forked from Kitware/VTK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vtkHyperTreeGridCursor.cxx
220 lines (174 loc) · 5.86 KB
/
vtkHyperTreeGridCursor.cxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*=========================================================================
Program: Visualization Toolkit
Module: vtkHyperTreeGridCursor.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkHyperTreeGridCursor.h"
#include "vtkHyperTree.h"
#include "vtkHyperTreeGrid.h"
#include "vtkHyperTreeCursor.h"
#include "vtkObjectFactory.h"
#include <cassert>
vtkStandardNewMacro(vtkHyperTreeGridCursor);
vtkCxxSetObjectMacro(vtkHyperTreeGridCursor,Grid,vtkHyperTreeGrid);
vtkCxxSetObjectMacro(vtkHyperTreeGridCursor,Tree,vtkHyperTree);
//-----------------------------------------------------------------------------
vtkHyperTreeGridCursor::vtkHyperTreeGridCursor()
{
// No grid is given by default
this->Grid = nullptr;
// No tree is given by default
this->Tree = nullptr;
// Default cursor level
this->Level = 0;
// Default index
this->Index = 0;
// Cursor is not at leaf by default
this->Leaf = false;
}
//-----------------------------------------------------------------------------
vtkHyperTreeGridCursor::~vtkHyperTreeGridCursor() = default;
//-----------------------------------------------------------------------------
vtkHyperTreeGridCursor* vtkHyperTreeGridCursor::Clone()
{
vtkHyperTreeGridCursor* clone = this->NewInstance();
assert( "post: clone_exists" && clone != nullptr );
// Copy iVars
clone->Grid = this->Grid;
clone->Tree = this->Tree;
clone->Level = this->Level;
clone->Index = this->Index;
clone->Leaf = this->Leaf;
// Return clone
return clone;
}
//-----------------------------------------------------------------------------
void vtkHyperTreeGridCursor::Initialize( vtkHyperTreeGrid* grid, vtkIdType index )
{
// Assigned grid instance variable
this->Grid = grid;
// Retrieve specified tree from grid
vtkHyperTree* tree = grid->GetTree( index );
this->Tree = tree;
// Initialize other iVars at default values
this->Level = 0;
this->Index = 0;
// Empty trees and trees with only a root cell appear like a leaf so recursion stop
this->Leaf = ( ! tree || tree->GetNumberOfVertices() == 1 );
}
//-----------------------------------------------------------------------------
vtkIdType vtkHyperTreeGridCursor::GetVertexId()
{
return this->Index;
}
//-----------------------------------------------------------------------------
int vtkHyperTreeGridCursor::GetDimension()
{
// Retrieve tree
vtkHyperTree* tree = this->Tree;
// An empty tree has dimension 0
return tree ? tree->GetDimension() : 0;
}
//-----------------------------------------------------------------------------
int vtkHyperTreeGridCursor::GetNumberOfChildren()
{
// Retrieve tree
vtkHyperTree* tree = this->Tree;
// An empty tree does not have children
return tree ? tree->GetNumberOfChildren() : 0;
}
//-----------------------------------------------------------------------------
bool vtkHyperTreeGridCursor::IsLeaf()
{
// See particular cases in Initialize()
return this->Leaf;
}
//-----------------------------------------------------------------------------
bool vtkHyperTreeGridCursor::IsRoot()
{
// No special null cursor exists with this object
return ( this->Index == 0 );
}
//-----------------------------------------------------------------------------
int vtkHyperTreeGridCursor::GetChildIndex()
{
if ( ! this->Tree )
{
// Index in a null grid is always 0
return 0;
}
int child = 0;
this->Tree->FindChildParameters( child, this->Index, this->Leaf );
return child;
}
//-----------------------------------------------------------------------------
void vtkHyperTreeGridCursor::ToRoot()
{
if ( ! this->Tree )
{
// In an empty tree there is nothing to be done
return;
}
// Return to root level
this->Level = 0;
this->Index = 0;
// Handle special case of root cells with no children
this->Leaf = ( this->Tree->GetNumberOfVertices() == 1 );
}
//-----------------------------------------------------------------------------
void vtkHyperTreeGridCursor::ToParent()
{
if ( ! this->Tree || this->Level )
{
// In an empty tree or at root there is nothing to be done
return;
}
// Update current vertex index to parent index
this->Tree->FindParentIndex( this->Index );
// Move one level higher
-- this->Level;
// Cursor can no longer be at a leaf
this->Leaf = false;
}
//-----------------------------------------------------------------------------
void vtkHyperTreeGridCursor::ToChild( int child )
{
// In an empty tree or at a leaf there is nothing to be done
if ( ! this->Tree || this->Leaf )
{
return;
}
this->Tree->FindChildParameters( child, this->Index, this->Leaf );
// Move one level deeper
++ this->Level;
}
//-----------------------------------------------------------------------------
vtkIdType vtkHyperTreeGridCursor::GetGlobalNodeIndex()
{
// Retrieve tree
vtkHyperTree* tree = this->Tree;
// Global index in a null grid is always 0
return tree ? tree->GetGlobalIndexFromLocal( this->Index ) : 0;
}
//-----------------------------------------------------------------------------
void vtkHyperTreeGridCursor::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf( os, indent );
if ( this->Tree )
{
os << indent << "Tree:" << this->Tree << endl;
}
else
{
os << indent << "Tree: (None)" << endl;
}
os << indent << "Level=" << this->Level << endl;
os << indent << "Index=" << this->Index << endl;
os << indent << "Leaf: " << ( this->Leaf ? "true" : "false" ) << endl;
}
//-----------------------------------------------------------------------------