Skip to content

Commit 0b4ec6d

Browse files
committed
Fem: Calculator filter implementation
1 parent 1aa5c3b commit 0b4ec6d

16 files changed

+671
-1
lines changed

src/Mod/Fem/App/AppFem.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ PyMOD_INIT_FUNC(Fem)
186186
Fem::FemPostObject ::init();
187187
Fem::FemPostPipeline ::init();
188188
Fem::FemPostFilter ::init();
189+
Fem::FemPostCalculatorFilter ::init();
189190
Fem::FemPostClipFilter ::init();
190191
Fem::FemPostContoursFilter ::init();
191192
Fem::FemPostCutFilter ::init();

src/Mod/Fem/App/FemPostFilter.cpp

+93
Original file line numberDiff line numberDiff line change
@@ -1158,3 +1158,96 @@ short int FemPostWarpVectorFilter::mustExecute() const
11581158
return App::DocumentObject::mustExecute();
11591159
}
11601160
}
1161+
1162+
1163+
// ***************************************************************************
1164+
// calculator filter
1165+
PROPERTY_SOURCE(Fem::FemPostCalculatorFilter, Fem::FemPostFilter)
1166+
1167+
FemPostCalculatorFilter::FemPostCalculatorFilter()
1168+
: FemPostFilter()
1169+
{
1170+
ADD_PROPERTY_TYPE(FieldName,
1171+
(""),
1172+
"Calculator",
1173+
App::Prop_None,
1174+
"Name of the calculated field");
1175+
ADD_PROPERTY_TYPE(Function,
1176+
(""),
1177+
"Calculator",
1178+
App::Prop_None,
1179+
"Expression of the unction to evaluate");
1180+
1181+
FilterPipeline calculator;
1182+
m_calculator = vtkSmartPointer<vtkArrayCalculator>::New();
1183+
calculator.source = m_calculator;
1184+
calculator.target = m_calculator;
1185+
addFilterPipeline(calculator, "calculator");
1186+
setActiveFilterPipeline("calculator");
1187+
}
1188+
1189+
FemPostCalculatorFilter::~FemPostCalculatorFilter() = default;
1190+
1191+
DocumentObjectExecReturn* FemPostCalculatorFilter::execute()
1192+
{
1193+
printf("EXECITER\n");
1194+
m_calculator->AddCoordinateScalarVariable("X", 0);
1195+
m_calculator->AddCoordinateScalarVariable("Y", 1);
1196+
m_calculator->AddCoordinateScalarVariable("Z", 2);
1197+
// std::string val;
1198+
// if (Vector.getValue() >= 0) {
1199+
// val = Vector.getValueAsString();
1200+
// }
1201+
//
1202+
// std::vector<std::string> VectorArray;
1203+
//
1204+
// vtkSmartPointer<vtkDataObject> data = getInputData();
1205+
// vtkDataSet* dset = vtkDataSet::SafeDownCast(data);
1206+
// if (!dset) {
1207+
// return StdReturn;
1208+
// }
1209+
// vtkPointData* pd = dset->GetPointData();
1210+
//
1211+
// // get all vector fields
1212+
// for (int i = 0; i < pd->GetNumberOfArrays(); ++i) {
1213+
// if (pd->GetArray(i)->GetNumberOfComponents() == 3) {
1214+
// VectorArray.emplace_back(pd->GetArrayName(i));
1215+
// }
1216+
// }
1217+
//
1218+
// App::Enumeration empty;
1219+
// Vector.setValue(empty);
1220+
// m_vectorFields.setEnums(VectorArray);
1221+
// Vector.setValue(m_vectorFields);
1222+
//
1223+
// // search if the current field is in the available ones and set it
1224+
// std::vector<std::string>::iterator it = std::find(VectorArray.begin(), VectorArray.end(),
1225+
// val); if (!val.empty() && it != VectorArray.end()) {
1226+
// Vector.setValue(val.c_str());
1227+
// }
1228+
//
1229+
// recalculate the filter
1230+
return FemPostFilter::execute();
1231+
}
1232+
1233+
void FemPostCalculatorFilter::onChanged(const Property* prop)
1234+
{
1235+
if (prop == &Function) {
1236+
m_calculator->SetFunction(Function.getValue());
1237+
}
1238+
else if (prop == &FieldName) {
1239+
m_calculator->SetResultArrayName(FieldName.getValue());
1240+
}
1241+
printf("FUNCION: %s\n", m_calculator->GetFunction());
1242+
Fem::FemPostFilter::onChanged(prop);
1243+
}
1244+
1245+
short int FemPostCalculatorFilter::mustExecute() const
1246+
{
1247+
if (Function.isTouched() || FieldName.isTouched()) {
1248+
return 1;
1249+
}
1250+
else {
1251+
return FemPostFilter::mustExecute();
1252+
}
1253+
}

src/Mod/Fem/App/FemPostFilter.h

+29
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#ifndef Fem_FemPostFilter_H
2424
#define Fem_FemPostFilter_H
2525

26+
#include <vtkArrayCalculator.h>
2627
#include <vtkContourFilter.h>
2728
#include <vtkSmoothPolyDataFilter.h>
2829
#include <vtkCutter.h>
@@ -352,6 +353,34 @@ class FemExport FemPostWarpVectorFilter: public FemPostFilter
352353
App::Enumeration m_vectorFields;
353354
};
354355

