From 2bf7083db46ace55c7fa50abe3c540986fd6b209 Mon Sep 17 00:00:00 2001 From: jriegel Date: Mon, 14 Apr 2014 03:17:37 +0200 Subject: [PATCH] fix FEM result dialog --- src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp | 34 ++++-- src/Mod/Fem/MechanicalAnalysis.py | 109 +++++++++---------- src/Mod/Fem/ShowDisplacement.ui | 30 +++-- 3 files changed, 102 insertions(+), 71 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp index d527f1af7..20b458c5d 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp @@ -59,6 +59,11 @@ App::Color calcColor(double value,double min, double max) PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args) { + // statistical values get collected and returned + double max = -1e12; + double min = +1e12; + double avg = 0; + PyObject *object=0; int type = 0; if (PyArg_ParseTuple(args,"O!|i",&(App::DocumentObjectPy::Type), &object, &type)) { @@ -68,10 +73,14 @@ PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args) const std::vector & Ids = result->ElementNumbers.getValues() ; const std::vector & Vals = result->Values.getValues() ; std::vector NodeColors(Vals.size()); - float max = 0.0; - for(std::vector::const_iterator it= Vals.begin();it!=Vals.end();++it) + for(std::vector::const_iterator it= Vals.begin();it!=Vals.end();++it){ if(*it > max) max = *it; + if(*it < min) + min = *it; + avg += *it; + } + avg /= Vals.size(); // fill up color vector long i=0; @@ -87,9 +96,8 @@ PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args) const std::vector & Ids = result->ElementNumbers.getValues() ; const std::vector & Vecs = result->Values.getValues() ; std::vector NodeColors(Vecs.size()); - double max = -1e12; - double min = +1e12; - for(std::vector::const_iterator it= Vecs.begin();it!=Vecs.end();++it){ + + for(std::vector::const_iterator it= Vecs.begin();it!=Vecs.end();++it){ double val; if(type == 0) val = it->Length(); @@ -106,18 +114,21 @@ PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args) max = val; if(val < min) min = val; + avg += val; } + avg /= Vecs.size(); + // fill up color vector long i=0; for(std::vector::const_iterator it= Vecs.begin();it!=Vecs.end();++it,i++) if(type == 0) NodeColors[i] = calcColor(it->Length(),0.0,max); else if (type == 1) - NodeColors[i] = calcColor(it->x,0.0,max); + NodeColors[i] = calcColor(it->x,min,max); else if (type == 2) - NodeColors[i] = calcColor(it->y,0.0,max); + NodeColors[i] = calcColor(it->y,min,max); else if (type == 3) - NodeColors[i] = calcColor(it->z,0.0,max); + NodeColors[i] = calcColor(it->z,min,max); else NodeColors[i] = calcColor(it->Length(),0.0,max); @@ -131,7 +142,12 @@ PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args) } } - Py_Return; + Py::Tuple res(3); + res[0] = Py::Float(min); + res[1] = Py::Float(max); + res[2] = Py::Float(avg); + + return Py::new_reference_to(res); } diff --git a/src/Mod/Fem/MechanicalAnalysis.py b/src/Mod/Fem/MechanicalAnalysis.py index 15c6574a4..61ec8f1fe 100644 --- a/src/Mod/Fem/MechanicalAnalysis.py +++ b/src/Mod/Fem/MechanicalAnalysis.py @@ -212,17 +212,14 @@ class _JobControlTaskPanel: # the panel has a tree widget that contains categories # for the subcomponents, such as additions, subtractions. # the categories are shown only if they are not empty. - form_class, base_class = uic.loadUiType(FreeCAD.getHomePath() + "Mod/Fem/MechanicalAnalysis.ui") - + self.form=FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/MechanicalAnalysis.ui") + self.CalculixBinary = FreeCAD.getHomePath() +'bin/ccx.exe' self.TempDir = FreeCAD.ActiveDocument.TransientDir.replace('\\','/') + '/FemAnl_'+ object.Uid[-4:] if not os.path.isdir(self.TempDir): os.mkdir(self.TempDir) self.obj = object - self.formUi = form_class() - self.form = QtGui.QWidget() - self.formUi.setupUi(self.form) #self.params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") self.Calculix = QtCore.QProcess() self.Timer = QtCore.QTimer() @@ -231,8 +228,8 @@ class _JobControlTaskPanel: self.OutStr = '' #Connect Signals and Slots - QtCore.QObject.connect(self.formUi.toolButton_chooseOutputDir, QtCore.SIGNAL("clicked()"), self.chooseOutputDir) - QtCore.QObject.connect(self.formUi.pushButton_generate, QtCore.SIGNAL("clicked()"), self.run) + QtCore.QObject.connect(self.form.toolButton_chooseOutputDir, QtCore.SIGNAL("clicked()"), self.chooseOutputDir) + QtCore.QObject.connect(self.form.pushButton_generate, QtCore.SIGNAL("clicked()"), self.run) QtCore.QObject.connect(self.Calculix, QtCore.SIGNAL("started()"), self.calculixStarted) QtCore.QObject.connect(self.Calculix, QtCore.SIGNAL("finished(int)"), self.calculixFinished) @@ -248,8 +245,8 @@ class _JobControlTaskPanel: #print out if out: self.OutStr = self.OutStr + unicode(out).replace('\n','
') - self.formUi.textEdit_Output.setText(self.OutStr) - self.formUi.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start) ) + self.form.textEdit_Output.setText(self.OutStr) + self.form.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start) ) def calculixError(self,error): print "Error()",error @@ -257,7 +254,7 @@ class _JobControlTaskPanel: def calculixStarted(self): print "calculixStarted()" print self.Calculix.state() - self.formUi.pushButton_generate.setText("Break Calculix") + self.form.pushButton_generate.setText("Break Calculix") def calculixFinished(self,exitCode): @@ -267,32 +264,32 @@ class _JobControlTaskPanel: print out if out: self.OutStr = self.OutStr + unicode(out).replace('\n','
') - self.formUi.textEdit_Output.setText(self.OutStr) + self.form.textEdit_Output.setText(self.OutStr) self.Timer.stop() self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + 'Calculix done!
' - self.formUi.textEdit_Output.setText(self.OutStr) + self.form.textEdit_Output.setText(self.OutStr) - self.formUi.pushButton_generate.setText("Re-run Calculix") + self.form.pushButton_generate.setText("Re-run Calculix") print "Loading results...." self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + 'Loading result sets...
' - self.formUi.textEdit_Output.setText(self.OutStr) - self.formUi.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start) ) + self.form.textEdit_Output.setText(self.OutStr) + self.form.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start) ) QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) CalculixLib.importFrd(self.Basename + '.frd',FemGui.getActiveAnalysis() ) QApplication.restoreOverrideCursor() self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + 'Loading results done!
' - self.formUi.textEdit_Output.setText(self.OutStr) - self.formUi.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start) ) + self.form.textEdit_Output.setText(self.OutStr) + self.form.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start) ) def getStandardButtons(self): return int(QtGui.QDialogButtonBox.Close) def update(self): 'fills the widgets' - self.formUi.lineEdit_outputDir.setText(tempfile.gettempdir()) + self.form.lineEdit_outputDir.setText(tempfile.gettempdir()) return def accept(self): @@ -307,17 +304,17 @@ class _JobControlTaskPanel: dirname = QtGui.QFileDialog.getExistingDirectory(None, 'Choose material directory',self.params.GetString("JobDir",'/')) if(dirname): self.params.SetString("JobDir",str(dirname)) - self.formUi.lineEdit_outputDir.setText(dirname) + self.form.lineEdit_outputDir.setText(dirname) def run(self): self.Start = time.time() - #dirName = self.formUi.lineEdit_outputDir.text() + #dirName = self.form.lineEdit_outputDir.text() dirName = self.TempDir print 'run() dir:',dirName self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + 'Check dependencies...
' - self.formUi.textEdit_Output.setText(self.OutStr) - self.formUi.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start) ) + self.form.textEdit_Output.setText(self.OutStr) + self.form.label_Time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start) ) MeshObject = None if FemGui.getActiveAnalysis(): for i in FemGui.getActiveAnalysis().Member: @@ -362,10 +359,10 @@ class _JobControlTaskPanel: filename = self.Basename + '.inp' self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + self.Basename + '
' - self.formUi.textEdit_Output.setText(self.OutStr) + self.form.textEdit_Output.setText(self.OutStr) self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + 'Write mesh...
' - self.formUi.textEdit_Output.setText(self.OutStr) + self.form.textEdit_Output.setText(self.OutStr) MeshObject.FemMesh.writeABAQUS(filename) # reopen file with "append" and add the analysis definition @@ -373,7 +370,7 @@ class _JobControlTaskPanel: inpfile.write('\n\n') self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + 'Write loads & Co...
' - self.formUi.textEdit_Output.setText(self.OutStr) + self.form.textEdit_Output.setText(self.OutStr) # write the fixed node set NodeSetName = FixedObject.Name @@ -440,10 +437,10 @@ class _JobControlTaskPanel: inpfile.write('*END STEP \n') self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + self.CalculixBinary + '
' - self.formUi.textEdit_Output.setText(self.OutStr) + self.form.textEdit_Output.setText(self.OutStr) self.OutStr = self.OutStr + '{0:4.1f}: '.format(time.time() - self.Start) + 'Run Calculix...
' - self.formUi.textEdit_Output.setText(self.OutStr) + self.form.textEdit_Output.setText(self.OutStr) # run Claculix print 'run Calclulix at:', self.CalculixBinary , ' with: ', self.Basename @@ -458,20 +455,17 @@ class _ResultControlTaskPanel: # the panel has a tree widget that contains categories # for the subcomponents, such as additions, subtractions. # the categories are shown only if they are not empty. - form_class, base_class = uic.loadUiType(FreeCAD.getHomePath() + "Mod/Fem/ShowDisplacement.ui") + self.form=FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/ShowDisplacement.ui") self.obj = object - self.formUi = form_class() - self.form = QtGui.QWidget() - self.formUi.setupUi(self.form) #Connect Signals and Slots - QtCore.QObject.connect(self.formUi.comboBox_Type, QtCore.SIGNAL("currentIndexChanged(QString)"), self.typeChanged) + QtCore.QObject.connect(self.form.comboBox_Type, QtCore.SIGNAL("currentIndexChanged(QString)"), self.typeChanged) - QtCore.QObject.connect(self.formUi.checkBox_ShowDisplacement, QtCore.SIGNAL("clicked(bool)"), self.showDisplacementClicked) - QtCore.QObject.connect(self.formUi.verticalScrollBar_Factor, QtCore.SIGNAL("valueChanged(int)"), self.sliderValue) - QtCore.QObject.connect(self.formUi.spinBox_SliderFactor, QtCore.SIGNAL("valueChanged(double)"), self.sliderMaxValue) - QtCore.QObject.connect(self.formUi.spinBox_DisplacementFactor, QtCore.SIGNAL("valueChanged(double)"), self.displacementFactorValue) + QtCore.QObject.connect(self.form.checkBox_ShowDisplacement, QtCore.SIGNAL("clicked(bool)"), self.showDisplacementClicked) + QtCore.QObject.connect(self.form.verticalScrollBar_Factor, QtCore.SIGNAL("valueChanged(int)"), self.sliderValue) + QtCore.QObject.connect(self.form.spinBox_SliderFactor, QtCore.SIGNAL("valueChanged(int)"), self.sliderMaxValue) + QtCore.QObject.connect(self.form.spinBox_DisplacementFactor, QtCore.SIGNAL("valueChanged(int)"), self.displacementFactorValue) self.DisplacementObject = None self.StressObject = None @@ -490,16 +484,21 @@ class _ResultControlTaskPanel: return QtGui.qApp.setOverrideCursor(QtCore.Qt.WaitCursor) - if typeName[:2] == "Ua" and self.DisplacementObject: - values = self.DisplacementObject.Values - maxL = 0.0 - for i in values: - if i.Length > maxL: - maxL = i.Length + + if typeName[:2] == "Ua" and self.DisplacementObject: + (min,max,avg) = self.MeshObject.ViewObject.setNodeColorByResult(self.DisplacementObject) + if typeName[:2] == "U1" and self.DisplacementObject: + (min,max,avg) = self.MeshObject.ViewObject.setNodeColorByResult(self.DisplacementObject,1) + if typeName[:2] == "U2" and self.DisplacementObject: + (min,max,avg) = self.MeshObject.ViewObject.setNodeColorByResult(self.DisplacementObject,2) + if typeName[:2] == "U3" and self.DisplacementObject: + (min,max,avg) = self.MeshObject.ViewObject.setNodeColorByResult(self.DisplacementObject,3) + if typeName[:2] == "Sa" and self.StressObject: + (min,max,avg) = self.MeshObject.ViewObject.setNodeColorByResult(self.StressObject) - self.formUi.lineEdit_Max.setText(str(maxL)) - - self.MeshObject.ViewObject.setNodeColorByResult(self.DisplacementObject) + self.form.lineEdit_Max.setText(str(max)) + self.form.lineEdit_Min.setText(str(min)) + self.form.lineEdit_Avg.setText(str(avg)) print typeName @@ -512,18 +511,18 @@ class _ResultControlTaskPanel: QtGui.qApp.restoreOverrideCursor() def sliderValue(self,value): - if(self.formUi.checkBox_ShowDisplacement.isChecked()): + if(self.form.checkBox_ShowDisplacement.isChecked()): self.MeshObject.ViewObject.animate(value) - self.formUi.spinBox_DisplacementFactor.setValue(value) + self.form.spinBox_DisplacementFactor.setValue(value) def sliderMaxValue(self,value): print 'sliderMaxValue()' - self.formUi.verticalScrollBar_Factor.setMaximum(value) + self.form.verticalScrollBar_Factor.setMaximum(value) def displacementFactorValue(self,value): print 'displacementFactorValue()' - self.formUi.verticalScrollBar_Factor.setValue(value) + self.form.verticalScrollBar_Factor.setValue(value) def setDisplacement(self): if self.DisplacementObject: @@ -533,7 +532,7 @@ class _ResultControlTaskPanel: if self.StressObject: values = self.StressObject.Values maxVal = max(values) - self.formUi.doubleSpinBox_MinValueColor.setValue(maxVal) + self.form.doubleSpinBox_MinValueColor.setValue(maxVal) self.MeshObject.ViewObject.setNodeColorByResult(self.StressObject) @@ -550,15 +549,15 @@ class _ResultControlTaskPanel: if i.isDerivedFrom("Fem::FemResultVector"): if i.DataType == 'Displacement': self.DisplacementObject = i - self.formUi.comboBox_Type.addItem("U1 (Disp. X)") - self.formUi.comboBox_Type.addItem("U2 (Disp. Y)") - self.formUi.comboBox_Type.addItem("U3 (Disp. z)") - self.formUi.comboBox_Type.addItem("Uabs (Disp. abs)") + self.form.comboBox_Type.addItem("U1 (Disp. X)") + self.form.comboBox_Type.addItem("U2 (Disp. Y)") + self.form.comboBox_Type.addItem("U3 (Disp. z)") + self.form.comboBox_Type.addItem("Uabs (Disp. abs)") for i in FemGui.getActiveAnalysis().Member: if i.isDerivedFrom("Fem::FemResultValue"): if i.DataType == 'VanMisesStress': self.StressObject = i - self.formUi.comboBox_Type.addItem("Sabs (Van Mises Stress)") + self.form.comboBox_Type.addItem("Sabs (Van Mises Stress)") def accept(self): FreeCADGui.Control.closeDialog() diff --git a/src/Mod/Fem/ShowDisplacement.ui b/src/Mod/Fem/ShowDisplacement.ui index a87145699..c532c40b5 100644 --- a/src/Mod/Fem/ShowDisplacement.ui +++ b/src/Mod/Fem/ShowDisplacement.ui @@ -41,10 +41,13 @@ - + true + + mm + @@ -55,10 +58,13 @@ - + true + + mm + @@ -69,10 +75,13 @@ - + true + + mm + @@ -108,13 +117,13 @@ - true + false 99999 - 2 + 10 1 @@ -135,13 +144,13 @@ - true + false 99999 - 5 + 10 100 @@ -186,6 +195,13 @@ + + + Gui::InputField + QLineEdit +
Gui/InputField.h
+
+