Skip to content

Commit

Permalink
FEM Post: Detail filter infrastructure
Browse files Browse the repository at this point in the history
  • Loading branch information
ickby authored and wwmayer committed May 18, 2016
1 parent 2b9e608 commit 51f2a0e
Show file tree
Hide file tree
Showing 25 changed files with 2,827 additions and 83 deletions.
2 changes: 2 additions & 0 deletions src/Mod/Fem/App/AppFem.cpp
Expand Up @@ -156,8 +156,10 @@ PyMODINIT_FUNC initFem()
Fem::FemPostPipeline ::init();
Fem::FemPostFilter ::init();
Fem::FemPostClipFilter ::init();
Fem::FemPostScalarClipFilter ::init();
Fem::FemPostFunction ::init();
Fem::FemPostFunctionProvider ::init();
Fem::FemPostPlaneFunction ::init();
Fem::FemPostSphereFunction ::init();
#endif
}
14 changes: 12 additions & 2 deletions src/Mod/Fem/App/AppFem.cpp.orig
@@ -1,4 +1,4 @@
<<<<<<< eec6f7aee8b6e5979a799358e2ae69bdc5a7af5b
<<<<<<< 387862dfe753cf0cb062032e97840353b14dcbae
/***************************************************************************
* Copyright (c) 2008 Jürgen Riegel (juergen.riegel@web.de) *
* *
Expand Down Expand Up @@ -55,8 +55,12 @@

#include "FemResultObject.h"
#include "FemSolverObject.h"

#ifdef FC_USE_VTK
#include "FemPostPipeline.h"
#include "FemPostFilter.h"
#include "FemPostFunction.h"
#endif

namespace Fem {
extern PyObject* initModule();
Expand Down Expand Up @@ -152,6 +156,10 @@ PyMODINIT_FUNC initFem()
Fem::FemPostObject ::init();
Fem::FemPostPipeline ::init();
Fem::FemPostFilter ::init();
Fem::FemPostClipFilter ::init();
Fem::FemPostFunction ::init();
Fem::FemPostFunctionProvider ::init();
Fem::FemPostPlaneFunction ::init();
#endif
}
=======
Expand Down Expand Up @@ -313,9 +321,11 @@ PyMODINIT_FUNC initFem()
Fem::FemPostPipeline ::init();
Fem::FemPostFilter ::init();
Fem::FemPostClipFilter ::init();
Fem::FemPostScalarClipFilter ::init();
Fem::FemPostFunction ::init();
Fem::FemPostFunctionProvider ::init();
Fem::FemPostPlaneFunction ::init();
Fem::FemPostSphereFunction ::init();
#endif
}
>>>>>>> Basic implementation of filter framework
>>>>>>> Detail filter infrastructure
121 changes: 119 additions & 2 deletions src/Mod/Fem/App/FemPostFilter.cpp
Expand Up @@ -30,6 +30,8 @@
#include "FemPostPipeline.h"
#include <Base/Console.h>
#include <App/DocumentObjectPy.h>
#include <vtkFieldData.h>
#include <vtkPointData.h>

using namespace Fem;
using namespace App;
Expand All @@ -44,6 +46,9 @@ FemPostFilter::FemPostFilter()

FemPostFilter::~FemPostFilter()
{
//we need to make sure that all vtk filters are disconnected
//as the would stay alive and connected otherwise
clearInput();
}

bool FemPostFilter::valid() {
Expand Down Expand Up @@ -173,11 +178,11 @@ FemPostClipFilter::FemPostClipFilter(void) : FemPostFilter() {
ADD_PROPERTY_TYPE(Function, (0), "Clip", App::Prop_None, "The function object which defines the clip regions");
ADD_PROPERTY_TYPE(InsideOut, (false), "Clip", App::Prop_None, "Invert the clip direction");
ADD_PROPERTY_TYPE(CutCells, (false), "Clip", App::Prop_None, "Decides if cells are cuttet and interpolated or if the cells are kept as a whole");

polyDataSource = vtkGeometryFilter::New();

FilterPipeline clip;
m_clipper = vtkClipDataSet::New();
m_clipper = vtkTableBasedClipDataSet::New();
clip.source = m_clipper;
clip.target = m_clipper;
clip.visualisation = m_clipper;
Expand Down Expand Up @@ -224,3 +229,115 @@ void FemPostClipFilter::onChanged(const Property* prop) {
}




PROPERTY_SOURCE(Fem::FemPostScalarClipFilter, Fem::FemPostFilter)

FemPostScalarClipFilter::FemPostScalarClipFilter(void) : FemPostFilter() {

ADD_PROPERTY_TYPE(Value, (0), "Clip", App::Prop_None, "The scalar value used to clip the selected field");
ADD_PROPERTY_TYPE(Scalars, (long(0)), "Clip", App::Prop_None, "The field used to clip");
ADD_PROPERTY_TYPE(InsideOut, (false), "Clip", App::Prop_None, "Invert the clip direction");

Value.setConstraints(&m_constraints);

polyDataSource = vtkGeometryFilter::New();

FilterPipeline clip;
m_clipper = vtkTableBasedClipDataSet::New();
clip.source = m_clipper;
clip.target = m_clipper;
clip.visualisation = m_clipper;
addFilterPipeline(clip, "clip");
setActiveFilterPipeline("clip");
}

FemPostScalarClipFilter::~FemPostScalarClipFilter() {

}

DocumentObjectExecReturn* FemPostScalarClipFilter::execute(void) {

//update the available fields and set the correct input field data for clipping
if(!isConnected())
return StdReturn;

std::string val;
if(m_scalarFields.getEnums() && Scalars.getValue() >= 0)
val = Scalars.getValueAsString();

std::vector<std::string> array;

vtkDataObject* data;
if(hasInputAlgorithmConnected()) {
getConnectedInputAlgorithm()->Update();
data = getConnectedInputAlgorithm()->GetOutputDataObject(0);
}
else
data = getConnectedInputData();

vtkDataSet* dset = dynamic_cast<vtkDataSet*>(data);
if(!dset)
return StdReturn;

vtkPointData* pd = dset->GetPointData();

for(int i=0; i<pd->GetNumberOfArrays(); ++i) {
if(pd->GetArray(i)->GetNumberOfComponents()==1)
array.push_back(pd->GetArrayName(i));
}

App::Enumeration empty;
Scalars.setValue(empty);
m_scalarFields.setEnums(array);
Scalars.setValue(m_scalarFields);

std::vector<std::string>::iterator it = std::find(array.begin(), array.end(), val);
if(!val.empty() && it != array.end())
Scalars.setValue(val.c_str());

//recalculate the filter
return Fem::FemPostFilter::execute();
}


void FemPostScalarClipFilter::onChanged(const Property* prop) {

if(prop == &Value) {
m_clipper->SetValue(Value.getValue());
}
else if(prop == &InsideOut) {
m_clipper->SetInsideOut(InsideOut.getValue());
}
else if(prop == &Scalars && (Scalars.getValue() >= 0)) {
m_clipper->SetInputArrayToProcess(0, 0, 0,
vtkDataObject::FIELD_ASSOCIATION_POINTS, Scalars.getValueAsString() );
setConstraintForField();
}

Fem::FemPostFilter::onChanged(prop);
}

void FemPostScalarClipFilter::setConstraintForField() {

vtkDataObject* data;
if(hasInputAlgorithmConnected()) {
getConnectedInputAlgorithm()->Update();
data = getConnectedInputAlgorithm()->GetOutputDataObject(0);
}
else
data = getConnectedInputData();

vtkDataSet* dset = dynamic_cast<vtkDataSet*>(data);
if(!dset)
return;

vtkDataArray* pdata = dset->GetPointData()->GetArray(Scalars.getValueAsString());
double p[2];
pdata->GetRange(p);
m_constraints.LowerBound = p[0];
m_constraints.UpperBound = p[1];
m_constraints.StepSize = (p[1]-p[0])/100.;
}


43 changes: 38 additions & 5 deletions src/Mod/Fem/App/FemPostFilter.h
Expand Up @@ -25,9 +25,10 @@
#define Fem_FemPostFilter_H

#include "FemPostObject.h"
#include <App/PropertyUnits.h>

#include <vtkSmartPointer.h>
#include <vtkClipDataSet.h>
#include <vtkTableBasedClipDataSet.h>
#include <vtkExtractGeometry.h>
#include <vtkGeometryFilter.h>
#include <vtkPassThrough.h>
Expand Down Expand Up @@ -92,18 +93,50 @@ class AppFemExport FemPostClipFilter : public FemPostFilter {
FemPostClipFilter(void);
virtual ~FemPostClipFilter();

App::PropertyLink Function;
App::PropertyBool InsideOut;
App::PropertyBool CutCells;
App::PropertyLink Function;
App::PropertyBool InsideOut;
App::PropertyBool CutCells;

virtual const char* getViewProviderName(void) const {
return "FemGui::ViewProviderFemPostClip";
}

protected:
virtual void onChanged(const App::Property* prop);

private:
vtkSmartPointer<vtkClipDataSet> m_clipper;
vtkSmartPointer<vtkTableBasedClipDataSet> m_clipper;
vtkSmartPointer<vtkExtractGeometry> m_extractor;
};


class AppFemExport FemPostScalarClipFilter : public FemPostFilter {

PROPERTY_HEADER(Fem::FemPostScalarClipFilter);

public:
FemPostScalarClipFilter(void);
virtual ~FemPostScalarClipFilter();

App::PropertyBool InsideOut;
App::PropertyFloatConstraint Value;
App::PropertyEnumeration Scalars;

virtual const char* getViewProviderName(void) const {
return "FemGui::ViewProviderFemPostScalarClip";
}

protected:
virtual App::DocumentObjectExecReturn* execute(void);
virtual void onChanged(const App::Property* prop);
void setConstraintForField();

private:
vtkSmartPointer<vtkTableBasedClipDataSet> m_clipper;
App::Enumeration m_scalarFields;
App::PropertyFloatConstraint::Constraints m_constraints;
};

} //namespace Fem


Expand Down
34 changes: 34 additions & 0 deletions src/Mod/Fem/App/FemPostFunction.cpp
Expand Up @@ -96,3 +96,37 @@ void FemPostPlaneFunction::onChanged(const Property* prop) {

Fem::FemPostFunction::onChanged(prop);
}




PROPERTY_SOURCE(Fem::FemPostSphereFunction, Fem::FemPostFunction)

FemPostSphereFunction::FemPostSphereFunction(void): FemPostFunction() {

ADD_PROPERTY(Radius,(5));
ADD_PROPERTY(Center,(Base::Vector3d(1.0,0.0,0.0)));

m_sphere = vtkSphere::New();
m_implicit = m_sphere;

m_sphere->SetCenter(0., 0., 0.);
m_sphere->SetRadius(5);
}

FemPostSphereFunction::~FemPostSphereFunction() {

}

void FemPostSphereFunction::onChanged(const Property* prop) {

if(prop == &Center) {
const Base::Vector3d& vec = Center.getValue();
m_sphere->SetCenter(vec[0], vec[1], vec[2]);
}
else if(prop == &Radius) {
m_sphere->SetRadius(Radius.getValue());
}

Fem::FemPostFunction::onChanged(prop);
}
27 changes: 26 additions & 1 deletion src/Mod/Fem/App/FemPostFunction.h
Expand Up @@ -25,11 +25,12 @@
#define Fem_FemPostFunction_H

#include "FemPostObject.h"
#include <App/PropertyUnits.h>

#include <vtkSmartPointer.h>
#include <vtkImplicitFunction.h>
#include <vtkPlane.h>
#include <vtkPlaneSource.h>
#include <vtkSphere.h>

namespace Fem
{
Expand Down Expand Up @@ -103,6 +104,30 @@ class AppFemExport FemPostPlaneFunction : public FemPostFunction
vtkSmartPointer<vtkPlane> m_plane;
};

////////////////////////////////////////////////////////////////////////////////////////////

class AppFemExport FemPostSphereFunction : public FemPostFunction
{
PROPERTY_HEADER(Fem::FemPostSphereFunction);

public:

FemPostSphereFunction(void);
virtual ~FemPostSphereFunction();

App::PropertyDistance Radius;
App::PropertyVectorDistance Center;

virtual const char* getViewProviderName(void) const {
return "FemGui::ViewProviderFemPostSphereFunction";
}

protected:
virtual void onChanged(const App::Property* prop);

vtkSmartPointer<vtkSphere> m_sphere;
};

} //namespace Fem


Expand Down
4 changes: 4 additions & 0 deletions src/Mod/Fem/App/FemPostPipeline.cpp
Expand Up @@ -134,6 +134,10 @@ void FemPostPipeline::onChanged(const Property* prop)

//we check if all connections are right and add new ones if needed
std::vector<App::DocumentObject*> objs = Filter.getValues();

if(objs.empty())
return;

std::vector<App::DocumentObject*>::iterator it = objs.begin();
FemPostFilter* filter = static_cast<FemPostFilter*>(*it);

Expand Down
4 changes: 4 additions & 0 deletions src/Mod/Fem/Gui/AppFemGui.cpp
Expand Up @@ -59,6 +59,7 @@
#include "ViewProviderFemPostObject.h"
#include "ViewProviderFemPostPipeline.h"
#include "ViewProviderFemPostFunction.h"
#include "ViewProviderFemPostFilter.h"
#endif

#ifdef FC_USE_VTK
Expand Down Expand Up @@ -126,6 +127,9 @@ PyMODINIT_FUNC initFemGui()
FemGui::ViewProviderFemPostFunction ::init();
FemGui::ViewProviderFemPostFunctionProvider::init();
FemGui::ViewProviderFemPostPlaneFunction ::init();
FemGui::ViewProviderFemPostSphereFunction ::init();
FemGui::ViewProviderFemPostClip ::init();
FemGui::ViewProviderFemPostScalarClip ::init();
#endif


Expand Down

0 comments on commit 51f2a0e

Please sign in to comment.