From 9ce1662ae1cd56ecf9e5e7189c0ac185c0d48d1e Mon Sep 17 00:00:00 2001 From: qingfengxia Date: Mon, 30 Jan 2017 18:22:11 +0100 Subject: [PATCH 1/5] Fem: add FemResult export to VTK files for visualization externally --- src/Mod/Fem/App/AppFemPy.cpp | 11 ++---- src/Mod/Fem/App/CMakeLists.txt | 1 + src/Mod/Fem/CMakeLists.txt | 3 ++ src/Mod/Fem/FemResultVTK.py | 67 ++++++++++++++++++++++++++++++++++ src/Mod/Fem/Init.py | 3 +- 5 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 src/Mod/Fem/FemResultVTK.py diff --git a/src/Mod/Fem/App/AppFemPy.cpp b/src/Mod/Fem/App/AppFemPy.cpp index 6a6314e4b..8c87238de 100644 --- a/src/Mod/Fem/App/AppFemPy.cpp +++ b/src/Mod/Fem/App/AppFemPy.cpp @@ -281,16 +281,13 @@ private: std::string EncodedName = std::string(fileName); PyMem_Free(fileName); - if (!pcObj) + if (pcObj) { - App::DocumentObjectPy* objpy= static_cast(pcObj); - App::DocumentObject* obj = objpy->getDocumentObjectPtr(); - if (!obj) + if (PyObject_TypeCheck(pcObj, &(App::DocumentObjectPy::Type))) { - App::Document* pcDoc = App::GetApplication().getActiveDocument(); - obj = pcDoc->getActiveObject(); + App::DocumentObject* obj = static_cast(pcObj)->getDocumentObjectPtr(); + FemVTKTools::writeResult(EncodedName.c_str(), obj); } - FemVTKTools::readFluidicResult(EncodedName.c_str(), obj); } else FemVTKTools::writeResult(EncodedName.c_str()); diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 4f22594a6..050758b97 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -114,6 +114,7 @@ SET(FemScripts_SRCS convert2TetGen.py importInpMesh.py importZ88Mesh.py + FemResultVTK.py Init.py InitGui.py FemAnalysis.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 3aa85c505..83b42eec2 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -124,6 +124,9 @@ INSTALL( _ViewProviderFemSolverZ88.py _CommandSolverZ88.py + # result related import and export + FemResultVTK.py + DESTINATION Mod/Fem ) diff --git a/src/Mod/Fem/FemResultVTK.py b/src/Mod/Fem/FemResultVTK.py new file mode 100644 index 000000000..ffbf6d61b --- /dev/null +++ b/src/Mod/Fem/FemResultVTK.py @@ -0,0 +1,67 @@ +# *************************************************************************** +# * (c) Qingfeng Xia 2017 * +# * * +# * 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. * +# * * +# * FreeCAD 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 Lesser General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with FreeCAD; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# * Juergen Riegel 2002 * +# ***************************************************************************/ + +__title__ = "FreeCAD Result import and export VTK file library" +__author__ = "Qingfeng Xia" +__url__ = "http://www.freecadweb.org" + + +import os +from math import pow, sqrt +import numpy as np + +import FreeCAD + +if open.__module__ == '__builtin__': + pyopen = open # because we'll redefine open below + +def insert(filename, docname): + "called when freecad wants to import a file" + try: + doc = FreeCAD.getDocument(docname) + except NameError: + doc = FreeCAD.newDocument(docname) + FreeCAD.ActiveDocument = doc + importFemResult(filename) + + +def open(filename): + "called when freecad opens a file" + docname = os.path.splitext(os.path.basename(filename))[0] + insert(filename, docname) + +def importFemResult(filename): + FreeCAD.Console.PrintError("FemResult import is not implemented, actually not necessary\n") + +def export(objectslist, filename): + "called when freecad exports a fem result object" + if len(objectslist) != 1: + FreeCAD.Console.PrintError("This exporter can only export one object at once\n") + return + obj = objectslist[0] + if not obj.isDerivedFrom("Fem::FemResultObject"): + FreeCAD.Console.PrintError("object selcted is not FemResultObject.\n") + return + import Fem + Fem.writeResult(filename, obj) \ No newline at end of file diff --git a/src/Mod/Fem/Init.py b/src/Mod/Fem/Init.py index 865ebb09c..1d7509719 100644 --- a/src/Mod/Fem/Init.py +++ b/src/Mod/Fem/Init.py @@ -30,9 +30,10 @@ import FreeCAD FreeCAD.addExportType("TetGen file (*.poly)", "convert2TetGen") FreeCAD.addImportType("FEM formats (*.unv *.med *.dat *.bdf)", "Fem") if("BUILD_FEM_VTK" in FreeCAD.__cmake__): - FreeCAD.addImportType("FEM results (*.vtk *.vtp *.vts *.vtr *.vtu *.vti)", "Fem") + #FreeCAD.addImportType("FEM results (*.vtk *.vtp *.vts *.vtr *.vtu *.vti)", "FemResultVTK") # not implemented yet FreeCAD.addImportType("FEM CFD Unstructure Mesh (*.vtk *.vtu)", "Fem") FreeCAD.addExportType("FEM CFD Unstructure Mesh (*.vtk *.vtu)", "Fem") + FreeCAD.addExportType("FEM CFD Result in VTK format (*.vtk *.vtu)", "FemResultVTK") FreeCAD.addExportType("FEM formats (*.unv *.med *.dat *.inp)", "Fem") FreeCAD.addImportType("CalculiX result (*.frd)", "ccxFrdReader") From df66ce0bc337e804f6aa85ecadf325c4fac46df5 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Mon, 30 Jan 2017 18:22:18 +0100 Subject: [PATCH 2/5] FEM: export results to vtk, code formating and documatation information --- src/Mod/Fem/FemResultVTK.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Mod/Fem/FemResultVTK.py b/src/Mod/Fem/FemResultVTK.py index ffbf6d61b..4d2c4d8bc 100644 --- a/src/Mod/Fem/FemResultVTK.py +++ b/src/Mod/Fem/FemResultVTK.py @@ -26,16 +26,17 @@ __title__ = "FreeCAD Result import and export VTK file library" __author__ = "Qingfeng Xia" __url__ = "http://www.freecadweb.org" +## @package FemResultVTK +# \ingroup FEM import os -from math import pow, sqrt -import numpy as np - import FreeCAD + if open.__module__ == '__builtin__': pyopen = open # because we'll redefine open below + def insert(filename, docname): "called when freecad wants to import a file" try: @@ -51,9 +52,11 @@ def open(filename): docname = os.path.splitext(os.path.basename(filename))[0] insert(filename, docname) + def importFemResult(filename): FreeCAD.Console.PrintError("FemResult import is not implemented, actually not necessary\n") + def export(objectslist, filename): "called when freecad exports a fem result object" if len(objectslist) != 1: @@ -64,4 +67,4 @@ def export(objectslist, filename): FreeCAD.Console.PrintError("object selcted is not FemResultObject.\n") return import Fem - Fem.writeResult(filename, obj) \ No newline at end of file + Fem.writeResult(filename, obj) From 469e391f66dc8be5d6ee024ce1d36b2ab6126f4e Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Mon, 30 Jan 2017 18:22:23 +0100 Subject: [PATCH 3/5] FEM: import VTK results, change module name to import... --- src/Mod/Fem/App/CMakeLists.txt | 2 +- src/Mod/Fem/CMakeLists.txt | 4 ++-- src/Mod/Fem/Init.py | 4 ++-- src/Mod/Fem/{FemResultVTK.py => importVTKResults.py} | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/Mod/Fem/{FemResultVTK.py => importVTKResults.py} (99%) diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 050758b97..5d9d776a1 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -113,8 +113,8 @@ SET(FemScripts_SRCS ccxFrdReader.py convert2TetGen.py importInpMesh.py + importVTKResults.py importZ88Mesh.py - FemResultVTK.py Init.py InitGui.py FemAnalysis.py diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 83b42eec2..928f6a38f 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -124,8 +124,8 @@ INSTALL( _ViewProviderFemSolverZ88.py _CommandSolverZ88.py - # result related import and export - FemResultVTK.py + # additional imports and exports + importVTKResults.py DESTINATION Mod/Fem diff --git a/src/Mod/Fem/Init.py b/src/Mod/Fem/Init.py index 1d7509719..bec0e12c2 100644 --- a/src/Mod/Fem/Init.py +++ b/src/Mod/Fem/Init.py @@ -30,10 +30,10 @@ import FreeCAD FreeCAD.addExportType("TetGen file (*.poly)", "convert2TetGen") FreeCAD.addImportType("FEM formats (*.unv *.med *.dat *.bdf)", "Fem") if("BUILD_FEM_VTK" in FreeCAD.__cmake__): - #FreeCAD.addImportType("FEM results (*.vtk *.vtp *.vts *.vtr *.vtu *.vti)", "FemResultVTK") # not implemented yet FreeCAD.addImportType("FEM CFD Unstructure Mesh (*.vtk *.vtu)", "Fem") FreeCAD.addExportType("FEM CFD Unstructure Mesh (*.vtk *.vtu)", "Fem") - FreeCAD.addExportType("FEM CFD Result in VTK format (*.vtk *.vtu)", "FemResultVTK") + # FreeCAD.addImportType("FEM results (*.vtk *.vtp *.vts *.vtr *.vtu *.vti)", "importVTKResults") # not implemented yet + FreeCAD.addExportType("FEM CFD Result in VTK format (*.vtk *.vtu)", "importVTKResults") FreeCAD.addExportType("FEM formats (*.unv *.med *.dat *.inp)", "Fem") FreeCAD.addImportType("CalculiX result (*.frd)", "ccxFrdReader") diff --git a/src/Mod/Fem/FemResultVTK.py b/src/Mod/Fem/importVTKResults.py similarity index 99% rename from src/Mod/Fem/FemResultVTK.py rename to src/Mod/Fem/importVTKResults.py index 4d2c4d8bc..8193e5d6f 100644 --- a/src/Mod/Fem/FemResultVTK.py +++ b/src/Mod/Fem/importVTKResults.py @@ -26,7 +26,7 @@ __title__ = "FreeCAD Result import and export VTK file library" __author__ = "Qingfeng Xia" __url__ = "http://www.freecadweb.org" -## @package FemResultVTK +## @package importVTKResults # \ingroup FEM import os From 3f08dd57398075b79864936b7fc57476763f3d0c Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Mon, 30 Jan 2017 18:22:28 +0100 Subject: [PATCH 4/5] FEM: import Z88 results, change module name to import... --- src/Mod/Fem/App/CMakeLists.txt | 2 +- src/Mod/Fem/CMakeLists.txt | 2 +- src/Mod/Fem/FemToolsZ88.py | 4 ++-- src/Mod/Fem/Init.py | 2 +- src/Mod/Fem/{z88DispReader.py => importZ88Results.py} | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) rename src/Mod/Fem/{z88DispReader.py => importZ88Results.py} (98%) diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 5d9d776a1..f7fa2c540 100755 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -115,6 +115,7 @@ SET(FemScripts_SRCS importInpMesh.py importVTKResults.py importZ88Mesh.py + importZ88Results.py Init.py InitGui.py FemAnalysis.py @@ -140,7 +141,6 @@ SET(FemScripts_SRCS FemMaterial.py FemSelectionObserver.py TestFem.py - z88DispReader.py TaskPanelFemBeamSection.ui TaskPanelFemMeshGmsh.ui TaskPanelFemMeshGroup.ui diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 928f6a38f..7fe32b3cb 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -116,7 +116,7 @@ INSTALL( # solver Z88 importZ88Mesh.py - z88DispReader.py + importZ88Results.py FemInputWriterZ88.py FemToolsZ88.py FemSolverZ88.py diff --git a/src/Mod/Fem/FemToolsZ88.py b/src/Mod/Fem/FemToolsZ88.py index 6f6822032..5599a07cb 100644 --- a/src/Mod/Fem/FemToolsZ88.py +++ b/src/Mod/Fem/FemToolsZ88.py @@ -190,11 +190,11 @@ class FemToolsZ88(FemTools.FemTools): def load_results_o2(self): import os - import z88DispReader + import importZ88Results disp_result_file = self.working_dir + '/z88o2.txt' if os.path.isfile(disp_result_file): result_name_prefix = 'Z88_' + self.solver.AnalysisType + '_' - z88DispReader.import_z88_disp(disp_result_file, self.analysis, result_name_prefix) + importZ88Results.import_z88_disp(disp_result_file, self.analysis, result_name_prefix) for m in self.analysis.Member: if m.isDerivedFrom("Fem::FemResultObject"): self.results_present = True diff --git a/src/Mod/Fem/Init.py b/src/Mod/Fem/Init.py index bec0e12c2..0d775cbd1 100644 --- a/src/Mod/Fem/Init.py +++ b/src/Mod/Fem/Init.py @@ -40,4 +40,4 @@ FreeCAD.addImportType("CalculiX result (*.frd)", "ccxFrdReader") FreeCAD.addImportType("Mesh from Calculix/Abaqus input file (*.inp)", "importInpMesh") FreeCAD.addImportType("Z88 mesh file (*.txt)", "importZ88Mesh") FreeCAD.addExportType("Z88 mesh file (*.txt)", "importZ88Mesh") -FreeCAD.addImportType("Z88 displacement result file (*.txt)", "z88DispReader") +FreeCAD.addImportType("Z88 result file (*.txt)", "importZ88Results") diff --git a/src/Mod/Fem/z88DispReader.py b/src/Mod/Fem/importZ88Results.py similarity index 98% rename from src/Mod/Fem/z88DispReader.py rename to src/Mod/Fem/importZ88Results.py index 35e24a202..f6437ea62 100644 --- a/src/Mod/Fem/z88DispReader.py +++ b/src/Mod/Fem/importZ88Results.py @@ -24,7 +24,7 @@ __title__ = "FreeCAD Z88 Disp Reader" __author__ = "Bernd Hahnebach " __url__ = "http://www.freecadweb.org" -## @package z88DispReader +## @package importZ88Results # \ingroup FEM import FreeCAD @@ -141,9 +141,9 @@ def read_z88_disp(z88_disp_input): pure usage: import FemToolsZ88 fea = FemToolsZ88.FemToolsZ88() - import z88dispReader + import importZ88Results disp_file = '/pathtofile/z88o2.txt' - z88DispReader.import_z88_disp(disp_file , fea.analysis) + importZ88Results.import_z88_disp(disp_file , fea.analysis) The FreeCAD file needs to have an Analysis and an appropiate FEM Mesh ''' From 71fe91189be1dd7bf482ef2c7f7204beffa4c410 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Mon, 30 Jan 2017 18:22:38 +0100 Subject: [PATCH 5/5] FEM: Z88 result reader, fix open Z88 results files directly --- src/Mod/Fem/importZ88Results.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Mod/Fem/importZ88Results.py b/src/Mod/Fem/importZ88Results.py index f6437ea62..592c20ab3 100644 --- a/src/Mod/Fem/importZ88Results.py +++ b/src/Mod/Fem/importZ88Results.py @@ -57,6 +57,8 @@ def insert(filename, docname): def import_z88_disp(filename, analysis=None, result_name_prefix=None): '''insert a FreeCAD FEM Result object in the ActiveDocument ''' + if result_name_prefix is None: + result_name_prefix = '' m = read_z88_disp(filename) if(len(m['Nodes']) > 0): if analysis is None: