Attached Files | surface-with-edges-opacity.py [^] (2,039 bytes) 2012-06-22 16:24
good.png [^] (18,530 bytes) 2012-06-22 16:25
bad.png [^] (50,622 bytes) 2012-06-22 16:25
BUG.13264.patch [^] (8,504 bytes) 2013-07-01 16:09 [Show Content] [Hide Content]diff --git a/Filters/ParallelMPI/vtkDistributedDataFilter.cxx b/Filters/ParallelMPI/vtkDistributedDataFilter.cxx
index 7574104..61e8604 100644
--- a/Filters/ParallelMPI/vtkDistributedDataFilter.cxx
+++ b/Filters/ParallelMPI/vtkDistributedDataFilter.cxx
@@ -19,8 +19,8 @@
#include "vtkDistributedDataFilter.h"
-#include "vtkBox.h"
#include "vtkBoxClipDataSet.h"
+#include "vtkBox.h"
#include "vtkBSPCuts.h"
#include "vtkCellArray.h"
#include "vtkCellData.h"
@@ -41,6 +41,7 @@
#include "vtkMergeCells.h"
#include "vtkMultiBlockDataSet.h"
#include "vtkMultiProcessController.h"
+#include "vtkNew.h"
#include "vtkObjectFactory.h"
#include "vtkPKdTree.h"
#include "vtkPlane.h"
@@ -49,6 +50,7 @@
#include "vtkSmartPointer.h"
#include "vtkSocketController.h"
#include "vtkStreamingDemandDrivenPipeline.h"
+#include "vtkTableBasedClipDataSet.h"
#include "vtkToolkits.h"
#include "vtkUnsignedCharArray.h"
#include "vtkUnstructuredGrid.h"
@@ -68,6 +70,77 @@ vtkStandardNewMacro(vtkDistributedDataFilter)
#include <map>
#include <algorithm>
+namespace
+{
+ template <class T>
+ void ClipVTKDataset(
+ vtkUnstructuredGrid *grid, double *bounds,
+ vtkUnstructuredGrid **outside,
+ vtkUnstructuredGrid **inside)
+ {
+ vtkNew<T> clipped;
+
+ vtkNew<vtkBox> box;
+ box->SetBounds(bounds);
+
+ clipped->SetClipFunction(box.GetPointer());
+ clipped->SetValue(0.0);
+ clipped->InsideOutOn();
+ clipped->SetInputData(grid);
+ if (outside)
+ {
+ clipped->GenerateClippedOutputOn();
+ }
+ clipped->Update();
+ if (outside)
+ {
+ vtkUnstructuredGrid* out = clipped->GetClippedOutput();
+ out->Register(NULL);
+ *outside = out;
+ }
+ vtkUnstructuredGrid* in =clipped->GetOutput();
+ in->Register(NULL);
+ *inside = in;
+ }
+
+ void ClipVTKDataset(int mode,
+ vtkUnstructuredGrid *grid, double *bounds,
+ vtkUnstructuredGrid **outside,
+ vtkUnstructuredGrid **inside)
+ {
+ if (mode == vtkDistributedDataFilter::USE_CLIPDATASET)
+ {
+ ClipVTKDataset<vtkClipDataSet>(grid, bounds, outside, inside);
+ }
+ else if (mode == vtkDistributedDataFilter::USE_TABLEBASEDCLIPDATASET)
+ {
+ ClipVTKDataset<vtkTableBasedClipDataSet>(grid, bounds, outside, inside);
+ }
+ else // if (mode == vtkDistributedDataFilter::USE_BOXCLIPDATASET)
+ {
+ vtkNew<vtkBoxClipDataSet> clipped;
+ clipped->SetBoxClip(bounds[0], bounds[1],
+ bounds[2], bounds[3], bounds[4], bounds[5]);
+ clipped->SetInputData(grid);
+ if (outside)
+ {
+ clipped->GenerateClippedOutputOn();
+ }
+ clipped->Update();
+ if (outside)
+ {
+ vtkUnstructuredGrid* out = clipped->GetClippedOutput();
+ out->Register(NULL);
+ *outside = out;
+ }
+
+ vtkUnstructuredGrid* in =clipped->GetOutput();
+ in->Register(NULL);
+ *inside = in;
+ }
+ }
+}
+
class vtkDistributedDataFilterSTLCloak
{
public:
@@ -100,6 +173,7 @@ vtkDistributedDataFilter::vtkDistributedDataFilter()
this->RetainKdtree = 1;
this->IncludeAllIntersectingCells = 0;
this->ClipCells = 0;
+ this->ClipAlgorithmType = USE_BOXCLIPDATASET;
this->Timing = 0;
@@ -2842,87 +2916,6 @@ void vtkDistributedDataFilter::AddConstantUnsignedCharCellArray(
}
//-------------------------------------------------------------------------
-// this is here temporarily, until vtkBoxClipDataSet is fixed to
-// be able to generate the clipped output
-void vtkDistributedDataFilter::ClipWithVtkClipDataSet(
- vtkUnstructuredGrid *grid, double *bounds,
- vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside)
-{
- vtkUnstructuredGrid *in;
- vtkUnstructuredGrid *out ;
-
- vtkClipDataSet *clipped = vtkClipDataSet::New();
-
- vtkBox *box = vtkBox::New();
- box->SetBounds(bounds);
-
- clipped->SetClipFunction(box);
- box->Delete();
- clipped->SetValue(0.0);
- clipped->InsideOutOn();
-
- clipped->SetInputData(grid);
-
- if (outside)
- {
- clipped->GenerateClippedOutputOn();
- }
-
- clipped->Update();
-
- if (outside)
- {
- out = clipped->GetClippedOutput();
- out->Register(this);
- *outside = out;
- }
-
- in = clipped->GetOutput();
- in->Register(this);
- *inside = in;
-
-
- clipped->Delete();
-}
-
-//-------------------------------------------------------------------------
-// In general, vtkBoxClipDataSet is much faster and makes fewer errors.
-void vtkDistributedDataFilter::ClipWithBoxClipDataSet(
- vtkUnstructuredGrid *grid, double *bounds,
- vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside)
-{
- vtkUnstructuredGrid *in;
- vtkUnstructuredGrid *out ;
-
- vtkBoxClipDataSet *clipped = vtkBoxClipDataSet::New();
-
- clipped->SetBoxClip(bounds[0], bounds[1],
- bounds[2], bounds[3], bounds[4], bounds[5]);
-
- clipped->SetInputData(grid);
-
- if (outside)
- {
- clipped->GenerateClippedOutputOn();
- }
-
- clipped->Update();
-
- if (outside)
- {
- out = clipped->GetClippedOutput();
- out->Register(this);
- *outside = out;
- }
-
- in = clipped->GetOutput();
- in->Register(this);
- *inside = in;
-
- clipped->Delete();
-}
-
-//-------------------------------------------------------------------------
void vtkDistributedDataFilter::ClipCellsToSpatialRegion(vtkUnstructuredGrid *grid)
{
this->ComputeMyRegionBounds();
@@ -2948,11 +2941,7 @@ void vtkDistributedDataFilter::ClipCellsToSpatialRegion(vtkUnstructuredGrid *gri
vtkUnstructuredGrid *outside;
vtkUnstructuredGrid *inside;
-#if 1
- this->ClipWithBoxClipDataSet(grid, bounds, &outside, &inside);
-#else
- this->ClipWithVtkClipDataSet(grid, bounds, &outside, &inside);
-#endif
+ ClipVTKDataset(this->ClipAlgorithmType, grid, bounds, &outside, &inside);
grid->Initialize();
@@ -3001,13 +2990,7 @@ void vtkDistributedDataFilter::ClipCellsToSpatialRegion(vtkUnstructuredGrid *gri
else
{
vtkUnstructuredGrid *inside;
-
-#if 1
- this->ClipWithBoxClipDataSet(grid, bounds, NULL, &inside);
-#else
- this->ClipWithVtkClipDataSet(grid, bounds, NULL, &inside);
-#endif
-
+ ClipVTKDataset(this->ClipAlgorithmType, grid, bounds, NULL, &inside);
grid->ShallowCopy(inside);
inside->Delete();
}
@@ -4608,6 +4591,7 @@ void vtkDistributedDataFilter::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "RetainKdtree: " << this->RetainKdtree << endl;
os << indent << "IncludeAllIntersectingCells: " << this->IncludeAllIntersectingCells << endl;
os << indent << "ClipCells: " << this->ClipCells << endl;
+ os << indent << "ClipAlgorithmType: " << this->ClipAlgorithmType << endl;
os << indent << "Timing: " << this->Timing << endl;
os << indent << "UseMinimalMemory: " << this->UseMinimalMemory << endl;
diff --git a/Filters/ParallelMPI/vtkDistributedDataFilter.h b/Filters/ParallelMPI/vtkDistributedDataFilter.h
index 8382a52..20e9d92 100644
--- a/Filters/ParallelMPI/vtkDistributedDataFilter.h
+++ b/Filters/ParallelMPI/vtkDistributedDataFilter.h
@@ -239,6 +239,18 @@ public:
// default behavior i.e. letting the KdTree come up with the assignments.
void SetUserRegionAssignments(const int *map, int numRegions);
+ enum
+ {
+ USE_BOXCLIPDATASET = 0,
+ USE_CLIPDATASET = 1,
+ USE_TABLEBASEDCLIPDATASET = 2
+ };
+ // Description:
+ // Get/Set the clip-algorithm type to use for clipping cells, if needed to
+ // clip cells.
+ vtkSetClampMacro(ClipAlgorithmType, int,
+ USE_BOXCLIPDATASET, USE_TABLEBASEDCLIPDATASET);
+ vtkGetMacro(ClipAlgorithmType, int);
protected:
vtkDistributedDataFilter();
~vtkDistributedDataFilter();
@@ -423,11 +435,6 @@ private:
// Description:
// ?
void ClipCellsToSpatialRegion(vtkUnstructuredGrid *grid);
- void ClipWithVtkClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
- vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
-
- void ClipWithBoxClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
- vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
// Description:
// Accessors to the "GLOBALID" point and cell arrays of the dataset.
@@ -537,6 +544,7 @@ private:
int RetainKdtree;
int IncludeAllIntersectingCells;
int ClipCells;
+ int ClipAlgorithmType;
int AssignBoundaryCellsToOneRegion;
int AssignBoundaryCellsToAllIntersectingRegions;
int DivideBoundaryCells;
|