def __init__(self, trc_data): super(MOCAPViewer, self).__init__() self._trc_data = trc_data self._ui = Ui_MOCAPViewer() self._ui.setupUi(self) self._nodes = [] self._labels = self._trc_data['Labels'][2:] frame_min = self._trc_data['Frame#'][0] frame_max = self._trc_data['Frame#'][-1] time_min = self._trc_data['Time'][0] time_max = self._trc_data['Time'][-1] self._ui.horizontalSlider.setMinimum(frame_min) self._ui.horizontalSlider.setMaximum(frame_max) self._ui.spinBox.setValue(10) self._context = Context('MOCAP') glyphmodule = self._context.getGlyphmodule() glyphmodule.defineStandardGlyphs() materialmodule = self._context.getMaterialmodule() materialmodule.defineStandardMaterials() self._ui.sceneviewerWidget.setContext(self._context) self._timer = QtCore.QTimer(self) self._timeKeeper = self._context.getTimekeepermodule().getDefaultTimekeeper() self._timeKeeper.setMinimumTime(time_min) self._timeKeeper.setMaximumTime(time_max) self._region = self._context.getDefaultRegion() self._createScene(self._region) self._graphics = None self._populateListWidget() self._makeConnections()
class MOCAPViewer(QtGui.QWidget): def __init__(self, trc_data): super(MOCAPViewer, self).__init__() self._trc_data = trc_data self._ui = Ui_MOCAPViewer() self._ui.setupUi(self) self._nodes = [] self._labels = self._trc_data['Labels'][2:] frame_min = self._trc_data['Frame#'][0] frame_max = self._trc_data['Frame#'][-1] time_min = self._trc_data['Time'][0] time_max = self._trc_data['Time'][-1] self._ui.horizontalSlider.setMinimum(frame_min) self._ui.horizontalSlider.setMaximum(frame_max) self._ui.spinBox.setValue(10) self._context = Context('MOCAP') glyphmodule = self._context.getGlyphmodule() glyphmodule.defineStandardGlyphs() materialmodule = self._context.getMaterialmodule() materialmodule.defineStandardMaterials() self._ui.sceneviewerWidget.setContext(self._context) self._timer = QtCore.QTimer(self) self._timeKeeper = self._context.getTimekeepermodule().getDefaultTimekeeper() self._timeKeeper.setMinimumTime(time_min) self._timeKeeper.setMaximumTime(time_max) self._region = self._context.getDefaultRegion() self._createScene(self._region) self._graphics = None self._populateListWidget() self._makeConnections() def _makeConnections(self): self._ui.listWidget.itemClicked.connect(self._labelClicked) self._ui.listWidget.itemChanged.connect(self._labelChanged) self._ui.sceneviewerWidget.graphicsInitialized.connect(self._sceneviewerReady) self._ui.pushButtonPlay.clicked.connect(self._playClicked) self._ui.spinBox.valueChanged.connect(self._sizeChanged) self._ui.horizontalSlider.valueChanged.connect(self._timeChanged) self._timer.timeout.connect(self._timeIncrement) def _playClicked(self): text = self._ui.pushButtonPlay.text() if text == '&Play': self._timer.start(10) self._ui.pushButtonPlay.setText('&Stop') else: self._timer.stop() self._ui.pushButtonPlay.setText('&Play') def _timeIncrement(self): time_increment = 1 current_value = self._ui.horizontalSlider.value() current_value += time_increment if current_value >= self._ui.horizontalSlider.maximum(): current_value = self._ui.horizontalSlider.minimum() self._ui.horizontalSlider.setValue(current_value) def _sizeChanged(self, value): scene = self._region.getScene() scene.beginChange() for graphics in self._graphics: attributes = graphics.getGraphicspointattributes() attributes.setBaseSize(value) scene.endChange() def _timeChanged(self, frame_index): time = self._trc_data['Time'][frame_index - 1] self._timeKeeper.setTime(time) def _sceneviewerReady(self): self._graphics = createNodeGraphics(self._region) self._ui.sceneviewerWidget.viewAll() def getTRCData(self): return self._trc_data def _getNodeForLabel(self, label): index = self._labels.index(label) node = self._nodes[index] return node def _labelClicked(self, item): # Set node selected. node = self._getNodeForLabel(item.text()) nodeset = node.getNodeset() selection_group = self._ui.sceneviewerWidget._selectionGroup#getSelectionGroup() nodegroup = selection_group.getFieldNodeGroup(nodeset) if not nodegroup.isValid(): nodegroup = selection_group.createFieldNodeGroup(nodeset) group = nodegroup.getNodesetGroup() if not group.containsNode(node): group.removeAllNodes() group.addNode(node) def _labelChanged(self, item): row = self._ui.listWidget.row(item) node = self._getNodeForLabel(self._labels[row]) new_text = str(item.text()) old_text = self._labels[row] fieldmodule = self._region.getFieldmodule() fieldcache = fieldmodule.createFieldcache() fieldmodule.beginChange() fieldcache.setNode(node) self._string_field.assignString(fieldcache, new_text) self._labels[row] = new_text self._trc_data[new_text] = self._trc_data.pop(old_text) self._trc_data['Labels'][row + 2] = new_text fieldmodule.endChange() def _populateListWidget(self): self._ui.listWidget.addItems(self._labels) for index in xrange(self._ui.listWidget.count()): item = self._ui.listWidget.item(index) item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable) def _createScene(self, region): coordinate_field = createFiniteElementField(region) self._string_field = createStoredStringField(region) fieldmodule = region.getFieldmodule() fieldmodule.beginChange() nodeset = fieldmodule.findNodesetByName('nodes') node_template = nodeset.createNodetemplate() time = self._trc_data['Time'] ts = fieldmodule.getMatchingTimesequence(0) for index, t in enumerate(time): ts.setTime(index + 1, t), # Set the finite element coordinate field for the nodes to use node_template.defineField(coordinate_field) node_template.defineField(self._string_field) node_template.setTimesequence(coordinate_field, ts) fieldcache = fieldmodule.createFieldcache() for label in self._labels: node_coordinates = self._trc_data[label] node = nodeset.createNode(-1, node_template) self._nodes.append(node) # Set the node coordinates, first set the field cache to use the current node fieldcache.setNode(node) for index, t in enumerate(time): fieldcache.setTime(t) # Pass in floats as an array coordinate_field.assignReal(fieldcache, node_coordinates[index]) self._string_field.assignString(fieldcache, label) fieldmodule.endChange()