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;