diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 17aca2d38..63acd8bad 100644 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -65,6 +65,7 @@ SET(FemScripts_SRCS importCcxDatResults.py importCcxFrdResults.py importInpMesh.py + importToolsFem.py importVTKResults.py importZ88Mesh.py importZ88O2Results.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 353dcbc46..e4e45a57c 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -21,6 +21,7 @@ INSTALL( importCcxDatResults.py importCcxFrdResults.py importInpMesh.py + importToolsFem.py importVTKResults.py importZ88Mesh.py importZ88O2Results.py diff --git a/src/Mod/Fem/FemMeshTools.py b/src/Mod/Fem/FemMeshTools.py index 3788629ab..10e6cfa86 100644 --- a/src/Mod/Fem/FemMeshTools.py +++ b/src/Mod/Fem/FemMeshTools.py @@ -1507,86 +1507,4 @@ def use_correct_fluidinout_ele_def(FluidInletoutlet_ele, fileName): f.close() inout_nodes_file.close() - -def make_femmesh(mesh_data): - ''' makes an FreeCAD FEM Mesh object from FEM Mesh data - ''' - import Fem - mesh = Fem.FemMesh() - m = mesh_data - if ('Nodes' in m) and (len(m['Nodes']) > 0): - print("Found: nodes") - if (('Seg2Elem' in m) or - ('Tria3Elem' in m) or - ('Tria6Elem' in m) or - ('Quad4Elem' in m) or - ('Quad8Elem' in m) or - ('Tetra4Elem' in m) or - ('Tetra10Elem' in m) or - ('Penta6Elem' in m) or - ('Penta15Elem' in m) or - ('Hexa8Elem' in m) or - ('Hexa20Elem' in m)): - - nds = m['Nodes'] - print("Found: elements") - for i in nds: - n = nds[i] - mesh.addNode(n[0], n[1], n[2], i) - elms_hexa8 = m['Hexa8Elem'] - for i in elms_hexa8: - e = elms_hexa8[i] - mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7]], i) - elms_penta6 = m['Penta6Elem'] - for i in elms_penta6: - e = elms_penta6[i] - mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5]], i) - elms_tetra4 = m['Tetra4Elem'] - for i in elms_tetra4: - e = elms_tetra4[i] - mesh.addVolume([e[0], e[1], e[2], e[3]], i) - elms_tetra10 = m['Tetra10Elem'] - for i in elms_tetra10: - e = elms_tetra10[i] - mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9]], i) - elms_penta15 = m['Penta15Elem'] - for i in elms_penta15: - e = elms_penta15[i] - mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9], - e[10], e[11], e[12], e[13], e[14]], i) - elms_hexa20 = m['Hexa20Elem'] - for i in elms_hexa20: - e = elms_hexa20[i] - mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9], - e[10], e[11], e[12], e[13], e[14], e[15], e[16], e[17], e[18], e[19]], i) - elms_tria3 = m['Tria3Elem'] - for i in elms_tria3: - e = elms_tria3[i] - mesh.addFace([e[0], e[1], e[2]], i) - elms_tria6 = m['Tria6Elem'] - for i in elms_tria6: - e = elms_tria6[i] - mesh.addFace([e[0], e[1], e[2], e[3], e[4], e[5]], i) - elms_quad4 = m['Quad4Elem'] - for i in elms_quad4: - e = elms_quad4[i] - mesh.addFace([e[0], e[1], e[2], e[3]], i) - elms_quad8 = m['Quad8Elem'] - for i in elms_quad8: - e = elms_quad8[i] - mesh.addFace([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7]], i) - elms_seg2 = m['Seg2Elem'] - for i in elms_seg2: - e = elms_seg2[i] - mesh.addEdge(e[0], e[1]) - print("imported mesh: {} nodes, {} HEXA8, {} PENTA6, {} TETRA4, {} TETRA10, {} PENTA15".format( - len(nds), len(elms_hexa8), len(elms_penta6), len(elms_tetra4), len(elms_tetra10), len(elms_penta15))) - print("imported mesh: {} HEXA20, {} TRIA3, {} TRIA6, {} QUAD4, {} QUAD8, {} SEG2".format( - len(elms_hexa20), len(elms_tria3), len(elms_tria6), len(elms_quad4), len(elms_quad8), len(elms_seg2))) - else: - FreeCAD.Console.PrintError("No Elements found!\n") - else: - FreeCAD.Console.PrintError("No Nodes found!\n") - return mesh - # @} diff --git a/src/Mod/Fem/importCcxFrdResults.py b/src/Mod/Fem/importCcxFrdResults.py index 641140f82..17d3dc719 100644 --- a/src/Mod/Fem/importCcxFrdResults.py +++ b/src/Mod/Fem/importCcxFrdResults.py @@ -89,8 +89,8 @@ def importFrd(filename, analysis=None, result_name_prefix=None): span = max(x_span, y_span, z_span) if (not analysis): - import FemMeshTools - mesh = FemMeshTools.make_femmesh(m) + import importToolsFem + mesh = importToolsFem.make_femmesh(m) if len(m['Nodes']) > 0: mesh_object = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject', 'ResultMesh') diff --git a/src/Mod/Fem/importInpMesh.py b/src/Mod/Fem/importInpMesh.py index c9ce18607..630b3fe00 100644 --- a/src/Mod/Fem/importInpMesh.py +++ b/src/Mod/Fem/importInpMesh.py @@ -29,7 +29,6 @@ __date__ = "04/08/2016" # \ingroup FEM # \brief FreeCAD INP file reader for FEM workbench -import FemMeshTools import FreeCAD import os import string @@ -65,7 +64,8 @@ def import_inp(filename): "create imported objects in FreeCAD, currently only FemMesh" m = read_inp(filename) - mesh = FemMeshTools.make_femmesh(m) + import importToolsFem + mesh = importToolsFem.make_femmesh(m) mesh_name = os.path.splitext(os.path.basename(filename))[0] mesh_object = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject', mesh_name) mesh_object.FemMesh = mesh diff --git a/src/Mod/Fem/importToolsFem.py b/src/Mod/Fem/importToolsFem.py new file mode 100644 index 000000000..4ef3d655e --- /dev/null +++ b/src/Mod/Fem/importToolsFem.py @@ -0,0 +1,113 @@ +# *************************************************************************** +# * * +# * Copyright (c) 2017 - 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__ = "FreeCAD FEM import tools" +__author__ = "Bernd Hahnebach" +__url__ = "http://www.freecadweb.org" + +## @package importToolsFem +# \ingroup FEM +# \brief FreeCAD FEM import tools + +import FreeCAD + + +def make_femmesh(mesh_data): + ''' makes an FreeCAD FEM Mesh object from FEM Mesh data + ''' + import Fem + mesh = Fem.FemMesh() + m = mesh_data + if ('Nodes' in m) and (len(m['Nodes']) > 0): + print("Found: nodes") + if (('Seg2Elem' in m) or + ('Tria3Elem' in m) or + ('Tria6Elem' in m) or + ('Quad4Elem' in m) or + ('Quad8Elem' in m) or + ('Tetra4Elem' in m) or + ('Tetra10Elem' in m) or + ('Penta6Elem' in m) or + ('Penta15Elem' in m) or + ('Hexa8Elem' in m) or + ('Hexa20Elem' in m)): + + nds = m['Nodes'] + print("Found: elements") + for i in nds: + n = nds[i] + mesh.addNode(n[0], n[1], n[2], i) + elms_hexa8 = m['Hexa8Elem'] + for i in elms_hexa8: + e = elms_hexa8[i] + mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7]], i) + elms_penta6 = m['Penta6Elem'] + for i in elms_penta6: + e = elms_penta6[i] + mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5]], i) + elms_tetra4 = m['Tetra4Elem'] + for i in elms_tetra4: + e = elms_tetra4[i] + mesh.addVolume([e[0], e[1], e[2], e[3]], i) + elms_tetra10 = m['Tetra10Elem'] + for i in elms_tetra10: + e = elms_tetra10[i] + mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9]], i) + elms_penta15 = m['Penta15Elem'] + for i in elms_penta15: + e = elms_penta15[i] + mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9], + e[10], e[11], e[12], e[13], e[14]], i) + elms_hexa20 = m['Hexa20Elem'] + for i in elms_hexa20: + e = elms_hexa20[i] + mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9], + e[10], e[11], e[12], e[13], e[14], e[15], e[16], e[17], e[18], e[19]], i) + elms_tria3 = m['Tria3Elem'] + for i in elms_tria3: + e = elms_tria3[i] + mesh.addFace([e[0], e[1], e[2]], i) + elms_tria6 = m['Tria6Elem'] + for i in elms_tria6: + e = elms_tria6[i] + mesh.addFace([e[0], e[1], e[2], e[3], e[4], e[5]], i) + elms_quad4 = m['Quad4Elem'] + for i in elms_quad4: + e = elms_quad4[i] + mesh.addFace([e[0], e[1], e[2], e[3]], i) + elms_quad8 = m['Quad8Elem'] + for i in elms_quad8: + e = elms_quad8[i] + mesh.addFace([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7]], i) + elms_seg2 = m['Seg2Elem'] + for i in elms_seg2: + e = elms_seg2[i] + mesh.addEdge(e[0], e[1]) + print("imported mesh: {} nodes, {} HEXA8, {} PENTA6, {} TETRA4, {} TETRA10, {} PENTA15".format( + len(nds), len(elms_hexa8), len(elms_penta6), len(elms_tetra4), len(elms_tetra10), len(elms_penta15))) + print("imported mesh: {} HEXA20, {} TRIA3, {} TRIA6, {} QUAD4, {} QUAD8, {} SEG2".format( + len(elms_hexa20), len(elms_tria3), len(elms_tria6), len(elms_quad4), len(elms_quad8), len(elms_seg2))) + else: + FreeCAD.Console.PrintError("No Elements found!\n") + else: + FreeCAD.Console.PrintError("No Nodes found!\n") + return mesh diff --git a/src/Mod/Fem/importZ88Mesh.py b/src/Mod/Fem/importZ88Mesh.py index 41033f12a..003a8477f 100644 --- a/src/Mod/Fem/importZ88Mesh.py +++ b/src/Mod/Fem/importZ88Mesh.py @@ -31,7 +31,6 @@ __url__ = "http://www.freecadweb.org" import FreeCAD import os -import FemMeshTools Debug = False @@ -72,6 +71,7 @@ def export(objectslist, filename): FreeCAD.Console.PrintError("No FEM mesh object selected.\n") return femnodes_mesh = obj.FemMesh.Nodes + import FemMeshTools femelement_table = FemMeshTools.get_femelement_table(obj.FemMesh) z88_element_type = get_z88_element_type(obj.FemMesh, femelement_table) f = pyopen(filename, "wb") @@ -85,7 +85,8 @@ def import_z88_mesh(filename, analysis=None): ''' mesh_data = read_z88_mesh(filename) mesh_name = os.path.basename(os.path.splitext(filename)[0]) - femmesh = FemMeshTools.make_femmesh(mesh_data) + import importToolsFem + femmesh = importToolsFem.make_femmesh(mesh_data) if femmesh: mesh_object = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject', mesh_name) mesh_object.FemMesh = femmesh @@ -387,6 +388,7 @@ def write_z88_mesh_to_file(femnodes_mesh, femelement_table, z88_element_type, f) # Helper def get_z88_element_type(femmesh, femelement_table=None): + import FemMeshTools if not femmesh: print("Error: No femmesh!") if not femelement_table: