FEM: in out modules, use double quotes instead of single ones

This commit is contained in:
Bernd Hahnebach
2019-09-13 08:58:55 +02:00
parent 3ec5af952d
commit 53252eb720
13 changed files with 346 additions and 345 deletions

View File

@@ -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")

View File

@@ -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:

View File

@@ -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
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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}

View File

@@ -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": {}
}

View File

@@ -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": {}
}

View File

@@ -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(