Skip to content

Commit

Permalink
FEM: issue #3038 Fenics mesh import/export: removed lxml dependency
Browse files Browse the repository at this point in the history
  • Loading branch information
joha2 authored and berndhahnebach committed Jun 29, 2017
1 parent 74e7940 commit 7b5adb9
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 22 deletions.
4 changes: 2 additions & 2 deletions src/Mod/Fem/readFenicsXML.py
Expand Up @@ -31,7 +31,7 @@


import FreeCAD
from lxml import etree # parsing xml files and exporting
from xml.etree import ElementTree as ET
import itertools


Expand Down Expand Up @@ -208,7 +208,7 @@ def invertdict(dic):
for val in Fenics_to_FreeCAD_dict.itervalues():
element_dict[val] = {}

tree = etree.parse(xmlfilename)
tree = ET.parse(xmlfilename)
root = tree.getroot()

if root.tag.lower() != "dolfin":
Expand Down
22 changes: 12 additions & 10 deletions src/Mod/Fem/writeFenicsXDMF.py
Expand Up @@ -30,7 +30,7 @@
# \brief FreeCAD Fenics Mesh XDMF writer for FEM workbench

from importToolsFem import get_FemMeshObjectDimension, get_FemMeshObjectElementTypes, get_MaxDimElementFromList, get_FemMeshObjectOrder
from lxml import etree # parsing xml files and exporting
from xml.etree import ElementTree as ET # parsing xml files and exporting
import numpy as np

