1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    vtkCellTypes.h
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 /**
16  * @class   vtkCellTypes
17  * @brief   object provides direct access to cells in vtkCellArray and type information
18  *
19  * This class is a supplemental object to vtkCellArray to allow random access
20  * into cells as well as representing cell type information.  The "location"
21  * field is the location in the vtkCellArray list in terms of an integer
22  * offset.  An integer offset was used instead of a pointer for easy storage
23  * and inter-process communication. The type information is defined in the
24  * file vtkCellType.h.
25  *
26  * @warning
27  * Sometimes this class is used to pass type information independent of the
28  * random access (i.e., location) information. For example, see
29  * vtkDataSet::GetCellTypes(). If you use the class in this way, you can use
30  * a location value of -1.
31  *
32  * @sa
33  * vtkCellArray vtkCellLinks
34 */
35 
36 #ifndef vtkCellTypes_h
37 #define vtkCellTypes_h
38 
39 #include "vtkCommonDataModelModule.h" // For export macro
40 #include "vtkObject.h"
41 
42 #include "vtkIntArray.h" // Needed for inline methods
43 #include "vtkIdTypeArray.h" // Needed for inline methods
44 #include "vtkUnsignedCharArray.h" // Needed for inline methods
45 #include "vtkCellType.h" // Needed for VTK_EMPTY_CELL
46 
47 class VTKCOMMONDATAMODEL_EXPORT vtkCellTypes : public vtkObject
48 {
49 public:
50   static vtkCellTypes *New();
51   vtkTypeMacro(vtkCellTypes,vtkObject);
52   void PrintSelf(ostream& os, vtkIndent indent) override;
53 
54   /**
55    * Allocate memory for this array. Delete old storage only if necessary.
56    */
57   int Allocate(int sz=512, int ext=1000);
58 
59   /**
60    * Add a cell at specified id.
61    */
62   void InsertCell(vtkIdType id, unsigned char type, vtkIdType loc);
63 
64   /**
65    * Add a cell to the object in the next available slot.
66    */
67   vtkIdType InsertNextCell(unsigned char type, vtkIdType loc);
68 
69   /**
70    * Specify a group of cell types.
71    */
72   void SetCellTypes(vtkIdType ncells, vtkUnsignedCharArray *cellTypes, vtkIdTypeArray *cellLocations);
73 
74   /**
75    * Specify a group of cell types. This version is provided to maintain
76    * backwards compatibility and does a copy of the cellLocations
77    */
78   void SetCellTypes(vtkIdType ncells, vtkUnsignedCharArray *cellTypes, vtkIntArray *cellLocations);
79 
80   /**
81    * Return the location of the cell in the associated vtkCellArray.
82    */
GetCellLocation(vtkIdType cellId)83   vtkIdType GetCellLocation(vtkIdType cellId) { return this->LocationArray->GetValue(cellId);};
84 
85   /**
86    * Delete cell by setting to nullptr cell type.
87    */
DeleteCell(vtkIdType cellId)88   void DeleteCell(vtkIdType cellId) { this->TypeArray->SetValue(cellId, VTK_EMPTY_CELL);};
89 
90   /**
91    * Return the number of types in the list.
92    */
GetNumberOfTypes()93   vtkIdType GetNumberOfTypes() { return (this->MaxId + 1);};
94 
95   /**
96    * Return 1 if type specified is contained in list; 0 otherwise.
97    */
98   int IsType(unsigned char type);
99 
100   /**
101    * Add the type specified to the end of the list. Range checking is performed.
102    */
InsertNextType(unsigned char type)103   vtkIdType InsertNextType(unsigned char type){return this->InsertNextCell(type,-1);};
104 
105   /**
106    * Return the type of cell.
107    */
GetCellType(vtkIdType cellId)108   unsigned char GetCellType(vtkIdType cellId) { return this->TypeArray->GetValue(cellId);};
109 
110   /**
111    * Reclaim any extra memory.
112    */
113   void Squeeze();
114 
115   /**
116    * Initialize object without releasing memory.
117    */
118   void Reset();
119 
120   /**
121    * Return the memory in kibibytes (1024 bytes) consumed by this cell type array.
122    * Used to support streaming and reading/writing data. The value
123    * returned is guaranteed to be greater than or equal to the memory
124    * required to actually represent the data represented by this object.
125    * The information returned is valid only after the pipeline has
126    * been updated.
127    */
128   unsigned long GetActualMemorySize();
129 
130   /**
131    * Standard DeepCopy method.  Since this object contains no reference
132    * to other objects, there is no ShallowCopy.
133    */
134   void DeepCopy(vtkCellTypes *src);
135 
136   /**
137    * Given an int (as defined in vtkCellType.h) identifier for a class
138    * return it's classname.
139    */
140   static const char* GetClassNameFromTypeId(int typeId);
141 
142   /**
143    * Given a data object classname, return it's int identified (as
144    * defined in vtkCellType.h)
145    */
146   static int GetTypeIdFromClassName(const char* classname);
147 
148   /**
149    * This convenience method is a fast check to determine if a cell type
150    * represents a linear or nonlinear cell.  This is generally much more
151    * efficient than getting the appropriate vtkCell and checking its IsLinear
152    * method.
153    */
154   static int IsLinear(unsigned char type);
155 
156 protected:
157   vtkCellTypes();
158   ~vtkCellTypes() override;
159 
160   vtkUnsignedCharArray *TypeArray; // pointer to types array
161   vtkIdTypeArray *LocationArray;   // pointer to array of offsets
162   vtkIdType Size;            // allocated size of data
163   vtkIdType MaxId;           // maximum index inserted thus far
164   vtkIdType Extend;          // grow array by this point
165 
166 private:
167   vtkCellTypes(const vtkCellTypes&) = delete;
168   void operator=(const vtkCellTypes&) = delete;
169 };
170 
171 
172 //----------------------------------------------------------------------------
IsType(unsigned char type)173 inline int vtkCellTypes::IsType(unsigned char type)
174 {
175   vtkIdType numTypes=this->GetNumberOfTypes();
176 
177   for (vtkIdType i=0; i<numTypes; i++)
178   {
179     if ( type == this->GetCellType(i))
180     {
181       return 1;
182     }
183   }
184   return 0;
185 }
186 
187 //-----------------------------------------------------------------------------
IsLinear(unsigned char type)188 inline int vtkCellTypes::IsLinear(unsigned char type)
189 {
190   return (   (type <= 20)
191           || (type == VTK_CONVEX_POINT_SET)
192           || (type == VTK_POLYHEDRON) );
193 }
194 
195 
196 #endif
197