FEM: in out modules, use double quotes instead of single ones
This commit is contained in:
@@ -42,7 +42,7 @@ def exportMeshToTetGenPoly(meshToExport, filePath, beVerbose=1):
|
||||
if beVerbose == 1:
|
||||
FreeCAD.Console.PrintMessage("\nExport of mesh to TetGen file ...")
|
||||
(allVertices, allFacets) = meshToExport.Topology
|
||||
f = open(filePath, 'w')
|
||||
f = open(filePath, "w")
|
||||
f.write("# This file was generated from FreeCAD geometry\n")
|
||||
f.write("# Part 1 - node list\n")
|
||||
f.write(
|
||||
@@ -52,10 +52,10 @@ def exportMeshToTetGenPoly(meshToExport, filePath, beVerbose=1):
|
||||
)
|
||||
for PointIndex in range(len(allVertices)):
|
||||
f.write("%(PointIndex)5i %(x) e %(y) e %(z) e\n" % {
|
||||
'PointIndex': PointIndex,
|
||||
'x': allVertices[PointIndex].x,
|
||||
'y': allVertices[PointIndex].y,
|
||||
'z': allVertices[PointIndex].z
|
||||
"PointIndex": PointIndex,
|
||||
"x": allVertices[PointIndex].x,
|
||||
"y": allVertices[PointIndex].y,
|
||||
"z": allVertices[PointIndex].z
|
||||
})
|
||||
|
||||
# Find out BoundaryMarker for each facet. If edge connects only two facets,
|
||||
@@ -92,7 +92,7 @@ def exportMeshToTetGenPoly(meshToExport, filePath, beVerbose=1):
|
||||
# disconnectedEdges = len(EdgeKeys)
|
||||
if beVerbose == 1:
|
||||
FreeCAD.Console.PrintMessage(
|
||||
'\nBoundaryMarker:' + repr(BoundaryMarker) + ' ' + repr(len(EdgeFacets))
|
||||
"\nBoundaryMarker:" + repr(BoundaryMarker) + " " + repr(len(EdgeFacets))
|
||||
)
|
||||
searchForPair = 1
|
||||
|
||||
@@ -144,24 +144,24 @@ def exportMeshToTetGenPoly(meshToExport, filePath, beVerbose=1):
|
||||
# End of main loop
|
||||
if beVerbose == 1:
|
||||
FreeCAD.Console.PrintMessage(
|
||||
'\nNew BoundaryMarker:' + repr(BoundaryMarker) + ' ' + repr(len(EdgeFacets))
|
||||
"\nNew BoundaryMarker:" + repr(BoundaryMarker) + " " + repr(len(EdgeFacets))
|
||||
)
|
||||
|
||||
# ********** Part 2 - write all facets to *.poly file
|
||||
f.write("# Part 2 - facet list\n")
|
||||
f.write("%(TotalNumOfFacets)i %(BoundaryMarkerExists)i\n" % {
|
||||
'TotalNumOfFacets': len(allFacets),
|
||||
'BoundaryMarkerExists': BoundaryMarkerExists
|
||||
"TotalNumOfFacets": len(allFacets),
|
||||
"BoundaryMarkerExists": BoundaryMarkerExists
|
||||
})
|
||||
for FacetIndex in range(len(allFacets)):
|
||||
f.write("# FacetIndex = %(Index)i\n" % {'Index': FacetIndex})
|
||||
f.write("%(NumOfPolygons)3i " % {'NumOfPolygons': 1})
|
||||
f.write("# FacetIndex = %(Index)i\n" % {"Index": FacetIndex})
|
||||
f.write("%(NumOfPolygons)3i " % {"NumOfPolygons": 1})
|
||||
if BoundaryMarkerExists == 1:
|
||||
f.write("0 %(BoundaryMarker)i" % {'BoundaryMarker': BoundaryMarker[FacetIndex]})
|
||||
f.write("\n%(NumOfConers)3i " % {'NumOfConers': len(allFacets[FacetIndex])})
|
||||
f.write("0 %(BoundaryMarker)i" % {"BoundaryMarker": BoundaryMarker[FacetIndex]})
|
||||
f.write("\n%(NumOfConers)3i " % {"NumOfConers": len(allFacets[FacetIndex])})
|
||||
for PointIndex in range(len(allFacets[FacetIndex])):
|
||||
# f.write(repr(allFacets[FacetIndex][PointIndex]))
|
||||
f.write("%(PointIndex)i " % {'PointIndex': allFacets[FacetIndex][PointIndex]})
|
||||
f.write("%(PointIndex)i " % {"PointIndex": allFacets[FacetIndex][PointIndex]})
|
||||
f.write("\n")
|
||||
# ********** Part 3 and Part 4 are zero
|
||||
f.write("# Part 3 - the hole list.\n# There is no hole in bar.\n0\n")
|
||||
|
||||
@@ -36,10 +36,10 @@ EIGENVALUE_OUTPUT_SECTION = " E I G E N V A L U E O U T P U T"
|
||||
|
||||
|
||||
# ********* generic FreeCAD import and export methods *********
|
||||
if open.__module__ == '__builtin__':
|
||||
if open.__module__ == "__builtin__":
|
||||
# because we'll redefine open below (Python2)
|
||||
pyopen = open
|
||||
elif open.__module__ == 'io':
|
||||
elif open.__module__ == "io":
|
||||
# because we'll redefine open below (Python3)
|
||||
pyopen = open
|
||||
|
||||
@@ -79,7 +79,7 @@ def import_dat(
|
||||
def readResult(
|
||||
dat_input
|
||||
):
|
||||
FreeCAD.Console.PrintMessage('Read ccx results from dat file: {}\n'.format(dat_input))
|
||||
FreeCAD.Console.PrintMessage("Read ccx results from dat file: {}\n".format(dat_input))
|
||||
dat_file = pyopen(dat_input, "r")
|
||||
eigenvalue_output_section_found = False
|
||||
mode_reading = False
|
||||
@@ -94,8 +94,8 @@ def readResult(
|
||||
mode = int(line[0:7])
|
||||
mode_frequency = float(line[39:55])
|
||||
m = {}
|
||||
m['eigenmode'] = mode
|
||||
m['frequency'] = mode_frequency
|
||||
m["eigenmode"] = mode
|
||||
m["frequency"] = mode_frequency
|
||||
results.append(m)
|
||||
mode_reading = True
|
||||
except:
|
||||
|
||||
@@ -35,10 +35,10 @@ import os
|
||||
|
||||
|
||||
# ********* generic FreeCAD import and export methods *********
|
||||
if open.__module__ == '__builtin__':
|
||||
if open.__module__ == "__builtin__":
|
||||
# because we'll redefine open below (Python2)
|
||||
pyopen = open
|
||||
elif open.__module__ == 'io':
|
||||
elif open.__module__ == "io":
|
||||
# because we'll redefine open below (Python3)
|
||||
pyopen = open
|
||||
|
||||
@@ -71,47 +71,47 @@ def importFrd(
|
||||
from . import importToolsFem
|
||||
import ObjectsFem
|
||||
if result_name_prefix is None:
|
||||
result_name_prefix = ''
|
||||
result_name_prefix = ""
|
||||
m = read_frd_result(filename)
|
||||
result_mesh_object = None
|
||||
if len(m['Nodes']) > 0:
|
||||
if len(m["Nodes"]) > 0:
|
||||
if analysis:
|
||||
analysis_object = analysis
|
||||
|
||||
mesh = importToolsFem.make_femmesh(m)
|
||||
result_mesh_object = ObjectsFem.makeMeshResult(
|
||||
FreeCAD.ActiveDocument,
|
||||
'ResultMesh'
|
||||
"ResultMesh"
|
||||
)
|
||||
result_mesh_object.FemMesh = mesh
|
||||
res_mesh_is_compacted = False
|
||||
nodenumbers_for_compacted_mesh = []
|
||||
|
||||
number_of_increments = len(m['Results'])
|
||||
number_of_increments = len(m["Results"])
|
||||
FreeCAD.Console.PrintLog(
|
||||
'Increments: ' + str(number_of_increments) + '\n'
|
||||
"Increments: " + str(number_of_increments) + "\n"
|
||||
)
|
||||
if len(m['Results']) > 0:
|
||||
for result_set in m['Results']:
|
||||
if 'number' in result_set:
|
||||
eigenmode_number = result_set['number']
|
||||
if len(m["Results"]) > 0:
|
||||
for result_set in m["Results"]:
|
||||
if "number" in result_set:
|
||||
eigenmode_number = result_set["number"]
|
||||
else:
|
||||
eigenmode_number = 0
|
||||
step_time = result_set['time']
|
||||
step_time = result_set["time"]
|
||||
step_time = round(step_time, 2)
|
||||
if eigenmode_number > 0:
|
||||
results_name = (
|
||||
'{}Mode{}_Results'
|
||||
"{}Mode{}_Results"
|
||||
.format(result_name_prefix, eigenmode_number)
|
||||
)
|
||||
elif number_of_increments > 1:
|
||||
results_name = (
|
||||
'{}Time{}_Results'
|
||||
"{}Time{}_Results"
|
||||
.format(result_name_prefix, step_time)
|
||||
)
|
||||
else:
|
||||
results_name = (
|
||||
'{}Results'
|
||||
"{}Results"
|
||||
.format(result_name_prefix)
|
||||
)
|
||||
|
||||
@@ -152,8 +152,8 @@ def importFrd(
|
||||
if res_obj.getParentGroup():
|
||||
has_reinforced_mat = False
|
||||
for obj in res_obj.getParentGroup().Group:
|
||||
if obj.isDerivedFrom('App::MaterialObjectPython') \
|
||||
and femutils.is_of_type(obj, 'Fem::MaterialReinforced'):
|
||||
if obj.isDerivedFrom("App::MaterialObjectPython") \
|
||||
and femutils.is_of_type(obj, "Fem::MaterialReinforced"):
|
||||
has_reinforced_mat = True
|
||||
restools.add_principal_stress_reinforced(res_obj)
|
||||
break
|
||||
@@ -187,7 +187,7 @@ def importFrd(
|
||||
|
||||
else:
|
||||
FreeCAD.Console.PrintError(
|
||||
'Problem on frd file import. No nodes found in frd file.\n'
|
||||
"Problem on frd file import. No nodes found in frd file.\n"
|
||||
)
|
||||
return res_obj
|
||||
|
||||
@@ -198,11 +198,11 @@ def read_frd_result(
|
||||
frd_input
|
||||
):
|
||||
FreeCAD.Console.PrintMessage(
|
||||
'Read ccx results from frd file: {}\n'
|
||||
"Read ccx results from frd file: {}\n"
|
||||
.format(frd_input)
|
||||
)
|
||||
inout_nodes = []
|
||||
inout_nodes_file = frd_input.rsplit('.', 1)[0] + '_inout_nodes.txt'
|
||||
inout_nodes_file = frd_input.rsplit(".", 1)[0] + "_inout_nodes.txt"
|
||||
if os.path.exists(inout_nodes_file):
|
||||
FreeCAD.Console.PrintMessage(
|
||||
"Read special 1DFlow nodes data form: {}\n".format(inout_nodes_file)
|
||||
@@ -210,7 +210,7 @@ def read_frd_result(
|
||||
f = pyopen(inout_nodes_file, "r")
|
||||
lines = f.readlines()
|
||||
for line in lines:
|
||||
a = line.split(',')
|
||||
a = line.split(",")
|
||||
inout_nodes.append(a)
|
||||
f.close()
|
||||
FreeCAD.Console.PrintMessage("{}\n".format(inout_nodes))
|
||||
@@ -230,8 +230,8 @@ def read_frd_result(
|
||||
elements_seg3 = {}
|
||||
results = []
|
||||
mode_results = {}
|
||||
mode_results['number'] = float('NaN')
|
||||
mode_results['time'] = float('NaN')
|
||||
mode_results["number"] = float("NaN")
|
||||
mode_results["time"] = float("NaN")
|
||||
mode_disp = {}
|
||||
mode_stress = {}
|
||||
mode_strain = {}
|
||||
@@ -345,7 +345,7 @@ def read_frd_result(
|
||||
nd19 = int(line[83:93])
|
||||
nd20 = int(line[93:103])
|
||||
input_continues = False
|
||||
'''
|
||||
"""
|
||||
CalculiX uses a different node order in
|
||||
input file *.inp and result file *.frd for hexa20 (C3D20)
|
||||
according to Guido (the developer of ccx):
|
||||
@@ -365,7 +365,7 @@ def read_frd_result(
|
||||
nd16, nd13, nd18, nd19, nd20, nd17, nd10, nd11, nd12, nd9
|
||||
)
|
||||
hexa20 import works with the following frd file node assignment
|
||||
'''
|
||||
"""
|
||||
elements_hexa20[elem] = (
|
||||
nd8, nd5, nd6, nd7, nd4, nd1, nd2, nd3, nd20, nd17,
|
||||
nd18, nd19, nd12, nd9, nd10, nd11, nd16, nd13, nd14, nd15
|
||||
@@ -394,7 +394,7 @@ def read_frd_result(
|
||||
nd14 = int(line[33:43])
|
||||
nd15 = int(line[43:53])
|
||||
input_continues = False
|
||||
'''
|
||||
"""
|
||||
CalculiX uses a different node order in
|
||||
input file *.inp and result file *.frd for penta15 (C3D15)
|
||||
see notes at hexa20
|
||||
@@ -402,7 +402,7 @@ def read_frd_result(
|
||||
nd5, nd6, nd4, nd2, nd3, nd1, nd11, nd12, nd10, nd8,
|
||||
nd9, nd7, nd14, nd15, nd13
|
||||
) # order of the *.inp file
|
||||
'''
|
||||
"""
|
||||
elements_penta15[elem] = (
|
||||
nd5, nd6, nd4, nd2, nd3, nd1, nd14, nd15, nd13, nd8,
|
||||
nd9, nd7, nd11, nd12, nd10
|
||||
@@ -610,57 +610,57 @@ def read_frd_result(
|
||||
node_element_section = True
|
||||
|
||||
if mode_disp_found:
|
||||
mode_results['disp'] = mode_disp
|
||||
mode_results["disp"] = mode_disp
|
||||
mode_disp = {}
|
||||
mode_disp_found = False
|
||||
node_element_section = False
|
||||
|
||||
if mode_stress_found:
|
||||
mode_results['stress'] = mode_stress
|
||||
mode_results["stress"] = mode_stress
|
||||
mode_stress = {}
|
||||
mode_stress_found = False
|
||||
node_element_section = False
|
||||
|
||||
if mode_strain_found:
|
||||
mode_results['strain'] = mode_strain
|
||||
mode_results["strain"] = mode_strain
|
||||
|
||||
mode_strain = {}
|
||||
mode_strain_found = False
|
||||
node_element_section = False
|
||||
|
||||
if mode_peeq_found:
|
||||
mode_results['peeq'] = mode_peeq
|
||||
mode_results["peeq"] = mode_peeq
|
||||
mode_peeq = {}
|
||||
mode_peeq_found = False
|
||||
node_element_section = False
|
||||
|
||||
if mode_temp_found:
|
||||
mode_results['temp'] = mode_temp
|
||||
mode_results["temp"] = mode_temp
|
||||
mode_temp = {}
|
||||
mode_temp_found = False
|
||||
node_element_section = False
|
||||
|
||||
if mode_massflow_found:
|
||||
mode_results['mflow'] = mode_massflow
|
||||
mode_results["mflow"] = mode_massflow
|
||||
mode_massflow = {}
|
||||
mode_massflow_found = False
|
||||
node_element_section = False
|
||||
|
||||
if mode_networkpressure_found:
|
||||
mode_results['npressure'] = mode_networkpressure
|
||||
mode_results["npressure"] = mode_networkpressure
|
||||
mode_networkpressure_found = False
|
||||
mode_networkpressure = {}
|
||||
node_element_section = False
|
||||
|
||||
'''
|
||||
print('---- End of Section --> Mode_Results may be changed ----')
|
||||
"""
|
||||
print("---- End of Section --> Mode_Results may be changed ----")
|
||||
for key in sorted(mode_results.keys()):
|
||||
if key is 'number' or key is 'time':
|
||||
print(key + ' --> ' + str(mode_results[key]))
|
||||
if key is "number" or key is "time":
|
||||
print(key + " --> " + str(mode_results[key]))
|
||||
else:
|
||||
print(key + ' --> ' + str(len(mode_results[key])))
|
||||
print('----Mode_Results----\n')
|
||||
'''
|
||||
print(key + " --> " + str(len(mode_results[key])))
|
||||
print("----Mode_Results----\n")
|
||||
"""
|
||||
|
||||
# Check if we found the end of frd data
|
||||
if line[1:5] == "9999":
|
||||
@@ -670,34 +670,34 @@ def read_frd_result(
|
||||
and end_of_section_found \
|
||||
and not node_element_section:
|
||||
|
||||
'''
|
||||
print('\n\n----Append mode_results to results')
|
||||
"""
|
||||
print("\n\n----Append mode_results to results")
|
||||
print(line)
|
||||
for key in sorted(mode_results.keys()):
|
||||
if key is 'number' or key is 'time':
|
||||
print(key + ' --> ' + str(mode_results[key]))
|
||||
if key is "number" or key is "time":
|
||||
print(key + " --> " + str(mode_results[key]))
|
||||
else:
|
||||
print(key + ' --> ' + str(len(mode_results[key])))
|
||||
print('----Append Mode_Results----\n')
|
||||
'''
|
||||
print(key + " --> " + str(len(mode_results[key])))
|
||||
print("----Append Mode_Results----\n")
|
||||
"""
|
||||
|
||||
# append mode_results to results and reset mode_result
|
||||
results.append(mode_results)
|
||||
mode_results = {}
|
||||
# https://forum.freecadweb.org/viewtopic.php?f=18&t=32649&start=10#p274686
|
||||
mode_results['number'] = float('NaN')
|
||||
mode_results['time'] = float('NaN')
|
||||
mode_results["number"] = float("NaN")
|
||||
mode_results["time"] = float("NaN")
|
||||
end_of_section_found = False
|
||||
|
||||
# on changed --> write changed values in mode_result
|
||||
# will be the first to do on an empty mode_result
|
||||
if mode_eigen_changed:
|
||||
mode_results['number'] = eigenmode
|
||||
mode_results["number"] = eigenmode
|
||||
mode_eigen_changed = False
|
||||
|
||||
if mode_time_changed:
|
||||
mode_results['time'] = timestep
|
||||
# mode_results['time'] = 0 # Don't return time if static # WARUM?
|
||||
mode_results["time"] = timestep
|
||||
# mode_results["time"] = 0 # Don't return time if static # WARUM?
|
||||
mode_time_found = False
|
||||
mode_time_changed = False
|
||||
|
||||
@@ -707,37 +707,37 @@ def read_frd_result(
|
||||
# close frd file if loop over all lines is finished
|
||||
frd_file.close()
|
||||
|
||||
'''
|
||||
"""
|
||||
# debug prints and checks with the read data
|
||||
print('\n\n----RESULTS values begin----')
|
||||
print("\n\n----RESULTS values begin----")
|
||||
print(len(results))
|
||||
# print('\n')
|
||||
# print("\n")
|
||||
# print(results)
|
||||
print('----RESULTS values end----\n\n')
|
||||
'''
|
||||
print("----RESULTS values end----\n\n")
|
||||
"""
|
||||
|
||||
if not inout_nodes:
|
||||
if results:
|
||||
if 'mflow' in results[0] or 'npressure' in results[0]:
|
||||
if "mflow" in results[0] or "npressure" in results[0]:
|
||||
FreeCAD.Console.PrintError(
|
||||
'We have mflow or npressure, but no inout_nodes file.\n'
|
||||
"We have mflow or npressure, but no inout_nodes file.\n"
|
||||
)
|
||||
if not nodes:
|
||||
FreeCAD.Console.PrintError('FEM: No nodes found in Frd file.\n')
|
||||
FreeCAD.Console.PrintError("FEM: No nodes found in Frd file.\n")
|
||||
|
||||
return {
|
||||
'Nodes': nodes,
|
||||
'Seg2Elem': elements_seg2,
|
||||
'Seg3Elem': elements_seg3,
|
||||
'Tria3Elem': elements_tria3,
|
||||
'Tria6Elem': elements_tria6,
|
||||
'Quad4Elem': elements_quad4,
|
||||
'Quad8Elem': elements_quad8,
|
||||
'Tetra4Elem': elements_tetra4,
|
||||
'Tetra10Elem': elements_tetra10,
|
||||
'Hexa8Elem': elements_hexa8,
|
||||
'Hexa20Elem': elements_hexa20,
|
||||
'Penta6Elem': elements_penta6,
|
||||
'Penta15Elem': elements_penta15,
|
||||
'Results': results
|
||||
"Nodes": nodes,
|
||||
"Seg2Elem": elements_seg2,
|
||||
"Seg3Elem": elements_seg3,
|
||||
"Tria3Elem": elements_tria3,
|
||||
"Tria6Elem": elements_tria6,
|
||||
"Quad4Elem": elements_quad4,
|
||||
"Quad8Elem": elements_quad8,
|
||||
"Tetra4Elem": elements_tetra4,
|
||||
"Tetra10Elem": elements_tetra10,
|
||||
"Hexa8Elem": elements_hexa8,
|
||||
"Hexa20Elem": elements_hexa20,
|
||||
"Penta6Elem": elements_penta6,
|
||||
"Penta15Elem": elements_penta15,
|
||||
"Results": results
|
||||
}
|
||||
|
||||
@@ -43,10 +43,10 @@ if FreeCAD.GuiUp:
|
||||
|
||||
# Template copied from importZ88Mesh.py. Thanks Bernd!
|
||||
# ********* generic FreeCAD import and export methods *********
|
||||
if open.__module__ == '__builtin__':
|
||||
if open.__module__ == "__builtin__":
|
||||
# because we'll redefine open below (Python2)
|
||||
pyopen = open
|
||||
elif open.__module__ == 'io':
|
||||
elif open.__module__ == "io":
|
||||
# because we'll redefine open below (Python3)
|
||||
pyopen = open
|
||||
|
||||
@@ -175,14 +175,14 @@ def export(objectslist, fileString, group_values_dict_nogui=None):
|
||||
|
||||
if fileString != "":
|
||||
fileName, fileExtension = os.path.splitext(fileString)
|
||||
if fileExtension.lower() == '.xml':
|
||||
if fileExtension.lower() == ".xml":
|
||||
FreeCAD.Console.PrintWarning(
|
||||
"XML is not designed to save higher order elements.\n")
|
||||
FreeCAD.Console.PrintWarning(
|
||||
"Reducing order for second order mesh.\n")
|
||||
FreeCAD.Console.PrintWarning("Tri6 -> Tri3, Tet10 -> Tet4, etc.\n")
|
||||
writeFenicsXML.write_fenics_mesh_xml(obj, fileString)
|
||||
elif fileExtension.lower() == '.xdmf':
|
||||
elif fileExtension.lower() == ".xdmf":
|
||||
mesh_groups = importToolsFem.get_FemMeshObjectMeshGroups(obj)
|
||||
if mesh_groups is not ():
|
||||
# if there are groups found, make task panel available if GuiUp
|
||||
@@ -203,13 +203,13 @@ def export(objectslist, fileString, group_values_dict_nogui=None):
|
||||
|
||||
# ********* module specific methods *********
|
||||
def import_fenics_mesh(filename, analysis=None):
|
||||
'''insert a FreeCAD FEM Mesh object in the ActiveDocument
|
||||
'''
|
||||
"""insert a FreeCAD FEM Mesh object in the ActiveDocument
|
||||
"""
|
||||
mesh_data = readFenicsXML.read_fenics_mesh_xml(filename)
|
||||
# xdmf not operational
|
||||
|
||||
mesh_name = os.path.basename(os.path.splitext(filename)[0])
|
||||
femmesh = importToolsFem.make_femmesh(mesh_data)
|
||||
if femmesh:
|
||||
mesh_object = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject', mesh_name)
|
||||
mesh_object = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObject", mesh_name)
|
||||
mesh_object.FemMesh = femmesh
|
||||
|
||||
@@ -34,10 +34,10 @@ import os
|
||||
|
||||
|
||||
# ********* generic FreeCAD import and export methods *********
|
||||
if open.__module__ == '__builtin__':
|
||||
if open.__module__ == "__builtin__":
|
||||
# because we'll redefine open below (Python2)
|
||||
pyopen = open
|
||||
elif open.__module__ == 'io':
|
||||
elif open.__module__ == "io":
|
||||
# because we'll redefine open below (Python3)
|
||||
pyopen = open
|
||||
|
||||
@@ -60,8 +60,8 @@ def insert(filename, docname):
|
||||
|
||||
# ********* module specific methods *********
|
||||
def read(filename):
|
||||
'''read a FemMesh from a inp mesh file and return the FemMesh
|
||||
'''
|
||||
"""read a FemMesh from a inp mesh file and return the FemMesh
|
||||
"""
|
||||
# no document object is created, just the FemMesh is returned
|
||||
mesh_data = read_inp(filename)
|
||||
from . import importToolsFem
|
||||
@@ -69,17 +69,17 @@ def read(filename):
|
||||
|
||||
|
||||
def import_inp(filename):
|
||||
'''read a FEM mesh from a Z88 mesh file and insert a FreeCAD FEM Mesh object in the ActiveDocument
|
||||
'''
|
||||
"""read a FEM mesh from a Z88 mesh file and insert a FreeCAD FEM Mesh object in the ActiveDocument
|
||||
"""
|
||||
femmesh = read(filename)
|
||||
mesh_name = os.path.splitext(os.path.basename(filename))[0]
|
||||
if femmesh:
|
||||
mesh_object = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject', mesh_name)
|
||||
mesh_object = FreeCAD.ActiveDocument.addObject("Fem::FemMeshObject", mesh_name)
|
||||
mesh_object.FemMesh = femmesh
|
||||
|
||||
|
||||
def read_inp(file_name):
|
||||
'''read .inp file '''
|
||||
"""read .inp file """
|
||||
# ATM only mesh reading is supported (no boundary conditions)
|
||||
|
||||
class elements():
|
||||
@@ -113,10 +113,10 @@ def read_inp(file_name):
|
||||
line = f.readline()
|
||||
else:
|
||||
line = f.readline()
|
||||
if line.strip() == '':
|
||||
if line.strip() == "":
|
||||
continue
|
||||
elif line[0] == '*': # start/end of a reading set
|
||||
if line[0:2] == '**': # comments
|
||||
elif line[0] == "*": # start/end of a reading set
|
||||
if line[0:2] == "**": # comments
|
||||
continue
|
||||
if line[:8].upper() == "*INCLUDE":
|
||||
start = 1 + line.index("=")
|
||||
@@ -137,7 +137,7 @@ def read_inp(file_name):
|
||||
if (line[:5].upper() == "*NODE") and (model_definition is True):
|
||||
read_node = True
|
||||
elif read_node is True:
|
||||
line_list = line.split(',')
|
||||
line_list = line.split(",")
|
||||
number = int(line_list[0])
|
||||
x = float(line_list[1])
|
||||
y = float(line_list[2])
|
||||
@@ -146,10 +146,10 @@ def read_inp(file_name):
|
||||
|
||||
# reading elements
|
||||
elif line[:8].upper() == "*ELEMENT":
|
||||
line_list = line[8:].upper().split(',')
|
||||
line_list = line[8:].upper().split(",")
|
||||
for line_part in line_list:
|
||||
if line_part.lstrip()[:4] == "TYPE":
|
||||
elm_type = line_part.split('=')[1].strip()
|
||||
elm_type = line_part.split("=")[1].strip()
|
||||
|
||||
if elm_type in ["S3", "CPS3", "CPE3", "CAX3"]:
|
||||
elm_category = elements.tria3
|
||||
@@ -192,7 +192,7 @@ def read_inp(file_name):
|
||||
error_seg3 = True # to print "not supported"
|
||||
|
||||
elif elm_category != []:
|
||||
line_list = line.split(',')
|
||||
line_list = line.split(",")
|
||||
if elm_2nd_line is False:
|
||||
number = int(line_list[0])
|
||||
elm_category[number] = []
|
||||
@@ -244,17 +244,17 @@ def read_inp(file_name):
|
||||
elements.seg3[en] = [n[0], n[2], n[1]]
|
||||
|
||||
return {
|
||||
'Nodes': nodes,
|
||||
'Seg2Elem': elements.seg2,
|
||||
'Seg3Elem': elements.seg3,
|
||||
'Tria3Elem': elements.tria3,
|
||||
'Tria6Elem': elements.tria6,
|
||||
'Quad4Elem': elements.quad4,
|
||||
'Quad8Elem': elements.quad8,
|
||||
'Tetra4Elem': elements.tetra4,
|
||||
'Tetra10Elem': elements.tetra10,
|
||||
'Hexa8Elem': elements.hexa8,
|
||||
'Hexa20Elem': elements.hexa20,
|
||||
'Penta6Elem': elements.penta6,
|
||||
'Penta15Elem': elements.penta15
|
||||
"Nodes": nodes,
|
||||
"Seg2Elem": elements.seg2,
|
||||
"Seg3Elem": elements.seg3,
|
||||
"Tria3Elem": elements.tria3,
|
||||
"Tria6Elem": elements.tria6,
|
||||
"Quad4Elem": elements.quad4,
|
||||
"Quad8Elem": elements.quad8,
|
||||
"Tetra4Elem": elements.tetra4,
|
||||
"Tetra10Elem": elements.tetra10,
|
||||
"Hexa8Elem": elements.hexa8,
|
||||
"Hexa20Elem": elements.hexa20,
|
||||
"Penta6Elem": elements.penta6,
|
||||
"Penta15Elem": elements.penta15
|
||||
}
|
||||
|
||||
@@ -133,82 +133,82 @@ def get_MaxDimElementFromList(
|
||||
def make_femmesh(
|
||||
mesh_data
|
||||
):
|
||||
''' makes an FreeCAD FEM Mesh object from FEM 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):
|
||||
if ("Nodes" in m) and (len(m["Nodes"]) > 0):
|
||||
FreeCAD.Console.PrintLog("Found: nodes\n")
|
||||
if (
|
||||
('Seg2Elem' in m)
|
||||
or ('Seg3Elem' 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)
|
||||
("Seg2Elem" in m)
|
||||
or ("Seg3Elem" 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']
|
||||
nds = m["Nodes"]
|
||||
FreeCAD.Console.PrintLog("Found: elements\n")
|
||||
for i in nds:
|
||||
n = nds[i]
|
||||
mesh.addNode(n[0], n[1], n[2], i)
|
||||
elms_hexa8 = m['Hexa8Elem']
|
||||
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']
|
||||
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']
|
||||
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']
|
||||
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']
|
||||
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']
|
||||
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']
|
||||
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']
|
||||
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']
|
||||
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']
|
||||
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']
|
||||
elms_seg2 = m["Seg2Elem"]
|
||||
for i in elms_seg2:
|
||||
e = elms_seg2[i]
|
||||
mesh.addEdge([e[0], e[1]], i)
|
||||
elms_seg3 = m['Seg3Elem']
|
||||
elms_seg3 = m["Seg3Elem"]
|
||||
for i in elms_seg3:
|
||||
e = elms_seg3[i]
|
||||
mesh.addEdge([e[0], e[1], e[2]], i)
|
||||
@@ -302,24 +302,24 @@ def make_dict_from_femmesh(
|
||||
len_to_volume[len(t)].append((v, t))
|
||||
|
||||
mesh_data = {
|
||||
'Nodes': dict([(k, (v.x, v.y, v.z))
|
||||
"Nodes": dict([(k, (v.x, v.y, v.z))
|
||||
for (k, v) in femmesh.Nodes.items()]),
|
||||
'Seg2Elem': dict(seg2),
|
||||
'Seg3Elem': dict(seg3),
|
||||
"Seg2Elem": dict(seg2),
|
||||
"Seg3Elem": dict(seg3),
|
||||
|
||||
'Tria3Elem': dict(tri3),
|
||||
'Tria6Elem': dict(tri6),
|
||||
'Quad4Elem': dict(quad4),
|
||||
'Quad8Elem': dict(quad8),
|
||||
"Tria3Elem": dict(tri3),
|
||||
"Tria6Elem": dict(tri6),
|
||||
"Quad4Elem": dict(quad4),
|
||||
"Quad8Elem": dict(quad8),
|
||||
|
||||
'Tetra4Elem': dict(tet4),
|
||||
'Tetra10Elem': dict(tet10),
|
||||
'Hexa8Elem': dict(hex8),
|
||||
'Hexa20Elem': dict(hex20),
|
||||
'Penta6Elem': dict(pent6),
|
||||
'Penta15Elem': dict(pent15),
|
||||
"Tetra4Elem": dict(tet4),
|
||||
"Tetra10Elem": dict(tet10),
|
||||
"Hexa8Elem": dict(hex8),
|
||||
"Hexa20Elem": dict(hex20),
|
||||
"Penta6Elem": dict(pent6),
|
||||
"Penta15Elem": dict(pent15),
|
||||
|
||||
'Groups': dict([(
|
||||
"Groups": dict([(
|
||||
group_num, (
|
||||
femmesh.getGroupName(group_num),
|
||||
femmesh.getGroupElements(group_num)
|
||||
@@ -336,22 +336,22 @@ def fill_femresult_mechanical(
|
||||
res_obj,
|
||||
result_set
|
||||
):
|
||||
''' fills a FreeCAD FEM mechanical result object with result data
|
||||
'''
|
||||
if 'number' in result_set:
|
||||
eigenmode_number = result_set['number']
|
||||
""" fills a FreeCAD FEM mechanical result object with result data
|
||||
"""
|
||||
if "number" in result_set:
|
||||
eigenmode_number = result_set["number"]
|
||||
else:
|
||||
eigenmode_number = 0
|
||||
|
||||
if 'time' in result_set:
|
||||
step_time = result_set['time']
|
||||
if "time" in result_set:
|
||||
step_time = result_set["time"]
|
||||
step_time = round(step_time, 2)
|
||||
|
||||
# if disp exists, fill res_obj.NodeNumbers and
|
||||
# res_obj.DisplacementVectors as well as stress and strain
|
||||
# furthermore the eigenmode number
|
||||
if 'disp' in result_set:
|
||||
disp = result_set['disp']
|
||||
if "disp" in result_set:
|
||||
disp = result_set["disp"]
|
||||
res_obj.DisplacementVectors = list(map((lambda x: x), disp.values()))
|
||||
res_obj.NodeNumbers = list(disp.keys())
|
||||
|
||||
@@ -359,8 +359,8 @@ def fill_femresult_mechanical(
|
||||
# list values are just added
|
||||
# Should we check if the key in stress and strain dict
|
||||
# is the same as the number in NodeNumbers?
|
||||
if 'stress' in result_set:
|
||||
stress = result_set['stress']
|
||||
if "stress" in result_set:
|
||||
stress = result_set["stress"]
|
||||
Sxx = []
|
||||
Syy = []
|
||||
Szz = []
|
||||
@@ -383,8 +383,8 @@ def fill_femresult_mechanical(
|
||||
res_obj.NodeStressYZ = Syz
|
||||
|
||||
# fill res_obj.NodeStrainXX etc if they exist in result_set
|
||||
if 'strain' in result_set:
|
||||
strain = result_set['strain']
|
||||
if "strain" in result_set:
|
||||
strain = result_set["strain"]
|
||||
Exx = []
|
||||
Eyy = []
|
||||
Ezz = []
|
||||
@@ -407,12 +407,12 @@ def fill_femresult_mechanical(
|
||||
res_obj.NodeStrainYZ = Eyz
|
||||
|
||||
# fill Equivalent Plastic strain if they exist
|
||||
if 'peeq' in result_set:
|
||||
Peeq = result_set['peeq']
|
||||
if "peeq" in result_set:
|
||||
Peeq = result_set["peeq"]
|
||||
if len(Peeq) > 0:
|
||||
if len(Peeq.values()) != len(disp.values()):
|
||||
# how is this possible? An example is needed!
|
||||
FreeCAD.Console.PrintError('PEEQ seams to have exptra nodes.\n')
|
||||
FreeCAD.Console.PrintError("PEEQ seams to have exptra nodes.\n")
|
||||
Pe = []
|
||||
Pe_extra_nodes = list(Peeq.values())
|
||||
nodes = len(disp.values())
|
||||
@@ -430,8 +430,8 @@ def fill_femresult_mechanical(
|
||||
# fill res_obj.Temperature if they exist
|
||||
# TODO, check if it is possible to have Temperature without disp
|
||||
# we would need to set NodeNumbers than
|
||||
if 'temp' in result_set:
|
||||
Temperature = result_set['temp']
|
||||
if "temp" in result_set:
|
||||
Temperature = result_set["temp"]
|
||||
if len(Temperature) > 0:
|
||||
if len(Temperature.values()) != len(disp.values()):
|
||||
Temp = []
|
||||
@@ -439,7 +439,7 @@ def fill_femresult_mechanical(
|
||||
nodes = len(disp.values())
|
||||
for i in range(nodes):
|
||||
# how is this possible? An example is needed!
|
||||
FreeCAD.Console.PrintError('Temperature seams to have exptra nodes.\n')
|
||||
FreeCAD.Console.PrintError("Temperature seams to have exptra nodes.\n")
|
||||
Temp_value = Temp_extra_nodes[i]
|
||||
Temp.append(Temp_value)
|
||||
res_obj.Temperature = list(map((lambda x: x), Temp))
|
||||
@@ -448,8 +448,8 @@ def fill_femresult_mechanical(
|
||||
res_obj.Time = step_time
|
||||
|
||||
# fill res_obj.MassFlow
|
||||
if 'mflow' in result_set:
|
||||
MassFlow = result_set['mflow']
|
||||
if "mflow" in result_set:
|
||||
MassFlow = result_set["mflow"]
|
||||
if len(MassFlow) > 0:
|
||||
res_obj.MassFlowRate = list(map((lambda x: x), MassFlow.values()))
|
||||
res_obj.Time = step_time
|
||||
@@ -457,8 +457,8 @@ def fill_femresult_mechanical(
|
||||
res_obj.NodeNumbers = list(MassFlow.keys())
|
||||
|
||||
# fill res_obj.NetworkPressure, disp does not exist, see MassFlow
|
||||
if 'npressure' in result_set:
|
||||
NetworkPressure = result_set['npressure']
|
||||
if "npressure" in result_set:
|
||||
NetworkPressure = result_set["npressure"]
|
||||
if len(NetworkPressure) > 0:
|
||||
res_obj.NetworkPressure = list(map((lambda x: x), NetworkPressure.values()))
|
||||
res_obj.Time = step_time
|
||||
|
||||
@@ -36,10 +36,10 @@ import Fem
|
||||
|
||||
|
||||
# ********* generic FreeCAD import and export methods *********
|
||||
if open.__module__ == '__builtin__':
|
||||
if open.__module__ == "__builtin__":
|
||||
# because we'll redefine open below (Python2)
|
||||
pyopen = open
|
||||
elif open.__module__ == 'io':
|
||||
elif open.__module__ == "io":
|
||||
# because we'll redefine open below (Python3)
|
||||
pyopen = open
|
||||
|
||||
@@ -79,19 +79,19 @@ def export(
|
||||
obj = objectslist[0]
|
||||
if obj.isDerivedFrom("Fem::FemPostPipeline"):
|
||||
FreeCAD.Console.PrintError(
|
||||
'Export of a VTK post object to vtk is not yet implemented !\n'
|
||||
"Export of a VTK post object to vtk is not yet implemented !\n"
|
||||
)
|
||||
return
|
||||
elif obj.isDerivedFrom("Fem::FemMeshObject"):
|
||||
FreeCAD.Console.PrintError(
|
||||
'Use export to FEM mesh formats to export a FEM mesh object to vtk!\n'
|
||||
"Use export to FEM mesh formats to export a FEM mesh object to vtk!\n"
|
||||
)
|
||||
return
|
||||
elif obj.isDerivedFrom("Fem::FemResultObject"):
|
||||
Fem.writeResult(filename, obj)
|
||||
else:
|
||||
FreeCAD.Console.PrintError(
|
||||
'Selected object is not supported by export to VTK.\n'
|
||||
"Selected object is not supported by export to VTK.\n"
|
||||
)
|
||||
return
|
||||
|
||||
@@ -120,7 +120,7 @@ def importVtk(
|
||||
importVtkFCResult(filename, object_name)
|
||||
else:
|
||||
FreeCAD.Console.PrintError(
|
||||
'Error, wrong parameter in VTK import pref: {}\n'
|
||||
"Error, wrong parameter in VTK import pref: {}\n"
|
||||
.format(object_type)
|
||||
)
|
||||
|
||||
@@ -158,11 +158,11 @@ def importVtkFCResult(
|
||||
|
||||
import ObjectsFem
|
||||
if result_name_prefix is None:
|
||||
result_name_prefix = ''
|
||||
result_name_prefix = ""
|
||||
if analysis:
|
||||
analysis_object = analysis
|
||||
|
||||
results_name = result_name_prefix + 'results'
|
||||
results_name = result_name_prefix + "results"
|
||||
result_obj = ObjectsFem.makeResultMechanical(FreeCAD.ActiveDocument, results_name)
|
||||
# readResult always creates a new femmesh named ResultMesh
|
||||
Fem.readResult(filename, result_obj.Name)
|
||||
@@ -172,14 +172,14 @@ def importVtkFCResult(
|
||||
import femresult.resulttools as restools
|
||||
result_obj = restools.add_disp_apps(result_obj) # DisplacementLengths
|
||||
|
||||
''' seems unused at the moment
|
||||
filenamebase = '.'.join(filename.split('.')[:-1]) # pattern: filebase_timestamp.vtk
|
||||
ts = filenamebase.split('_')[-1]
|
||||
""" seems unused at the moment
|
||||
filenamebase = ".".join(filename.split(".")[:-1]) # pattern: filebase_timestamp.vtk
|
||||
ts = filenamebase.split("_")[-1]
|
||||
try:
|
||||
time_step = float(ts)
|
||||
except:
|
||||
time_step = 0.0
|
||||
'''
|
||||
"""
|
||||
|
||||
if analysis:
|
||||
analysis_object.addObject(result_obj)
|
||||
|
||||
@@ -50,10 +50,10 @@ except ImportError:
|
||||
# names are fix given from FreeCAD, these methods are called from FreeCAD
|
||||
# they are set in FEM modules Init.py
|
||||
|
||||
if open.__module__ == '__builtin__':
|
||||
if open.__module__ == "__builtin__":
|
||||
# because we'll redefine open below (Python2)
|
||||
pyopen = open
|
||||
elif open.__module__ == 'io':
|
||||
elif open.__module__ == "io":
|
||||
# because we'll redefine open below (Python3)
|
||||
pyopen = open
|
||||
|
||||
@@ -61,8 +61,8 @@ elif open.__module__ == 'io':
|
||||
def open(
|
||||
filename
|
||||
):
|
||||
'''called when freecad opens a file
|
||||
a FEM mesh object is created in a new document'''
|
||||
"""called when freecad opens a file
|
||||
a FEM mesh object is created in a new document"""
|
||||
|
||||
docname = os.path.splitext(os.path.basename(filename))[0]
|
||||
return insert(filename, docname)
|
||||
@@ -72,8 +72,8 @@ def insert(
|
||||
filename,
|
||||
docname
|
||||
):
|
||||
'''called when freecad wants to import a file"
|
||||
a FEM mesh object is created in a existing document'''
|
||||
"""called when freecad wants to import a file"
|
||||
a FEM mesh object is created in a existing document"""
|
||||
|
||||
try:
|
||||
doc = FreeCAD.getDocument(docname)
|
||||
@@ -129,7 +129,7 @@ def import_yaml_json_mesh(
|
||||
femmesh = read(fileString)
|
||||
if femmesh:
|
||||
mesh_object = FreeCAD.ActiveDocument.addObject(
|
||||
'Fem::FemMeshObject',
|
||||
"Fem::FemMeshObject",
|
||||
mesh_name
|
||||
)
|
||||
mesh_object.FemMesh = femmesh
|
||||
@@ -140,8 +140,8 @@ def import_yaml_json_mesh(
|
||||
def read(
|
||||
fileString
|
||||
):
|
||||
'''read a FemMesh from a yaml/json mesh file and return the FemMesh
|
||||
'''
|
||||
"""read a FemMesh from a yaml/json mesh file and return the FemMesh
|
||||
"""
|
||||
# no document object is created, just the FemMesh is returned
|
||||
|
||||
fileExtension = os.path.basename(os.path.splitext(fileString)[1])
|
||||
@@ -197,8 +197,8 @@ def write(
|
||||
fileString,
|
||||
fem_mesh
|
||||
):
|
||||
'''directly write a FemMesh to a yaml/json mesh file
|
||||
fem_mesh: a FemMesh'''
|
||||
"""directly write a FemMesh to a yaml/json mesh file
|
||||
fem_mesh: a FemMesh"""
|
||||
|
||||
mesh_data = importToolsFem.make_dict_from_femmesh(fem_mesh)
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# ***************************************************************************
|
||||
# * *
|
||||
# * Copyright (c) 2016 - Bernd Hahnebach <bernd@bimstatik.org> *
|
||||
|
||||
# * *
|
||||
# * This program is free software; you can redistribute it and/or modify *
|
||||
# * it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
@@ -36,10 +37,10 @@ import FreeCAD
|
||||
# names are fix given from FreeCAD, these methods are called from FreeCAD
|
||||
# they are set in FEM modules Init.py
|
||||
|
||||
if open.__module__ == '__builtin__':
|
||||
if open.__module__ == "__builtin__":
|
||||
# because we'll redefine open below (Python2)
|
||||
pyopen = open
|
||||
elif open.__module__ == 'io':
|
||||
elif open.__module__ == "io":
|
||||
# because we'll redefine open below (Python3)
|
||||
pyopen = open
|
||||
|
||||
@@ -47,8 +48,8 @@ elif open.__module__ == 'io':
|
||||
def open(
|
||||
filename
|
||||
):
|
||||
'''called when freecad opens a file
|
||||
a FEM mesh object is created in a new document'''
|
||||
"""called when freecad opens a file
|
||||
a FEM mesh object is created in a new document"""
|
||||
|
||||
docname = os.path.splitext(os.path.basename(filename))[0]
|
||||
return insert(filename, docname)
|
||||
@@ -58,8 +59,8 @@ def insert(
|
||||
filename,
|
||||
docname
|
||||
):
|
||||
'''called when freecad wants to import a file
|
||||
a FEM mesh object is created in a existing document'''
|
||||
"""called when freecad wants to import a file
|
||||
a FEM mesh object is created in a existing document"""
|
||||
|
||||
try:
|
||||
doc = FreeCAD.getDocument(docname)
|
||||
@@ -109,9 +110,9 @@ def import_z88_mesh(
|
||||
analysis=None,
|
||||
docname=None
|
||||
):
|
||||
'''read a FEM mesh from a Z88 mesh file and
|
||||
"""read a FEM mesh from a Z88 mesh file and
|
||||
insert a FreeCAD FEM Mesh object in the ActiveDocument
|
||||
'''
|
||||
"""
|
||||
|
||||
try:
|
||||
doc = FreeCAD.getDocument(docname)
|
||||
@@ -126,7 +127,7 @@ def import_z88_mesh(
|
||||
|
||||
femmesh = read(filename)
|
||||
if femmesh:
|
||||
mesh_object = doc.addObject('Fem::FemMeshObject', mesh_name)
|
||||
mesh_object = doc.addObject("Fem::FemMeshObject", mesh_name)
|
||||
mesh_object.FemMesh = femmesh
|
||||
|
||||
return mesh_object
|
||||
@@ -135,8 +136,8 @@ def import_z88_mesh(
|
||||
def read(
|
||||
filename
|
||||
):
|
||||
'''read a FemMesh from a Z88 mesh file and return the FemMesh
|
||||
'''
|
||||
"""read a FemMesh from a Z88 mesh file and return the FemMesh
|
||||
"""
|
||||
# no document object is created, just the FemMesh is returned
|
||||
|
||||
mesh_data = read_z88_mesh(filename)
|
||||
@@ -148,9 +149,9 @@ def read(
|
||||
def read_z88_mesh(
|
||||
z88_mesh_input
|
||||
):
|
||||
''' reads a z88 mesh file z88i1.txt (Z88OSV14) or z88structure.txt (Z88AuroraV3)
|
||||
""" reads a z88 mesh file z88i1.txt (Z88OSV14) or z88structure.txt (Z88AuroraV3)
|
||||
and extracts the nodes and elements
|
||||
'''
|
||||
"""
|
||||
nodes = {}
|
||||
elements_hexa8 = {}
|
||||
elements_penta6 = {}
|
||||
@@ -188,13 +189,13 @@ def read_z88_mesh(
|
||||
elements_last_line = elemts_first_line - 1 + elements_count * 2
|
||||
|
||||
FreeCAD.Console.PrintLog(nodes_count)
|
||||
FreeCAD.Console.PrintLog('\n')
|
||||
FreeCAD.Console.PrintLog("\n")
|
||||
FreeCAD.Console.PrintLog(elements_count)
|
||||
FreeCAD.Console.PrintLog('\n')
|
||||
FreeCAD.Console.PrintLog("\n")
|
||||
FreeCAD.Console.PrintLog(nodes_last_line)
|
||||
FreeCAD.Console.PrintLog('\n')
|
||||
FreeCAD.Console.PrintLog("\n")
|
||||
FreeCAD.Console.PrintLog(elemts_first_line)
|
||||
FreeCAD.Console.PrintLog('\n')
|
||||
FreeCAD.Console.PrintLog("\n")
|
||||
FreeCAD.Console.PrintLog(elements_last_line)
|
||||
|
||||
z88_mesh_file.seek(0) # go back to the beginning of the file
|
||||
@@ -395,27 +396,27 @@ def read_z88_mesh(
|
||||
return {}
|
||||
|
||||
for n in nodes:
|
||||
FreeCAD.Console.PrintLog(str(n) + ' ' + str(nodes[n]) + '\n')
|
||||
FreeCAD.Console.PrintLog(str(n) + " " + str(nodes[n]) + "\n")
|
||||
for e in elements_tria6:
|
||||
FreeCAD.Console.PrintLog(str(e) + ' ' + str(elements_tria6[e]) + '\n')
|
||||
FreeCAD.Console.PrintLog('\n')
|
||||
FreeCAD.Console.PrintLog(str(e) + " " + str(elements_tria6[e]) + "\n")
|
||||
FreeCAD.Console.PrintLog("\n")
|
||||
|
||||
z88_mesh_file.close()
|
||||
|
||||
return {
|
||||
'Nodes': nodes,
|
||||
'Seg2Elem': elements_seg2,
|
||||
'Seg3Elem': elements_seg3,
|
||||
'Tria3Elem': elements_tria3,
|
||||
'Tria6Elem': elements_tria6,
|
||||
'Quad4Elem': elements_quad4,
|
||||
'Quad8Elem': elements_quad8,
|
||||
'Tetra4Elem': elements_tetra4,
|
||||
'Tetra10Elem': elements_tetra10,
|
||||
'Hexa8Elem': elements_hexa8,
|
||||
'Hexa20Elem': elements_hexa20,
|
||||
'Penta6Elem': elements_penta6,
|
||||
'Penta15Elem': elements_penta15
|
||||
"Nodes": nodes,
|
||||
"Seg2Elem": elements_seg2,
|
||||
"Seg3Elem": elements_seg3,
|
||||
"Tria3Elem": elements_tria3,
|
||||
"Tria6Elem": elements_tria6,
|
||||
"Quad4Elem": elements_quad4,
|
||||
"Quad8Elem": elements_quad8,
|
||||
"Tetra4Elem": elements_tetra4,
|
||||
"Tetra10Elem": elements_tetra10,
|
||||
"Hexa8Elem": elements_hexa8,
|
||||
"Hexa20Elem": elements_hexa20,
|
||||
"Penta6Elem": elements_penta6,
|
||||
"Penta15Elem": elements_penta15
|
||||
}
|
||||
|
||||
|
||||
@@ -424,8 +425,8 @@ def write(
|
||||
fem_mesh,
|
||||
filename
|
||||
):
|
||||
'''directly write a FemMesh to a Z88 mesh file format
|
||||
fem_mesh: a FemMesh'''
|
||||
"""directly write a FemMesh to a Z88 mesh file format
|
||||
fem_mesh: a FemMesh"""
|
||||
|
||||
if not fem_mesh.isDerivedFrom("Fem::FemMesh"):
|
||||
FreeCAD.Console.PrintError("Not a FemMesh was given as parameter.\n")
|
||||
@@ -565,7 +566,7 @@ def get_z88_element_type(
|
||||
# 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: ' + str(elem_length) + '\n')
|
||||
FreeCAD.Console.PrintLog("node count of first element: " + str(elem_length) + "\n")
|
||||
break # break after the first elem
|
||||
if FemMeshTools.is_solid_femmesh(femmesh):
|
||||
if femmesh.TetraCount == femmesh.VolumeCount:
|
||||
@@ -574,43 +575,43 @@ def get_z88_element_type(
|
||||
elif elem_length == 10:
|
||||
return 16
|
||||
else:
|
||||
FreeCAD.Console.PrintMessage('Tetra with neither 4 nor 10 nodes.\n')
|
||||
FreeCAD.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:
|
||||
FreeCAD.Console.PrintMessage('Hexa with neither 8 nor 20 nodes.\n')
|
||||
FreeCAD.Console.PrintMessage("Hexa with neither 8 nor 20 nodes.\n")
|
||||
return 0
|
||||
else:
|
||||
FreeCAD.Console.PrintMessage('no tetra, no hexa or Mixed Volume Elements.\n')
|
||||
FreeCAD.Console.PrintMessage("no tetra, no hexa or Mixed Volume Elements.\n")
|
||||
elif FemMeshTools.is_face_femmesh(femmesh):
|
||||
if femmesh.TriangleCount == femmesh.FaceCount:
|
||||
if elem_length == 3:
|
||||
FreeCAD.Console.PrintMessage('tria3mesh, not supported by Z88.\n')
|
||||
FreeCAD.Console.PrintMessage("tria3mesh, not supported by Z88.\n")
|
||||
return 0
|
||||
elif elem_length == 6:
|
||||
return 24
|
||||
else:
|
||||
FreeCAD.Console.PrintMessage('Tria with neither 3 nor 6 nodes.\n')
|
||||
FreeCAD.Console.PrintMessage("Tria with neither 3 nor 6 nodes.\n")
|
||||
return 0
|
||||
elif femmesh.QuadrangleCount == femmesh.FaceCount:
|
||||
if elem_length == 4:
|
||||
FreeCAD.Console.PrintMessage('quad4mesh, not supported by Z88.\n')
|
||||
FreeCAD.Console.PrintMessage("quad4mesh, not supported by Z88.\n")
|
||||
return 0
|
||||
elif elem_length == 8:
|
||||
return 23
|
||||
else:
|
||||
FreeCAD.Console.PrintMessage('Quad with neither 4 nor 8 nodes.\n')
|
||||
FreeCAD.Console.PrintMessage("Quad with neither 4 nor 8 nodes.\n")
|
||||
return 0
|
||||
else:
|
||||
FreeCAD.Console.PrintMessage('no tria, no quad\n')
|
||||
FreeCAD.Console.PrintMessage("no tria, no quad\n")
|
||||
return 0
|
||||
elif FemMeshTools.is_edge_femmesh(femmesh):
|
||||
FreeCAD.Console.PrintMessage('Edge femmesh will be exported as 3D truss element nr 4.\n')
|
||||
FreeCAD.Console.PrintMessage("Edge femmesh will be exported as 3D truss element nr 4.\n")
|
||||
return 4
|
||||
else:
|
||||
FreeCAD.Console.PrintMessage('Neither edge nor face nor solid femmesh.\n')
|
||||
FreeCAD.Console.PrintMessage("Neither edge nor face nor solid femmesh.\n")
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -33,10 +33,10 @@ import os
|
||||
|
||||
|
||||
# ********* generic FreeCAD import and export methods *********
|
||||
if open.__module__ == '__builtin__':
|
||||
if open.__module__ == "__builtin__":
|
||||
# because we'll redefine open below (Python2)
|
||||
pyopen = open
|
||||
elif open.__module__ == 'io':
|
||||
elif open.__module__ == "io":
|
||||
# because we'll redefine open below (Python3)
|
||||
pyopen = open
|
||||
|
||||
@@ -68,42 +68,42 @@ def import_z88_disp(
|
||||
analysis=None,
|
||||
result_name_prefix=None
|
||||
):
|
||||
'''insert a FreeCAD FEM mechanical result object in the ActiveDocument
|
||||
"""insert a FreeCAD FEM mechanical result object in the ActiveDocument
|
||||
pure usage:
|
||||
import feminout.importZ88O2Results as importZ88O2Results
|
||||
disp_file = '/pathtofile/z88o2.txt'
|
||||
disp_file = "/pathtofile/z88o2.txt"
|
||||
importZ88O2Results.import_z88_disp(disp_file)
|
||||
|
||||
the z888i1.txt FEMMesh file needs to be in the same directory as z88o2.txt
|
||||
# ahh, make a new document first ;-)
|
||||
'''
|
||||
"""
|
||||
from . import importZ88Mesh
|
||||
from . import importToolsFem
|
||||
import ObjectsFem
|
||||
if result_name_prefix is None:
|
||||
result_name_prefix = ''
|
||||
result_name_prefix = ""
|
||||
disp_read = read_z88_disp(filename)
|
||||
result_mesh_object = None
|
||||
if len(disp_read['Nodes']) > 0:
|
||||
if len(disp_read["Nodes"]) > 0:
|
||||
if analysis:
|
||||
analysis_object = analysis
|
||||
|
||||
# read result mesh
|
||||
if filename.endswith('z88o2.txt'):
|
||||
mesh_file = filename.replace('o2', 'i1')
|
||||
if filename.endswith("z88o2.txt"):
|
||||
mesh_file = filename.replace("o2", "i1")
|
||||
mesh_data = importZ88Mesh.read_z88_mesh(mesh_file)
|
||||
femmesh = importToolsFem.make_femmesh(mesh_data)
|
||||
result_mesh_object = ObjectsFem.makeMeshResult(
|
||||
FreeCAD.ActiveDocument,
|
||||
'Result_mesh'
|
||||
"Result_mesh"
|
||||
)
|
||||
result_mesh_object.FemMesh = femmesh
|
||||
else:
|
||||
FreeCAD.Console.PrintError('Z88 mesh file z88i1.txt not found!')
|
||||
FreeCAD.Console.PrintError("Z88 mesh file z88i1.txt not found!")
|
||||
|
||||
# create result obj
|
||||
for result_set in disp_read['Results']:
|
||||
results_name = result_name_prefix + 'results'
|
||||
for result_set in disp_read["Results"]:
|
||||
results_name = result_name_prefix + "results"
|
||||
|
||||
res_obj = ObjectsFem.makeResultMechanical(FreeCAD.ActiveDocument, results_name)
|
||||
res_obj.Mesh = result_mesh_object
|
||||
@@ -119,7 +119,7 @@ def import_z88_disp(
|
||||
|
||||
else:
|
||||
FreeCAD.Console.PrintError(
|
||||
'Problem on Z88 result file import. No nodes found in Z88 result file.\n'
|
||||
"Problem on Z88 result file import. No nodes found in Z88 result file.\n"
|
||||
)
|
||||
return res_obj
|
||||
|
||||
@@ -127,11 +127,11 @@ def import_z88_disp(
|
||||
def read_z88_disp(
|
||||
z88_disp_input
|
||||
):
|
||||
'''
|
||||
"""
|
||||
read a z88 disp file and extract the nodes and elements
|
||||
z88 Displacement output file is z88o2.txt
|
||||
works with Z88OS14
|
||||
'''
|
||||
"""
|
||||
nodes = {}
|
||||
mode_disp = {}
|
||||
mode_results = {}
|
||||
@@ -156,11 +156,11 @@ def read_z88_disp(
|
||||
mode_disp[node_no] = FreeCAD.Vector(mode_disp_x, mode_disp_y, mode_disp_z)
|
||||
nodes[node_no] = node_no
|
||||
|
||||
mode_results['disp'] = mode_disp
|
||||
mode_results["disp"] = mode_disp
|
||||
results.append(mode_results)
|
||||
|
||||
for r in results[0]['disp']:
|
||||
FreeCAD.Console.PrintLog("{} --> {}\n".format(r, results[0]['disp'][r]))
|
||||
for r in results[0]["disp"]:
|
||||
FreeCAD.Console.PrintLog("{} --> {}\n".format(r, results[0]["disp"][r]))
|
||||
|
||||
z88_disp_file.close()
|
||||
return {'Nodes': nodes, 'Results': results}
|
||||
return {"Nodes": nodes, "Results": results}
|
||||
|
||||
@@ -36,16 +36,16 @@ def read_fenics_mesh_xdmf(xdmffilename):
|
||||
FreeCAD.Console.PrintMessage("Not operational, yet\n")
|
||||
|
||||
return {
|
||||
'Nodes': {},
|
||||
'Hexa8Elem': {},
|
||||
'Penta6Elem': {},
|
||||
'Tetra4Elem': {},
|
||||
'Tetra10Elem': {},
|
||||
'Penta15Elem': {},
|
||||
'Hexa20Elem': {},
|
||||
'Tria3Elem': {},
|
||||
'Tria6Elem': {},
|
||||
'Quad4Elem': {},
|
||||
'Quad8Elem': {},
|
||||
'Seg2Elem': {}
|
||||
"Nodes": {},
|
||||
"Hexa8Elem": {},
|
||||
"Penta6Elem": {},
|
||||
"Tetra4Elem": {},
|
||||
"Tetra10Elem": {},
|
||||
"Penta15Elem": {},
|
||||
"Hexa20Elem": {},
|
||||
"Tria3Elem": {},
|
||||
"Tria6Elem": {},
|
||||
"Quad4Elem": {},
|
||||
"Quad8Elem": {},
|
||||
"Seg2Elem": {}
|
||||
}
|
||||
|
||||
@@ -36,9 +36,9 @@ import itertools
|
||||
|
||||
|
||||
def read_fenics_mesh_xml(xmlfilename):
|
||||
'''
|
||||
"""
|
||||
Returns element dictionary to be evaluated by make_femmesh later
|
||||
'''
|
||||
"""
|
||||
|
||||
Fenics_to_FreeCAD_dict = {
|
||||
"triangle": "tria3",
|
||||
@@ -49,10 +49,10 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
}
|
||||
|
||||
def read_mesh_block(mesh_block):
|
||||
'''
|
||||
"""
|
||||
Reading mesh block from XML file.
|
||||
The mesh block only contains cells and vertices.
|
||||
'''
|
||||
"""
|
||||
dim = int(mesh_block.get("dim"))
|
||||
cell_type = mesh_block.get("celltype")
|
||||
|
||||
@@ -63,12 +63,12 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
|
||||
# every cell type contains a dict with key=dimension and value=number
|
||||
|
||||
cells_parts_dim = {'point': {0: 1},
|
||||
'interval': {0: 2, 1: 1},
|
||||
'triangle': {0: 3, 1: 3, 2: 1},
|
||||
'tetrahedron': {0: 4, 1: 6, 2: 4, 3: 1},
|
||||
'quadrilateral': {0: 4, 1: 4, 2: 1},
|
||||
'hexahedron': {0: 8, 1: 12, 2: 6, 3: 1}}
|
||||
cells_parts_dim = {"point": {0: 1},
|
||||
"interval": {0: 2, 1: 1},
|
||||
"triangle": {0: 3, 1: 3, 2: 1},
|
||||
"tetrahedron": {0: 4, 1: 6, 2: 4, 3: 1},
|
||||
"quadrilateral": {0: 4, 1: 4, 2: 1},
|
||||
"hexahedron": {0: 8, 1: 12, 2: 6, 3: 1}}
|
||||
|
||||
find_vertices = mesh_block.find("vertices")
|
||||
find_cells = mesh_block.find("cells")
|
||||
@@ -85,7 +85,7 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
for vertex in find_vertices:
|
||||
ind = int(vertex.get("index"))
|
||||
|
||||
if vertex.tag.lower() == 'vertex':
|
||||
if vertex.tag.lower() == "vertex":
|
||||
[node_x, node_y, node_z] = [
|
||||
float(vertex.get(coord, 0.)) for coord in ["x", "y", "z"]
|
||||
]
|
||||
@@ -126,15 +126,15 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
def generate_lower_dimensional_structures(nodes, cell_dict, cell_type, dim):
|
||||
|
||||
def correct_volume_det(element_dict):
|
||||
'''
|
||||
"""
|
||||
Checks whether the cell elements
|
||||
all have the same volume (<0?)
|
||||
sign (is necessary to avoid negative
|
||||
Jacobian errors).
|
||||
Works only with tet4 and tri3 elements at the moment
|
||||
'''
|
||||
"""
|
||||
if dim == 3:
|
||||
for (ind, tet) in list(element_dict['tetra4'].items()):
|
||||
for (ind, tet) in list(element_dict["tetra4"].items()):
|
||||
v0 = nodes[tet[0]]
|
||||
v1 = nodes[tet[1]]
|
||||
v2 = nodes[tet[2]]
|
||||
@@ -143,17 +143,17 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
b = v2 - v0
|
||||
c = v3 - v0
|
||||
if a.dot(b.cross(c)) > 0:
|
||||
element_dict['tetra4'][ind] = (tet[1], tet[0], tet[2], tet[3])
|
||||
element_dict["tetra4"][ind] = (tet[1], tet[0], tet[2], tet[3])
|
||||
if dim == 2:
|
||||
nz = FreeCAD.Vector(0., 0., 1.)
|
||||
for (ind, tria) in list(element_dict['tria3'].items()):
|
||||
for (ind, tria) in list(element_dict["tria3"].items()):
|
||||
v0 = nodes[tria[0]]
|
||||
v1 = nodes[tria[1]]
|
||||
v2 = nodes[tria[2]]
|
||||
a = v1 - v0
|
||||
b = v2 - v0
|
||||
if nz.dot(a.cross(b)) < 0:
|
||||
element_dict['tria3'][ind] = (tria[1], tria[0], tria[2])
|
||||
element_dict["tria3"][ind] = (tria[1], tria[0], tria[2])
|
||||
|
||||
element_dict = {}
|
||||
element_counter = {}
|
||||
@@ -176,16 +176,16 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
invdic[it] = key
|
||||
return invdic
|
||||
|
||||
num_vert_dict = {'interval': 2,
|
||||
'triangle': 3,
|
||||
'tetrahedron': 4,
|
||||
'hexahedron': 8,
|
||||
'quadrilateral': 4}
|
||||
lower_dims_dict = {'interval': [],
|
||||
'triangle': ['interval'],
|
||||
'tetrahedron': ['triangle', 'interval'],
|
||||
'hexahedron': ['quadrilateral', 'interval'],
|
||||
'quadrilateral': ['interval']}
|
||||
num_vert_dict = {"interval": 2,
|
||||
"triangle": 3,
|
||||
"tetrahedron": 4,
|
||||
"hexahedron": 8,
|
||||
"quadrilateral": 4}
|
||||
lower_dims_dict = {"interval": [],
|
||||
"triangle": ["interval"],
|
||||
"tetrahedron": ["triangle", "interval"],
|
||||
"hexahedron": ["quadrilateral", "interval"],
|
||||
"quadrilateral": ["interval"]}
|
||||
|
||||
# generate cell list from file
|
||||
# read vertex list from cells
|
||||
@@ -207,14 +207,14 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
# print("len & len counter", length_counter)
|
||||
for (key, val_dict) in list(element_dict.items()):
|
||||
# to ensure distinct indices for FreeCAD
|
||||
# print('key: ', key)
|
||||
# print("key: ", key)
|
||||
for (vkey, it) in list(val_dict.items()):
|
||||
val_dict[vkey] = it + length_counter # maintain distinct element numbers
|
||||
len_val_dict = len(val_dict)
|
||||
if len_val_dict > 0:
|
||||
length_counter += len_val_dict + 1 # only if preceding list is not empty
|
||||
# print('len: ', len_val_dict)
|
||||
# print('lencounter: ', length_counter)
|
||||
# print("len: ", len_val_dict)
|
||||
# print("lencounter: ", length_counter)
|
||||
# inverse of the dict (dict[key] = val -> dict[val] = key)
|
||||
element_dict[key] = invertdict(val_dict)
|
||||
|
||||
@@ -251,17 +251,17 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
print("Internal mesh data found")
|
||||
|
||||
return {
|
||||
'Nodes': nodes,
|
||||
'Seg2Elem': element_dict['seg2'],
|
||||
'Seg3Elem': {},
|
||||
'Tria3Elem': element_dict['tria3'],
|
||||
'Tria6Elem': {},
|
||||
'Quad4Elem': element_dict['quad4'],
|
||||
'Quad8Elem': {},
|
||||
'Tetra4Elem': element_dict['tetra4'],
|
||||
'Tetra10Elem': {},
|
||||
'Hexa8Elem': {},
|
||||
'Hexa20Elem': {},
|
||||
'Penta6Elem': {},
|
||||
'Penta15Elem': {}
|
||||
"Nodes": nodes,
|
||||
"Seg2Elem": element_dict["seg2"],
|
||||
"Seg3Elem": {},
|
||||
"Tria3Elem": element_dict["tria3"],
|
||||
"Tria6Elem": {},
|
||||
"Quad4Elem": element_dict["quad4"],
|
||||
"Quad8Elem": {},
|
||||
"Tetra4Elem": element_dict["tetra4"],
|
||||
"Tetra10Elem": {},
|
||||
"Hexa8Elem": {},
|
||||
"Hexa20Elem": {},
|
||||
"Penta6Elem": {},
|
||||
"Penta15Elem": {}
|
||||
}
|
||||
|
||||
@@ -39,8 +39,8 @@ __url__ = "http://www.freecadweb.org"
|
||||
# \ingroup FEM
|
||||
# \brief FreeCAD Fenics Mesh XDMF writer for FEM workbench
|
||||
|
||||
ENCODING_ASCII = 'ASCII'
|
||||
ENCODING_HDF5 = 'HDF5'
|
||||
ENCODING_ASCII = "ASCII"
|
||||
ENCODING_HDF5 = "HDF5"
|
||||
|
||||
FreeCAD_Group_Dimensions = {
|
||||
"Vertex": 0,
|
||||
@@ -68,9 +68,9 @@ def numpy_array_to_str(
|
||||
):
|
||||
res = ""
|
||||
dt = str(npa.dtype)
|
||||
if 'int' in dt:
|
||||
if "int" in dt:
|
||||
res = "\n".join([" ".join([("%d" % s) for s in a]) for a in npa.tolist()])
|
||||
elif 'float' in dt:
|
||||
elif "float" in dt:
|
||||
res = "\n".join([" ".join([("%3.6f" % s) for s in a]) for a in npa.tolist()])
|
||||
return res
|
||||
|
||||
@@ -141,11 +141,11 @@ def write_fenics_mesh_codim_xdmf(
|
||||
element_types = get_FemMeshObjectElementTypes(fem_mesh_obj, remove_zero_element_entries=True)
|
||||
element_order = get_FemMeshObjectOrder(fem_mesh_obj)
|
||||
# we get all elements from mesh to decide which one to write by selection of codim
|
||||
'''
|
||||
"""
|
||||
nodeindices = [(
|
||||
nodes_dict[ind] for ind in fem_mesh_obj.FemMesh.getElementNodes(fc_volume_ind)
|
||||
) for (fen_ind, fc_volume_ind) in enumerate(fc_cells)]
|
||||
'''
|
||||
"""
|
||||
writeout_element_dimension = mesh_dimension - codim
|
||||
|
||||
(num_topo, name_topo, dim_topo) = (0, "", 0)
|
||||
@@ -314,14 +314,14 @@ def write_fenics_mesh_xdmf(
|
||||
gmshgroups = get_FemMeshObjectMeshGroups(fem_mesh_obj)
|
||||
|
||||
if gmshgroups is not ():
|
||||
print('found mesh groups')
|
||||
print("found mesh groups")
|
||||
|
||||
for g in gmshgroups:
|
||||
mesh_function_type = fem_mesh.getGroupElementType(g)
|
||||
mesh_function_codim = dim_cell - FreeCAD_Group_Dimensions[mesh_function_type]
|
||||
mesh_function_name = fem_mesh.getGroupName(g)
|
||||
|
||||
print('group id: %d (label: %s) with element type %s and codim %d'
|
||||
print("group id: %d (label: %s) with element type %s and codim %d"
|
||||
% (g, mesh_function_name, mesh_function_type, mesh_function_codim))
|
||||
|
||||
mesh_function_grid = ET.SubElement(
|
||||
|
||||
Reference in New Issue
Block a user