ENCODING_ASCII = 'ASCII'
Expand Down Expand Up @@ -83,7 +83,7 @@ def write_fenics_mesh_points_xdmf(fem_mesh_obj, geometrynode, encoding=ENCODING_
recalc_nodes_ind_dict = {}

if encoding == ENCODING_ASCII:
dataitem = etree.SubElement(geometrynode, "DataItem", Dimensions="%d %d" % (numnodes, 3), Format="XML")
dataitem = ET.SubElement(geometrynode, "DataItem", Dimensions="%d %d" % (numnodes, 3), Format="XML")
nodes = []
for (ind, (key, node)) in enumerate(fem_mesh_obj.FemMesh.Nodes.iteritems()):
nodes.append(node)
Expand Down Expand Up @@ -133,7 +133,7 @@ def write_fenics_mesh_volumes_xdmf(fem_mesh_obj, topologynode, rd, encoding=ENCO
# write nodeindices into dict to access them later

if encoding == ENCODING_ASCII:
dataitem = etree.SubElement(topologynode, "DataItem", NumberType="UInt", Dimensions="%d %d" % (num_cells, nodes_per_element), Format="XML")
dataitem = ET.SubElement(topologynode, "DataItem", NumberType="UInt", Dimensions="%d %d" % (num_cells, nodes_per_element), Format="XML")
dataitem.text = numpy_array_to_str(tuples_to_numpy(nodeindices))
elif encoding == ENCODING_HDF5:
pass
Expand All @@ -147,7 +147,7 @@ def write_fenics_mesh_cellfunctions(fem_mesh_obj, mycellvalues, attributenode, e
(num_cells, name_cell, dim_cell) = get_MaxDimElementFromList(get_FemMeshObjectElementTypes(fem_mesh_obj))

if encoding == ENCODING_ASCII:
dataitem = etree.SubElement(attributenode, "DataItem", Dimensions="%d %d" % (num_cells, 1), Format="XML")
dataitem = ET.SubElement(attributenode, "DataItem", Dimensions="%d %d" % (num_cells, 1), Format="XML")
dataitem.text = numpy_array_to_str(np.random.random((num_cells, 1)))
elif encoding == ENCODING_HDF5:
pass
Expand Down Expand Up @@ -180,11 +180,11 @@ def write_fenics_mesh_xdmf(fem_mesh_obj, outputfile, encoding=ENCODING_ASCII):
cellname_fenics = FreeCAD_to_Fenics_dict[cellname_fc]
print("Celltype in mesh -> %s and its Fenics dolfin name: %s" % (str(celltype_in_mesh), cellname_fenics))

root = etree.Element("Xdmf", version="3.0")
domain = etree.SubElement(root, "Domain")
grid = etree.SubElement(domain, "Grid", Name="mesh", GridType="Uniform")
topology = etree.SubElement(grid, "Topology")
geometry = etree.SubElement(grid, "Geometry")
root = ET.Element("Xdmf", version="3.0")
domain = ET.SubElement(root, "Domain")
grid = ET.SubElement(domain, "Grid", Name="mesh", GridType="Uniform")
topology = ET.SubElement(grid, "Topology")
geometry = ET.SubElement(grid, "Geometry")

# attribute = etree.SubElement(grid, "Attribute") # for cell functions

Expand All @@ -196,5 +196,7 @@ def write_fenics_mesh_xdmf(fem_mesh_obj, outputfile, encoding=ENCODING_ASCII):

fp = open(outputfile, "w")
fp.write('''<?xml version="1.0"?>\n<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>\n''')
fp.write(etree.tostring(root, pretty_print=True))
fp.write(ET.tostring(root))
# xml core functionality does not support pretty printing
# so the output file looks quite ugly
fp.close()
22 changes: 12 additions & 10 deletions src/Mod/Fem/writeFenicsXML.py
Expand Up @@ -31,7 +31,7 @@


from importToolsFem import get_FemMeshObjectDimension, get_FemMeshObjectElementTypes, get_MaxDimElementFromList
from lxml import etree # parsing xml files and exporting
from xml.etree import ElementTree as ET # parsing xml files and exporting


def write_fenics_mesh_xml(fem_mesh_obj, outputfile):
Expand Down Expand Up @@ -64,17 +64,17 @@ def write_fenics_mesh_xml(fem_mesh_obj, outputfile):
cellname_fenics = FreeCAD_to_Fenics_dict[cellname_fc]
print("Celltype in mesh -> %s and its Fenics name: %s" % (str(celltype_in_mesh), cellname_fenics))

root = etree.Element("dolfin", dolfin="http://fenicsproject.org")
meshchild = etree.SubElement(root, "mesh", celltype=cellname_fenics, dim=str(dim_cell))
vertices = etree.SubElement(meshchild, "vertices", size=str(fem_mesh_obj.FemMesh.NodeCount))
root = ET.Element("dolfin", dolfin="http://fenicsproject.org")
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
etree.SubElement(
ET.SubElement(
vertices, "vertex", index=str(nodeind - 1),
# FC starts from 1, fenics starts from 0 to size-1
x=str(fc_vec[0]), y=str(fc_vec[1]), z=str(fc_vec[2]))

cells = etree.SubElement(meshchild, "cells", size=str(num_cells))
cells = ET.SubElement(meshchild, "cells", size=str(num_cells))
if dim_cell == 3:
fc_cells = fem_mesh_obj.FemMesh.Volumes
elif dim_cell == 2:
Expand All @@ -93,10 +93,12 @@ def write_fenics_mesh_xml(fem_mesh_obj, outputfile):
cell_args["v" + str(vi)] = str(ni - 1)
# generate as many v entries in dict as nodes are listed in cell (works only for first order elements)

etree.SubElement(cells, cellname_fenics, index=str(fen_ind), **cell_args)
ET.SubElement(cells, cellname_fenics, index=str(fen_ind), **cell_args)

etree.SubElement(meshchild, "data")
ET.SubElement(meshchild, "data")

fp = open(outputfile, "w") # TODO: what about pyopen?
fp.write(etree.tostring(root, pretty_print=True))
fp = open(outputfile, "w")
fp.write(ET.tostring(root))
# xml core functionality does not support pretty printing
# so the output file looks quite ugly
fp.close()

0 comments on commit 7b5adb9

Please sign in to comment.