FEM: move the new python FemResult object to FemMechanicalResult object derived from C++ FemResult object

This commit is contained in:
Bernd Hahnebach 2017-02-16 07:55:10 +01:00
parent aa49586766
commit 12f53b6098
8 changed files with 114 additions and 64 deletions

View File

@ -84,6 +84,7 @@ SET(FemScripts_SRCS
_FemBeamSection.py _FemBeamSection.py
_FemConstraintSelfWeight.py _FemConstraintSelfWeight.py
_FemMaterialMechanicalNonlinear.py _FemMaterialMechanicalNonlinear.py
_FemMechanicalResult.py
_FemMeshGmsh.py _FemMeshGmsh.py
_FemMeshGroup.py _FemMeshGroup.py
_FemMeshRegion.py _FemMeshRegion.py
@ -102,6 +103,7 @@ SET(FemScripts_SRCS
_ViewProviderFemBeamSection.py _ViewProviderFemBeamSection.py
_ViewProviderFemConstraintSelfWeight.py _ViewProviderFemConstraintSelfWeight.py
_ViewProviderFemMaterialMechanicalNonlinear.py _ViewProviderFemMaterialMechanicalNonlinear.py
_ViewProviderFemMechanicalResult.py
_ViewProviderFemMeshGmsh.py _ViewProviderFemMeshGmsh.py
_ViewProviderFemMeshGroup.py _ViewProviderFemMeshGroup.py
_ViewProviderFemMeshRegion.py _ViewProviderFemMeshRegion.py
@ -109,7 +111,6 @@ SET(FemScripts_SRCS
_ViewProviderFemSolverCalculix.py _ViewProviderFemSolverCalculix.py
_ViewProviderFemSolverZ88.py _ViewProviderFemSolverZ88.py
_ViewProviderFemMaterial.py _ViewProviderFemMaterial.py
_ViewProviderFemResult.py
ccxDatReader.py ccxDatReader.py
ccxFrdReader.py ccxFrdReader.py
convert2TetGen.py convert2TetGen.py
@ -128,6 +129,7 @@ SET(FemScripts_SRCS
FemInputWriterCcx.py FemInputWriterCcx.py
FemInputWriterZ88.py FemInputWriterZ88.py
FemMaterialMechanicalNonlinear.py FemMaterialMechanicalNonlinear.py
FemMechanicalResult.py
FemMesh2Mesh.py FemMesh2Mesh.py
FemMeshGmsh.py FemMeshGmsh.py
FemMeshGroup.py FemMeshGroup.py
@ -140,7 +142,6 @@ SET(FemScripts_SRCS
FemToolsCcx.py FemToolsCcx.py
FemToolsZ88.py FemToolsZ88.py
FemMaterial.py FemMaterial.py
FemResult.py
FemSelectionObserver.py FemSelectionObserver.py
TestFem.py TestFem.py
TaskPanelFemBeamSection.ui TaskPanelFemBeamSection.ui

View File

@ -36,6 +36,9 @@ INSTALL(
_CommandRunSolver.py _CommandRunSolver.py
_CommandControlSolver.py _CommandControlSolver.py
FemMechanicalResult.py
_FemMechanicalResult.py
_ViewProviderFemMechanicalResult.py
_CommandShowResult.py _CommandShowResult.py
_TaskPanelShowResult.py _TaskPanelShowResult.py
TaskPanelShowResult.ui TaskPanelShowResult.ui
@ -126,8 +129,6 @@ INSTALL(
# additional imports and exports # additional imports and exports
importVTKResults.py importVTKResults.py
FemResult.py
_ViewProviderFemResult.py
DESTINATION DESTINATION
Mod/Fem Mod/Fem

View File

@ -0,0 +1,43 @@
#***************************************************************************
#* *
#* Copyright (c) 2016 - Qingfeng Xia <qingfeng.xia()eng.ox.ac.uk> *
#* *
#* 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 *
#* *
#***************************************************************************
__title__ = "module to make a mechanical FEM result object"
__author__ = "Qingfeng Xia, Bernd Hahnebach"
__url__ = "http://www.freecadweb.org"
## \addtogroup FEM
# \brief FreeCAD module to make mechanical result object in FEM workbench
# @{
import FreeCAD
import _FemMechanicalResult
def makeFemMechanicalResult(result_obj_name):
obj = FreeCAD.ActiveDocument.addObject('Fem::FemResultObjectPython', result_obj_name)
_FemMechanicalResult._FemMechanicalResult(obj)
if FreeCAD.GuiUp:
from _ViewProviderFemMechanicalResult import _ViewProviderFemMechanicalResult
_ViewProviderFemMechanicalResult(obj.ViewObject)
return obj
# @}

View File

@ -20,59 +20,61 @@
#* * #* *
#*************************************************************************** #***************************************************************************
__title__ = "DocumentOject Class to hold Fem result" __title__ = "DocumentOject Class to hold mechanical FEM results"
__author__ = "Qingfeng Xia" __author__ = "Qingfeng Xia, Bernd Hahnebach"
__url__ = "http://www.freecadweb.org" __url__ = "http://www.freecadweb.org"
import FreeCAD ## @package FemMechanicalResult
import Fem # \ingroup FEM
# \brief FreeCAD DocumentObject class to hold mechanical results in FEM workbench
def makeFemResult(result_obj_name):
obj= FreeCAD.ActiveDocument.addObject('Fem::FemResultObjectPython', result_obj_name)
# detect domain later, CFD or Mechanical later
_MechanicalResult(obj)
if FreeCAD.GuiUp:
from _ViewProviderFemResult import _ViewProviderFemResult
_ViewProviderFemResult(obj.ViewObject)
return obj
class _MechanicalResult(object): class _FemMechanicalResult():
"""The Fem::_FemMechanicalResult's Proxy python type, add result specific properties
"""
def __init__(self, obj): def __init__(self, obj):
self.Type = "MechanicalResult" self.Type = "FemMechanicalResult"
self.Object = obj # keep a ref to the DocObj for nonGui usage self.Object = obj # keep a ref to the DocObj for nonGui usage
obj.Proxy = self # link between App::DocumentObject to this object obj.Proxy = self # link between App::DocumentObject to this object
# `Time, Stats` should have been defined in base cpp class obj.addProperty("App::PropertyString", "ResultType", "Base", "Type of the result", 1) # the 1 set the property to ReadOnly
obj.addProperty("App::PropertyVectorList", "DisplacementVectors", "Fem", obj.ResultType = str(self.Type)
"List of displacement vectors", True) # does not show up in propertyEditor of combiView
obj.addProperty("App::PropertyVectorList", "StressVectors", "Fem",
"List of stress vectors", True) # does not show up in propertyEditor of combiView
obj.addProperty("App::PropertyVectorList", "StrainVectors", "Fem",
"List of strain vectors", True) # does not show up in propertyEditor of combiView
obj.addProperty("App::PropertyFloatList", "DisplacementLengths", "Fem",
"List of displacement lengths", True) # readonly in propertyEditor of combiView
obj.addProperty("App::PropertyFloatList", "StressValues", "Fem",
"", True)
obj.addProperty("App::PropertyFloatList", "PrincipalMax", "Fem",
"", True)
obj.addProperty("App::PropertyFloatList", "PrincipalMed", "Fem",
"", True)
obj.addProperty("App::PropertyFloatList", "PrincipalMin", "Fem",
"", True)
obj.addProperty("App::PropertyFloatList", "MaxShear", "Fem",
"List of Maximum Shear stress values", True)
obj.addProperty("App::PropertyFloatList", "UserDefined", "Fem",
"User Defined Results", True)
# temperature field is needed in the thermal stress analysis
obj.addProperty("App::PropertyFloatList", "Temperature", "Fem",
"Temperature field", True)
# for frequency analysis
obj.addProperty("App::PropertyInteger", "Eigenmode", "Fem",
"", True)
obj.addProperty("App::PropertyFloat", "EigenmodeFrequency", "Fem",
"User Defined Results", True)
############ standard FeutureT methods ########## # `Time, Stats` should have been defined in base cpp class
# does not show up in propertyEditor of combiView
obj.addProperty("App::PropertyVectorList", "DisplacementVectors", "Fem", "List of displacement vectors", True)
# does not show up in propertyEditor of combiView
obj.addProperty("App::PropertyVectorList", "StressVectors", "Fem", "List of stress vectors", True)
# does not show up in propertyEditor of combiView
obj.addProperty("App::PropertyVectorList", "StrainVectors", "Fem", "List of strain vectors", True)
# readonly in propertyEditor of combiView
obj.addProperty("App::PropertyFloatList", "DisplacementLengths", "Fem", "List of displacement lengths", True)
obj.addProperty("App::PropertyFloatList", "StressValues", "Fem", "", True)
obj.addProperty("App::PropertyFloatList", "PrincipalMax", "Fem", "", True)
obj.addProperty("App::PropertyFloatList", "PrincipalMed", "Fem", "", True)
obj.addProperty("App::PropertyFloatList", "PrincipalMin", "Fem", "", True)
obj.addProperty("App::PropertyFloatList", "MaxShear", "Fem", "List of Maximum Shear stress values", True)
obj.addProperty("App::PropertyFloatList", "UserDefined", "Fem", "User Defined Results", True)
# temperature field is needed in the thermal stress analysis
obj.addProperty("App::PropertyFloatList", "Temperature", "Fem", "Temperature field", True)
# for frequency analysis
obj.addProperty("App::PropertyInteger", "Eigenmode", "Fem", "", True)
obj.addProperty("App::PropertyFloat", "EigenmodeFrequency", "Fem", "User Defined Results", True)
# standard FeutureT methods
def execute(self, obj): def execute(self, obj):
""""this method is executed on object creation and whenever the document is recomputed" """"this method is executed on object creation and whenever the document is recomputed"
update Part or Mesh should NOT lead to recompution of the analysis automatically, time consuming update Part or Mesh should NOT lead to recompution of the analysis automatically, time consuming

View File

@ -20,15 +20,19 @@
#* * #* *
#*************************************************************************** #***************************************************************************
__title__ = "ViewProvider for Fem ResultObjectPython" __title__ = "ViewProvider for FEM mechanical ResultObjectPython"
__author__ = "Qingfeng Xia" __author__ = "Qingfeng Xia, Bernd Hahnebach"
__url__ = "http://www.freecadweb.org" __url__ = "http://www.freecadweb.org"
## @package _ViewProviderFemMechanicalResult
# \ingroup FEM
# \brief FreeCAD ViewProvider for mechanical ResultObjectPython in FEM workbench
import FreeCAD import FreeCAD
import FreeCADGui import FreeCADGui
import FemGui
class _ViewProviderFemResult:
class _ViewProviderFemMechanicalResult:
"""A View Provider for the FemResultObject Python dervied FemResult class """A View Provider for the FemResultObject Python dervied FemResult class
""" """
@ -48,7 +52,7 @@ class _ViewProviderFemResult:
def onChanged(self, vobj, prop): def onChanged(self, vobj, prop):
return return
def doubleClicked(self, vobj): def doubleClicked(self, vobj):
if FreeCADGui.activeWorkbench().name() != 'FemWorkbench': if FreeCADGui.activeWorkbench().name() != 'FemWorkbench':
FreeCADGui.activateWorkbench("FemWorkbench") FreeCADGui.activateWorkbench("FemWorkbench")
@ -58,11 +62,11 @@ class _ViewProviderFemResult:
else: else:
FreeCAD.Console.PrintError('Active Task Dialog found! Please close this one first!\n') FreeCAD.Console.PrintError('Active Task Dialog found! Please close this one first!\n')
return True return True
def setEdit(self, vobj, mode): def setEdit(self, vobj, mode):
#if FemGui.getActiveAnalysis(): #if FemGui.getActiveAnalysis():
from _TaskPanelShowResult import _TaskPanelShowResult import _TaskPanelShowResult
taskd = _TaskPanelShowResult() taskd = _TaskPanelShowResult._TaskPanelShowResult(self.Object)
taskd.obj = vobj.Object taskd.obj = vobj.Object
FreeCADGui.Control.showDialog(taskd) FreeCADGui.Control.showDialog(taskd)
return True return True

View File

@ -443,9 +443,8 @@ def importFrd(filename, analysis=None, result_name_prefix=None):
results_name = result_name_prefix + 'time_' + str(step_time) + '_results' results_name = result_name_prefix + 'time_' + str(step_time) + '_results'
else: else:
results_name = result_name_prefix + 'results' results_name = result_name_prefix + 'results'
import FemResult import FemMechanicalResult
results = FemResult.makeFemResult(results_name) results = FemMechanicalResult.makeFemMechanicalResult(results_name)
#results = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name)
for m in analysis_object.Member: for m in analysis_object.Member:
if m.isDerivedFrom("Fem::FemMeshObject"): if m.isDerivedFrom("Fem::FemMeshObject"):
results.Mesh = m results.Mesh = m

View File

@ -67,8 +67,8 @@ def importVTK(filename, analysis=None, result_name_prefix=None):
# if properties can be added in FemVTKTools importCfdResult(), this file can be used for CFD workbench # if properties can be added in FemVTKTools importCfdResult(), this file can be used for CFD workbench
results_name = result_name_prefix + 'results' results_name = result_name_prefix + 'results'
from FemResult import makeFemResult from FemMechanicalResult import makeFemMechanicalResult
result_obj = makeFemResult(results_name) result_obj = makeFemMechanicalResult(results_name)
# result_obj = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name) # result_obj = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name)
Fem.readResult(filename, result_obj.Name) # readResult always creates a new femmesh named ResultMesh Fem.readResult(filename, result_obj.Name) # readResult always creates a new femmesh named ResultMesh
analysis_object.Member = analysis_object.Member + [result_obj] analysis_object.Member = analysis_object.Member + [result_obj]

View File

@ -71,8 +71,8 @@ def import_z88_disp(filename, analysis=None, result_name_prefix=None):
for result_set in m['Results']: for result_set in m['Results']:
results_name = result_name_prefix + 'results' results_name = result_name_prefix + 'results'
import FemResult import FemMechanicalResult
results = FemResult.makeFemResult(results_name) results = FemMechanicalResult.makeFemMechanicalResult(results_name)
#results = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name) #results = FreeCAD.ActiveDocument.addObject('Fem::FemResultObject', results_name)
for m in analysis_object.Member: for m in analysis_object.Member:
if m.isDerivedFrom("Fem::FemMeshObject"): if m.isDerivedFrom("Fem::FemMeshObject"):
@ -97,7 +97,7 @@ def import_z88_disp(filename, analysis=None, result_name_prefix=None):
# set stats of not imported values to 0 # set stats of not imported values to 0
s_max = s_min = s_avg = 0 s_max = s_min = s_avg = 0
p1_min = p1_avg = p1_max = p2_min = p2_avg = p2_max = p3_min = p3_avg = p3_max = 0 p1_min = p1_avg = p1_max = p2_min = p2_avg = p2_max = p3_min = p3_avg = p3_max = 0
ms_min = ms_avg = ms_max = 0 ms_min = ms_avg = ms_max = 0
# s_max = max(results.StressValues) # s_max = max(results.StressValues)
# s_min = min(results.StressValues) # s_min = min(results.StressValues)