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