Skip to content

Commit

Permalink
FEM: importFenicsMesh: GuiUp code inserted
Browse files Browse the repository at this point in the history
  • Loading branch information
joha2 authored and berndhahnebach committed May 27, 2019
1 parent 540ad16 commit ae0a164
Showing 1 changed file with 118 additions and 80 deletions.
198 changes: 118 additions & 80 deletions src/Mod/Fem/feminout/importFenicsMesh.py
Expand Up @@ -28,11 +28,14 @@
# \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
Expand All @@ -49,75 +52,93 @@
# because we'll redefine open below (Python3)
pyopen = open


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

def convert_fem_mesh_obj_to_table(self):

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

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

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()) # 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)

return group_values_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)

FreeCADGui.Control.closeDialog()
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

self.convert_fem_mesh_obj_to_table()

def convert_fem_mesh_obj_to_table(self):

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

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

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())
# 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")

group_values_dict[g] = (marked_value, default_value)

return group_values_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)

FreeCADGui.Control.closeDialog()


def open(filename):
Expand All @@ -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"):
Expand All @@ -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)

Expand Down

0 comments on commit ae0a164

Please sign in to comment.