FEM: meshtools, add generic method to return femmesh type
This commit is contained in:
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user