From d5bba60f106e17e4abc375999f6e1b4ac2ef4fd5 Mon Sep 17 00:00:00 2001 From: joha2 Date: Tue, 27 Jun 2017 12:15:40 +0200 Subject: [PATCH] FEM: issue #0003038 Fenics mesh import/export: removed lxml dependency --- src/Mod/Fem/readFenicsXML.py | 4 ++-- src/Mod/Fem/writeFenicsXDMF.py | 22 ++++++++++++---------- src/Mod/Fem/writeFenicsXML.py | 22 ++++++++++++---------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/Mod/Fem/readFenicsXML.py b/src/Mod/Fem/readFenicsXML.py index ae8280411e..65738543de 100644 --- a/src/Mod/Fem/readFenicsXML.py +++ b/src/Mod/Fem/readFenicsXML.py @@ -31,7 +31,7 @@ __url__ = "http://www.freecadweb.org" import FreeCAD -from lxml import etree # parsing xml files and exporting +from xml.etree import ElementTree as ET import itertools @@ -208,7 +208,7 @@ def read_fenics_mesh_xml(xmlfilename): 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": diff --git a/src/Mod/Fem/writeFenicsXDMF.py b/src/Mod/Fem/writeFenicsXDMF.py index e8bf37fab8..0996f26ffc 100644 --- a/src/Mod/Fem/writeFenicsXDMF.py +++ b/src/Mod/Fem/writeFenicsXDMF.py @@ -30,7 +30,7 @@ __url__ = "http://www.freecadweb.org" # \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' @@ -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) @@ -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 @@ -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 @@ -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 @@ -196,5 +196,7 @@ def write_fenics_mesh_xdmf(fem_mesh_obj, outputfile, encoding=ENCODING_ASCII): fp = open(outputfile, "w") fp.write('''\n\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() diff --git a/src/Mod/Fem/writeFenicsXML.py b/src/Mod/Fem/writeFenicsXML.py index 97f5f630f2..01f552f870 100644 --- a/src/Mod/Fem/writeFenicsXML.py +++ b/src/Mod/Fem/writeFenicsXML.py @@ -31,7 +31,7 @@ __url__ = "http://www.freecadweb.org" 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): @@ -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: @@ -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()