356+
// ***************************************************************************
357+
// calculator filter
358+
class FemExport FemPostCalculatorFilter: public FemPostFilter
359+
{
360+
361+
PROPERTY_HEADER_WITH_OVERRIDE(Fem::FemPostCalculatorFilter);
362+
363+
public:
364+
FemPostCalculatorFilter();
365+
~FemPostCalculatorFilter() override;
366+
367+
App::PropertyString FieldName;
368+
App::PropertyString Function;
369+
370+
const char* getViewProviderName() const override
371+
{
372+
return "FemGui::ViewProviderFemPostCalculator";
373+
}
374+
short int mustExecute() const override;
375+
376+
protected:
377+
App::DocumentObjectExecReturn* execute() override;
378+
void onChanged(const App::Property* prop) override;
379+
380+
private:
381+
vtkSmartPointer<vtkArrayCalculator> m_calculator;
382+
};
383+
355384
} // namespace Fem
356385

357386

src/Mod/Fem/App/PreCompiled.h

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154

155155
// VTK
156156
#include <vtkAppendFilter.h>
157+
#include <vtkArrayCalculator.h>
157158
#include <vtkCellArray.h>
158159
#include <vtkCompositeDataSet.h>
159160
#include <vtkDataArray.h>

src/Mod/Fem/Gui/AppFemGui.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ PyMOD_INIT_FUNC(FemGui)
160160
#ifdef FC_USE_VTK
161161
FemGui::ViewProviderFemPostObject ::init();
162162
FemGui::ViewProviderFemPostPipeline ::init();
163+
FemGui::ViewProviderFemPostCalculator ::init();
163164
FemGui::ViewProviderFemPostClip ::init();
164165
FemGui::ViewProviderFemPostContours ::init();
165166
FemGui::ViewProviderFemPostCut ::init();

src/Mod/Fem/Gui/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ if(BUILD_FEM_VTK)
9494
CylinderWidget.ui
9595
PlaneWidget.ui
9696
SphereWidget.ui
97+
TaskPostCalculator.ui
9798
TaskPostClip.ui
9899
TaskPostContours.ui
99100
TaskPostCut.ui
@@ -286,6 +287,7 @@ if(BUILD_FEM_VTK)
286287
SphereWidget.ui
287288
TaskPostBoxes.h
288289
TaskPostBoxes.cpp
290+
TaskPostCalculator.ui
289291
TaskPostClip.ui
290292
TaskPostContours.ui
291293
TaskPostCut.ui

src/Mod/Fem/Gui/Command.cpp

+37
Original file line numberDiff line numberDiff line change
@@ -2443,6 +2443,42 @@ bool CmdFemPostContoursFilter::isActive()
24432443
}
24442444

24452445

2446+
//================================================================================================
2447+
DEF_STD_CMD_A(CmdFemPostCalculatorFilter)
2448+
2449+
CmdFemPostCalculatorFilter::CmdFemPostCalculatorFilter()
2450+
: Command("FEM_PostFilterCalculator")
2451+
{
2452+
sAppModule = "Fem";
2453+
sGroup = QT_TR_NOOP("Fem");
2454+
sMenuText = QT_TR_NOOP("Calculator filter");
2455+
sToolTipText = QT_TR_NOOP("Create new fields from current data");
2456+
sWhatsThis = "FEM_PostFilterCalculator";
2457+
sStatusTip = sToolTipText;
2458+
sPixmap = "FEM_PostFilterCalculator";
2459+
}
2460+
2461+
void CmdFemPostCalculatorFilter::activated(int)
2462+
{
2463+
setupFilter(this, "Calculator");
2464+
}
2465+
2466+
bool CmdFemPostCalculatorFilter::isActive()
2467+
{
2468+
// only allow one object
2469+
auto selection = getSelection().getSelection();
2470+
if (selection.size() > 1) {
2471+
return false;
2472+
}
2473+
for (auto obj : selection) {
2474+
if (obj.pObject->isDerivedFrom<Fem::FemPostObject>()) {
2475+
return true;
2476+
}
2477+
}
2478+
return false;
2479+
}
2480+
2481+
24462482
//================================================================================================
24472483
DEF_STD_CMD_ACL(CmdFemPostFunctions)
24482484

@@ -2858,6 +2894,7 @@ void CreateFemCommands()
28582894
// vtk post processing
28592895
#ifdef FC_USE_VTK
28602896
rcCmdMgr.addCommand(new CmdFemPostApllyChanges);
2897+
rcCmdMgr.addCommand(new CmdFemPostCalculatorFilter);
28612898
rcCmdMgr.addCommand(new CmdFemPostClipFilter);
28622899
rcCmdMgr.addCommand(new CmdFemPostContoursFilter);
28632900
rcCmdMgr.addCommand(new CmdFemPostCutFilter);

src/Mod/Fem/Gui/PreCompiled.h

+2
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@
8181
#include <QSlider>
8282
#include <QStackedWidget>
8383
#include <QString>
84+
#include <QStringList>
85+
#include <QStringListModel>
8486
#include <QTextCharFormat>
8587
#include <QTextStream>
8688
#include <QThread>

src/Mod/Fem/Gui/Resources/Fem.qrc

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
<file>icons/FEM_MaterialSolid.svg</file>
7373

7474
<!-- gui command icons: post processing -->
75+
<file>icons/FEM_PostFilterCalculator.svg</file>
7576
<file>icons/FEM_PostFilterClipRegion.svg</file>
7677
<file>icons/FEM_PostFilterClipScalar.svg</file>
7778
<file>icons/FEM_PostFilterContours.svg</file>

0 commit comments

Comments
 (0)