1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkDataArraySelection.cxx
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14 =========================================================================*/
15 #include "vtkDataArraySelection.h"
16 #include "vtkObjectFactory.h"
17
18 #include <vector>
19 #include <string>
20
21 vtkStandardNewMacro(vtkDataArraySelection);
22
23 class vtkDataArraySelectionInternals
24 {
25 public:
26 std::vector<std::string> ArrayNames;
27 std::vector<int> ArraySettings;
28 };
29
30 //----------------------------------------------------------------------------
vtkDataArraySelection()31 vtkDataArraySelection::vtkDataArraySelection()
32 {
33 this->Internal = new vtkDataArraySelectionInternals;
34 }
35
36 //----------------------------------------------------------------------------
~vtkDataArraySelection()37 vtkDataArraySelection::~vtkDataArraySelection()
38 {
39 delete this->Internal;
40 }
41
42 //----------------------------------------------------------------------------
PrintSelf(ostream & os,vtkIndent indent)43 void vtkDataArraySelection::PrintSelf(ostream& os, vtkIndent indent)
44 {
45 this->Superclass::PrintSelf(os, indent);
46 os << indent << "Number of Arrays: " << this->GetNumberOfArrays() << "\n";
47 vtkIndent nindent = indent.GetNextIndent();
48 int cc;
49 for ( cc = 0; cc < this->GetNumberOfArrays(); cc ++ )
50 {
51 os << nindent << "Array: " << this->GetArrayName(cc) << " is: "
52 << (this->GetArraySetting(cc)?"enabled":"disabled")
53 << " (" << this->ArrayIsEnabled(this->GetArrayName(cc)) << ")" << endl;
54 }
55 }
56
57 //----------------------------------------------------------------------------
EnableArray(const char * name)58 void vtkDataArraySelection::EnableArray(const char* name)
59 {
60 vtkDebugMacro("Enabling array \"" << name << "\".");
61 int index = this->GetArrayIndex(name);
62 if(index >= 0)
63 {
64 if(!this->Internal->ArraySettings[index])
65 {
66 this->Internal->ArraySettings[index] = 1;
67 this->Modified();
68 }
69 }
70 else
71 {
72 this->Internal->ArrayNames.push_back(name);
73 this->Internal->ArraySettings.push_back(1);
74 this->Modified();
75 }
76 }
77
78 //----------------------------------------------------------------------------
DisableArray(const char * name)79 void vtkDataArraySelection::DisableArray(const char* name)
80 {
81 vtkDebugMacro("Disabling array \"" << name << "\".");
82 int index = this->GetArrayIndex(name);
83 if(index >= 0)
84 {
85 if(this->Internal->ArraySettings[index])
86 {
87 this->Internal->ArraySettings[index] = 0;
88 this->Modified();
89 }
90 }
91 else
92 {
93 this->Internal->ArrayNames.push_back(name);
94 this->Internal->ArraySettings.push_back(0);
95 this->Modified();
96 }
97 }
98
99 //----------------------------------------------------------------------------
ArrayIsEnabled(const char * name)100 int vtkDataArraySelection::ArrayIsEnabled(const char* name)
101 {
102 // Check if there is a specific entry for this array.
103 int index = this->GetArrayIndex(name);
104 if(index >= 0)
105 {
106 return this->Internal->ArraySettings[index];
107 }
108
109 // The array does not have an entry. Assume it is disabled.
110 return 0;
111 }
112
113 //----------------------------------------------------------------------------
ArrayExists(const char * name)114 int vtkDataArraySelection::ArrayExists(const char* name)
115 {
116 // Check if there is a specific entry for this array.
117 return (this->GetArrayIndex(name) >= 0)? 1:0;
118 }
119
120 //----------------------------------------------------------------------------
EnableAllArrays()121 void vtkDataArraySelection::EnableAllArrays()
122 {
123 vtkDebugMacro("Enabling all arrays.");
124 int modified = 0;
125 for(std::vector<int>::iterator i = this->Internal->ArraySettings.begin();
126 i != this->Internal->ArraySettings.end(); ++i)
127 {
128 if(!*i)
129 {
130 *i = 1;
131 modified = 1;
132 }
133 }
134 if(modified)
135 {
136 this->Modified();
137 }
138 }
139
140 //----------------------------------------------------------------------------
DisableAllArrays()141 void vtkDataArraySelection::DisableAllArrays()
142 {
143 vtkDebugMacro("Disabling all arrays.");
144 int modified = 0;
145 for(std::vector<int>::iterator i = this->Internal->ArraySettings.begin();
146 i != this->Internal->ArraySettings.end(); ++i)
147 {
148 if(*i)
149 {
150 *i = 0;
151 modified = 1;
152 }
153 }
154 if(modified)
155 {
156 this->Modified();
157 }
158 }
159
160 //----------------------------------------------------------------------------
GetNumberOfArrays()161 int vtkDataArraySelection::GetNumberOfArrays()
162 {
163 return static_cast<int>(this->Internal->ArrayNames.size());
164 }
165
166 //----------------------------------------------------------------------------
GetNumberOfArraysEnabled()167 int vtkDataArraySelection::GetNumberOfArraysEnabled()
168 {
169 int numArrays = 0;
170 for(std::vector<int>::iterator i = this->Internal->ArraySettings.begin();
171 i != this->Internal->ArraySettings.end(); ++i)
172 {
173 if(*i)
174 {
175 numArrays++;
176 }
177 }
178 return numArrays;
179 }
180
181 //----------------------------------------------------------------------------
GetArrayName(int index)182 const char* vtkDataArraySelection::GetArrayName(int index)
183 {
184 if(index >= 0 && index < this->GetNumberOfArrays())
185 {
186 return this->Internal->ArrayNames[index].c_str();
187 }
188 return 0;
189 }
190
191 //----------------------------------------------------------------------------
GetArrayIndex(const char * name)192 int vtkDataArraySelection::GetArrayIndex(const char* name)
193 {
194 for(unsigned int i=0; i < this->Internal->ArrayNames.size(); ++i)
195 {
196 if(this->Internal->ArrayNames[i] == name)
197 {
198 return i;
199 }
200 }
201 return -1;
202 }
203
204 //----------------------------------------------------------------------------
GetEnabledArrayIndex(const char * name)205 int vtkDataArraySelection::GetEnabledArrayIndex(const char* name)
206 {
207 int index = 0;
208 for(unsigned int i=0; i < this->Internal->ArrayNames.size(); ++i)
209 {
210 if(this->Internal->ArrayNames[i] == name)
211 {
212 return index;
213 }
214 else if(this->Internal->ArraySettings[i])
215 {
216 ++index;
217 }
218 }
219 return -1;
220 }
221
222 //----------------------------------------------------------------------------
GetArraySetting(int index)223 int vtkDataArraySelection::GetArraySetting(int index)
224 {
225 if(index >= 0 && index < this->GetNumberOfArrays())
226 {
227 return this->Internal->ArraySettings[index];
228 }
229 return 0;
230 }
231
232 //----------------------------------------------------------------------------
RemoveAllArrays()233 void vtkDataArraySelection::RemoveAllArrays()
234 {
235 vtkDebugMacro("Removing all arrays.");
236 if(this->GetNumberOfArrays() > 0)
237 {
238 this->Internal->ArrayNames.erase(this->Internal->ArrayNames.begin(),
239 this->Internal->ArrayNames.end());
240 this->Internal->ArraySettings.erase(this->Internal->ArraySettings.begin(),
241 this->Internal->ArraySettings.end());
242 this->Modified();
243 }
244 }
245
246 //----------------------------------------------------------------------------
AddArray(const char * name)247 int vtkDataArraySelection::AddArray(const char* name)
248 {
249 vtkDebugMacro("Adding array \"" << name << "\".");
250 // This function is called only by the filter owning the selection.
251 // It should not call Modified() because array settings are not
252 // changed.
253 if(this->ArrayExists(name))
254 {
255 return 0;
256 }
257 this->Internal->ArrayNames.push_back(name);
258 this->Internal->ArraySettings.push_back(1);
259 return 1;
260 }
261
262 //----------------------------------------------------------------------------
RemoveArrayByIndex(int index)263 void vtkDataArraySelection::RemoveArrayByIndex(int index)
264 {
265 if(index >= 0 && index < this->GetNumberOfArrays())
266 {
267 this->Internal->ArrayNames.erase(
268 this->Internal->ArrayNames.begin()+index
269 );
270 this->Internal->ArraySettings.erase(
271 this->Internal->ArraySettings.begin()+index
272 );
273 }
274 }
275
276 //----------------------------------------------------------------------------
RemoveArrayByName(const char * name)277 void vtkDataArraySelection::RemoveArrayByName(const char *name)
278 {
279 this->RemoveArrayByIndex(this->GetArrayIndex(name));
280 }
281
282 //----------------------------------------------------------------------------
SetArrays(const char * const * names,int numArrays)283 void vtkDataArraySelection::SetArrays(const char* const* names, int numArrays)
284 {
285 this->SetArraysWithDefault(names, numArrays, 1);
286 }
287
288 //----------------------------------------------------------------------------
SetArraysWithDefault(const char * const * names,int numArrays,int defaultStatus)289 void vtkDataArraySelection::SetArraysWithDefault(const char* const* names,
290 int numArrays,
291 int defaultStatus)
292 {
293 // This function is called only by the filter owning the selection.
294 // It should not call Modified() because array settings are not
295 // changed.
296
297 vtkDebugMacro("Settings arrays to given list of " << numArrays
298 << " arrays.");
299
300 // Create a new map for this set of arrays.
301 vtkDataArraySelectionInternals* newInternal =
302 new vtkDataArraySelectionInternals;
303
304 newInternal->ArrayNames.reserve(numArrays);
305 newInternal->ArraySettings.reserve(numArrays);
306
307 // Fill with settings for all arrays.
308 int i;
309 for(i=0;i < numArrays; ++i)
310 {
311 // Add this array.
312 newInternal->ArrayNames.push_back(names[i]);
313
314 // Fill in the setting. Use the old value if available.
315 // Otherwise, use the given default.
316 int setting = defaultStatus?1:0;
317 int index = this->GetArrayIndex(names[i]);
318 if(index >= 0)
319 {
320 setting = this->Internal->ArraySettings[index];
321 }
322 newInternal->ArraySettings.push_back(setting);
323 }
324
325 // Delete the old map and save the new one.
326 delete this->Internal;
327 this->Internal = newInternal;
328 }
329
330 //----------------------------------------------------------------------------
CopySelections(vtkDataArraySelection * selections)331 void vtkDataArraySelection::CopySelections(vtkDataArraySelection* selections)
332 {
333 if(this == selections)
334 {
335 return;
336 }
337
338 int needUpdate = 0;
339 int i;
340 const char* arrayName;
341 if (this->GetNumberOfArrays() != selections->GetNumberOfArrays())
342 {
343 needUpdate = 1;
344 }
345 else
346 {
347 for (i = 0; i < this->GetNumberOfArrays(); i++)
348 {
349 arrayName = this->GetArrayName(i);
350 if (!selections->ArrayExists(arrayName))
351 {
352 needUpdate = 1;
353 break;
354 }
355 if (selections->ArrayIsEnabled(arrayName) !=
356 this->ArrayIsEnabled(arrayName))
357 {
358 needUpdate = 1;
359 break;
360 }
361 }
362 }
363
364 if (!needUpdate)
365 {
366 return;
367 }
368
369 vtkDebugMacro("Copying arrays and settings from " << selections << ".");
370
371 this->RemoveAllArrays();
372
373 this->Internal->ArrayNames.insert(this->Internal->ArrayNames.begin(),
374 selections->Internal->ArrayNames.begin(),
375 selections->Internal->ArrayNames.end());
376 this->Internal->ArraySettings.insert(
377 this->Internal->ArraySettings.begin(),
378 selections->Internal->ArraySettings.begin(),
379 selections->Internal->ArraySettings.end()
380 );
381 this->Modified();
382 }
383