diff --git a/src/Mod/Fem/App/FemPostPipeline.cpp b/src/Mod/Fem/App/FemPostPipeline.cpp
index 0e23b9bc9c..c50deffed9 100644
--- a/src/Mod/Fem/App/FemPostPipeline.cpp
+++ b/src/Mod/Fem/App/FemPostPipeline.cpp
@@ -149,6 +149,11 @@ void FemPostPipeline::read(Base::FileInfo File) {
throw Base::FileException("Unknown extension");
}
+void FemPostPipeline::scale(double s)
+{
+ Data.scale(s);
+}
+
void FemPostPipeline::onChanged(const Property* prop)
{
if (prop == &Filter || prop == &Mode) {
diff --git a/src/Mod/Fem/App/FemPostPipeline.h b/src/Mod/Fem/App/FemPostPipeline.h
index 0f9ed8c095..01415cd2cf 100644
--- a/src/Mod/Fem/App/FemPostPipeline.h
+++ b/src/Mod/Fem/App/FemPostPipeline.h
@@ -58,6 +58,7 @@ public:
//load data from files
static bool canRead(Base::FileInfo file);
void read(Base::FileInfo file);
+ void scale(double s);
//load from results
void load(FemResultObject* res);
diff --git a/src/Mod/Fem/App/FemPostPipelinePy.xml b/src/Mod/Fem/App/FemPostPipelinePy.xml
index 6bd3711093..fef97a33c9 100644
--- a/src/Mod/Fem/App/FemPostPipelinePy.xml
+++ b/src/Mod/Fem/App/FemPostPipelinePy.xml
@@ -18,6 +18,11 @@
Read in vtk file
+
+
+ scale the points of a loaded vtk file
+
+
Load a result object
diff --git a/src/Mod/Fem/App/FemPostPipelinePyImp.cpp b/src/Mod/Fem/App/FemPostPipelinePyImp.cpp
index d71c685b85..e21955258a 100644
--- a/src/Mod/Fem/App/FemPostPipelinePyImp.cpp
+++ b/src/Mod/Fem/App/FemPostPipelinePyImp.cpp
@@ -51,6 +51,16 @@ PyObject* FemPostPipelinePy::read(PyObject *args)
return nullptr;
}
+PyObject* FemPostPipelinePy::scale(PyObject *args)
+{
+ double scale;
+ if (PyArg_ParseTuple(args, "d", &scale)) {
+ getFemPostPipelinePtr()->scale(scale);
+ Py_Return;
+ }
+ return nullptr;
+}
+
PyObject* FemPostPipelinePy::load(PyObject *args)
{
PyObject* py;
diff --git a/src/Mod/Fem/App/PropertyPostDataObject.cpp b/src/Mod/Fem/App/PropertyPostDataObject.cpp
index c4945d182b..b35bcfd376 100644
--- a/src/Mod/Fem/App/PropertyPostDataObject.cpp
+++ b/src/Mod/Fem/App/PropertyPostDataObject.cpp
@@ -67,6 +67,51 @@ PropertyPostDataObject::~PropertyPostDataObject()
{
}
+void PropertyPostDataObject::scaleDataObject(vtkDataObject* dataObject, double s)
+{
+ auto scalePoints = [](vtkPoints* points, double s) {
+ for (vtkIdType i = 0; i < points->GetNumberOfPoints(); i++) {
+ double xyz[3];
+ points->GetPoint(i, xyz);
+ for (int j = 0; j < 3; j++)
+ xyz[j] *= s;
+ points->SetPoint(i, xyz);
+ }
+ };
+
+ if (dataObject->GetDataObjectType() == VTK_POLY_DATA) {
+ vtkPolyData* dataSet = vtkPolyData::SafeDownCast(dataObject);
+ scalePoints(dataSet->GetPoints(), s);
+ }
+ else if (dataObject->GetDataObjectType() == VTK_STRUCTURED_GRID) {
+ vtkStructuredGrid* dataSet = vtkStructuredGrid::SafeDownCast(dataObject);
+ scalePoints(dataSet->GetPoints(), s);
+ }
+ else if (dataObject->GetDataObjectType() == VTK_UNSTRUCTURED_GRID) {
+ vtkUnstructuredGrid* dataSet = vtkUnstructuredGrid::SafeDownCast(dataObject);
+ scalePoints(dataSet->GetPoints(), s);
+ }
+ else if (dataObject->GetDataObjectType() == VTK_MULTIBLOCK_DATA_SET) {
+ vtkMultiBlockDataSet* dataSet = vtkMultiBlockDataSet::SafeDownCast(dataObject);
+ for (unsigned int i = 0; i < dataSet->GetNumberOfBlocks(); i++)
+ scaleDataObject(dataSet->GetBlock(i), s);
+ }
+ else if (dataObject->GetDataObjectType() == VTK_MULTIPIECE_DATA_SET) {
+ vtkMultiPieceDataSet* dataSet = vtkMultiPieceDataSet::SafeDownCast(dataObject);
+ for (unsigned int i = 0; i < dataSet->GetNumberOfPieces(); i++)
+ scaleDataObject(dataSet->GetPiece(i), s);
+ }
+}
+
+void PropertyPostDataObject::scale(double s)
+{
+ if (m_dataObject) {
+ aboutToSetValue();
+ scaleDataObject(m_dataObject, s);
+ hasSetValue();
+ }
+}
+
void PropertyPostDataObject::setValue(const vtkSmartPointer& ds)
{
aboutToSetValue();
@@ -75,8 +120,9 @@ void PropertyPostDataObject::setValue(const vtkSmartPointer& ds)
createDataObjectByExternalType(ds);
m_dataObject->DeepCopy(ds);
}
- else
+ else {
m_dataObject = nullptr;
+ }
hasSetValue();
}
diff --git a/src/Mod/Fem/App/PropertyPostDataObject.h b/src/Mod/Fem/App/PropertyPostDataObject.h
index 0b00a65892..481a1ea9f8 100644
--- a/src/Mod/Fem/App/PropertyPostDataObject.h
+++ b/src/Mod/Fem/App/PropertyPostDataObject.h
@@ -47,6 +47,8 @@ public:
/** @name Getter/setter */
//@{
+ /// Scale the point coordinates of the data set with factor \a s
+ void scale(double s);
/// set the dataset
void setValue(const vtkSmartPointer&);
/// get the part shape
@@ -79,6 +81,9 @@ public:
/// Get valid paths for this property; used by auto completer
virtual void getPaths(std::vector & paths) const;
+private:
+ static void scaleDataObject(vtkDataObject*, double s);
+
protected:
void createDataObjectByExternalType(vtkSmartPointer ex);
vtkSmartPointer m_dataObject;