diff --git a/src/Mod/Fem/App/AppFemPy.cpp b/src/Mod/Fem/App/AppFemPy.cpp index bbbe4520d4..c87474fd08 100644 --- a/src/Mod/Fem/App/AppFemPy.cpp +++ b/src/Mod/Fem/App/AppFemPy.cpp @@ -252,14 +252,14 @@ private: Py::Object frdToVTK(const Py::Tuple& args) { char* filename = nullptr; - - if (!PyArg_ParseTuple(args.ptr(), "et", "utf-8", &filename)) { + PyObject* binary = Py_True; + if (!PyArg_ParseTuple(args.ptr(), "et|O!", "utf-8", &filename, &PyBool_Type, &binary)) { throw Py::Exception(); } std::string encodedName = std::string(filename); PyMem_Free(filename); - FemVTKTools::frdToVTK(encodedName.c_str()); + FemVTKTools::frdToVTK(encodedName.c_str(), Base::asBoolean(binary)); return Py::None(); } diff --git a/src/Mod/Fem/App/FemVTKTools.cpp b/src/Mod/Fem/App/FemVTKTools.cpp index 78958fff92..e8cb884d93 100644 --- a/src/Mod/Fem/App/FemVTKTools.cpp +++ b/src/Mod/Fem/App/FemVTKTools.cpp @@ -1711,7 +1711,7 @@ vtkSmartPointer readFRD(std::ifstream& ifstr) } // namespace FRDReader -void FemVTKTools::frdToVTK(const char* filename) +void FemVTKTools::frdToVTK(const char* filename, bool binary) { Base::FileInfo fi(filename); @@ -1733,6 +1733,8 @@ void FemVTKTools::frdToVTK(const char* filename) std::string type = info->GetValue(0).c_str(); auto writer = vtkSmartPointer::New(); + writer->SetDataMode(binary ? vtkXMLMultiBlockDataWriter::Binary + : vtkXMLMultiBlockDataWriter::Ascii); std::string blockFile = dir + "/" + fi.fileNamePure() + type + "." + writer->GetDefaultFileExtension(); diff --git a/src/Mod/Fem/App/FemVTKTools.h b/src/Mod/Fem/App/FemVTKTools.h index 00db4d0763..cf8db957b4 100644 --- a/src/Mod/Fem/App/FemVTKTools.h +++ b/src/Mod/Fem/App/FemVTKTools.h @@ -72,7 +72,7 @@ public: // write FemResult (activeObject if res= NULL) to vtkUnstructuredGrid dataset file static void writeResult(const char* filename, const App::DocumentObject* res = nullptr); - static void frdToVTK(const char* filename); + static void frdToVTK(const char* filename, bool binary = true); }; } // namespace Fem diff --git a/src/Mod/Fem/Gui/DlgSettingsFemCcx.ui b/src/Mod/Fem/Gui/DlgSettingsFemCcx.ui index 00444ce443..3a82a89a5e 100644 --- a/src/Mod/Fem/Gui/DlgSettingsFemCcx.ui +++ b/src/Mod/Fem/Gui/DlgSettingsFemCcx.ui @@ -686,6 +686,33 @@ By uncheck this option, CalculiX command behave like SolverCalculiXCcxTools + + + + Result format + + + + + + + Save result in binary format. +Only ta kes effect if 'Pipeline only' is enabled + + + Use binary format + + + false + + + BinaryOutput + + + Mod/Fem/Ccx + + + diff --git a/src/Mod/Fem/Gui/DlgSettingsFemCcxImp.cpp b/src/Mod/Fem/Gui/DlgSettingsFemCcxImp.cpp index 3aaa88e7a3..eca76761c8 100644 --- a/src/Mod/Fem/Gui/DlgSettingsFemCcxImp.cpp +++ b/src/Mod/Fem/Gui/DlgSettingsFemCcxImp.cpp @@ -73,6 +73,7 @@ void DlgSettingsFemCcxImp::saveSettings() ui->dsb_ccx_minimum_time_step->onSave(); // Minimum time step ui->dsb_ccx_maximum_time_step->onSave(); // Maximum time step ui->ckb_pipeline_result->onSave(); + ui->ckb_result_format->onSave(); ui->cb_analysis_type->onSave(); ui->cb_BeamShellOutput->onSave(); // Beam shell output 3d or 2d @@ -101,6 +102,7 @@ void DlgSettingsFemCcxImp::loadSettings() ui->dsb_ccx_minimum_time_step->onRestore(); // Minimum time step ui->dsb_ccx_maximum_time_step->onRestore(); // Maximum time step ui->ckb_pipeline_result->onRestore(); + ui->ckb_result_format->onRestore(); ui->cb_analysis_type->onRestore(); ui->cb_BeamShellOutput->onRestore(); // Beam shell output 3d or 2d diff --git a/src/Mod/Fem/femsolver/calculix/calculixtools.py b/src/Mod/Fem/femsolver/calculix/calculixtools.py index 88c91397c6..331de692b1 100644 --- a/src/Mod/Fem/femsolver/calculix/calculixtools.py +++ b/src/Mod/Fem/femsolver/calculix/calculixtools.py @@ -172,7 +172,8 @@ class CalculiXTools: def _load_ccxfrd_results(self): frd_result_prefix = os.path.join(self.obj.WorkingDirectory, self.input_deck) - Fem.frdToVTK(frd_result_prefix + ".frd") + 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"):