0022651: Impossible to build OCC as static library due to using Standard_EXPORT inste...
[occt.git] / src / IVtkTools / IVtkTools_SubPolyDataFilter.cxx
CommitLineData
913a4c4a 1// Created on: 2011-10-27
2// Created by: Roman KOZLOV
3// Copyright (c) 2011-2014 OPEN CASCADE SAS
4//
5// This file is part of Open CASCADE Technology software library.
6//
7// This library is free software; you can redistribute it and/or modify it under
8// the terms of the GNU Lesser General Public License version 2.1 as published
9// by the Free Software Foundation, with special exception defined in the file
10// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11// distribution for complete text of the license and disclaimer of any warranty.
12//
13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
15
16#include <IVtkTools_SubPolyDataFilter.hxx>
17#include <IVtkVTK_ShapeData.hxx>
a9660929 18
19// prevent disabling some MSVC warning messages by VTK headers
20#ifdef _MSC_VER
21#pragma warning(push)
22#endif
a2f76b15 23#include <vtkCellData.h>
24#include <vtkIdList.h>
25#include <vtkIdTypeArray.h>
913a4c4a 26#include <vtkInformation.h>
27#include <vtkInformationVector.h>
28#include <vtkObjectFactory.h>
a9660929 29#ifdef _MSC_VER
30#pragma warning(pop)
31#endif
913a4c4a 32
68858c7d 33vtkStandardNewMacro(IVtkTools_SubPolyDataFilter)
913a4c4a 34
35//================================================================
36// Function : Constructor
37// Purpose :
38//================================================================
39IVtkTools_SubPolyDataFilter::IVtkTools_SubPolyDataFilter()
40{
68df8478 41 myIdsArrayName = IVtkVTK_ShapeData::ARRNAME_SUBSHAPE_IDS();
913a4c4a 42 myDoFiltering = true;
43}
44
45//================================================================
46// Function : Destructor
47// Purpose :
48//================================================================
49IVtkTools_SubPolyDataFilter::~IVtkTools_SubPolyDataFilter() { }
50
51//================================================================
52// Function : RequestData
53// Purpose : Filter cells according to the given set of ids.
54//================================================================
55int IVtkTools_SubPolyDataFilter::RequestData (vtkInformation *vtkNotUsed(theRequest),
56 vtkInformationVector **theInputVector,
57 vtkInformationVector *theOutputVector)
58{
59 // get the input and output
a2f76b15 60 vtkSmartPointer<vtkInformation> anInInfo = theInputVector[0]->GetInformationObject(0);
61 vtkSmartPointer<vtkInformation> anOutInfo = theOutputVector->GetInformationObject(0);
913a4c4a 62
a2f76b15 63 vtkSmartPointer<vtkPolyData> anInput = vtkPolyData::SafeDownCast(
913a4c4a 64 anInInfo->Get (vtkDataObject::DATA_OBJECT()));
65
a2f76b15 66 vtkSmartPointer<vtkPolyData> anOutput = vtkPolyData::SafeDownCast(
913a4c4a 67 anOutInfo->Get (vtkDataObject::DATA_OBJECT()));
68
913a4c4a 69 anInput->Modified();
70
71 if (myDoFiltering)
72 {
a2f76b15 73 vtkSmartPointer<vtkCellData> aCellData = anInput->GetCellData();
896faa72 74 vtkIdType aSize = 0;
a2f76b15 75 vtkSmartPointer<vtkIdTypeArray> aDataArray =
76 vtkIdTypeArray::SafeDownCast (aCellData->GetArray (myIdsArrayName));
77
78 // List of cell ids to be passed
79 vtkSmartPointer<vtkIdList> anIdList = vtkSmartPointer<vtkIdList>::New();
80 anIdList->Allocate(myIdsSet.Extent()); // Allocate the list of ids
913a4c4a 81
a2f76b15 82 if (aDataArray.GetPointer() != NULL)
913a4c4a 83 {
84 aSize = aDataArray->GetNumberOfTuples();
85 anIdList->Allocate (aSize); // Allocate the list of ids
86 }
87
88 // Prepare the list of ids from the set of ids.
89 // Iterate on input cells.
90 if (!myIdsSet.IsEmpty())
91 {
92 for (vtkIdType anI = 0; anI < aSize; anI++)
93 {
94 if (myIdsSet.Contains (aDataArray->GetValue (anI)))
95 {
96 // Add a cell id to output if it's value is in the set.
97 anIdList->InsertNextId (anI);
98 }
99 }
100 }
101
102 // Copy cells with their points according to the prepared list of cell ids.
103 anOutput->GetCellData()->AllocateArrays(anInput->GetCellData()->GetNumberOfArrays());
104 anOutput->Allocate(anInput, anIdList->GetNumberOfIds()); // Allocate output cells
105 // Pass data arrays.
106 // Create new arrays for output data
a2f76b15 107 vtkSmartPointer<vtkCellData> anInData = anInput->GetCellData();
108 vtkSmartPointer<vtkCellData> anOutData = anOutput->GetCellData();
109 vtkSmartPointer<vtkDataArray> anInArr, anOutArr;
913a4c4a 110
111 for (Standard_Integer anI = 0; anI < anInData->GetNumberOfArrays(); anI++)
112 {
113 anInArr = anInData->GetArray (anI);
a2f76b15 114 anOutArr = vtkSmartPointer<vtkDataArray>::Take(
115 vtkDataArray::CreateDataArray(anInArr->GetDataType()));
913a4c4a 116 anOutArr->SetName(anInArr->GetName());
117 anOutArr->Allocate(anIdList->GetNumberOfIds() * anInArr->GetNumberOfComponents());
118 anOutArr->SetNumberOfTuples (anIdList->GetNumberOfIds());
119 anOutArr->SetNumberOfComponents (anInArr->GetNumberOfComponents());
120 anOutData->AddArray(anOutArr);
121 }
122
123 // Copy cells with ids from our list.
124 anOutput->CopyCells (anInput, anIdList);
125
126 // Copy filtered arrays data
127 vtkIdType anOutId, anInId;
128
129 for (Standard_Integer anI = 0; anI < anInData->GetNumberOfArrays(); anI++)
130 {
131 anInArr = anInData->GetArray (anI);
a2f76b15 132 anOutArr = anOutData->GetArray(anI);
913a4c4a 133 for (anOutId = 0; anOutId < anIdList->GetNumberOfIds(); anOutId++)
134 {
135 anInId = anIdList->GetId (anOutId);
136 anOutArr->SetTuple (anOutId, anInId, anInArr);
137 }
138 }
913a4c4a 139 }
140 else
141 {
142 anOutput->CopyStructure (anInput); // Copy points and cells
143 anOutput->CopyAttributes (anInput); // Copy data arrays (sub-shapes ids)
144 }
145
146 return 1; // Return non-zero value if success and pipeline is not failed.
147}
148
149//================================================================
150// Function : SetDoFiltering
151// Purpose :
152//================================================================
153void IVtkTools_SubPolyDataFilter::SetDoFiltering (const bool theDoFiltering)
154{
155 myDoFiltering = theDoFiltering;
156}
157
158//================================================================
159// Function : PrintSelf
160// Purpose :
161//================================================================
162void IVtkTools_SubPolyDataFilter::PrintSelf (std::ostream& theOs, vtkIndent theIndent)
163{
164 this->Superclass::PrintSelf (theOs,theIndent);
165 theOs << theIndent << "SubPolyData: " << "\n";
166 theOs << theIndent << " Number of cells to pass: " << myIdsSet.Extent() << "\n";
167 theOs << theIndent << " Cells ids to pass: {" ;
168 // Print the content of the set of ids.
169 IVtk_IdTypeMap::Iterator anIter(myIdsSet);
170 while (anIter.More())
171 {
172 theOs << " " << anIter.Value();
173 anIter.Next();
174 if (anIter.More())
175 {
176 theOs << "; ";
177 }
178 }
179 theOs << "}" << "\n";
180}
181
182//================================================================
183// Function : Clear
184// Purpose : Clear ids set to be passed through this filter.
185//================================================================
186void IVtkTools_SubPolyDataFilter::Clear()
187{
188 myIdsSet.Clear();
189}
190
191//================================================================
192// Function : SetData
193// Purpose : Set ids to be passed through this filter.
194//================================================================
195void IVtkTools_SubPolyDataFilter::SetData (const IVtk_IdTypeMap theSet)
196{
197 myIdsSet = theSet;
198}
199
200//================================================================
201// Function : AddData
202// Purpose : Add ids to be passed through this filter.
203//================================================================
204void IVtkTools_SubPolyDataFilter::AddData (const IVtk_IdTypeMap theSet)
205{
206 IVtk_IdTypeMap::Iterator anIt (theSet);
207 for (; anIt.More(); anIt.Next())
208 {
209 if (!myIdsSet.Contains (anIt.Value()))
210 {
211 myIdsSet.Add (anIt.Value());
212 }
213 }
214}
215
216//================================================================
217// Function : SetData
218// Purpose : Set ids to be passed through this filter.
219//================================================================
220void IVtkTools_SubPolyDataFilter::SetData (const IVtk_ShapeIdList theIdList)
221{
222 myIdsSet.Clear();
223 AddData (theIdList);
224}
225
226//================================================================
227// Function : AddData
228// Purpose : Add ids to be passed through this filter.
229//================================================================
230void IVtkTools_SubPolyDataFilter::AddData (const IVtk_ShapeIdList theIdList)
231{
232 IVtk_ShapeIdList::Iterator anIt (theIdList);
233 for (; anIt.More(); anIt.Next())
234 {
235 if (!myIdsSet.Contains (anIt.Value()))
236 {
237 myIdsSet.Add (anIt.Value());
238 }
239 }
240}
241
242//! Set ids to be passed through this filter.
243//================================================================
244// Function : SetIdsArrayName
245// Purpose :
246//================================================================
247void IVtkTools_SubPolyDataFilter::SetIdsArrayName (const char* theArrayName)
248{
249 myIdsArrayName = theArrayName;
250}