Skip to content

Commit 8a1af40

Browse files
committed
Fem: calculator
1 parent 5872d1b commit 8a1af40

6 files changed

+79
-5
lines changed

src/Mod/Fem/App/FemPostFilter.cpp

+49-5
Original file line numberDiff line numberDiff line change
@@ -1190,10 +1190,11 @@ FemPostCalculatorFilter::~FemPostCalculatorFilter() = default;
11901190

11911191
DocumentObjectExecReturn* FemPostCalculatorFilter::execute()
11921192
{
1193-
printf("EXECITER\n");
1194-
m_calculator->AddCoordinateScalarVariable("X", 0);
1195-
m_calculator->AddCoordinateScalarVariable("Y", 1);
1196-
m_calculator->AddCoordinateScalarVariable("Z", 2);
1193+
if (!m_calculator->GetFunction()) {
1194+
return StdReturn;
1195+
}
1196+
updateAvailableFields();
1197+
11971198
// std::string val;
11981199
// if (Vector.getValue() >= 0) {
11991200
// val = Vector.getValueAsString();
@@ -1238,7 +1239,10 @@ void FemPostCalculatorFilter::onChanged(const Property* prop)
12381239
else if (prop == &FieldName) {
12391240
m_calculator->SetResultArrayName(FieldName.getValue());
12401241
}
1241-
printf("FUNCION: %s\n", m_calculator->GetFunction());
1242+
else if (prop == &Data) {
1243+
updateAvailableFields();
1244+
}
1245+
printf("FUNCION: %s\t%s\n", m_calculator->GetFunction(), prop->getName());
12421246
Fem::FemPostFilter::onChanged(prop);
12431247
}
12441248

@@ -1251,3 +1255,43 @@ short int FemPostCalculatorFilter::mustExecute() const
12511255
return FemPostFilter::mustExecute();
12521256
}
12531257
}
1258+
1259+
void FemPostCalculatorFilter::updateAvailableFields()
1260+
{
1261+
printf("EXECITER\n");
1262+
// clear all variables
1263+
m_calculator->RemoveAllVariables();
1264+
m_calculator->AddCoordinateScalarVariable("X", 0);
1265+
m_calculator->AddCoordinateScalarVariable("Y", 1);
1266+
m_calculator->AddCoordinateScalarVariable("Z", 2);
1267+
1268+
std::vector<std::string> scalars;
1269+
std::vector<std::string> vectors;
1270+
// std::vector<std::string> tensors;
1271+
1272+
vtkSmartPointer<vtkDataObject> data = getInputData();
1273+
vtkDataSet* dset = vtkDataSet::SafeDownCast(data);
1274+
if (!dset) {
1275+
return;
1276+
}
1277+
vtkPointData* pd = dset->GetPointData();
1278+
1279+
// get all vector fields
1280+
for (int i = 0; i < pd->GetNumberOfArrays(); ++i) {
1281+
std::string name1 = pd->GetArrayName(i);
1282+
std::string name2 = name1;
1283+
std::replace(name2.begin(), name2.end(), ' ', '_');
1284+
if (pd->GetArray(i)->GetNumberOfComponents() == 3) {
1285+
// printf("NOMBRE: %s\n", name2.c_str());
1286+
m_calculator->AddVectorVariable(name2.c_str(), name1.c_str());
1287+
// add components as scalar variable
1288+
m_calculator->AddScalarVariable((name2 + "_X").c_str(), name1.c_str(), 0);
1289+
m_calculator->AddScalarVariable((name2 + "_Y").c_str(), name1.c_str(), 1);
1290+
m_calculator->AddScalarVariable((name2 + "_Z").c_str(), name1.c_str(), 2);
1291+
}
1292+
else if (pd->GetArray(i)->GetNumberOfComponents() == 1) {
1293+
// printf("NOMBRE SCA: %s\n", name2.c_str());
1294+
m_calculator->AddScalarVariable(name2.c_str(), name1.c_str());
1295+
}
1296+
}
1297+
}

src/Mod/Fem/App/FemPostFilter.h

+2
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ class FemExport FemPostCalculatorFilter: public FemPostFilter
377377
App::DocumentObjectExecReturn* execute() override;
378378
void onChanged(const App::Property* prop) override;
379379

380+
void updateAvailableFields();
381+
380382
private:
381383
vtkSmartPointer<vtkArrayCalculator> m_calculator;
382384
};

