1 #include "vtkExtractCellType.h"
4 #include "vtkCellTypes.h"
5 #include "vtkCompositeDataSet.h"
6 #include "vtkCompositeDataIterator.h"
7 #include "vtkDataArraySelection.h"
8 #include "vtkDataSet.h"
9 #include "vtkExtractSelection.h"
10 #include "vtkIdTypeArray.h"
11 #include "vtkInformation.h"
12 #include "vtkObjectFactory.h"
13 #include "vtkSelection.h"
14 #include "vtkSelectionNode.h"
16 vtkStandardNewMacro(vtkExtractCellType);
18 //----------------------------------------------------------------------------
19 vtkExtractCellType::vtkExtractCellType(){}
21 //----------------------------------------------------------------------------
22 vtkExtractCellType::~vtkExtractCellType(){}
24 //----------------------------------------------------------------------------
25 void vtkExtractCellType::AppendToGeoTypes(vtkDataSet* dataset)
27 for(int i = 0; i < dataset->GetNumberOfCells(); i++)
29 vtkCell* cell = dataset->GetCell(i);
31 // TODO use MEDCoupling CellType API
32 const char* cellType = vtkCellTypes::GetClassNameFromTypeId(cell->GetCellType());
33 if (!this->FieldSelection->ArrayExists(cellType))
35 this->FieldSelection->AddArray(cellType, false);
40 //----------------------------------------------------------------------------
41 void vtkExtractCellType::SelectIds(vtkDataSet* dataset, vtkIdTypeArray* selArr)
43 for(int i = 0; i < dataset->GetNumberOfCells(); i++)
45 vtkCell* cell = dataset->GetCell(i);
47 // TODO use MEDCoupling CellType API
48 const char* cellType = vtkCellTypes::GetClassNameFromTypeId(cell->GetCellType());
50 // Needed as append to geotypes may not have been done in request information
52 if (!this->FieldSelection->ArrayExists(cellType))
54 this->FieldSelection->AddArray(cellType, false);
56 else if(this->FieldSelection->ArrayIsEnabled(cellType))
58 selArr->InsertNextValue(i);
63 //----------------------------------------------------------------------------
64 int vtkExtractCellType::RequestInformation(vtkInformation* req, vtkInformationVector** inputVector, vtkInformationVector* outputVector)
66 vtkDataSet* inputDS = vtkDataSet::GetData(inputVector[0]);
67 vtkCompositeDataSet* inputComposite = vtkCompositeDataSet::GetData(inputVector[0]);
71 this->AppendToGeoTypes(inputDS);
73 else if(inputComposite)
75 vtkSmartPointer<vtkCompositeDataIterator> iter;
76 iter.TakeReference(inputComposite->NewIterator());
77 for (iter->InitTraversal(); !iter->IsDoneWithTraversal(); iter->GoToNextItem())
79 this->AppendToGeoTypes(vtkDataSet::SafeDownCast(inputComposite->GetDataSet(iter)));
86 //----------------------------------------------------------------------------
87 int vtkExtractCellType::RequestData(vtkInformation* req, vtkInformationVector** inputVector, vtkInformationVector* outputVector)
89 // Get the input and output data objects.
90 vtkDataSet* input = vtkDataSet::GetData(inputVector[0]);
91 vtkDataSet* output = vtkDataSet::GetData(outputVector);
93 // Create a selection, sel1, of cells with indices 7643-7499-7355-7211
94 vtkNew<vtkIdTypeArray> selArr1;
96 vtkDataSet* inputDS = vtkDataSet::GetData(inputVector[0]);
97 vtkCompositeDataSet* inputComposite = vtkCompositeDataSet::GetData(inputVector[0]);
101 this->SelectIds(inputDS, selArr1);
103 else if(inputComposite)
105 vtkSmartPointer<vtkCompositeDataIterator> iter;
106 iter.TakeReference(inputComposite->NewIterator());
107 for (iter->InitTraversal(); !iter->IsDoneWithTraversal(); iter->GoToNextItem())
109 this->SelectIds(vtkDataSet::SafeDownCast(inputComposite->GetDataSet(iter)), selArr1);
113 vtkNew<vtkSelectionNode> selNode1;
114 selNode1->SetContentType(vtkSelectionNode::INDICES);
115 selNode1->SetFieldType(vtkSelectionNode::CELL);
116 selNode1->GetProperties()->Set(vtkSelectionNode::COMPOSITE_INDEX(), 1);
117 selNode1->GetProperties()->Set(vtkSelectionNode::INVERSE(), this->InsideOut);
118 selNode1->SetSelectionList(selArr1);
119 vtkNew<vtkSelection> sel1;
120 sel1->AddNode(selNode1);
122 this->SetInputData(1, sel1);
123 this->Superclass::RequestData(req, inputVector, outputVector);
127 //----------------------------------------------------------------------------
128 void vtkExtractCellType::PrintSelf(ostream& os, vtkIndent indent)
130 this->Superclass::PrintSelf(os, indent);
132 //------------------------------------------------------------------------------
133 int vtkExtractCellType::GetNumberOfGeoTypesArrays()
135 return this->FieldSelection->GetNumberOfArrays();
138 //------------------------------------------------------------------------------
139 const char *vtkExtractCellType::GetGeoTypesArrayName(int index)
141 return this->FieldSelection->GetArrayName(index) + 3; // String parsing -- remove "vtk"
144 //------------------------------------------------------------------------------
145 int vtkExtractCellType::GetGeoTypesArrayStatus(const char *name)
147 return this->FieldSelection->ArrayIsEnabled(name);
150 //------------------------------------------------------------------------------
151 void vtkExtractCellType::SetGeoTypesStatus(const char *name, int status)
153 std::string complete_name = "vtk";
154 complete_name.append(name);
155 if (this->GetGeoTypesArrayStatus(complete_name.c_str()) != status)
159 this->FieldSelection->EnableArray(complete_name.c_str());
163 this->FieldSelection->DisableArray(complete_name.c_str());