FEM: issue #3038 Fenics integration
- minor changes in xdmf saving dialog - fixed missing locals() reference in get_FemMeshObjectElementTypes for python3 compatiblity in xml/xdmf import/export - fixed open() and write() commands for python3 compatiblity in xml/xdmf export - fixed further python3 issues in xml/xdmf import/export
This commit is contained in:
@@ -84,18 +84,30 @@ class WriteXDMFTaskPanel:
|
||||
# group elements
|
||||
self.form.tableGroups.setItem(ind, 2, ro(QtGui.QTableWidgetItem(fem_mesh.getGroupElementType(gind))))
|
||||
# default value for not marked elements
|
||||
self.form.tableGroups.setItem(ind, 3, QtGui.QTableWidgetItem(str(-1)))
|
||||
self.form.tableGroups.setItem(ind, 3, QtGui.QTableWidgetItem(str(0)))
|
||||
# default value for marked elements
|
||||
self.form.tableGroups.setItem(ind, 4, QtGui.QTableWidgetItem(str(gind)))
|
||||
self.form.tableGroups.setItem(ind, 4, QtGui.QTableWidgetItem(str(1)))
|
||||
|
||||
header = self.form.tableGroups.horizontalHeader()
|
||||
header.setResizeMode(0, QtGui.QHeaderView.ResizeToContents)
|
||||
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents)
|
||||
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents)
|
||||
header.setResizeMode(3, QtGui.QHeaderView.ResizeToContents)
|
||||
header.setResizeMode(4, QtGui.QHeaderView.Stretch)
|
||||
|
||||
def convert_table_to_group_dict(self):
|
||||
group_values_dict = {}
|
||||
num_rows = self.form.tableGroups.rowCount()
|
||||
|
||||
for r in range(num_rows):
|
||||
g = int(self.form.tableGroups.item(r, 0).text())
|
||||
default_value = int(self.form.tableGroups.item(r, 3).text())
|
||||
marked_value = int(self.form.tableGroups.item(r, 4).text())
|
||||
g = int(self.form.tableGroups.item(r, 0).text()) # read-only no prob
|
||||
default_value = 0
|
||||
marked_value = 1
|
||||
try:
|
||||
default_value = int(self.form.tableGroups.item(r, 3).text())
|
||||
marked_value = int(self.form.tableGroups.item(r, 4).text())
|
||||
except:
|
||||
print("ERROR: value conversion failed in table to dict: assuming 0 for default, 1 for marked.")
|
||||
|
||||
group_values_dict[g] = (marked_value, default_value)
|
||||
|
||||
|
||||
@@ -100,7 +100,8 @@ def get_FemMeshObjectElementTypes(fem_mesh_obj, remove_zero_element_entries=True
|
||||
"Node": 0, "Edge": 1, "Hexa": 3, "Polygon": 2, "Polyhedron": 3,
|
||||
"Prism": 3, "Pyramid": 3, "Quadrangle": 2, "Tetra": 3, "Triangle": 2}
|
||||
|
||||
elements_list_with_zero = [(eval("fem_mesh_obj.FemMesh." + s + "Count"), s, d) for (s, d) in FreeCAD_element_names_dims.iteritems()]
|
||||
eval_dict = locals() # to access local variables from eval
|
||||
elements_list_with_zero = [(eval("fem_mesh_obj.FemMesh." + s + "Count", eval_dict), s, d) for (s, d) in FreeCAD_element_names_dims.items()]
|
||||
# ugly but necessary
|
||||
if remove_zero_element_entries:
|
||||
elements_list = [(num, s, d) for (num, s, d) in elements_list_with_zero if num > 0]
|
||||
|
||||
@@ -125,7 +125,7 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
Works only with tet4 and tri3 elements at the moment
|
||||
'''
|
||||
if dim == 3:
|
||||
for (ind, tet) in element_dict['tetra4'].iteritems():
|
||||
for (ind, tet) in list(element_dict['tetra4'].items()):
|
||||
v0 = nodes[tet[0]]
|
||||
v1 = nodes[tet[1]]
|
||||
v2 = nodes[tet[2]]
|
||||
@@ -137,7 +137,7 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
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 element_dict['tria3'].iteritems():
|
||||
for (ind, tria) in list(element_dict['tria3'].items()):
|
||||
v0 = nodes[tria[0]]
|
||||
v1 = nodes[tria[1]]
|
||||
v2 = nodes[tria[2]]
|
||||
@@ -150,7 +150,7 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
element_counter = {}
|
||||
|
||||
# TODO: remove upper level lookup
|
||||
for (key, val) in Fenics_to_FreeCAD_dict.iteritems():
|
||||
for (key, val) in list(Fenics_to_FreeCAD_dict.items()):
|
||||
element_dict[val] = {}
|
||||
element_counter[key] = 0 # count every distinct element and sub element type
|
||||
|
||||
@@ -163,7 +163,7 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
|
||||
def invertdict(dic):
|
||||
invdic = {}
|
||||
for (key, it) in dic.iteritems():
|
||||
for (key, it) in list(dic.items()):
|
||||
invdic[it] = key
|
||||
return invdic
|
||||
|
||||
@@ -178,7 +178,7 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
'hexahedron': ['quadrilateral', 'interval'],
|
||||
'quadrilateral': ['interval']}
|
||||
|
||||
for (cell_index, cell) in cell_dict.iteritems():
|
||||
for (cell_index, cell) in list(cell_dict.items()):
|
||||
cell_lower_dims = lower_dims_dict[cell_type]
|
||||
element_counter[cell_type] += 1
|
||||
element_dict[Fenics_to_FreeCAD_dict[cell_type]][cell] = element_counter[cell_type]
|
||||
@@ -190,9 +190,9 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
element_counter[ld])
|
||||
|
||||
length_counter = len(nodes)
|
||||
for (key, val_dict) in element_dict.iteritems():
|
||||
for (key, val_dict) in list(element_dict.items()):
|
||||
# to ensure distinct indices for FreeCAD
|
||||
for (vkey, it) in val_dict.iteritems():
|
||||
for (vkey, it) in list(val_dict.items()):
|
||||
val_dict[vkey] = it + length_counter
|
||||
length_counter += len(val_dict)
|
||||
# inverse of the dict (dict[key] = val -> dict[val] = key)
|
||||
@@ -205,7 +205,7 @@ def read_fenics_mesh_xml(xmlfilename):
|
||||
nodes = {}
|
||||
element_dict = {}
|
||||
# TODO: remove two times initialization
|
||||
for val in Fenics_to_FreeCAD_dict.itervalues():
|
||||
for val in list(Fenics_to_FreeCAD_dict.values()):
|
||||
element_dict[val] = {}
|
||||
|
||||
tree = ET.parse(xmlfilename)
|
||||
|
||||
@@ -101,7 +101,7 @@ def write_fenics_mesh_points_xdmf(fem_mesh_obj, geometrynode, encoding=ENCODING_
|
||||
if encoding == ENCODING_ASCII:
|
||||
dataitem = ET.SubElement(geometrynode, "DataItem", Dimensions="%d %d" % (numnodes, effective_dim), Format="XML")
|
||||
nodes = []
|
||||
for (ind, (key, node)) in enumerate(fem_mesh_obj.FemMesh.Nodes.iteritems()):
|
||||
for (ind, (key, node)) in enumerate(list(fem_mesh_obj.FemMesh.Nodes.items())):
|
||||
nodes.append(node)
|
||||
recalc_nodes_ind_dict[key] = ind
|
||||
|
||||
@@ -282,7 +282,7 @@ def write_fenics_mesh_xdmf(fem_mesh_obj, outputfile, group_values_dict={}, encod
|
||||
mesh_function_attribute = ET.SubElement(mesh_function_grid, "Attribute")
|
||||
|
||||
elem_dict = {}
|
||||
(elem_mark_group, elem_mark_default) = group_values_dict.get(g, (g, -1))
|
||||
(elem_mark_group, elem_mark_default) = group_values_dict.get(g, (1, 0))
|
||||
|
||||
# TODO: is it better to save all groups each at once or collect all codim equal
|
||||
# groups to put them into one function?
|
||||
@@ -299,8 +299,8 @@ def write_fenics_mesh_xdmf(fem_mesh_obj, outputfile, group_values_dict={}, encod
|
||||
|
||||
# TODO: improve cell functions support
|
||||
|
||||
fp = open(outputfile, "w")
|
||||
fp.write('''<?xml version="1.0"?>\n<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>\n''')
|
||||
fp = open(outputfile, "wb")
|
||||
fp.write(b'''<?xml version="1.0"?>\n<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>\n''')
|
||||
fp.write(ET.tostring(root))
|
||||
# xml core functionality does not support pretty printing
|
||||
# so the output file looks quite ugly
|
||||
|
||||
@@ -68,7 +68,7 @@ def write_fenics_mesh_xml(fem_mesh_obj, outputfile):
|
||||
meshchild = ET.SubElement(root, "mesh", celltype=cellname_fenics, dim=str(dim_cell))
|
||||
vertices = ET.SubElement(meshchild, "vertices", size=str(fem_mesh_obj.FemMesh.NodeCount))
|
||||
|
||||
for (nodeind, fc_vec) in fem_mesh_obj.FemMesh.Nodes.iteritems(): # python2
|
||||
for (nodeind, fc_vec) in list(fem_mesh_obj.FemMesh.Nodes.items()):
|
||||
ET.SubElement(
|
||||
vertices, "vertex", index=str(nodeind - 1),
|
||||
# FC starts from 1, fenics starts from 0 to size-1
|
||||
@@ -97,7 +97,7 @@ def write_fenics_mesh_xml(fem_mesh_obj, outputfile):
|
||||
|
||||
ET.SubElement(meshchild, "data")
|
||||
|
||||
fp = open(outputfile, "w")
|
||||
fp = open(outputfile, "wb")
|
||||
fp.write(ET.tostring(root))
|
||||
# xml core functionality does not support pretty printing
|
||||
# so the output file looks quite ugly
|
||||
|
||||
Reference in New Issue
Block a user