src/Mod/Fem/Gui/TaskPostBoxes.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -2079,13 +2079,18 @@ void TaskPostCalculator::onFieldNameChanged()
20792079
std::string name = ui->let_field_name->text().toStdString();
20802080
auto obj = getObject<Fem::FemPostCalculatorFilter>();
20812081
obj->FieldName.setValue(name);
2082+
recompute();
2083+
getTypedView<ViewProviderFemPostCalculator>()->Field.setValue(name.c_str());
20822084
}
20832085

20842086
void TaskPostCalculator::onFunctionChanged()
20852087
{
20862088
std::string function = ui->let_function->text().toStdString();
20872089
auto obj = getObject<Fem::FemPostCalculatorFilter>();
20882090
obj->Function.setValue(function);
2091+
auto view = getTypedView<ViewProviderFemPostCalculator>();
2092+
recompute();
2093+
view->updateMaterial();
20892094
}
20902095

20912096

src/Mod/Fem/Gui/ViewProviderFemPostFilter.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,19 @@ ViewProviderFemPostCalculator::ViewProviderFemPostCalculator()
228228

229229
ViewProviderFemPostCalculator::~ViewProviderFemPostCalculator() = default;
230230

231+
void ViewProviderFemPostCalculator::updateData(const App::Property* prop)
232+
{
233+
auto obj = getObject<Fem::FemPostCalculatorFilter>();
234+
if (prop == &obj->Data) {
235+
printf("updata Material\n");
236+
// update color bar
237+
updateMaterial();
238+
Field.touch();
239+
}
240+
241+
return ViewProviderFemPostObject::updateData(prop);
242+
}
243+
231244
void ViewProviderFemPostCalculator::setupTaskDialog(TaskDlgPost* dlg)
232245
{
233246
// add the function box

src/Mod/Fem/Gui/ViewProviderFemPostFilter.h

+2
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ class FemGuiExport ViewProviderFemPostCalculator: public ViewProviderFemPostObje
166166
ViewProviderFemPostCalculator();
167167
~ViewProviderFemPostCalculator() override;
168168

169+
void updateData(const App::Property* prop) override;
170+
169171
protected:
170172
void setupTaskDialog(TaskDlgPost* dlg) override;
171173
};

src/Mod/Fem/Gui/ViewProviderFemPostObject.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -655,11 +655,15 @@ void ViewProviderFemPostObject::updateMaterial()
655655

656656
void ViewProviderFemPostObject::WriteColorData(bool ResetColorBarRange)
657657
{
658+
printf("colordata1\n");
658659
if (!setupPipeline()) {
660+
printf("colordata2\n");
659661
return;
660662
}
661663

664+
printf("colordata3\n");
662665
if (Field.getEnumVector().empty() || Field.getValue() == 0) {
666+
printf("colordata3.1\n");
663667
m_material->diffuseColor.setValue(SbColor(0.8, 0.8, 0.8));
664668
float trans = Base::fromPercent(Transparency.getValue());
665669
m_material->transparency.setValue(trans);
@@ -675,6 +679,7 @@ void ViewProviderFemPostObject::WriteColorData(bool ResetColorBarRange)
675679
vtkPolyData* pd = m_currentAlgorithm->GetOutput();
676680
vtkDataArray* data = pd->GetPointData()->GetArray(array);
677681
if (!data) {
682+
printf("colordata3.2\n");
678683
return;
679684
}
680685

@@ -687,10 +692,12 @@ void ViewProviderFemPostObject::WriteColorData(bool ResetColorBarRange)
687692

688693
// build the lookuptable
689694
if (ResetColorBarRange) {
695+
printf("colordata4\n");
690696
double range[2];
691697
data->GetRange(range, component);
692698
setRangeOfColorBar(static_cast<float>(range[0]), static_cast<float>(range[1]));
693699
}
700+
printf("colordata5\n");
694701

695702
vtkIdType numPts = pd->GetNumberOfPoints();
696703
m_material->diffuseColor.setNum(numPts);
@@ -914,6 +921,7 @@ void ViewProviderFemPostObject::onChanged(const App::Property* prop)
914921
}
915922

916923
if (prop == &Field && setupPipeline()) {
924+
printf("RECOMPUTE FIELD\n");
917925
updateProperties();
918926
WriteColorData(ResetColorBarRange);
919927
}

0 commit comments

Comments
 (0)