def __init__(self, parent=None): super(MainWindow,self).__init__(parent) super(MainWindow,self).setupUi(self) self.thread = None#Server(self) self.BoxSceneItems = dict() self.boxesLastFrame = dict() self.mode = "stopedRecording" self.fpsDisplay = QtGui.QLCDNumber(self) self.statusBar().addPermanentWidget(self.fpsDisplay) self.graphicsViewIsModifyed = False self.clientDialog = ClientDiolog(self) self.editDiolog = EditDiolog(self) self.connectActions() self.curFile = '' self.curRecordFile = '' self.recordingModifyed = False self.readSettings()
class MainWindow( QtGui.QMainWindow, Ui_MainWindow ): def __init__(self, parent=None): super(MainWindow,self).__init__(parent) super(MainWindow,self).setupUi(self) self.thread = None#Server(self) self.BoxSceneItems = dict() self.boxesLastFrame = dict() self.mode = "stopedRecording" self.fpsDisplay = QtGui.QLCDNumber(self) self.statusBar().addPermanentWidget(self.fpsDisplay) self.graphicsViewIsModifyed = False self.clientDialog = ClientDiolog(self) self.editDiolog = EditDiolog(self) self.connectActions() self.curFile = '' self.curRecordFile = '' self.recordingModifyed = False self.readSettings() #rf = open('C:\\Users\\gregmeeresyoung\\git\\NagapiMocap\\nagapi\\mocapScenes\\newTestrecord.raw','r') #AsciiFile(rf) #rf.close() def connectTreadSingals(self): self.connect(self.thread, QtCore.SIGNAL("subFrame(int, long, long, long, long)"), self.updateSubframe) self.connect(self.thread, QtCore.SIGNAL("frameEnd()"), self.updateFrame) self.connect(self.thread, QtCore.SIGNAL("stopingServer()"), self.stopingServer) self.connect(self, QtCore.SIGNAL("recording(QString)"), self.thread.startRecording) self.connect(self, QtCore.SIGNAL("stopRecording()"), self.thread.stopRecording) self.connect(self, QtCore.SIGNAL("closeThred()"), self.thread.closeThred) def connectActions(self): self.connect(self.actionListenForConnections, QtCore.SIGNAL("triggered(bool)"), self.openServer) self.connect(self.actionClassifiedData, QtCore.SIGNAL("triggered(bool)"), self.clasifyData) self.connect(self.actionRawData, QtCore.SIGNAL("triggered(bool)"), self.rawData) self.connect(self.actionRecordMocap, QtCore.SIGNAL("triggered(bool)"), self.recordMocap) self.connect(self.actionFilterData, QtCore.SIGNAL("triggered(bool)"),self.filterData) self.connect(self.action_Close, QtCore.SIGNAL("triggered()"), self.close) self.connect(self.action_Open, QtCore.SIGNAL("triggered()"), self.open) self.connect(self.action_Save, QtCore.SIGNAL("triggered()"), self.save) self.connect(self.action_Save_as, QtCore.SIGNAL("triggered()"), self.saveAs) self.connect(self.action_New, QtCore.SIGNAL("triggered()"), self.newFile) self.connect(self.actionAbout_nagapi_mocap, QtCore.SIGNAL("triggered()"), self.about) self.connect(self.actionEditClasificationRegen, QtCore.SIGNAL("triggered()"), self.showEditDialog) self.connect(self.actionAddClasificationRegen, QtCore.SIGNAL("triggered()"), self.startAddClasificationRegen) self.connect(self.actionDelet_selected, QtCore.SIGNAL("triggered()"),self.graphicsView.deletSelected) self.connect(self.graphicsView, QtCore.SIGNAL("regenEditEnd()"), self.updateClasifyData) self.connect(self.graphicsView, QtCore.SIGNAL("regenEditEnd()"), self.blockEditDiolog) self.connect(self.graphicsView, QtCore.SIGNAL("regenEditEnd()"), self.endAddClasificationRegen) self.connect(self.graphicsView, QtCore.SIGNAL("updateEditData()"), self.updateEditData) self.connect(self.editDiolog.spinBox_width, QtCore.SIGNAL("valueChanged(int)"), self.graphicsView.resizeSelectedWidth) self.connect(self.editDiolog.spinBox_height, QtCore.SIGNAL("valueChanged(int)"), self.graphicsView.resizeSelectedHight) self.connect(self.editDiolog.spinBox_colID, QtCore.SIGNAL("valueChanged(int)"), self.graphicsView.updateColour) self.connect(self.editDiolog.spinBox_colID, QtCore.SIGNAL("valueChanged(int)"), self.graphicsView.updateColour) self.connect(self.editDiolog.buttonBox, QtCore.SIGNAL("clicked(QAbstractButton*"), self.updatRegenData) self.connect(self.editDiolog.buttonBox, QtCore.SIGNAL("clicked(QAbstractButton*)"), self.updatRegenData) def updateSmartBox(self): self.thread.smartFilterBoxSize def updateOutputChannel(self): sender = self.sender() senderName = str(sender.objectName()) channel = re.match("[\s\S]+_([xywh]$)", senderName).group(1) tag = self.graphicsView.regenSelected().getTag() self.thread.updateOutputChannel(tag,channel,sender.isChecked()) def updateBufferSize(self): sender = self.sender() senderName = str(sender.objectName()) channel = re.match("[\s\S]+_([xywh]$)", senderName).group(1) tag = self.graphicsView.regenSelected().getTag() self.thread.updateBufferSize(tag,channel,sender.value()) def updateLowPassFreq(self): sender = self.sender() senderName = str(sender.objectName()) channel = re.match("[\s\S]+_([xywh]$)", senderName).group(1) tag = self.graphicsView.regenSelected().getTag() self.thread.updateLowPassFreq(tag,channel,sender.value()) def updateFilterType(self,toggle): sender = self.sender() senderName = str(sender.objectName()) channel = re.match("[\s\S]+_([xywh]$)", senderName).group(1) filterType = re.match("([\s\S]+)_([xywh]$)", senderName).group(1) tag = self.graphicsView.regenSelected().getTag() if filterType == 'radioButton_noF': self.thread.updateFilterType(tag,channel,Server.nofilter) elif filterType == 'radioButton_gAve': self.thread.updateFilterType(tag,channel,Server.gouseanFilter) elif filterType == 'radioButton_lowPassF': self.thread.updateFilterType(tag,channel,Server.lowPassFilter) def filterData(self,on): if on: self.actionRawData.setChecked(False) self.actionClassifiedData.setChecked(True) data = self.graphicsView.getClasificationRegens() if self.thread: self.thread.clasifyData(data) self.thread.filterData() else: if self.thread: self.thread.filterOff() def updateClasifyData(self): if self.graphicsView.regenSelected() and self.actionFilterData.isChecked(): self.filterData(True) elif self.graphicsView.regenSelected() and self.actionClassifiedData.isChecked(): self.clasifyData(True) def clasifyData(self,on): if on: self.actionRawData.setChecked(False) data = self.graphicsView.getClasificationRegens() if self.thread: self.thread.clasifyData(data) else: self.actionRawData.setChecked(True) self.actionFilterData.setChecked(False) if self.thread: self.thread.rawData() def rawData(self,on): if on: self.actionClassifiedData.setChecked(False) self.actionFilterData.setChecked(False) self.thread.rawData() elif not self.actionClassifiedData.isChecked(): self.actionRawData.setChecked(True) self.thread.rawData() def recordMocap(self,startRec): if self.thread: if startRec: self.newRecordingFile() else: print "stop recording" self.emit(QtCore.SIGNAL("stopRecording()")) self.saveRecordingAs() def updateSubframe(self,tag,x,y,w,h): #convert from camera spcae to screen space screenSpace_x,screenSpace_y = x*2,y*2 screenSpace_w,screenSpace_h = w*2,h*2 lcx = screenSpace_x - (screenSpace_w/2) lcy = screenSpace_y - (screenSpace_h/2) if self.BoxSceneItems.has_key(tag): self.BoxSceneItems[tag].show() self.BoxSceneItems[tag].setRect (lcx, lcy, screenSpace_w, screenSpace_h) self.BoxSceneItems[tag].lable.setText(str(tag)) else: self.BoxSceneItems[tag] = MocapBox(lcx, lcy, screenSpace_w, screenSpace_h) self.BoxSceneItems[tag].setRect (lcx, lcy, screenSpace_w, screenSpace_h) self.BoxSceneItems[tag].lable.setText(str(tag)) self.graphicsView.addMocapBox(self.BoxSceneItems[tag]) if self.boxesLastFrame.has_key(tag): self.boxesLastFrame.pop(tag, None) def updateFrame(self): for tag,mbox in self.boxesLastFrame.items(): mbox.hide() for tag,mbox in self.BoxSceneItems.items(): self.boxesLastFrame[tag] = mbox self.fpsDisplay.display(int(fpsclock.speed())) def openServerOld(self,lisen): #currentFile = self.getCurrentFile() #display ui for inputing client programs for mocap client and plugin client if lisen: if self.clientDialog.exec_(): if self.clientDialog.radioButton_remote.isChecked(): self.thread = Server() for clasifyData in self.graphicsView.getData().values(): if self.thread: self.thread.buildFromData(clasifyData) if self.actionFilterData.isChecked(): self.filterData(True) elif self.actionClassifiedData.isChecked(): self.clasifyData(True) else: pass self.connectTreadSingals() if self.actionRecordMocap.isChecked(): self.recordMocap(True) lisenPort = int(self.clientDialog.comboBox_lisenPort.itemText(self.clientDialog.comboBox_lisenPort.currentIndex())) mocapClientIP = self.clientDialog.comboBox_mocapIP.itemText(self.clientDialog.comboBox_mocapIP.currentIndex()) pluginClientIP = self.clientDialog.comboBox_pluginIP.itemText(self.clientDialog.comboBox_pluginIP.currentIndex()) print "starting server" self.thread.render(lisenPort,mocapClientIP,pluginClientIP) self.statusBar().showMessage("Lisinging for clients", 0) elif self.clientDialog.radioButton_local.isChecked(): rawTempFile = self.getTempFile() self.thread = LocalClient(rawTempFile) for clasifyData in self.graphicsView.getData().values(): if self.thread: self.thread.buildFromData(clasifyData) if self.actionFilterData.isChecked(): self.filterData(True) elif self.actionClassifiedData.isChecked(): self.clasifyData(True) else: pass self.connectTreadSingals() if self.actionRecordMocap.isChecked(): self.recordMocap(True) self.thread.render() self.statusBar().showMessage("Running local client", 0) else: self.thread = LocalPixey() for clasifyData in self.graphicsView.getData().values(): if self.thread: self.thread.buildFromData(clasifyData) if self.actionFilterData.isChecked(): self.filterData(True) elif self.actionClassifiedData.isChecked(): self.clasifyData(True) else: pass self.connectTreadSingals() if self.actionRecordMocap.isChecked(): self.recordMocap(True) self.thread.render() self.statusBar().showMessage("Running local client", 0) else: self.actionListenForConnections.setChecked(False) else: self.emit(QtCore.SIGNAL("closeThred()"))#self.thread.closeServer() def openServer(self,lisen): #currentFile = self.getCurrentFile() #display ui for inputing client programs for mocap client and plugin client if lisen: if self.clientDialog.exec_(): if self.clientDialog.radioButton_remote.isChecked(): self.thread = Server() for clasifyData in self.graphicsView.getData().values(): if self.thread: self.thread.buildFromData(clasifyData) if self.actionFilterData.isChecked(): self.filterData(True) elif self.actionClassifiedData.isChecked(): self.clasifyData(True) else: pass self.connectTreadSingals() if self.actionRecordMocap.isChecked(): self.recordMocap(True) lisenPort = int(self.clientDialog.comboBox_lisenPort.itemText(self.clientDialog.comboBox_lisenPort.currentIndex())) mocapClientIP = self.clientDialog.comboBox_mocapIP.itemText(self.clientDialog.comboBox_mocapIP.currentIndex()) pluginClientIP = self.clientDialog.comboBox_pluginIP.itemText(self.clientDialog.comboBox_pluginIP.currentIndex()) print "starting server" self.thread.render(lisenPort,mocapClientIP,pluginClientIP) self.statusBar().showMessage("Lisinging for clients", 0) elif self.clientDialog.radioButton_local.isChecked(): serverThread = None if self.clientDialog.groupBox_2.isChecked(): print "creating that servers boyo" serverThread = Server() rawTempFile = self.getTempFile() self.thread = LocalClient(rawTempFile) self.thread.setServer(serverThread) for clasifyData in self.graphicsView.getData().values(): if self.thread: self.thread.buildFromData(clasifyData) if self.actionFilterData.isChecked(): self.filterData(True) elif self.actionClassifiedData.isChecked(): self.clasifyData(True) else: pass self.connectTreadSingals() if self.actionRecordMocap.isChecked(): self.recordMocap(True) lisenPort = int(self.clientDialog.comboBox_lisenPort.itemText(self.clientDialog.comboBox_lisenPort.currentIndex())) mocapClientIP = None#self.clientDialog.comboBox_mocapIP.itemText(self.clientDialog.comboBox_mocapIP.currentIndex()) pluginClientIP = self.clientDialog.comboBox_pluginIP.itemText(self.clientDialog.comboBox_pluginIP.currentIndex()) print lisenPort,mocapClientIP,pluginClientIP self.thread.render(lisenPort,mocapClientIP,pluginClientIP) self.statusBar().showMessage("Running local client", 0) else: serverThread = None if self.clientDialog.groupBox_2.isChecked(): print "creating that servers boyo" serverThread = Server() self.thread = LocalPixey() self.thread.setServer(serverThread) for clasifyData in self.graphicsView.getData().values(): if self.thread: self.thread.buildFromData(clasifyData) if self.actionFilterData.isChecked(): self.filterData(True) elif self.actionClassifiedData.isChecked(): self.clasifyData(True) else: pass self.connectTreadSingals() if self.actionRecordMocap.isChecked(): self.recordMocap(True) lisenPort = int(self.clientDialog.comboBox_lisenPort.itemText(self.clientDialog.comboBox_lisenPort.currentIndex())) mocapClientIP = None#self.clientDialog.comboBox_mocapIP.itemText(self.clientDialog.comboBox_mocapIP.currentIndex()) pluginClientIP = self.clientDialog.comboBox_pluginIP.itemText(self.clientDialog.comboBox_pluginIP.currentIndex()) print lisenPort,mocapClientIP,pluginClientIP self.thread.render(lisenPort,mocapClientIP,pluginClientIP ) self.statusBar().showMessage("Running local client", 0) else: self.actionListenForConnections.setChecked(False) else: self.emit(QtCore.SIGNAL("closeThred()"))#self.thread.closeServer() def stopingServer(self): self.actionListenForConnections.setChecked(False) QMessageBox.information(self.parent(), " Server", "Closing liserning server.") def updatRegenData(self,buttion): regen = self.graphicsView.regenSelected() if regen: if buttion.text () in ("Apply",'OK'): data = self.editDiolog.getData() regen.setData(data) if self.thread: self.thread.buildFromData(data) self.statusBar().showMessage("upedated regen %s"%data['name'], 2000) def blockEditDiolog(self): regen = self.graphicsView.regenSelected() if not regen: self.editDiolog.setDisabled(True) else: self.editDiolog.setEnabled(True) def updateEditData(self): self.editDiolog.updatData(self.graphicsView.regenSelected().clasifyData) def startAddClasificationRegen(self): self.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape(2))) self.graphicsView.editRegen = True def endAddClasificationRegen(self): self.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape(0))) self.graphicsView.editRegen = False def showEditDialog(self): regen = self.graphicsView.regenSelected() if regen: self.editDiolog.updatData(regen.clasifyData) self.editDiolog.show() def closeEvent(self, event): # do stuff print "cleanup" if self.thread: self.thread.stopRecording() self.thread.exiting = True if self.maybeSave(): self.writeSettings() event.accept() else: event.ignore() def newFile(self): if self.maybeSave(): self.graphicsView.clear() self.setCurrentFile('') def newRecordingFile(self): print "new recording" if self.maybeRecordingSave(): self.setRecordCurrentFile('mocapRecording.tmp') self.emit(QtCore.SIGNAL("recording(QString)"),self.curRecordFile) print "start temp file recroding" def getTempFile(self): fileName = QtGui.QFileDialog.getOpenFileName(self) if fileName: return fileName return None def open(self): if self.maybeSave(): fileName = QtGui.QFileDialog.getOpenFileName(self) if fileName: self.loadFile(fileName) def save(self): if self.curFile: return self.saveFile(self.curFile) return self.saveAs() def saveRecording(self): if self.curRecordFile: return self.saveRecordingFile('') return self.saveRecordingAs() def saveAs(self): fileName = QtGui.QFileDialog.getSaveFileName(self, "save setup", "", "setup Files (*.txt)") if fileName: return self.saveFile(fileName) return False def saveRecordingAs(self): fileName = QtGui.QFileDialog.getSaveFileName(self, "Save Mocap", "", "Mocap Files (*.raw *.mocap *.ma)") if fileName: return self.saveRecordingFile(fileName) return False def about(self): QtGui.QMessageBox.about(self, "About Application", "The <b>Application</b> example demonstrates how to write " "modern GUI applications using Qt, with a menu bar, " "toolbars, and a status bar.") def documentWasModified(self): self.setWindowModified(self.graphicsView.isModified()) def setCurrentFile(self, fileName): self.curFile = fileName self.graphicsView.setModified(False) self.setWindowModified(False) if self.curFile: shownName = self.strippedName(self.curFile) else: shownName = 'untitled.mcap' self.setWindowTitle("%s[*] - Nagapi Mocap" % shownName) def getCurrentFile(self): return self.curFile def setRecordCurrentFile(self, fileName): self.curRecordFile = fileName #set record file to modifyed ?? self.recordingModifyed = True if self.curRecordFile: shownName = self.strippedName(self.curRecordFile) else: shownName = 'mocapRecording.tmp' self.statusBar().showMessage("Recording mocap", 2000) #self.setWindowTitle("%s[*] - Nagapi Mocap" % shownName) def strippedName(self, fullFileName): return QtCore.QFileInfo(fullFileName).fileName() def loadFile(self, fileName): qfile = QtCore.QFile(fileName) if not qfile.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text): QtGui.QMessageBox.warning(self, "Nagapi Mocap", "Cannot read file %s:\n%s." % (fileName, file.errorString())) return inf = file(qfile.fileName(), 'r') QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) self.graphicsView.clear() for data in yaml.load_all(inf): for clasifyData in data.values(): self.graphicsView.buildFromData(clasifyData) if self.thread: self.thread.buildFromData(clasifyData) QtGui.QApplication.restoreOverrideCursor() self.setCurrentFile(fileName) self.statusBar().showMessage("File loaded", 2000) def saveFile(self, fileName): qfile = QtCore.QFile(fileName) if not qfile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text): QtGui.QMessageBox.warning(self, "Nagapi Mocap", "Cannot write file %s:\n%s." % (fileName, file.errorString())) return False stream = file(qfile.fileName(), 'w') QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) self.graphicsView.dumpData(stream) stream.close() QtGui.QApplication.restoreOverrideCursor() self.setCurrentFile(fileName); self.statusBar().showMessage("File saved", 2000) return True def saveRecordingFile(self, fileName): file = QtCore.QFile(fileName) fileName,ext = os.path.splitext(str(file.fileName())) if not file.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text): QtGui.QMessageBox.warning(self, "Nagapi Mocap", "Cannot write file %s:\n%s." % (fileName, file.errorString())) return False #fileName = qfile.fileName() outf = QtCore.QTextStream(file) QtGui.QApplication.restoreOverrideCursor() tmpfile = QtCore.QFile(self.curRecordFile) if not tmpfile.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text): QtGui.QMessageBox.warning(self, "Nagapi Mocap", "Cannot write file %s:\n%s." % (self.curRecordFile, tmpfile.errorString())) if ext == '.raw': outf << tmpfile.readAll() if ext == '.mocap': print "convert to mocap format filterd and clasifyed" outf << tmpfile.readAll() if ext == '.ma': print "convert ot maya ascii format" setupData = self.graphicsView.getData() outf << str(AsciiFile(tmpfile,setupData)) tmpfile.close() self.recordingModifyed = False self.statusBar().showMessage("Mocap saved", 2000) return True def maybeSave(self): return True def maybeRecordingSave(self): if self.recordingModifyed:#if added new rectangels ret = QtGui.QMessageBox.warning(self, "Nagapi Mocap", "The document has been modified.\nDo you want to save " "your changes?", QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel) if ret == QtGui.QMessageBox.Save: return self.saveRecording() elif ret == QtGui.QMessageBox.Cancel: return False return True def writeSettings(self): print "writ settings" settings = QtCore.QSettings("Nagapi", "NagapiMocap") settings.beginGroup("ClientDiolog") settings.beginWriteArray("mocapIPs") settings.setValue("currentIndex", self.clientDialog.comboBox_mocapIP.currentIndex()) size = self.clientDialog.comboBox_mocapIP.count() settings.setValue("size",size) for index in range(size): settings.setArrayIndex(index); settings.setValue("text", self.clientDialog.comboBox_mocapIP.itemText(index)) settings.endArray() settings.beginWriteArray("pluginIPs") settings.setValue("currentIndex", self.clientDialog.comboBox_pluginIP.currentIndex()) size =self.clientDialog.comboBox_pluginIP.count() settings.setValue("size",size) for index in range(size): settings.setArrayIndex(index); settings.setValue("text", self.clientDialog.comboBox_pluginIP.itemText(index)) settings.endArray() settings.endGroup() def readSettings(self): settings = QtCore.QSettings("Nagapi", "NagapiMocap") settings.beginGroup("ClientDiolog") for i in settings.allKeys(): print i,settings.value(i).toString() self.clientDialog.comboBox_mocapIP.clear() size = settings.beginReadArray("mocapIPs") currentIndex = settings.value("currentIndex").toString() for i in range(size): settings.setArrayIndex(i) self.clientDialog.comboBox_mocapIP.addItem(settings.value("text").toString()) settings.endArray() currentIndex = int(currentIndex) if currentIndex else 0 self.clientDialog.comboBox_mocapIP.setCurrentIndex(currentIndex) self.clientDialog.comboBox_pluginIP.clear() size = settings.beginReadArray("pluginIPs") currentIndex = settings.value("currentIndex").toString() for i in range(size): settings.setArrayIndex(i) self.clientDialog.comboBox_pluginIP.addItem(settings.value("text").toString()) settings.endArray() currentIndex = int(currentIndex) if currentIndex else 0 self.clientDialog.comboBox_pluginIP.setCurrentIndex(currentIndex) settings.endGroup()