FEM: importFenicsMesh: GuiUp code inserted

This commit is contained in:
joha2
2019-05-25 11:00:49 +02:00
committed by Bernd Hahnebach
parent 7080301ea2
commit 464eb372ab

View File

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