diff --git a/src/Mod/Fem/feminout/importZ88Mesh.py b/src/Mod/Fem/feminout/importZ88Mesh.py index 18f7090606..e8697b7d38 100644 --- a/src/Mod/Fem/feminout/importZ88Mesh.py +++ b/src/Mod/Fem/feminout/importZ88Mesh.py @@ -555,60 +555,19 @@ def get_z88_element_type( femmesh, femelement_table=None ): - if not femmesh: - Console.PrintError("Error: No femmesh.\n") - if not femelement_table: - Console.PrintError("The femelement_table need to be calculated.\n") - femelement_table = meshtools.get_femelement_table(femmesh) - # in some cases lowest key in femelement_table is not [1] - for elem in sorted(femelement_table): - elem_length = len(femelement_table[elem]) - Console.PrintLog("Node count of first element: {}\n".format(elem_length)) - break # break after the first elem - if meshtools.is_solid_femmesh(femmesh): - if femmesh.TetraCount == femmesh.VolumeCount: - if elem_length == 4: - return 17 - elif elem_length == 10: - return 16 - else: - Console.PrintMessage("Tetra with neither 4 nor 10 nodes.\n") - elif femmesh.HexaCount == femmesh.VolumeCount: - if elem_length == 8: - return 1 - elif elem_length == 20: - return 10 - else: - Console.PrintError("Hexa with neither 8 nor 20 nodes.\n") - return 0 - else: - Console.PrintError("no tetra, no hexa or Mixed Volume Elements.\n") - elif meshtools.is_face_femmesh(femmesh): - if femmesh.TriangleCount == femmesh.FaceCount: - if elem_length == 3: - Console.PrintError("tria3mesh, not supported by Z88.\n") - return 0 - elif elem_length == 6: - return 24 - else: - Console.PrintError("Tria with neither 3 nor 6 nodes.\n") - return 0 - elif femmesh.QuadrangleCount == femmesh.FaceCount: - if elem_length == 4: - Console.PrintError("quad4mesh, not supported by Z88.\n") - return 0 - elif elem_length == 8: - return 23 - else: - Console.PrintError("Quad with neither 4 nor 8 nodes.\n") - return 0 - else: - Console.PrintError("no tria, no quad\n") - return 0 - elif meshtools.is_edge_femmesh(femmesh): - Console.PrintMessage("Edge femmesh will be exported as 3D truss element nr 4.\n") - return 4 - else: - Console.PrintError("Neither edge nor face nor solid femmesh.\n") - return 0 - return 0 + return z88_ele_types[meshtools.get_femmesh_eletype(femmesh, femelement_table)] + + +z88_ele_types = { + "tetra4": 17, + "tetra10": 16, + "hexa8": 1, + "hexa20": 10, + "tria3": 0, + "tria6": 24, + "quad4": 0, + "quad8": 23, + "seg2": 4, + "seg3": 4, + "None": 0, +} diff --git a/src/Mod/Fem/femmesh/meshtools.py b/src/Mod/Fem/femmesh/meshtools.py index 993483a5f9..b705e43abd 100644 --- a/src/Mod/Fem/femmesh/meshtools.py +++ b/src/Mod/Fem/femmesh/meshtools.py @@ -2193,6 +2193,74 @@ def is_zplane_2D_mesh( return False +# ************************************************************************************************ +def get_femmesh_eletype( + femmesh, + femelement_table=None +): + if not femmesh: + FreeCAD.Console.PrintError("Error: No femmesh.\n") + if not femelement_table: + FreeCAD.Console.PrintError("The femelement_table need to be calculated.\n") + femelement_table = get_femelement_table(femmesh) + # in some cases lowest key in femelement_table is not [1] + for elem in sorted(femelement_table): + elem_length = len(femelement_table[elem]) + FreeCAD.Console.PrintLog("Node count of first element: {}\n".format(elem_length)) + break # break after the first elem + if is_solid_femmesh(femmesh): + if femmesh.TetraCount == femmesh.VolumeCount: + if elem_length == 4: + return "tetra4" + elif elem_length == 10: + return "tetra10" + else: + FreeCAD.Console.PrintMessage("Tetra with neither 4 nor 10 nodes.\n") + return "None" + elif femmesh.HexaCount == femmesh.VolumeCount: + if elem_length == 8: + return "hexa8" + elif elem_length == 20: + return "hexa20" + else: + FreeCAD.Console.PrintError("Hexa with neither 8 nor 20 nodes.\n") + return "None" + else: + FreeCAD.Console.PrintError("no tetra, no hexa or Mixed Volume Elements.\n") + elif is_face_femmesh(femmesh): + if femmesh.TriangleCount == femmesh.FaceCount: + if elem_length == 3: + return "tria3" + elif elem_length == 6: + return "tria6" + else: + FreeCAD.Console.PrintError("Tria with neither 3 nor 6 nodes.\n") + return "None" + elif femmesh.QuadrangleCount == femmesh.FaceCount: + if elem_length == 4: + return "quad4" + elif elem_length == 8: + return "quad8" + else: + FreeCAD.Console.PrintError("Quad with neither 4 nor 8 nodes.\n") + return "None" + else: + FreeCAD.Console.PrintError("no tria, no quad\n") + return "None" + elif is_edge_femmesh(femmesh): + if elem_length == 3: + return "seg2" + elif elem_length == 6: + return "seg3" + else: + FreeCAD.Console.PrintError("Seg with neither 2 nor 3 nodes.\n") + return "None" + else: + FreeCAD.Console.PrintError("Neither edge nor face nor solid femmesh.\n") + return "None" + return "None" + + # ************************************************************************************************ def get_three_non_colinear_nodes( nodes_coords