FEM: examples, add Gui to setup examples

This commit is contained in:
Sudhanshu Dubey
2020-07-03 18:01:58 +02:00
committed by Bernd Hahnebach
parent 3685b3dad7
commit ff3ce49139
4 changed files with 210 additions and 1 deletions

View File

@@ -52,6 +52,7 @@ SET(FemExamples_SRCS
femexamples/constraint_contact_solid_solid.py
femexamples/constraint_section_print.py
femexamples/constraint_tie.py
femexamples/examplesgui.py
femexamples/manager.py
femexamples/material_multiple_twoboxes.py
femexamples/material_nl_platewithhole.py

View File

@@ -374,7 +374,8 @@ Gui::MenuItem* Workbench::setupMenuBar() const
utils->setCommand("Utilities");
*utils
<< "FEM_ClippingPlaneAdd"
<< "FEM_ClippingPlaneRemoveAll";
<< "FEM_ClippingPlaneRemoveAll"
<< "FEM_Examples";
return root;
}

View File

@@ -340,6 +340,21 @@ class _EquationHeat(CommandManager):
self.do_activated = "add_obj_on_gui_selobj_noset_edit"
class _Examples(CommandManager):
"The FEM_Examples command definition"
def __init__(self):
super(_Examples, self).__init__()
self.pixmap = "preferences-fem"
self.menuetext = "Open FEM examples"
self.tooltip = "Open FEM examples"
self.is_active = "always"
def Activated(self):
FreeCADGui.addModule("femexamples.examplesgui")
FreeCADGui.doCommand("femexamples.examplesgui.show_examplegui()")
class _MaterialEditor(CommandManager):
"The FEM_MaterialEditor command definition"
@@ -872,6 +887,10 @@ FreeCADGui.addCommand(
"FEM_EquationHeat",
_EquationHeat()
)
FreeCADGui.addCommand(
"FEM_Examples",
_Examples()
)
FreeCADGui.addCommand(
"FEM_MaterialEditor",
_MaterialEditor()

View File

@@ -0,0 +1,188 @@
# ***************************************************************************
# * Copyright (c) 2020 Bernd Hahnebach <bernd@bimstatik.org> *
# * Copyright (c) 2020 Sudhanshu Dubey <sudhanshu.thethunder@gmail.com> *
# * *
# * This file is part of the FreeCAD CAx development system. *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
import os
from importlib import import_module
from PySide import QtCore
from PySide import QtGui
import FreeCADGui
class FemExamples(QtGui.QWidget):
def __init__(self):
super(FemExamples, self).__init__()
self.init_ui()
def __del__(self,):
# need as fix for qt event error
# --> see http://forum.freecadweb.org/viewtopic.php?f=18&t=10732&start=10#p86493
return
def init_ui(self):
# init widgets
self.view = QtGui.QTreeWidget()
path = os.path.dirname(os.path.realpath(__file__))
files = [f for f in os.listdir(str(path))]
not_files = [
"examplesgui.py",
"manager.py",
"meshes",
"__init__.py",
"__pycache__",
]
files = [str(f) for f in files if f not in not_files]
# Slicing the .py from every file
files = [f[:-3] for f in files if f.endswith(".py")]
files.sort()
files_info = {}
self.files_name = {}
constraints = set()
meshes = set()
solvers = set()
equations = set()
materials = set()
for f in files:
module = import_module("femexamples." + f)
if hasattr(module, "get_information"):
info = getattr(module, "get_information")()
files_info[f] = info
self.files_name[info["name"]] = f
meshes.add(info["meshelement"])
equations.add(info["equation"])
materials.add(info["material"])
file_solvers = info["solvers"]
for solver in file_solvers:
solvers.add(solver)
file_constraints = info["constraints"]
for constraint in file_constraints:
constraints.add(constraint)
all_examples = QtGui.QTreeWidgetItem(self.view, ["All"])
for example, info in files_info.items():
QtGui.QTreeWidgetItem(all_examples, [info["name"]])
self.view.addTopLevelItem(all_examples)
all_constraints = QtGui.QTreeWidgetItem(self.view, ["Constraints"])
for constraint in constraints:
constraint_item = QtGui.QTreeWidgetItem(all_constraints, [constraint])
for example, info in files_info.items():
file_constraints = info["constraints"]
if constraint in file_constraints:
QtGui.QTreeWidgetItem(constraint_item, [info["name"]])
self.view.addTopLevelItem(all_constraints)
all_solvers = QtGui.QTreeWidgetItem(self.view, ["Solvers"])
for solver in solvers:
solver_item = QtGui.QTreeWidgetItem(all_solvers, [solver])
for example, info in files_info.items():
file_solvers = info["solvers"]
if solver in file_solvers:
QtGui.QTreeWidgetItem(solver_item, [info["name"]])
self.view.addTopLevelItem(all_solvers)
all_meshes = QtGui.QTreeWidgetItem(self.view, ["Meshes"])
for mesh in meshes:
mesh_item = QtGui.QTreeWidgetItem(all_meshes, [mesh])
for example, info in files_info.items():
if info["meshelement"] == mesh:
QtGui.QTreeWidgetItem(mesh_item, [info["name"]])
self.view.addTopLevelItem(all_meshes)
all_equations = QtGui.QTreeWidgetItem(self.view, ["Equations"])
for equation in equations:
equation_item = QtGui.QTreeWidgetItem(all_equations, [equation])
for example, info in files_info.items():
if info["equation"] == equation:
QtGui.QTreeWidgetItem(equation_item, [info["name"]])
self.view.addTopLevelItem(all_equations)
all_materials = QtGui.QTreeWidgetItem(self.view, ["Materials"])
for material in materials:
material_item = QtGui.QTreeWidgetItem(all_materials, [material])
for example, info in files_info.items():
if info["material"] == material:
QtGui.QTreeWidgetItem(material_item, [info["name"]])
self.view.addTopLevelItem(all_materials)
self.view.setHeaderHidden(True)
# Ok buttons:
self.button_box = QtGui.QDialogButtonBox(self)
self.button_box.setOrientation(QtCore.Qt.Horizontal)
self.button_box.setStandardButtons(
QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok
)
run_button = QtGui.QPushButton(QtGui.QIcon.fromTheme("system-run"), "Run")
self.button_box.addButton(run_button, QtGui.QDialogButtonBox.ApplyRole)
self.button_box.clicked.connect(self.clicked)
# Layout:
layout = QtGui.QGridLayout()
layout.addWidget(self.view, 2, 0, 1, 2)
layout.addWidget(self.button_box, 3, 1)
self.setLayout(layout)
def clicked(self, button):
if self.button_box.buttonRole(button) == QtGui.QDialogButtonBox.AcceptRole:
self.accept()
elif self.button_box.buttonRole(button) == QtGui.QDialogButtonBox.ApplyRole:
self.run()
elif self.button_box.buttonRole(button) == QtGui.QDialogButtonBox.RejectRole:
self.reject()
def accept(self):
item = self.view.selectedItems()[0]
name = item.text(0)
example = self.files_name[name]
# if done this way the Python commands are printed in Python console
FreeCADGui.doCommand("from femexamples." + str(example) + " import setup")
FreeCADGui.doCommand("setup()")
def reject(self):
self.close()
d.close()
def run(self):
item = self.view.selectedItems()[0]
name = item.text(0)
example = self.files_name[name]
# if done this way the Python commands are printed in Python console
FreeCADGui.doCommand("from femexamples.manager import run_example")
FreeCADGui.doCommand("run_example(\"" + str(example) + "\")")
def show_examplegui():
mw = FreeCADGui.getMainWindow()
d = QtGui.QDockWidget("FEM Examples")
d.setWidget(FemExamples())
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea, d)