diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index f84b4a9966..afb32492c9 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -68,6 +68,9 @@ SET(FemScripts_SRCS _CommandBeamSection.py _CommandControlSolver.py _CommandConstraintSelfWeight.py + _CommandFEMMesh2Mesh.py + _CommandMechanicalMaterial.py + _CommandShowResult.py _CommandMaterialMechanicalNonlinear.py _CommandMechanicalMaterial.py _CommandMeshGmshFromShape.py @@ -116,6 +119,7 @@ SET(FemScripts_SRCS FemInputWriterCcx.py FemInputWriterZ88.py FemMaterialMechanicalNonlinear.py + FemMesh2Mesh.py FemMeshGmsh.py FemMeshTools.py FemShellThickness.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 1d5636a81a..794b56e5e2 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -45,6 +45,9 @@ INSTALL( FemGmshTools.py + FemMesh2Mesh.py + _CommandFEMMesh2Mesh.py + FemBeamSection.py _FemBeamSection.py _ViewProviderFemBeamSection.py diff --git a/src/Mod/Fem/FemCommands.py b/src/Mod/Fem/FemCommands.py index 76e310a0c9..7c6f505d19 100644 --- a/src/Mod/Fem/FemCommands.py +++ b/src/Mod/Fem/FemCommands.py @@ -58,6 +58,10 @@ class FemCommands(object): active = FemGui.getActiveAnalysis() is not None and self.active_analysis_in_active_doc() and self.results_present() elif self.is_active == 'with_part_feature': active = FreeCADGui.ActiveDocument is not None and self.part_feature_selected() + elif self.is_active == 'with_femmesh': + active = FreeCADGui.ActiveDocument is not None and self.femmesh_selected() + elif self.is_active == 'with_femmesh_andor_res': + active = FreeCADGui.ActiveDocument is not None and self.with_femmesh_andor_res_selected() elif self.is_active == 'with_material': active = FemGui.getActiveAnalysis() is not None and self.active_analysis_in_active_doc() and self.material_selected() elif self.is_active == 'with_solver': @@ -81,6 +85,13 @@ class FemCommands(object): else: return False + def femmesh_selected(self): + sel = FreeCADGui.Selection.getSelection() + if len(sel) == 1 and sel[0].isDerivedFrom("Fem::FemMeshObject"): + return True + else: + return False + def material_selected(self): sel = FreeCADGui.Selection.getSelection() if len(sel) == 1 and sel[0].isDerivedFrom("App::MaterialObjectPython"): @@ -88,6 +99,26 @@ class FemCommands(object): else: return False + def with_femmesh_andor_res_selected(self): + sel = FreeCADGui.Selection.getSelection() + if len(sel) == 1 and sel[0].isDerivedFrom("Fem::FemMeshObject"): + return True + elif len(sel) == 2: + if(sel[0].isDerivedFrom("Fem::FemMeshObject")): + if(sel[1].isDerivedFrom("Fem::FemResultObject")): + return True + else: + return False + elif(sel[1].isDerivedFrom("Fem::FemMeshObject")): + if(sel[0].isDerivedFrom("Fem::FemResultObject")): + return True + else: + return False + else: + return False + else: + return False + def active_analysis_in_active_doc(self): return FemGui.getActiveAnalysis().Document is FreeCAD.ActiveDocument diff --git a/src/Mod/Fem/FemGmshTools.py b/src/Mod/Fem/FemGmshTools.py index a93c373650..26fd8d728f 100644 --- a/src/Mod/Fem/FemGmshTools.py +++ b/src/Mod/Fem/FemGmshTools.py @@ -29,6 +29,7 @@ __url__ = "http://www.freecadweb.org" import FreeCAD import Fem +import Units import subprocess import tempfile from platform import system @@ -48,12 +49,12 @@ class FemGmshTools(): self.part_obj = self.mesh_obj.Part # clmax, ElementSizeMax: float, 0.0 = 1e+22 - self.clmax = self.mesh_obj.ElementSizeMax + self.clmax = Units.Quantity(self.mesh_obj.ElementSizeMax).Value if self.clmax == 0.0: self.clmax = 1e+22 # clmin, ElementSizeMin: float - self.clmin = self.mesh_obj.ElementSizeMin + self.clmin = Units.Quantity(self.mesh_obj.ElementSizeMin).Value # order, ElementOrder: ['Auto', '1st', '2nd'] self.order = self.mesh_obj.ElementOrder diff --git a/src/Mod/Fem/FemMesh2Mesh.py b/src/Mod/Fem/FemMesh2Mesh.py new file mode 100644 index 0000000000..f10087a0c4 --- /dev/null +++ b/src/Mod/Fem/FemMesh2Mesh.py @@ -0,0 +1,176 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Frantisek Loeffelmann * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "FemMesh to Mesh converter" +__author__ = "Frantisek Loeffelmann, Ulrich Brammer, Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package FwmMesh2Mesh +# \ingroup FEM + +import time +# import Mesh + + +''' +load FreeCADs 3D FEM example from Start Workbench + +femmesh = App.ActiveDocument.getObject("Box_Mesh").FemMesh +result = App.ActiveDocument.getObject("CalculiX_static_results") +import FemMesh2Mesh +out_mesh = FemMesh2Mesh.femmesh_2_mesh(femmesh, result) +import Mesh +Mesh.show(Mesh.Mesh(out_mesh)) + +''' +# These dictionaries list the nodes, that define faces of an element. +# The key is the face number, used internally by FreeCAD. +# The list contains the nodes in the element for each face. +tetFaces = { + 1: [0, 1, 2], + 2: [0, 3, 1], + 3: [1, 3, 2], + 4: [2, 3, 0]} + +pentaFaces = { + 1: [0, 1, 2], + 2: [3, 5, 4], + 3: [0, 3, 4, 1], + 4: [1, 4, 5, 2], + 5: [0, 2, 5, 3]} + +hexaFaces = { # hexa8 or hexa20 (ignoring mid-nodes) + 1: [0, 1, 2, 3], + 2: [4, 7, 6, 5], + 3: [0, 4, 5, 1], + 4: [1, 5, 6, 2], + 5: [2, 6, 7, 3], + 6: [3, 7, 4, 0]} + +pyraFaces = { # pyra5 or pyra13 (ignoring mid-nodes) + 1: [0, 1, 2, 3], + 2: [0, 4, 1], + 3: [1, 4, 2], + 4: [2, 4, 3], + 5: [3, 4, 0]} + +face_dicts = { + 4: tetFaces, + 5: pyraFaces, + 6: pentaFaces, + 8: hexaFaces, + 10: tetFaces, + 13: pyraFaces, + 15: pentaFaces, + 20: hexaFaces} + + +def femmesh_2_mesh(myFemMesh, myResults=None): + shiftBits = 20 # allows a million nodes, needs to be higher for more nodes in a FemMesh + + # This code generates a dict and a faceCode for each face of all elements + # All faceCodes are than sorted. + + start_time = time.clock() + faceCodeList = [] + faceCodeDict = {} + + for ele in myFemMesh.Volumes: + element_nodes = myFemMesh.getElementNodes(ele) + # print 'element_node: ', element_nodes + faceDef = face_dicts[len(element_nodes)] + + for key in faceDef: + nodeList = [] + codeList = [] + faceCode = 0 + shifter = 0 + for nodeIdx in faceDef[key]: + nodeList.append(element_nodes[nodeIdx]) + codeList.append(element_nodes[nodeIdx]) + codeList.sort() + for node in codeList: + faceCode += (node << shifter) + # x << n: x shifted left by n bits = Multiplication + shifter += shiftBits + # print 'codeList: ', codeList + faceCodeDict[faceCode] = nodeList + faceCodeList.append(faceCode) + + faceCodeList.sort() + allFaces = len(faceCodeList) + actFaceIdx = 0 + singleFaces = [] + # Here we search for faces, which do not have a counterpart. + # These are the faces on the surface of the mesh. + while actFaceIdx < allFaces: + if actFaceIdx < (allFaces - 1): + if faceCodeList[actFaceIdx] == faceCodeList[actFaceIdx + 1]: + actFaceIdx += 2 + else: + # print 'found a single Face: ', faceCodeList[actFaceIdx] + singleFaces.append(faceCodeList[actFaceIdx]) + actFaceIdx += 1 + else: + print 'found a last Face: ', faceCodeList[actFaceIdx] + singleFaces.append(faceCodeList[actFaceIdx]) + actFaceIdx += 1 + + output_mesh = [] + if myResults: + print(myResults.Name) + for myFace in singleFaces: + face_nodes = faceCodeDict[myFace] + dispVec0 = myResults.DisplacementVectors[myResults.NodeNumbers.index(face_nodes[0])] + dispVec1 = myResults.DisplacementVectors[myResults.NodeNumbers.index(face_nodes[1])] + dispVec2 = myResults.DisplacementVectors[myResults.NodeNumbers.index(face_nodes[2])] + triangle = [myFemMesh.getNodeById(face_nodes[0]) + dispVec0, + myFemMesh.getNodeById(face_nodes[1]) + dispVec1, + myFemMesh.getNodeById(face_nodes[2]) + dispVec2] + output_mesh.extend(triangle) + # print 'my triangle: ', triangle + if len(face_nodes) == 4: + dispVec3 = myResults.DisplacementVectors[myResults.NodeNumbers.index(face_nodes[3])] + triangle = [myFemMesh.getNodeById(face_nodes[2]) + dispVec2, + myFemMesh.getNodeById(face_nodes[3]) + dispVec3, + myFemMesh.getNodeById(face_nodes[0]) + dispVec0] + output_mesh.extend(triangle) + # print 'my 2. triangle: ', triangle + + else: + for myFace in singleFaces: + face_nodes = faceCodeDict[myFace] + triangle = [myFemMesh.getNodeById(face_nodes[0]), + myFemMesh.getNodeById(face_nodes[1]), + myFemMesh.getNodeById(face_nodes[2])] + output_mesh.extend(triangle) + # print 'my triangle: ', triangle + if len(face_nodes) == 4: + triangle = [myFemMesh.getNodeById(face_nodes[2]), + myFemMesh.getNodeById(face_nodes[3]), + myFemMesh.getNodeById(face_nodes[0])] + output_mesh.extend(triangle) + # print 'my 2. triangle: ', triangle + + end_time = time.clock() + print 'Mesh by surface search method: ', end_time - start_time + return output_mesh diff --git a/src/Mod/Fem/Gui/Resources/Fem.qrc b/src/Mod/Fem/Gui/Resources/Fem.qrc index 7eb3d8a58d..1f914c0890 100755 --- a/src/Mod/Fem/Gui/Resources/Fem.qrc +++ b/src/Mod/Fem/Gui/Resources/Fem.qrc @@ -1,54 +1,58 @@ - icons/fem-fem-mesh-from-shape.svg - icons/fem-fem-mesh-gmsh-from-shape.svg - icons/fem-fem-mesh-netgen-from-shape.svg - icons/fem-fem-mesh-create-node-by-poly.svg - icons/fem-analysis.svg - icons/fem-cfd-analysis.svg - icons/fem-constraint-fluid-boundary.svg - icons/fem-solver.svg - icons/fem-constraint-displacement.svg - icons/fem-constraint-selfweight.svg - icons/fem-constraint-temperature.svg - icons/fem-constraint-InitialTemperature.svg - icons/fem-constraint-force.svg - icons/fem-constraint-fixed.svg - icons/fem-constraint-planerotation.svg - icons/fem-constraint-pressure.svg - icons/fem-constraint-heatflux.svg - icons/fem-constraint-bearing.svg - icons/fem-constraint-gear.svg - icons/fem-constraint-pulley.svg - icons/fem-constraint-contact.svg - icons/fem-constraint-transform.svg icons/fem-add-fem-mesh.svg icons/fem-add-material.svg icons/fem-add-part.svg + icons/fem-analysis.svg + icons/fem-beam-section.svg + icons/fem-box.svg + icons/fem-cfd-analysis.svg + icons/fem-constraint-bearing.svg + icons/fem-constraint-contact.svg + icons/fem-constraint-displacement.svg + icons/fem-constraint-fixed.svg + icons/fem-constraint-fluid-boundary.svg + icons/fem-constraint-force.svg + icons/fem-constraint-gear.svg + icons/fem-constraint-heatflux.svg + icons/fem-constraint-InitialTemperature.svg + icons/fem-constraint-planerotation.svg + icons/fem-constraint-pressure.svg + icons/fem-constraint-pulley.svg + icons/fem-constraint-selfweight.svg + icons/fem-constraint-temperature.svg + icons/fem-constraint-transform.svg + icons/fem-control-solver.svg + icons/fem-cylinder.svg + icons/fem-data.png + icons/fem-fem-mesh-create-node-by-poly.svg + icons/fem-fem-mesh-from-shape.svg + icons/fem-fem-mesh-gmsh-from-shape.svg + icons/fem-fem-mesh-netgen-from-shape.svg + icons/fem-femmesh-to-mesh.svg + icons/fem-frequency-analysis.svg icons/fem-inp-editor.svg icons/fem-material.svg icons/fem-material-nonlinear.svg - icons/fem-control-solver.svg + icons/fem-plane.svg icons/fem-purge-results.svg - icons/fem-run-solver.svg - icons/fem-frequency-analysis.svg - icons/fem-thermomechanical-analysis.svg - icons/fem-static-analysis.svg icons/fem-result.svg + icons/fem-run-solver.svg icons/fem-shell-thickness.svg - icons/fem-beam-section.svg - icons/preferences-fem.svg + icons/fem-solver.svg + icons/fem-sphere.svg + icons/fem-static-analysis.svg + icons/fem-thermomechanical-analysis.svg + icons/FemWorkbench.svg + icons/preferences-fem.svg + icons/fem-clip.png icons/fem-clip-scalar.png icons/fem-cut.png icons/fem-isosurface.png icons/fem-warp.png - icons/fem-data.png - icons/fem-plane.svg - icons/fem-box.svg - icons/fem-sphere.svg - icons/fem-cylinder.svg + translations/Fem_af.qm translations/Fem_de.qm translations/Fem_fi.qm diff --git a/src/Mod/Fem/Gui/Resources/icons/fem-femmesh-to-mesh.svg b/src/Mod/Fem/Gui/Resources/icons/fem-femmesh-to-mesh.svg new file mode 100644 index 0000000000..282ae08233 --- /dev/null +++ b/src/Mod/Fem/Gui/Resources/icons/fem-femmesh-to-mesh.svg @@ -0,0 +1,153 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Fem/Gui/Workbench.cpp b/src/Mod/Fem/Gui/Workbench.cpp index 543289e9bd..b3f4d9e8b7 100755 --- a/src/Mod/Fem/Gui/Workbench.cpp +++ b/src/Mod/Fem/Gui/Workbench.cpp @@ -55,7 +55,8 @@ Gui::ToolBarItem* Workbench::setupToolBars() const Gui::ToolBarItem* root = StdWorkbench::setupToolBars(); Gui::ToolBarItem* fem = new Gui::ToolBarItem(root); fem->setCommand("FEM"); - *fem << "Fem_Analysis" + *fem << "Fem_FemMesh2Mesh" + << "Fem_Analysis" << "Fem_SolverCalculix" // << "Fem_SolverZ88" << "Fem_MeshNetgenFromShape" @@ -113,10 +114,17 @@ Gui::MenuItem* Workbench::setupMenuBar() const { Gui::MenuItem* root = StdWorkbench::setupMenuBar(); Gui::MenuItem* item = root->findItem("&Windows"); + + Gui::MenuItem* util = new Gui::MenuItem; + util->setCommand("&Utilities"); + *util << "Fem_FemMesh2Mesh"; + Gui::MenuItem* fem = new Gui::MenuItem; root->insertItem(item, fem); fem->setCommand("&FEM"); - *fem << "Fem_Analysis" + *fem << util + << "Separator" + << "Fem_Analysis" << "Fem_SolverCalculix" << "Fem_SolverZ88" << "Fem_MeshNetgenFromShape" diff --git a/src/Mod/Fem/InitGui.py b/src/Mod/Fem/InitGui.py index 4aa64f99c8..d813bd4a4f 100644 --- a/src/Mod/Fem/InitGui.py +++ b/src/Mod/Fem/InitGui.py @@ -49,6 +49,7 @@ class FemWorkbench (Workbench): import _CommandRunSolver import _CommandPurgeResults import _CommandControlSolver + import _CommandFEMMesh2Mesh import _CommandMeshGmshFromShape import _CommandMeshNetgenFromShape import _CommandAnalysis diff --git a/src/Mod/Fem/_CommandAnalysis.py b/src/Mod/Fem/_CommandAnalysis.py index 11803349ae..9891faad0e 100644 --- a/src/Mod/Fem/_CommandAnalysis.py +++ b/src/Mod/Fem/_CommandAnalysis.py @@ -58,5 +58,4 @@ class _CommandAnalysis(FemCommands): FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [App.activeDocument()." + sel[0].Name + "]") FreeCADGui.Selection.clearSelection() -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_Analysis', _CommandAnalysis()) +FreeCADGui.addCommand('Fem_Analysis', _CommandAnalysis()) diff --git a/src/Mod/Fem/_CommandBeamSection.py b/src/Mod/Fem/_CommandBeamSection.py index 8f411756fb..7fb480c4fd 100644 --- a/src/Mod/Fem/_CommandBeamSection.py +++ b/src/Mod/Fem/_CommandBeamSection.py @@ -49,5 +49,4 @@ class _CommandBeamSection(FemCommands): FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemBeamSection.makeFemBeamSection()]") -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_BeamSection', _CommandBeamSection()) +FreeCADGui.addCommand('Fem_BeamSection', _CommandBeamSection()) diff --git a/src/Mod/Fem/_CommandConstraintSelfWeight.py b/src/Mod/Fem/_CommandConstraintSelfWeight.py index 604c653d05..0a2a704891 100644 --- a/src/Mod/Fem/_CommandConstraintSelfWeight.py +++ b/src/Mod/Fem/_CommandConstraintSelfWeight.py @@ -49,5 +49,4 @@ class _CommandConstraintSelfWeight(FemCommands): FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemConstraintSelfWeight.makeFemConstraintSelfWeight()]") -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_ConstraintSelfWeight', _CommandConstraintSelfWeight()) +FreeCADGui.addCommand('Fem_ConstraintSelfWeight', _CommandConstraintSelfWeight()) diff --git a/src/Mod/Fem/_CommandControlSolver.py b/src/Mod/Fem/_CommandControlSolver.py index b5029bb138..9184c966a2 100644 --- a/src/Mod/Fem/_CommandControlSolver.py +++ b/src/Mod/Fem/_CommandControlSolver.py @@ -27,7 +27,6 @@ __url__ = "http://www.freecadweb.org" ## @package CommandControlSolver # \ingroup FEM -import FreeCAD from FemCommands import FemCommands import FreeCADGui from PySide import QtCore @@ -51,5 +50,4 @@ class _CommandControlSolver(FemCommands): FreeCADGui.ActiveDocument.setEdit(solver_obj, 0) -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_ControlSolver', _CommandControlSolver()) +FreeCADGui.addCommand('Fem_ControlSolver', _CommandControlSolver()) diff --git a/src/Mod/Fem/_CommandFEMMesh2Mesh.py b/src/Mod/Fem/_CommandFEMMesh2Mesh.py new file mode 100644 index 0000000000..5cfade211b --- /dev/null +++ b/src/Mod/Fem/_CommandFEMMesh2Mesh.py @@ -0,0 +1,80 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2016 - Bernd Hahnebach * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +__title__ = "Command FEMMesh to Mesh" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package CommandFemMesh2Mesh +# \ingroup FEM + +import FreeCAD +from FemCommands import FemCommands + +import FreeCADGui +from PySide import QtCore + + +class _CommandFemMesh2Mesh(FemCommands): + # the Fem_FemMesh2Mesh command definition + def __init__(self): + super(_CommandFemMesh2Mesh, self).__init__() + self.resources = {'Pixmap': 'fem-femmesh-to-mesh', + 'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_FemMesh2Mesh", "FEM mesh to mesh"), + 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_FemMesh2Mesh", "Convert the surface of a FEM mesh to a mesh")} + self.is_active = 'with_femmesh_andor_res' + + def Activated(self): + FreeCAD.ActiveDocument.openTransaction("Create FEM mesh") + FreeCADGui.addModule("FemGui") + sel = FreeCADGui.Selection.getSelection() + if (len(sel) == 1): + if(sel[0].isDerivedFrom("Fem::FemMeshObject")): + FreeCAD.ActiveDocument.openTransaction("Create Mesh from FEMMesh") + FreeCADGui.addModule("FemMesh2Mesh") + FreeCADGui.doCommand("out_mesh = FemMesh2Mesh.femmesh_2_mesh(App.ActiveDocument." + sel[0].Name + ".FemMesh)") + FreeCADGui.addModule("Mesh") + FreeCADGui.doCommand("Mesh.show(Mesh.Mesh(out_mesh))") + FreeCADGui.doCommand("App.ActiveDocument." + sel[0].Name + ".ViewObject.hide()") + if (len(sel) == 2): + femmesh = None + res = None + if(sel[0].isDerivedFrom("Fem::FemMeshObject")): + if(sel[1].isDerivedFrom("Fem::FemResultObject")): + femmesh = sel[0] + res = sel[1] + elif(sel[1].isDerivedFrom("Fem::FemMeshObject")): + if(sel[0].isDerivedFrom("Fem::FemResultObject")): + femmesh = sel[1] + res = sel[0] + if femmesh and res: + FreeCAD.ActiveDocument.openTransaction("Create Mesh from FEMMesh") + FreeCADGui.addModule("FemMesh2Mesh") + FreeCADGui.doCommand("out_mesh = FemMesh2Mesh.femmesh_2_mesh(App.ActiveDocument." + femmesh.Name + ".FemMesh, App.ActiveDocument." + res.Name + ")") + FreeCADGui.addModule("Mesh") + FreeCADGui.doCommand("Mesh.show(Mesh.Mesh(out_mesh))") + FreeCADGui.doCommand("App.ActiveDocument." + femmesh.Name + ".ViewObject.hide()") + + FreeCADGui.Selection.clearSelection() + + +FreeCADGui.addCommand('Fem_FemMesh2Mesh', _CommandFemMesh2Mesh()) diff --git a/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py b/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py index 2e78978fa6..5564259612 100644 --- a/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py +++ b/src/Mod/Fem/_CommandMaterialMechanicalNonlinear.py @@ -74,5 +74,4 @@ class _CommandMaterialMechanicalNonlinear(FemCommands): if solver_object and solver_object.SolverType == 'FemSolverCalculix': solver_object.MaterialNonlinearity = "nonlinear" -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_MaterialMechanicalNonlinear', _CommandMaterialMechanicalNonlinear()) +FreeCADGui.addCommand('Fem_MaterialMechanicalNonlinear', _CommandMaterialMechanicalNonlinear()) diff --git a/src/Mod/Fem/_CommandMechanicalMaterial.py b/src/Mod/Fem/_CommandMechanicalMaterial.py index 97e312318b..8976d60694 100644 --- a/src/Mod/Fem/_CommandMechanicalMaterial.py +++ b/src/Mod/Fem/_CommandMechanicalMaterial.py @@ -55,5 +55,4 @@ class _CommandMechanicalMaterial(FemCommands): FreeCADGui.doCommand("Gui.activeDocument().setEdit(App.ActiveDocument.ActiveObject.Name)") -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_MechanicalMaterial', _CommandMechanicalMaterial()) +FreeCADGui.addCommand('Fem_MechanicalMaterial', _CommandMechanicalMaterial()) diff --git a/src/Mod/Fem/_CommandMeshGmshFromShape.py b/src/Mod/Fem/_CommandMeshGmshFromShape.py index c279232880..5044fff6f5 100644 --- a/src/Mod/Fem/_CommandMeshGmshFromShape.py +++ b/src/Mod/Fem/_CommandMeshGmshFromShape.py @@ -61,5 +61,4 @@ class _CommandMeshGmshFromShape(FemCommands): FreeCADGui.Selection.clearSelection() -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_MeshGmshFromShape', _CommandMeshGmshFromShape()) +FreeCADGui.addCommand('Fem_MeshGmshFromShape', _CommandMeshGmshFromShape()) diff --git a/src/Mod/Fem/_CommandMeshNetgenFromShape.py b/src/Mod/Fem/_CommandMeshNetgenFromShape.py index b44a161db5..877687a5bb 100644 --- a/src/Mod/Fem/_CommandMeshNetgenFromShape.py +++ b/src/Mod/Fem/_CommandMeshNetgenFromShape.py @@ -55,5 +55,4 @@ class _CommandMeshNetgenFromShape(FemCommands): FreeCADGui.Selection.clearSelection() -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_MeshNetgenFromShape', _CommandMeshNetgenFromShape()) +FreeCADGui.addCommand('Fem_MeshNetgenFromShape', _CommandMeshNetgenFromShape()) diff --git a/src/Mod/Fem/_CommandPurgeResults.py b/src/Mod/Fem/_CommandPurgeResults.py index edd60fcdda..11f43e14a2 100644 --- a/src/Mod/Fem/_CommandPurgeResults.py +++ b/src/Mod/Fem/_CommandPurgeResults.py @@ -27,7 +27,6 @@ __url__ = "http://www.freecadweb.org" ## @package CommandPurgeResults # \ingroup FEM -import FreeCAD from FemCommands import FemCommands import FemTools import FreeCADGui @@ -47,8 +46,7 @@ class _CommandPurgeResults(FemCommands): def Activated(self): fea = FemTools.FemTools() fea.reset_all() - self.hide_meshes_show_parts_constraints() -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_PurgeResults', _CommandPurgeResults()) + +FreeCADGui.addCommand('Fem_PurgeResults', _CommandPurgeResults()) diff --git a/src/Mod/Fem/_CommandRunSolver.py b/src/Mod/Fem/_CommandRunSolver.py index 1476c46bdb..2c37645345 100644 --- a/src/Mod/Fem/_CommandRunSolver.py +++ b/src/Mod/Fem/_CommandRunSolver.py @@ -27,7 +27,6 @@ __url__ = "http://www.freecadweb.org" ## @package CommandRunSolver # \ingroup FEM -import FreeCAD from FemCommands import FemCommands import FreeCADGui from PySide import QtCore, QtGui @@ -88,5 +87,4 @@ class _CommandRunSolver(FemCommands): tp.restore_result_dialog() -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_RunSolver', _CommandRunSolver()) +FreeCADGui.addCommand('Fem_RunSolver', _CommandRunSolver()) diff --git a/src/Mod/Fem/_CommandShellThickness.py b/src/Mod/Fem/_CommandShellThickness.py index 1b77f7642c..9e757921ba 100644 --- a/src/Mod/Fem/_CommandShellThickness.py +++ b/src/Mod/Fem/_CommandShellThickness.py @@ -49,5 +49,4 @@ class _CommandShellThickness(FemCommands): FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemShellThickness.makeFemShellThickness()]") -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_ShellThickness', _CommandShellThickness()) +FreeCADGui.addCommand('Fem_ShellThickness', _CommandShellThickness()) diff --git a/src/Mod/Fem/_CommandShowResult.py b/src/Mod/Fem/_CommandShowResult.py index 017e38d4cf..caa2c1b5e1 100644 --- a/src/Mod/Fem/_CommandShowResult.py +++ b/src/Mod/Fem/_CommandShowResult.py @@ -27,7 +27,6 @@ __url__ = "http://www.freecadweb.org" ## @package CommandShowResult # \ingroup FEM -import FreeCAD from FemCommands import FemCommands import FreeCADGui from PySide import QtCore, QtGui @@ -69,5 +68,5 @@ def get_results_object(sel): return i return None -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_ShowResult', _CommandShowResult()) + +FreeCADGui.addCommand('Fem_ShowResult', _CommandShowResult()) diff --git a/src/Mod/Fem/_CommandSolverCalculix.py b/src/Mod/Fem/_CommandSolverCalculix.py index 768e10b8fe..1a4a0ac9d3 100644 --- a/src/Mod/Fem/_CommandSolverCalculix.py +++ b/src/Mod/Fem/_CommandSolverCalculix.py @@ -58,5 +58,5 @@ class _CommandSolverCalculix(FemCommands): else: FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemSolverCalculix.makeFemSolverCalculix()]") -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_SolverCalculix', _CommandSolverCalculix()) + +FreeCADGui.addCommand('Fem_SolverCalculix', _CommandSolverCalculix()) diff --git a/src/Mod/Fem/_CommandSolverZ88.py b/src/Mod/Fem/_CommandSolverZ88.py index 1a1c5db34e..11cd10e948 100644 --- a/src/Mod/Fem/_CommandSolverZ88.py +++ b/src/Mod/Fem/_CommandSolverZ88.py @@ -49,5 +49,4 @@ class _CommandSolverZ88(FemCommands): FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [FemSolverZ88.makeFemSolverZ88()]") -if FreeCAD.GuiUp: - FreeCADGui.addCommand('Fem_SolverZ88', _CommandSolverZ88()) +FreeCADGui.addCommand('Fem_SolverZ88', _CommandSolverZ88()) diff --git a/src/Mod/Fem/_FemMeshGmsh.py b/src/Mod/Fem/_FemMeshGmsh.py index 2dc0833e4b..ea29ad8a30 100644 --- a/src/Mod/Fem/_FemMeshGmsh.py +++ b/src/Mod/Fem/_FemMeshGmsh.py @@ -44,10 +44,10 @@ class _FemMeshGmsh(): obj.addProperty("App::PropertyLink", "Part", "FEM Mesh", "Part object to mesh") obj.Part = None - obj.addProperty("App::PropertyFloat", "ElementSizeMax", "FEM Mesh Params", "Max mesh element size (0.0 = infinity)") + obj.addProperty("App::PropertyLength", "ElementSizeMax", "FEM Mesh Params", "Max mesh element size (0.0 = infinity)") obj.ElementSizeMax = 0.0 # will be 1e+22 - obj.addProperty("App::PropertyFloat", "ElementSizeMin", "FEM Mesh Params", "Min mesh element size") + obj.addProperty("App::PropertyLength", "ElementSizeMin", "FEM Mesh Params", "Min mesh element size") obj.ElementSizeMin = 0.0 obj.addProperty("App::PropertyEnumeration", "ElementDimension", "FEM Mesh Params", "Dimension of mesh elements (Auto = according ShapeType of part to mesh)") diff --git a/src/Mod/Fem/_TaskPanelFemMeshGmsh.py b/src/Mod/Fem/_TaskPanelFemMeshGmsh.py index 8abd45fe4b..0a9d0a42a2 100644 --- a/src/Mod/Fem/_TaskPanelFemMeshGmsh.py +++ b/src/Mod/Fem/_TaskPanelFemMeshGmsh.py @@ -48,8 +48,8 @@ class _TaskPanelFemMeshGmsh: self.gmsh_runs = False self.console_message_gmsh = '' - QtCore.QObject.connect(self.form.if_max, QtCore.SIGNAL("valueChanged(double)"), self.max_changed) - QtCore.QObject.connect(self.form.if_min, QtCore.SIGNAL("valueChanged(double)"), self.min_changed) + QtCore.QObject.connect(self.form.if_max, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.max_changed) + QtCore.QObject.connect(self.form.if_min, QtCore.SIGNAL("valueChanged(Base::Quantity)"), self.min_changed) QtCore.QObject.connect(self.form.cb_dimension, QtCore.SIGNAL("activated(int)"), self.choose_dimension) QtCore.QObject.connect(self.form.cb_order, QtCore.SIGNAL("activated(int)"), self.choose_order) QtCore.QObject.connect(self.Timer, QtCore.SIGNAL("timeout()"), self.update_timer_text) @@ -91,8 +91,8 @@ class _TaskPanelFemMeshGmsh: def update(self): 'fills the widgets' - self.form.if_max.setText("{} mm".format(self.clmax)) - self.form.if_min.setText("{} mm".format(self.clmin)) + self.form.if_max.setText(self.clmax.UserString) + self.form.if_min.setText(self.clmin.UserString) index_dimension = self.form.cb_dimension.findText(self.dimension) self.form.cb_dimension.setCurrentIndex(index_dimension) index_order = self.form.cb_order.findText(self.order) @@ -111,11 +111,11 @@ class _TaskPanelFemMeshGmsh: # print('Time: {0:4.1f}: '.format(time.time() - self.Start)) self.form.l_time.setText('Time: {0:4.1f}: '.format(time.time() - self.Start)) - def max_changed(self, value): - self.clmax = float(value) + def max_changed(self, base_quantity_value): + self.clmax = base_quantity_value - def min_changed(self, value): - self.clmin = float(value) + def min_changed(self, base_quantity_value): + self.clmin = base_quantity_value def choose_dimension(self, index): if index < 0: