diff --git a/src/Gui/ViewProviderMaterialObject.h b/src/Gui/ViewProviderMaterialObject.h index ebb8754d8..5990bdd88 100644 --- a/src/Gui/ViewProviderMaterialObject.h +++ b/src/Gui/ViewProviderMaterialObject.h @@ -44,6 +44,9 @@ public: bool doubleClicked(void); + // shows solid in the tree + virtual bool isShow(void) const{return true;} + }; typedef ViewProviderPythonFeatureT ViewProviderMaterialObjectPython; diff --git a/src/Mod/Fem/App/FemMeshShapeNetgenObject.cpp b/src/Mod/Fem/App/FemMeshShapeNetgenObject.cpp index 293cbc760..a0e356e27 100644 --- a/src/Mod/Fem/App/FemMeshShapeNetgenObject.cpp +++ b/src/Mod/Fem/App/FemMeshShapeNetgenObject.cpp @@ -57,7 +57,7 @@ const char* FininessEnums[]= {"VeryCoarse","Coarse","Moderate","Fine","VeryFine" FemMeshShapeNetgenObject::FemMeshShapeNetgenObject() { ADD_PROPERTY_TYPE(MaxSize,(1000), "MeshParams",Prop_None,"Maximum element size"); - ADD_PROPERTY_TYPE(SecondOrder,(false), "MeshParams",Prop_None,"Create quadric elements"); + ADD_PROPERTY_TYPE(SecondOrder,(true), "MeshParams",Prop_None,"Create quadric elements"); ADD_PROPERTY_TYPE(Fininess,(2), "MeshParams",Prop_None,"Fininess level of the mesh"); Fininess.setEnums(FininessEnums); ADD_PROPERTY_TYPE(GrowthRate,(0.3), "MeshParams",Prop_None," allows to define how much the linear dimensions of two adjacent cells can differ"); diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 0a4396984..56b2f9e37 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -16,6 +16,7 @@ INSTALL( MechanicalMaterial.py MechanicalMaterial.ui MechanicalAnalysis.ui + ShowDisplacement.ui DESTINATION Mod/Fem ) diff --git a/src/Mod/Fem/Gui/Workbench.cpp b/src/Mod/Fem/Gui/Workbench.cpp index 1291cad2d..2acc9a1b6 100755 --- a/src/Mod/Fem/Gui/Workbench.cpp +++ b/src/Mod/Fem/Gui/Workbench.cpp @@ -56,14 +56,21 @@ Gui::ToolBarItem* Workbench::setupToolBars() const Gui::ToolBarItem* fem = new Gui::ToolBarItem(root); fem->setCommand("FEM"); *fem << "Fem_CreateFromShape" - << "Fem_NewMechanicalAnalysis" - << "Fem_FemAddPart" - << "Fem_CreateNodesSet" - << "Fem_ConstraintFixed" - << "Fem_ConstraintForce" - << "Fem_ConstraintBearing" - << "Fem_ConstraintGear" - << "Fem_ConstraintPulley"; + << "Separator" + << "Fem_MechanicalMaterial" + << "Fem_NewMechanicalAnalysis" + << "Fem_MechanicalJobControl" + << "Separator" + << "Fem_CreateNodesSet" + << "Separator" + << "Fem_ConstraintFixed" + << "Fem_ConstraintForce" + << "Fem_ConstraintBearing" + << "Fem_ConstraintGear" + << "Fem_ConstraintPulley" + << "Separator" + << "Fem_ShowStressResult" + << "Fem_ShowDisplacementResult"; return root; } @@ -75,15 +82,22 @@ Gui::MenuItem* Workbench::setupMenuBar() const root->insertItem(item, fem); fem->setCommand("&FEM"); *fem << "Fem_CreateFromShape" + << "Separator" << "Fem_MechanicalMaterial" << "Fem_NewMechanicalAnalysis" << "Fem_MechanicalJobControl" + << "Separator" << "Fem_CreateNodesSet" + << "Separator" << "Fem_ConstraintFixed" << "Fem_ConstraintForce" << "Fem_ConstraintBearing" << "Fem_ConstraintGear" - << "Fem_ConstraintPulley"; + << "Fem_ConstraintPulley" + << "Separator" + << "Fem_ShowStressResult" + << "Fem_ShowDisplacementResult" + ; return root; } diff --git a/src/Mod/Fem/MechanicalAnalysis.py b/src/Mod/Fem/MechanicalAnalysis.py index 68c3cc09b..f36ed54b2 100644 --- a/src/Mod/Fem/MechanicalAnalysis.py +++ b/src/Mod/Fem/MechanicalAnalysis.py @@ -85,7 +85,7 @@ class _CommandMechanicalJobControl: return {'Pixmap' : 'Fem_NewAnalysis', 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_JobControl","Start calculation"), 'Accel': "A", - 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_Analysis","Dialog to start the calculation of the machanical anlysis")} + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_JobControl","Dialog to start the calculation of the machanical anlysis")} def Activated(self): import FemGui @@ -101,6 +101,57 @@ class _CommandMechanicalJobControl: return FreeCADGui.ActiveDocument != None and FemGui.getActiveAnalysis() != None +class _CommandMechanicalShowStress: + "the Fem JobControl command definition" + def GetResources(self): + return {'Pixmap' : 'Fem_ResultStress', + 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_ResultStress","Show stress result"), + 'Accel': "A", + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_ResultStress","Show stress result")} + + def Activated(self): + import FemGui + + taskd = _JobControlTaskPanel(FemGui.getActiveAnalysis()) + #taskd.obj = vobj.Object + taskd.update() + FreeCADGui.Control.showDialog(taskd) + + + def IsActive(self): + import FemGui + return FreeCADGui.ActiveDocument != None and FemGui.getActiveAnalysis() != None + + +class _CommandMechanicalShowDisplacement: + "the Fem JobControl command definition" + def GetResources(self): + return {'Pixmap' : 'Fem_ResultDisplacement', + 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_ResultDisplacement","Show displacement result"), + 'Accel': "A", + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_ResultDisplacement","Show displacement result")} + + def Activated(self): + import FemGui + DisplacementObject = None + for i in FemGui.getActiveAnalysis().Member: + if i.isDerivedFrom("Fem::FemResultVector"): + DisplacementObject = i + if not DisplacementObject: + QtGui.QMessageBox.critical(None, "Missing prerequisit","No displacement result in active Analysis") + return + + taskd = _DisplacementControlTaskPanel(FemGui.getActiveAnalysis()) + #taskd.obj = vobj.Object + taskd.update() + FreeCADGui.Control.showDialog(taskd) + + + def IsActive(self): + import FemGui + return FreeCADGui.ActiveDocument != None and FemGui.getActiveAnalysis() != None + + class _FemAnalysis: "The Material object" @@ -134,7 +185,7 @@ class _ViewProviderFemAnalysis: vobj.Proxy = self def getIcon(self): - return ":/icons/Fem_FemMesh.svg" + return ":/icons/Fem_Analysis.svg" def attach(self, vobj): @@ -150,10 +201,17 @@ class _ViewProviderFemAnalysis: return def doubleClicked(self,vobj): - taskd = _JobControlTaskPanel(self.Object) - taskd.obj = vobj.Object - taskd.update() - FreeCADGui.Control.showDialog(taskd) + import FemGui + if FemGui.getActiveAnalysis() == None: + if FreeCADGui.activeWorkbench().name() != 'FemWorkbench': + FreeCADGui.activateWorkbench("FemWorkbench") + FemGui.setActiveAnalysis(self.Object) + return True + else: + taskd = _JobControlTaskPanel(self.Object) + taskd.obj = vobj.Object + taskd.update() + FreeCADGui.Control.showDialog(taskd) return True @@ -233,25 +291,72 @@ class _JobControlTaskPanel: return matmap = MathObject.Material - IsoNodeObject = None + FixedObject = None for i in FemGui.getActiveAnalysis().Member: - if i.isDerivedFrom("Fem::FemSetNodesObject"): - IsoNodeObject = i - if not IsoNodeObject: - QtGui.QMessageBox.critical(None, "Missing prerequisit","No Isostatic nodes defined in the Analysis") + if i.isDerivedFrom("Fem::ConstraintFixed"): + FixedObject = i + if not FixedObject: + QtGui.QMessageBox.critical(None, "Missing prerequisit","No fixed-constraint nodes defined in the Analysis") return - IsoNodes = IsoNodeObject.Nodes + + ForceObject = None + for i in FemGui.getActiveAnalysis().Member: + if i.isDerivedFrom("Fem::ConstraintForce"): + ForceObject = i + if not ForceObject: + QtGui.QMessageBox.critical(None, "Missing prerequisit","No force-constraint nodes defined in the Analysis") + return + filename_without_suffix = MeshObject.Name #current_file_name - young_modulus = float(matmap['FEM_youngsmodulus']) - poisson_ratio = float(matmap['PartDist_poissonratio']) + #young_modulus = float(matmap['FEM_youngsmodulus']) + #poisson_ratio = float(matmap['FEM_poissonratio']) +class _DisplacementControlTaskPanel: + '''The control for the displacement post-processing''' + def __init__(self,object): + # 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.obj = object + self.formUi = form_class() + self.form = QtGui.QWidget() + self.formUi.setupUi(self.form) + + #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) + + self.update() + + + + def getStandardButtons(self): + return int(QtGui.QDialogButtonBox.Close) + def update(self): + 'fills the widgets' + #self.formUi.lineEdit_outputDir.setText(self.params.GetString("JobDir",'/')) + return + + def accept(self): + FreeCADGui.Control.closeDialog() + + + def reject(self): + FreeCADGui.Control.closeDialog() + + + FreeCADGui.addCommand('Fem_NewMechanicalAnalysis',_CommandNewMechanicalAnalysis()) FreeCADGui.addCommand('Fem_MechanicalJobControl',_CommandMechanicalJobControl()) +FreeCADGui.addCommand('Fem_ShowStressResult',_CommandMechanicalShowStress()) +FreeCADGui.addCommand('Fem_ShowDisplacementResult',_CommandMechanicalShowDisplacement()) diff --git a/src/Mod/Fem/ShowDisplacement.ui b/src/Mod/Fem/ShowDisplacement.ui new file mode 100644 index 000000000..8e5fa0571 --- /dev/null +++ b/src/Mod/Fem/ShowDisplacement.ui @@ -0,0 +1,123 @@ + + + ShowDisplacement + + + + 0 + 0 + 193 + 354 + + + + Mechanical analysis + + + + + + + + + + Use color + + + true + + + + + + + Qt::Horizontal + + + + + + + + + Max: + + + + + + + true + + + + + + + + + + + Avg: + + + + + + + true + + + + + + + + + Qt::Horizontal + + + + + + + + + Factor: + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 168 + + + + + + + + + + Qt::Vertical + + + + + + + +