diff --git a/src/Mod/Fem/feminout/importFenicsMesh.py b/src/Mod/Fem/feminout/importFenicsMesh.py index 1bb40ded82..7bba6eaa90 100644 --- a/src/Mod/Fem/feminout/importFenicsMesh.py +++ b/src/Mod/Fem/feminout/importFenicsMesh.py @@ -28,11 +28,14 @@ __url__ = "http://www.freecadweb.org" # \ingroup FEM # \brief FreeCAD Fenics Mesh reader and writer for FEM workbench -from PySide import QtGui, QtCore +import os import FreeCAD import FreeCADGui -import os + +if FreeCAD.GuiUp == 1: + from PySide import QtGui, QtCore + from . import importToolsFem from . import readFenicsXML @@ -49,75 +52,93 @@ elif open.__module__ == 'io': # because we'll redefine open below (Python3) pyopen = open +if FreeCAD.GuiUp == 1: + class WriteXDMFTaskPanel: + """ + This task panel is used to write mesh groups with user defined values. + It will called if there are mesh groups detected. Else it will be bypassed. + """ + def __init__(self, fem_mesh_obj, fileString): + self.form = FreeCADGui.PySideUic.loadUi( + FreeCAD.getHomePath() + + "Mod/Fem/Resources/ui/MeshGroupXDMFExport.ui") + self.result_dict = {} + self.fem_mesh_obj = fem_mesh_obj + self.fileString = fileString -class WriteXDMFTaskPanel: - """ - This task panel is used to write mesh groups with user defined values. - It will called if there are mesh groups detected. Else it will be bypassed. - """ - def __init__(self, fem_mesh_obj, fileString): - self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/Resources/ui/MeshGroupXDMFExport.ui") - self.result_dict = {} - self.fem_mesh_obj = fem_mesh_obj - self.fileString = fileString + self.convert_fem_mesh_obj_to_table() - self.convert_fem_mesh_obj_to_table() + def convert_fem_mesh_obj_to_table(self): - def convert_fem_mesh_obj_to_table(self): + def ro(item): + item.setFlags(~QtCore.Qt.ItemIsEditable & ~QtCore.Qt.ItemIsEnabled) + return item - def ro(item): - item.setFlags(~QtCore.Qt.ItemIsEditable & ~QtCore.Qt.ItemIsEnabled) - return item + gmshgroups = importToolsFem.get_FemMeshObjectMeshGroups( + self.fem_mesh_obj) + fem_mesh = self.fem_mesh_obj.FemMesh - gmshgroups = importToolsFem.get_FemMeshObjectMeshGroups(self.fem_mesh_obj) - fem_mesh = self.fem_mesh_obj.FemMesh + self.form.tableGroups.setRowCount(0) + self.form.tableGroups.setRowCount(len(gmshgroups)) - self.form.tableGroups.setRowCount(0) - self.form.tableGroups.setRowCount(len(gmshgroups)) + for (ind, gind) in enumerate(gmshgroups): + # group number + self.form.tableGroups.setItem(ind, 0, + ro(QtGui.QTableWidgetItem( + str(gind)))) + # group name + self.form.tableGroups.setItem(ind, 1, + ro(QtGui.QTableWidgetItem( + fem_mesh.getGroupName(gind)))) + # 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(0))) + # default value for marked elements + self.form.tableGroups.setItem(ind, 4, + QtGui.QTableWidgetItem(str(1))) - for (ind, gind) in enumerate(gmshgroups): - # group number - self.form.tableGroups.setItem(ind, 0, ro(QtGui.QTableWidgetItem(str(gind)))) - # group name - self.form.tableGroups.setItem(ind, 1, ro(QtGui.QTableWidgetItem(fem_mesh.getGroupName(gind)))) - # 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(0))) - # default value for marked elements - 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) - 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() - 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()) + # 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 ValueError: + FreeCAD.Console.PrintError( + "ERROR: value conversion failed " + + "in table to dict: assuming 0 for default, " + + "1 for marked.\n") - for r in range(num_rows): - 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: - FreeCAD.Console.PrintError("ERROR: value conversion failed in table to dict: assuming 0 for default, 1 for marked.\n") + group_values_dict[g] = (marked_value, default_value) - group_values_dict[g] = (marked_value, default_value) + return group_values_dict - return group_values_dict + def accept(self): + group_values_dict = self.convert_table_to_group_dict() - def accept(self): - group_values_dict = self.convert_table_to_group_dict() + writeFenicsXDMF.write_fenics_mesh_xdmf( + self.fem_mesh_obj, self.fileString, + group_values_dict=group_values_dict) - writeFenicsXDMF.write_fenics_mesh_xdmf(self.fem_mesh_obj, self.fileString, group_values_dict=group_values_dict) - - FreeCADGui.Control.closeDialog() + FreeCADGui.Control.closeDialog() def open(filename): @@ -136,10 +157,15 @@ def insert(filename, docname): import_fenics_mesh(filename) -def export(objectslist, fileString): - "called when freecad exports a file" +def export(objectslist, fileString, group_values_dict_nogui=None): + """ + Called when freecad exports a file. + group_dict_no_gui: dictionary with group_numbers as keys and tuples + of (marked_value (default=1), default_value (default=0)) + """ if len(objectslist) != 1: - FreeCAD.Console.PrintError("This exporter can only export one object.\n") + FreeCAD.Console.PrintError( + "This exporter can only export one object.\n") return obj = objectslist[0] if not obj.isDerivedFrom("Fem::FemMeshObject"): @@ -149,15 +175,27 @@ def export(objectslist, fileString): if fileString != "": fileName, fileExtension = os.path.splitext(fileString) 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( + "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': - if importToolsFem.get_FemMeshObjectMeshGroups(obj) is not (): - # if there are groups found, make task panel available - panel = WriteXDMFTaskPanel(obj, fileString) - FreeCADGui.Control.showDialog(panel) + mesh_groups = importToolsFem.get_FemMeshObjectMeshGroups(obj) + if mesh_groups is not (): + # if there are groups found, make task panel available if GuiUp + if FreeCAD.GuiUp == 1: + panel = WriteXDMFTaskPanel(obj, fileString) + FreeCADGui.Control.showDialog(panel) + else: + # create default dict if groupdict_nogui is not None + if group_values_dict_nogui is None: + group_values_dict_nogui = dict([(g, (1, 0)) + for g in mesh_groups]) + writeFenicsXDMF.write_fenics_mesh_xdmf( + obj, fileString, + group_values_dict=group_values_dict_nogui) else: writeFenicsXDMF.write_fenics_mesh_xdmf(obj, fileString)