Files
create/src/Mod/Fem/importZ88O2Results.py

153 lines
5.5 KiB
Python

# ***************************************************************************
# * *
# * Copyright (c) 2016 - Bernd Hahnebach <bernd@bimstatik.org> *
# * *
# * 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__ = "FreeCAD Z88 Disp Reader"
__author__ = "Bernd Hahnebach"
__url__ = "http://www.freecadweb.org"
## @package importZ88O2Results
# \ingroup FEM
# \brief FreeCAD Z88 Disp Reader for FEM workbench
import FreeCAD
import os
Debug = False
########## generic FreeCAD import and export methods ##########
if open.__module__ == '__builtin__':
# because we'll redefine open below (Python2)
pyopen = open
elif open.__module__ == 'io':
# because we'll redefine open below (Python3)
pyopen = open
def open(filename):
"called when freecad opens a file"
docname = os.path.splitext(os.path.basename(filename))[0]
insert(filename, docname)
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
import_z88_disp(filename)
########## module specific methods ##########
def import_z88_disp(filename, analysis=None, result_name_prefix=None):
'''insert a FreeCAD FEM mechanical result object in the ActiveDocument
pure usage:
import importZ88O2Results
disp_file = '/pathtofile/z88o2.txt'
importZ88O2Results.import_z88_disp(disp_file)
the z888i1.txt FEMMesh file needs to be in the same directory as z88o2.txt (ahh, make a new document first ;-))
'''
import importZ88Mesh
import importToolsFem
import ObjectsFem
if result_name_prefix is None:
result_name_prefix = ''
disp_read = read_z88_disp(filename)
result_mesh_object = None
if len(disp_read['Nodes']) > 0:
if analysis:
analysis_object = analysis
# read result mesh
if filename.endswith('z88o2.txt'):
mesh_file = filename.replace('o2', 'i1')
mesh_data = importZ88Mesh.read_z88_mesh(mesh_file)
femmesh = importToolsFem.make_femmesh(mesh_data)
result_mesh_object = ObjectsFem.makeMeshResult(FreeCAD.ActiveDocument, 'Result_mesh')
result_mesh_object.FemMesh = femmesh
else:
FreeCAD.Console.PrintError('Z88 mesh file z88i1.txt not found!')
# create result obj
for result_set in disp_read['Results']:
results_name = result_name_prefix + 'results'
results = ObjectsFem.makeResultMechanical(FreeCAD.ActiveDocument, results_name)
results.Mesh = result_mesh_object
results = importToolsFem.fill_femresult_mechanical(results, result_set, 0)
if analysis:
analysis_object.addObject(results)
if FreeCAD.GuiUp:
if analysis:
import FemGui
FemGui.setActiveAnalysis(analysis_object)
FreeCAD.ActiveDocument.recompute()
else:
FreeCAD.Console.PrintError('Problem on frd file import. No nodes found in frd file.\n')
def read_z88_disp(z88_disp_input):
'''
read a z88 disp file and extract the nodes and elements
z88 Displacment output file is z88o2.txt
works with Z88OS14
'''
nodes = {}
mode_disp = {}
mode_results = {}
results = []
z88_disp_file = pyopen(z88_disp_input, "r")
for no, line in enumerate(z88_disp_file):
lno = no + 1
linelist = line.split()
if lno >= 6:
# disp line
# print(linelist)
node_no = int(linelist[0])
mode_disp_x = float(linelist[1])
mode_disp_y = float(linelist[2])
if len(linelist) > 3:
mode_disp_z = float(linelist[3])
else:
mode_disp_z = 0.0
mode_disp[node_no] = FreeCAD.Vector(mode_disp_x, mode_disp_y, mode_disp_z)
nodes[node_no] = node_no
mode_results['disp'] = mode_disp
results.append(mode_results)
if Debug:
for r in results[0]['disp']:
print(r, ' --> ', results[0]['disp'][r])
z88_disp_file.close()
return {'Nodes': nodes, 'Results': results}