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