def getSelectionPane(self): """Creates a widget to select elements and fields for plotting. search-root, field-name, comparison operator , value """ if not hasattr(self, '_selectionPane'): self._searchWidget = SearchWidget() self._searchWidget.setSearchRoot(self.plugin.modelRoot) self._fieldLabel = QtGui.QLabel('Field to plot') self._fieldEdit = QtGui.QLineEdit() self._fieldEdit.returnPressed.connect(self._searchWidget.searchSlot) self._selectionPane = QtGui.QWidget() layout = QtGui.QHBoxLayout() layout.addWidget(self._fieldLabel) layout.addWidget(self._fieldEdit) self._searchWidget.layout().addLayout(layout) self._selectionPane = self._searchWidget self._selectionPane.layout().addStretch(1) return self._selectionPane
class PlotView(PlotBase): """View for selecting fields on elements to plot.""" def __init__(self, *args): PlotBase.__init__(self, *args) self.plugin.modelRootChanged.connect(self.getSelectionPane().setSearchRoot) self.plugin.dataRootChanged.connect(self.setDataRoot) self.dataRoot = self.plugin.dataRoot def setDataRoot(self, root): self.dataRoot = moose.element(root).path def getToolPanes(self): return (self.getFieldSelectionDock(), ) def getSelectionPane(self): """Creates a widget to select elements and fields for plotting. search-root, field-name, comparison operator , value """ if not hasattr(self, '_selectionPane'): self._searchWidget = SearchWidget() self._searchWidget.setSearchRoot(self.plugin.modelRoot) self._fieldLabel = QtGui.QLabel('Field to plot') self._fieldEdit = QtGui.QLineEdit() self._fieldEdit.returnPressed.connect(self._searchWidget.searchSlot) self._selectionPane = QtGui.QWidget() layout = QtGui.QHBoxLayout() layout.addWidget(self._fieldLabel) layout.addWidget(self._fieldEdit) self._searchWidget.layout().addLayout(layout) self._selectionPane = self._searchWidget self._selectionPane.layout().addStretch(1) return self._selectionPane def getOperationsPane(self): """TODO: complete this""" if hasattr(self, 'operationsPane'): return self.operationsPane self.operationsPane = QtGui.QWidget() self._createTablesButton = QtGui.QPushButton('Create tables for recording selected fields', self.operationsPane) self._createTablesButton.clicked.connect(self.setupRecording) layout = QtGui.QVBoxLayout() self.operationsPane.setLayout(layout) layout.addWidget(self._createTablesButton) return self.operationsPane def getFieldSelectionDock(self): if not hasattr(self, '_fieldSelectionDock'): self._fieldSelectionDock = QtGui.QDockWidget('Search and select elements') self._fieldSelectionWidget = QtGui.QWidget() layout = QtGui.QVBoxLayout() self._fieldSelectionWidget.setLayout(layout) layout.addWidget(self.getSelectionPane()) layout.addWidget(self.getOperationsPane()) self._fieldSelectionDock.setWidget(self._fieldSelectionWidget) return self._fieldSelectionDock def getCentralWidget(self): if not hasattr(self, '_centralWidget') or self._centralWidget is None: self._centralWidget = PlotSelectionWidget() self.getSelectionPane().executed.connect(self.selectElements) return self._centralWidget def selectElements(self, elements): """Refines the selection. Currently checks if _fieldEdit has an entry and if so, selects only elements which have that field, and ticks the same in the PlotSelectionWidget. """ field = str(self._fieldEdit.text()).strip() if len(field) == 0: self.getCentralWidget().setSelectedElements(elements) return classElementDict = defaultdict(list) for epath in elements: el = moose.element(epath) classElementDict[el.className].append(el) refinedList = [] elementFieldList = [] for className, elist in classElementDict.items(): if field in elist[0].getFieldNames('valueFinfo'): refinedList +=elist elementFieldList += [(el, field) for el in elist] self.getCentralWidget().setSelectedElements(refinedList) self.getCentralWidget().setSelectedFields(elementFieldList) def setupRecording(self): """Create the tables for recording selected data and connect them.""" for element, field in self.getCentralWidget().getSelectedFields(): #createRecordingTable(element, field, self._recordingDict, self._reverseDict, self.dataRoot) #harsha:CreateRecordingTable function is moved to python/moose/utils.py file as create function #as this is required when I drop table on to the plot utils.create(self.plugin.modelRoot,moose.element(element),field) #self.dataTable.create(self.plugin.modelRoot, moose.element(element), field) #self.updateCallback() '''
class PlotView(PlotBase): """View for selecting fields on elements to plot.""" def __init__(self, *args): PlotBase.__init__(self, *args) self.plugin.modelRootChanged.connect(self.getSelectionPane().setSearchRoot) self.plugin.dataRootChanged.connect(self.setDataRoot) self._recordingDict = {} self._reverseDict = {} self.dataRoot = self.plugin.dataRoot def setDataRoot(self, root): self.dataRoot = moose.element(root).path def getToolPanes(self): return (self.getFieldSelectionDock(), ) def getSelectionPane(self): """Creates a widget to select elements and fields for plotting. search-root, field-name, comparison operator , value """ if not hasattr(self, '_selectionPane'): self._searchWidget = SearchWidget() self._searchWidget.setSearchRoot(self.plugin.modelRoot) self._fieldLabel = QtGui.QLabel('Field to plot') self._fieldEdit = QtGui.QLineEdit() self._fieldEdit.returnPressed.connect(self._searchWidget.searchSlot) self._selectionPane = QtGui.QWidget() layout = QtGui.QHBoxLayout() layout.addWidget(self._fieldLabel) layout.addWidget(self._fieldEdit) self._searchWidget.layout().addLayout(layout) self._selectionPane = self._searchWidget self._selectionPane.layout().addStretch(1) return self._selectionPane def getOperationsPane(self): """TODO: complete this""" if hasattr(self, 'operationsPane'): return self.operationsPane self.operationsPane = QtGui.QWidget() self._createTablesButton = QtGui.QPushButton('Create tables for recording selected fields', self.operationsPane) self._createTablesButton.clicked.connect(self.setupRecording) layout = QtGui.QVBoxLayout() self.operationsPane.setLayout(layout) layout.addWidget(self._createTablesButton) return self.operationsPane def getFieldSelectionDock(self): if not hasattr(self, '_fieldSelectionDock'): self._fieldSelectionDock = QtGui.QDockWidget('Search and select elements') self._fieldSelectionWidget = QtGui.QWidget() layout = QtGui.QVBoxLayout() self._fieldSelectionWidget.setLayout(layout) layout.addWidget(self.getSelectionPane()) layout.addWidget(self.getOperationsPane()) self._fieldSelectionDock.setWidget(self._fieldSelectionWidget) return self._fieldSelectionDock def getCentralWidget(self): if not hasattr(self, '_centralWidget') or self._centralWidget is None: self._centralWidget = PlotSelectionWidget() self.getSelectionPane().executed.connect(self.selectElements) return self._centralWidget def selectElements(self, elements): """Refines the selection. Currently checks if _fieldEdit has an entry and if so, selects only elements which have that field, and ticks the same in the PlotSelectionWidget. """ field = str(self._fieldEdit.text()).strip() if len(field) == 0: self.getCentralWidget().setSelectedElements(elements) return classElementDict = defaultdict(list) for epath in elements: el = moose.element(epath) classElementDict[el.className].append(el) refinedList = [] elementFieldList = [] for className, elist in classElementDict.items(): if field in elist[0].getFieldNames('valueFinfo'): refinedList +=elist elementFieldList += [(el, field) for el in elist] self.getCentralWidget().setSelectedElements(refinedList) self.getCentralWidget().setSelectedFields(elementFieldList) def setupRecording(self): """Create the tables for recording selected data and connect them.""" for element, field in self.getCentralWidget().getSelectedFields(): self.createRecordingTable(element, field) def createRecordingTable(self, element, field): """Create table to record `field` from element `element` Tables are created under `dataRoot`, the names are generally created by removing `/model` in the beginning of `elementPath` and replacing `/` with `_`. If this conflicts with an existing table, the id value of the target element (elementPath) is appended to the name. """ if len(field) == 0 or ((element, field) in self._recordingDict): return # The table path is not foolproof - conflict is # possible: e.g. /model/test_object and # /model/test/object will map to same table. So we # check for existing table without element field # path in recording dict. relativePath = element.path.partition('/model[0]/')[-1] if relativePath.startswith('/'): relativePath = relativePath[1:] #Convert to camelcase if field == "concInit": field = "ConcInit" elif field == "conc": field = "Conc" elif field == "nInit": field = "NInit" elif field == "n": field = "N" elif field == "volume": field = "Volume" elif field == "diffConst": field ="DiffConst" tablePath = relativePath.replace('/', '_') + '.' + field tablePath = re.sub('.', lambda m: {'[':'_', ']':'_'}.get(m.group(), m.group()),tablePath) tablePath = self.dataRoot + '/' +tablePath if moose.exists(tablePath): tablePath = '%s_%d' % (tablePath, element.getId().value) if not moose.exists(tablePath): table = moose.Table(tablePath) print 'Created', table.path, 'for plotting', '%s.%s' % (element.path, field) target = element moose.connect(table, 'requestOut', target, 'get%s' % (field)) self._recordingDict[(target, field)] = table self._reverseDict[table] = (target, field)