Exemplo n.º 1
0
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