class DataTransWidget(QDialog, Ui_dataTransWidget): AppName = u'气动数据转换' _BalanceSty__ = [u"14杆天平", u"16杆天平", u"18杆天平", u"盒式天平(内)", u"盒式天平(外)"] def __init__(self, parent=None): super(DataTransWidget, self).__init__(parent) self.setupUi(self) # self.setWindowFlags(Qt.WindowMinimizeButtonHint) # 创建飞行器试验模型 self.model = AircraftModel() self.initModel() # 创建天平类型 self.balance = Balance() self.initBalance() self.balance.setAircraftModel(self.model) self._dir = "./" self.balanceParamsTable = BalanceCoesTable(self, balance=self.balance) self.tabWidget.setCurrentIndex(0) self.txtModelArea.setValidator(QDoubleValidator()) self.txtModelSpan.setValidator(QDoubleValidator()) self.txtModelRootChord.setValidator(QDoubleValidator()) self.txtModelRefChord.setValidator(QDoubleValidator()) self.txtWindSpeed.setValidator(QDoubleValidator()) self.txtDeltaX.setValidator(QDoubleValidator()) self.txtDeltaY.setValidator(QDoubleValidator()) self.txtDeltaZ.setValidator(QDoubleValidator()) self.txtModelArea.textChanged.connect(self.initModel) self.txtModelSpan.textChanged.connect(self.initModel) self.txtModelRootChord.textChanged.connect(self.initModel) self.txtModelRefChord.textChanged.connect(self.initModel) self.txtWindSpeed.textChanged.connect(self.initModel) self.txtDeltaX.textChanged.connect(self.initModel) self.txtDeltaY.textChanged.connect(self.initModel) self.txtDeltaZ.textChanged.connect(self.initModel) self.cbBalanceSty.currentIndexChanged.connect(self.initBalance) self.txtStaticFile.textChanged.connect(self.initBalance) self.txtDynamicFile.textChanged.connect(self.initBalance) self.txtBodyFile.textChanged.connect(self.initBalance) self.txtAeroFile.textChanged.connect(self.initBalance) self.spbFileHeaderNums.valueChanged.connect(self.initBalance) self.spbFileFooterNums.valueChanged.connect(self.initBalance) self.chbTime.stateChanged.connect(self.initBalance) self.spbFMStartCol.valueChanged.connect(self.initBalance) self.spbFMEndCol.valueChanged.connect(self.initBalance) self.rbAngleEuler.clicked.connect(self.initBalance) self.rbAngleAero.clicked.connect(self.initBalance) self.chbTheta.clicked.connect(self.initBalance) self.chbPhi.clicked.connect(self.initBalance) self.chbPsi.clicked.connect(self.initBalance) self.spbThetaCol.valueChanged.connect(self.initBalance) self.spbPhiCol.valueChanged.connect(self.initBalance) self.spbPsiCol.valueChanged.connect(self.initBalance) self.spbAlphaCol.valueChanged.connect(self.initBalance) self.spbBetaCol.valueChanged.connect(self.initBalance) def initModel(self): self.model.setArea(float(self.txtModelArea.text())) # 初始化模型面积 self.model.setSpan(float(self.txtModelSpan.text())) # 初始化模型展长 self.model.setRootChord(float(self.txtModelRootChord.text())) # 初始化模型根弦长 self.model.setRefChord(float(self.txtModelRefChord.text())) # 初始化模型参考弦长 self.model.setWindSpeed(float(self.txtWindSpeed.text())) # 初始化试验风速 self.model.dx = float(self.txtDeltaX.text()) # 初始化deltaX self.model.dy = float(self.txtDeltaY.text()) self.model.dz = float(self.txtDeltaZ.text()) def initBalance(self): self.balance.setBalanceSty(self.cbBalanceSty.currentIndex()) # 初始化天平类型 self.balance.setStaFile(unicode(self.txtStaticFile.text())) self.balance.setDynFile(unicode(self.txtDynamicFile.text())) self.balance.setBodyFile(unicode(self.txtBodyFile.text())) self.balance.setAeroFile(unicode(self.txtAeroFile.text())) self.balance.setHeaderRows(self.spbFileHeaderNums.value()) self.balance.setFooterRows(self.spbFileFooterNums.value()) self.balance.setTime(self.chbTime.isChecked()) self.balance.setFMStartCol(self.spbFMStartCol.value() - 1) self.spbFMEndCol.setValue(self.spbFMStartCol.value() + 5) self.balance.setFMEndCol(self.spbFMEndCol.value() - 1) # 更新角度列 self.balance.setAngleType('body') if self.rbAngleEuler.isChecked() else self.balance.setAngleType('aero') self.balance.setThetaCol(self.spbThetaCol.value() - 1) if self.rbAngleEuler.isChecked() and self.chbTheta.isChecked() else self.balance.setThetaCol(None) self.balance.setPhiCol(self.spbPhiCol.value() - 1) if self.rbAngleEuler.isChecked() and self.chbPhi.isChecked() else self.balance.setPhiCol(None) self.balance.setPsiCol(self.spbPsiCol.value() - 1) if self.rbAngleEuler.isChecked() and self.chbPsi.isChecked() else self.balance.setPsiCol(None) self.balance.setAlphaCol(self.spbAlphaCol.value() - 1) if self.rbAngleAero.isChecked() and self.chbAlpha.isChecked() else self.balance.setAlphaCol(None) self.balance.setBetaCol(self.spbBetaCol.value() - 1) if self.rbAngleAero.isChecked() and self.chbBeta.isChecked() else self.balance.setBetaCol(None) def updateBatchFiles(self): self.listWidgetBatchFiles.clear() rawjReg = self.txtBatchStaFileReg.text() rawdReg = self.txtBatchDynFileReg.text() if (not rawjReg) or (not rawdReg): QMessageBox.warning(self, u"{0} -- warning".format(DataTransWidget.AppName), u"请输入动/静文件校验符") return jReg = unicode(rawjReg).strip().lower() dReg = unicode(rawdReg).strip().lower() dirNums = self.listWidgetBatchDirs.count() if self.chbBatchStaticFile.isChecked(): staticFile = unicode(self.txtBatchStaticFile.text()) if not staticFile: QMessageBox.warning(self, u"{0} -- warning".format(DataTransWidget.AppName), u"请输入静态文件") return for i in range(dirNums): rawDir = unicode(self.listWidgetBatchDirs.item(i).text()) fileList = os.listdir(rawDir) for f in fileList: if f.lower().endswith(dReg): filePath = os.path.join(rawDir, f) self.listWidgetBatchFiles.addItem(staticFile) self.listWidgetBatchFiles.addItem(filePath) else: for i in range(dirNums): rawDir = unicode(self.listWidgetBatchDirs.item(i).text()) fileList = os.listdir(rawDir) for df in fileList: if df.lower().endswith(dReg): jfLower = df.lower().replace(dReg, jReg) fileLowerList = [item.lower() for item in fileList] if jfLower in fileLowerList: index = fileLowerList.index(jfLower) jf = fileList[index] jfilePath = os.path.join(rawDir, jf) dfilePath = os.path.join(rawDir, df) self.listWidgetBatchFiles.addItem(jfilePath) self.listWidgetBatchFiles.addItem(dfilePath) @pyqtSignature("int") def on_cbBalanceSty_currentIndexChanged(self, index): self.balance.setBalanceSty(index) self.balance.setBalanceCoes(None) self.balanceParamsTable.tableWidget.clear() @pyqtSignature("") def on_pbtnBalanceParamsSetting_clicked(self): if self.cbBalanceSty.currentIndex() == -1: QMessageBox.warning(self, u"{0}提示".format(DataTransWidget.AppName), u"未选择天平类型") return index = self.cbBalanceSty.currentIndex() self.balanceParamsTable.label.setText(DataTransWidget._BalanceSty__[index]) self.balanceParamsTable.labelIndex.setText(str(index + 1)) coes = self.balance.getBalanceCoes() if coes is not None: self.balanceParamsTable.setBalanceCoes(coes) else: if index == 0: self.balanceParamsTable.tableWidget.setRowCount(6) self.balanceParamsTable.tableWidget.setColumnCount(6) if index == 1: self.balanceParamsTable.tableWidget.setRowCount(6) self.balanceParamsTable.tableWidget.setColumnCount(6) if index == 2: self.balanceParamsTable.tableWidget.setRowCount(6) self.balanceParamsTable.tableWidget.setColumnCount(27) if index == 3 or index == 4: self.balanceParamsTable.label.setText(DataTransWidget._BalanceSty__[3] + '/' + DataTransWidget._BalanceSty__[4]) self.balanceParamsTable.tableWidget.setRowCount(6) self.balanceParamsTable.tableWidget.setColumnCount(8) self.balanceParamsTable.exec_() @pyqtSignature("") def on_pbtnModelDataInput_clicked(self): mdFn = QFileDialog.getOpenFileName(self, u"打开模型文件...", directory=self._dir, filter=u"所有文件(*.*);;数据文件(*.dat);;文本文件(*.txt)", selectedFilter=u"文本文件(*.txt)") if not mdFn.isEmpty(): self._dir = mdFn try: with codecs.open(mdFn, "r", "utf8") as f: rawData = f.readlines()[2:-2] params1 = [s.split('\t')[1].encode('ascii') for s in rawData[:5]] params2 = [s.split('\t')[1].encode('ascii') for s in rawData[6:]] self.txtModelArea.setText(params1[0]) self.txtModelSpan.setText(params1[1]) self.txtModelRootChord.setText(params1[2]) self.txtModelRefChord.setText(params1[3]) self.txtWindSpeed.setText(params1[4]) self.txtDeltaX.setText(params2[0]) self.txtDeltaY.setText(params2[1]) self.txtDeltaZ.setText(params2[2]) return True except Exception, msg: QMessageBox.about(self, u"{0}提示".format(DataTransWidget.AppName), u"模型文件打开失败\n{0}".format(msg)) return