From eadc02d65db773113d8935f1c77f2bc74fcf9986 Mon Sep 17 00:00:00 2001 From: jriegel Date: Sat, 12 Apr 2014 19:09:40 +0200 Subject: [PATCH] some fixes in Fem --- src/Mod/Fem/Gui/ViewProviderFemMesh.h | 1 + src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp | 56 +++++++-- src/Mod/Fem/MechanicalAnalysis.py | 63 +++++----- src/Mod/Fem/ShowDisplacement.ui | 122 +++++-------------- 4 files changed, 102 insertions(+), 140 deletions(-) diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.h b/src/Mod/Fem/Gui/ViewProviderFemMesh.h index 174591685..22e3fa796 100755 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.h +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.h @@ -103,6 +103,7 @@ public: * color or certain elements. */ //@{ + /// set the color for each node void setColorByNodeId(const std::map &NodeColorMap); void setColorByNodeId(const std::vector &NodeIds,const std::vector &NodeColors); diff --git a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp index 0481b5b8a..cb522432f 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp @@ -37,21 +37,29 @@ PyObject* ViewProviderFemMeshPy::animate(PyObject * args) App::Color calcColor(double value,double min, double max) { + if (max < 0) max = 0; + if (min > 0) min = 0; + if (value < min) - return App::Color (0.0,1.0,0.0); + return App::Color (0.0,0.0,1.0); if (value > max) return App::Color (1.0,0.0,0.0); - if ( value < (min + (max-min)/2.0 )) - return App::Color ((value-min) / ((max-min)/2.0),1.0,0.0) ; - else - return App::Color (1.0,1-((value-min-((max-min)/2.0)) / ((max-min)/2.0)),0.0); + if ( value > max/2.0 ) + return App::Color (1.0,1-((value-(max/2.0)) / (max/2.0)),0.0); + if ( value > 0.0 ) + return App::Color (value/(max/2.0),1.0,0.0) ; + if ( value < min/2.0 ) + return App::Color (0.0,1-((value-(min/2.0)) / (min/2.0)),1.0); + if ( value < 0.0 ) + return App::Color (0.0,1.0,value/(min/2.0)) ; } PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args) { PyObject *object=0; - if (PyArg_ParseTuple(args,"O!",&(App::DocumentObjectPy::Type), &object)) { + int type = 0; + if (PyArg_ParseTuple(args,"O!|i",&(App::DocumentObjectPy::Type), &object, &type)) { App::DocumentObject* obj = static_cast(object)->getDocumentObjectPtr(); if (obj && obj->getTypeId().isDerivedFrom(Fem::FemResultValue::getClassTypeId())){ Fem::FemResultValue *result = static_cast(obj); @@ -77,16 +85,40 @@ PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args) const std::vector & Ids = result->ElementNumbers.getValues() ; const std::vector & Vecs = result->Values.getValues() ; std::vector NodeColors(Vecs.size()); - float max = 0.0; - for(std::vector::const_iterator it= Vecs.begin();it!=Vecs.end();++it) - if(it->Length() > max) - max = it->Length(); + double max = -1e12; + double min = +1e12; + for(std::vector::const_iterator it= Vecs.begin();it!=Vecs.end();++it){ + double val; + if(type == 0) + val = it->Length(); + else if (type == 1) + val = it->x; + else if (type == 2) + val = it->y; + else if (type == 3) + val = it->z; + else + val = it->Length(); + if(val > max) + max = val; + if(val < min) + min = val; + } // fill up color vector long i=0; for(std::vector::const_iterator it= Vecs.begin();it!=Vecs.end();++it,i++) - NodeColors[i] = calcColor(it->Length(),0.0,max); - + if(type == 0) + NodeColors[i] = calcColor(it->Length(),0.0,max); + else if (type == 1) + NodeColors[i] = calcColor(it->x,0.0,max); + else if (type == 2) + NodeColors[i] = calcColor(it->y,0.0,max); + else if (type == 3) + NodeColors[i] = calcColor(it->z,0.0,max); + else + NodeColors[i] = calcColor(it->Length(),0.0,max); + // set the color to the view-provider this->getViewProviderFemMeshPtr()->setColorByNodeId(Ids,NodeColors); diff --git a/src/Mod/Fem/MechanicalAnalysis.py b/src/Mod/Fem/MechanicalAnalysis.py index d678e8f78..15c6574a4 100644 --- a/src/Mod/Fem/MechanicalAnalysis.py +++ b/src/Mod/Fem/MechanicalAnalysis.py @@ -130,8 +130,6 @@ class _CommandMechanicalShowResult: return taskd = _ResultControlTaskPanel(FemGui.getActiveAnalysis()) - #taskd.obj = vobj.Object - taskd.update() FreeCADGui.Control.showDialog(taskd) @@ -197,8 +195,6 @@ class _ViewProviderFemAnalysis: return True else: taskd = _JobControlTaskPanel(self.Object) - taskd.obj = vobj.Object - taskd.update() FreeCADGui.Control.showDialog(taskd) return True @@ -470,13 +466,10 @@ class _ResultControlTaskPanel: self.formUi.setupUi(self.form) #Connect Signals and Slots - QtCore.QObject.connect(self.formUi.radioButton_Displacement, QtCore.SIGNAL("clicked(bool)"), self.displacementClicked) - QtCore.QObject.connect(self.formUi.radioButton_Stress, QtCore.SIGNAL("clicked(bool)"), self.stressClicked) - QtCore.QObject.connect(self.formUi.radioButton_NoColor, QtCore.SIGNAL("clicked(bool)"), self.noColorClicked) + QtCore.QObject.connect(self.formUi.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) @@ -490,20 +483,28 @@ class _ResultControlTaskPanel: def getStandardButtons(self): return int(QtGui.QDialogButtonBox.Close) - def displacementClicked(self,bool): + def typeChanged(self,typeName): + if typeName == "None": + self.MeshObject.ViewObject.NodeColor = {} + self.MeshObject.ViewObject.ElementColor = {} + return + QtGui.qApp.setOverrideCursor(QtCore.Qt.WaitCursor) - self.setColorDisplacement() + 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 + + self.formUi.lineEdit_Max.setText(str(maxL)) + + self.MeshObject.ViewObject.setNodeColorByResult(self.DisplacementObject) + + print typeName + QtGui.qApp.restoreOverrideCursor() - def stressClicked(self,bool): - print 'stressClicked()' - QtGui.qApp.setOverrideCursor(QtCore.Qt.WaitCursor) - self.setColorStress() - QtGui.qApp.restoreOverrideCursor() - - def noColorClicked(self,bool): - self.MeshObject.ViewObject.NodeColor = {} - self.MeshObject.ViewObject.ElementColor = {} def showDisplacementClicked(self,bool): QtGui.qApp.setOverrideCursor(QtCore.Qt.WaitCursor) @@ -523,20 +524,7 @@ class _ResultControlTaskPanel: def displacementFactorValue(self,value): print 'displacementFactorValue()' self.formUi.verticalScrollBar_Factor.setValue(value) - - def setColorDisplacement(self): - if self.DisplacementObject: - values = self.DisplacementObject.Values - maxL = 0.0 - for i in values: - if i.Length > maxL: - maxL = i.Length - - self.formUi.lineEdit_Max.setText(str(maxL)) - self.formUi.doubleSpinBox_MinValueColor.setValue(maxL) - - self.MeshObject.ViewObject.setNodeColorByResult(self.DisplacementObject) - + def setDisplacement(self): if self.DisplacementObject: self.MeshObject.ViewObject.setNodeDisplacementByResult(self.DisplacementObject) @@ -551,7 +539,7 @@ class _ResultControlTaskPanel: def update(self): 'fills the widgets' - + print "Update-------------------------------" self.MeshObject = None if FemGui.getActiveAnalysis(): for i in FemGui.getActiveAnalysis().Member: @@ -562,10 +550,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)") 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)") def accept(self): FreeCADGui.Control.closeDialog() diff --git a/src/Mod/Fem/ShowDisplacement.ui b/src/Mod/Fem/ShowDisplacement.ui index 71d40d880..a87145699 100644 --- a/src/Mod/Fem/ShowDisplacement.ui +++ b/src/Mod/Fem/ShowDisplacement.ui @@ -7,7 +7,7 @@ 0 0 186 - 416 + 371 @@ -23,66 +23,56 @@ - - - Stress - - - false - + + + + None + + - - - Displacement - - - false - - - - - - - No color - - - true - - - - - + - + - Max: + Avg: - + true - + + + Max: + + + + + + + true + + + + + Min: - - + + true - - 99999990.000000000000000 - @@ -90,60 +80,6 @@ - - - - Statistic - - - - QFormLayout::AllNonFixedFieldsGrow - - - - - Max: - - - - - - - true - - - - - - - Min: - - - - - - - true - - - - - - - Avg: - - - - - - - true - - - - - - @@ -225,7 +161,7 @@ 20 - 18 + 240