From 3ae8d4550638f863c07838cb9c8a67e76fb8123d Mon Sep 17 00:00:00 2001 From: marioalexis Date: Tue, 24 Feb 2026 01:33:43 -0300 Subject: [PATCH] Fem: Read material info from .frd file --- src/Mod/Fem/App/FemVTKTools.cpp | 23 +++++++++++++++---- src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp | 9 ++++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/Mod/Fem/App/FemVTKTools.cpp b/src/Mod/Fem/App/FemVTKTools.cpp index 61f9311814..bce77e57f9 100644 --- a/src/Mod/Fem/App/FemVTKTools.cpp +++ b/src/Mod/Fem/App/FemVTKTools.cpp @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -1177,7 +1178,7 @@ void valueFromLine(const std::string_view::iterator& it, int digits, dou // add cell from sorted nodes template -void addCell(vtkSmartPointer& cellArray, const std::vector& topoElem) +void addCell(vtkCellArray* cellArray, const std::vector& topoElem) { vtkSmartPointer cell = vtkSmartPointer::New(); cell->GetPointIds()->SetNumberOfIds(topoElem.size()); @@ -1190,7 +1191,7 @@ void addCell(vtkSmartPointer& cellArray, const std::vector& t // fill cell array void fillCell( - vtkSmartPointer& cellArray, + vtkCellArray* cellArray, std::vector& topoElem, std::vector& vtkType, ElementType elemType @@ -1363,7 +1364,9 @@ std::vector readElements( std::ifstream& ifstr, const std::string& lines, const std::map& mapNodes, - vtkSmartPointer& cellArray + vtkCellArray* cellArray, + vtkIntArray* material, + vtkIntArray* group ) { std::string line; @@ -1380,6 +1383,12 @@ std::vector readElements( std::vector topoElem; std::vector vtkType; + material->SetNumberOfComponents(1); + material->SetName("Material"); + + group->SetNumberOfComponents(1); + group->SetName("Group"); + std::string_view view {lines}; std::string_view sub = view.substr(keyCode.length() + 18); @@ -1412,6 +1421,8 @@ std::vector readElements( // add cell to cellArray if (topoElem.size() == mapCcxTypeNodes[static_cast(info[0])]) { fillCell(cellArray, topoElem, vtkType, static_cast(info[0])); + group->InsertNextValue(info[1]); + material->InsertNextValue(info[2]); topoElem.clear(); mapElem[elem] = elemID++; } @@ -1657,6 +1668,8 @@ vtkSmartPointer readFRD(std::ifstream& ifstr) std::string line; std::map mapNodes; std::vector cellTypes; + auto materialArray = vtkSmartPointer::New(); + auto groupArray = vtkSmartPointer::New(); while (std::getline(ifstr, line)) { std::string keyCode = " 2C"; @@ -1669,7 +1682,7 @@ vtkSmartPointer readFRD(std::ifstream& ifstr) keyCode = " 3C"; if (view.rfind(keyCode, 0) == 0) { // read elements block - cellTypes = readElements(ifstr, line, mapNodes, cells); + cellTypes = readElements(ifstr, line, mapNodes, cells, materialArray, groupArray); } keyCode = " 1P"; if (view.rfind(keyCode, 0) == 0) { @@ -1699,6 +1712,8 @@ vtkSmartPointer readFRD(std::ifstream& ifstr) grid = vtkSmartPointer::New(); grid->SetPoints(points); grid->SetCells(cellTypes.data(), cells); + grid->GetCellData()->AddArray(materialArray); + grid->GetCellData()->AddArray(groupArray); // create TimeValue metadata auto stepValue = createTimeValue(info.value); diff --git a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp index 034513abce..24b8116114 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp @@ -433,10 +433,11 @@ void ViewProviderFemPostObject::updateProperties() } } - vtkCellData* cell = poly->GetCellData(); - for (int i = 0; i < cell->GetNumberOfArrays(); ++i) { - colorArrays.emplace_back(cell->GetArrayName(i)); - } + // don't add cell data arrays until they are supported in the 3d view + // vtkCellData* cell = poly->GetCellData(); + // for (int i = 0; i < cell->GetNumberOfArrays(); ++i) { + // colorArrays.emplace_back(cell->GetArrayName(i)); + //} App::Enumeration empty; Field.setValue(empty);