Fem: Create CalculiX output from .dat file - fixes #22983

This commit is contained in:
marioalexis
2025-08-10 19:16:38 -03:00
committed by Chris Hennes
parent 576fed8362
commit dc967cdb1c

View File

@@ -126,17 +126,8 @@ class CalculiXTools:
def update_properties(self):
# TODO at the moment, only one .vtm file is assumed
if not self.obj.Results:
pipeline = self.obj.Document.addObject("Fem::FemPostPipeline", self.obj.Name + "Result")
self.analysis.addObject(pipeline)
self.obj.Results = [pipeline]
self._load_ccxfrd_results()
# default display mode
pipeline.ViewObject.DisplayMode = "Surface"
pipeline.ViewObject.SelectionStyle = "BoundBox"
pipeline.ViewObject.Field = self.get_default_field(self.obj.AnalysisType)
else:
self._load_ccxfrd_results()
self._load_ccxfrd_results()
self._load_ccxdat_results()
def _clear_results(self):
# result is a 'Result.vtm' file and a 'Result' directory
@@ -150,19 +141,67 @@ class CalculiXTools:
os.remove(path)
# remove dir with .vtu files
shutil.rmtree(base)
elif ext == ".dat":
# remove .dat file
os.remove(path)
def _load_ccxdat_results(self):
# search dat output
dat = None
for res in self.obj.Results:
if res.isDerivedFrom("App::TextDocument"):
dat = res
if not dat:
# create dat output
dat = self.obj.Document.addObject("App::TextDocument", self.obj.Name + "Output")
self.analysis.addObject(dat)
tmp = self.obj.Results
tmp.append(dat)
self.obj.Results = tmp
files = os.listdir(self.obj.WorkingDirectory)
for f in files:
if f.endswith(".dat"):
dat_file = os.path.join(self.obj.WorkingDirectory, f)
with open(dat_file, "r") as file:
dat.Text = file.read()
break
def _load_ccxfrd_results(self):
# search current pipeline
pipeline = None
create = False
for res in self.obj.Results:
if res.isDerivedFrom("Fem::FemPostPipeline"):
pipeline = res
if not pipeline:
# create pipeline
pipeline = self.obj.Document.addObject("Fem::FemPostPipeline", self.obj.Name + "Result")
self.analysis.addObject(pipeline)
tmp = self.obj.Results
tmp.append(pipeline)
self.obj.Results = tmp
create = True
frd_result_prefix = os.path.join(self.obj.WorkingDirectory, self.input_deck)
binary_mode = self.fem_param.GetGroup("Ccx").GetBool("BinaryOutput", False)
Fem.frdToVTK(frd_result_prefix + ".frd", binary_mode)
files = os.listdir(self.obj.WorkingDirectory)
for f in files:
if f.endswith(".vtm"):
res = os.path.join(self.obj.WorkingDirectory, f)
self.obj.Results[0].read(res)
self.obj.Results[0].renameArrays(self.frd_var_conversion(self.obj.AnalysisType))
vtm_file = os.path.join(self.obj.WorkingDirectory, f)
pipeline.read(vtm_file)
pipeline.renameArrays(self.frd_var_conversion(self.obj.AnalysisType))
break
if create:
# default display mode
pipeline.ViewObject.DisplayMode = "Surface"
pipeline.ViewObject.SelectionStyle = "BoundBox"
pipeline.ViewObject.Field = self.get_default_field(self.obj.AnalysisType)
def frd_var_conversion(self, analysis_type):
common = {
"CONTACT": "Contact Displacement",