You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
9.3 KiB
C
307 lines
9.3 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkStructuredGrid.h
|
||
|
|
||
|
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.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/**
|
||
|
* @class vtkStructuredGrid
|
||
|
* @brief topologically regular array of data
|
||
|
*
|
||
|
* vtkStructuredGrid is a data object that is a concrete implementation of
|
||
|
* vtkDataSet. vtkStructuredGrid represents a geometric structure that is a
|
||
|
* topologically regular array of points. The topology is that of a cube that
|
||
|
* has been subdivided into a regular array of smaller cubes. Each point/cell
|
||
|
* can be addressed with i-j-k indices. Examples include finite difference
|
||
|
* grids.
|
||
|
*
|
||
|
* The order and number of points must match that specified by the dimensions
|
||
|
* of the grid. The point order increases in i fastest (from 0<=i<dims[0]),
|
||
|
* then j (0<=j<dims[1]), then k (0<=k<dims[2]) where dims[] are the
|
||
|
* dimensions of the grid in the i-j-k topological directions. The number of
|
||
|
* points is dims[0]*dims[1]*dims[2]. The same is true for the cells of the
|
||
|
* grid. The order and number of cells must match that specified by the
|
||
|
* dimensions of the grid. The cell order increases in i fastest (from
|
||
|
* 0<=i<(dims[0]-1)), then j (0<=j<(dims[1]-1)), then k (0<=k<(dims[2]-1))
|
||
|
* The number of cells is (dims[0]-1)*(dims[1]-1)*(dims[2]-1).
|
||
|
*
|
||
|
* vtkStructuredGrid has the ability to blank,
|
||
|
* or "turn-off" points and cells in the dataset. This is done by setting
|
||
|
* vtkDataSetAttributes::HIDDENPOINT or vtkDataSetAttributes::HIDDENCELL
|
||
|
* in the ghost array for each point / cell that needs to be blanked.
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkStructuredGrid_h
|
||
|
#define vtkStructuredGrid_h
|
||
|
|
||
|
#include "vtkCommonDataModelModule.h" // For export macro
|
||
|
#include "vtkPointSet.h"
|
||
|
|
||
|
#include "vtkStructuredData.h" // Needed for inline methods
|
||
|
|
||
|
class vtkEmptyCell;
|
||
|
class vtkHexahedron;
|
||
|
class vtkLine;
|
||
|
class vtkQuad;
|
||
|
class vtkUnsignedCharArray;
|
||
|
class vtkVertex;
|
||
|
|
||
|
class VTKCOMMONDATAMODEL_EXPORT vtkStructuredGrid : public vtkPointSet
|
||
|
{
|
||
|
public:
|
||
|
static vtkStructuredGrid* New();
|
||
|
|
||
|
vtkTypeMacro(vtkStructuredGrid, vtkPointSet);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
/**
|
||
|
* Return what type of dataset this is.
|
||
|
*/
|
||
|
int GetDataObjectType() override { return VTK_STRUCTURED_GRID; }
|
||
|
|
||
|
/**
|
||
|
* Copy the geometric and topological structure of an input poly data object.
|
||
|
*/
|
||
|
void CopyStructure(vtkDataSet* ds) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Standard vtkDataSet API methods. See vtkDataSet for more information.
|
||
|
*/
|
||
|
vtkIdType GetNumberOfPoints() override { return vtkPointSet::GetNumberOfPoints(); }
|
||
|
double* GetPoint(vtkIdType ptId) VTK_SIZEHINT(3) override
|
||
|
{
|
||
|
return this->vtkPointSet::GetPoint(ptId);
|
||
|
}
|
||
|
void GetPoint(vtkIdType ptId, double p[3]) override { this->vtkPointSet::GetPoint(ptId, p); }
|
||
|
vtkCell* GetCell(vtkIdType cellId) override;
|
||
|
vtkCell* GetCell(int i, int j, int k) override;
|
||
|
void GetCell(vtkIdType cellId, vtkGenericCell* cell) override;
|
||
|
void GetCellBounds(vtkIdType cellId, double bounds[6]) override;
|
||
|
int GetCellType(vtkIdType cellId) override;
|
||
|
vtkIdType GetNumberOfCells() override;
|
||
|
void GetCellPoints(vtkIdType cellId, vtkIdList* ptIds) override;
|
||
|
void GetPointCells(vtkIdType ptId, vtkIdList* cellIds) override
|
||
|
{
|
||
|
vtkStructuredData::GetPointCells(ptId, cellIds, this->GetDimensions());
|
||
|
}
|
||
|
void Initialize() override;
|
||
|
int GetMaxCellSize() override { return 8; } // hexahedron is the largest
|
||
|
void GetCellNeighbors(vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds) override;
|
||
|
void GetCellNeighbors(vtkIdType cellId, vtkIdList* ptIds, vtkIdList* cellIds, int* seedLoc);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* following methods are specific to structured grid
|
||
|
*/
|
||
|
void SetDimensions(int i, int j, int k);
|
||
|
void SetDimensions(const int dim[3]);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get dimensions of this structured points dataset.
|
||
|
*/
|
||
|
virtual int* GetDimensions() VTK_SIZEHINT(3);
|
||
|
virtual void GetDimensions(int dim[3]);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Return the dimensionality of the data.
|
||
|
*/
|
||
|
int GetDataDimension();
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Different ways to set the extent of the data array. The extent
|
||
|
* should be set before the "Scalars" are set or allocated.
|
||
|
* The Extent is stored in the order (X, Y, Z).
|
||
|
*/
|
||
|
void SetExtent(int extent[6]);
|
||
|
void SetExtent(int x1, int x2, int y1, int y2, int z1, int z2);
|
||
|
vtkGetVector6Macro(Extent, int);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Return the actual size of the data in kibibytes (1024 bytes). This number
|
||
|
* is valid only after the pipeline has updated. The memory size
|
||
|
* returned is guaranteed to be greater than or equal to the
|
||
|
* memory required to represent the data (e.g., extra space in
|
||
|
* arrays, etc. are not included in the return value). THIS METHOD
|
||
|
* IS THREAD SAFE.
|
||
|
*/
|
||
|
unsigned long GetActualMemorySize() override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Shallow and Deep copy.
|
||
|
*/
|
||
|
void ShallowCopy(vtkDataObject* src) override;
|
||
|
void DeepCopy(vtkDataObject* src) override;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* The extent type is a 3D extent
|
||
|
*/
|
||
|
int GetExtentType() override { return VTK_3D_EXTENT; }
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Methods for supporting blanking of cells. Blanking turns on or off
|
||
|
* points in the structured grid, and hence the cells connected to them.
|
||
|
* These methods should be called only after the dimensions of the
|
||
|
* grid are set.
|
||
|
*/
|
||
|
void BlankPoint(vtkIdType ptId);
|
||
|
void UnBlankPoint(vtkIdType ptId);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Methods for supporting blanking of cells. Blanking turns on or off
|
||
|
* cells in the structured grid, and hence the points connected to them.
|
||
|
* These methods should be called only after the dimensions of the
|
||
|
* grid are set.
|
||
|
*/
|
||
|
void BlankCell(vtkIdType ptId);
|
||
|
void UnBlankCell(vtkIdType ptId);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Return non-zero value if specified point is visible.
|
||
|
* These methods should be called only after the dimensions of the
|
||
|
* grid are set.
|
||
|
*/
|
||
|
unsigned char IsPointVisible(vtkIdType ptId);
|
||
|
|
||
|
/**
|
||
|
* Return non-zero value if specified point is visible.
|
||
|
* These methods should be called only after the dimensions of the
|
||
|
* grid are set.
|
||
|
*/
|
||
|
unsigned char IsCellVisible(vtkIdType cellId);
|
||
|
|
||
|
/**
|
||
|
* Returns 1 if there is any visibility constraint on the points,
|
||
|
* 0 otherwise.
|
||
|
*/
|
||
|
bool HasAnyBlankPoints() override;
|
||
|
/**
|
||
|
* Returns 1 if there is any visibility constraint on the cells,
|
||
|
* 0 otherwise.
|
||
|
*/
|
||
|
bool HasAnyBlankCells() override;
|
||
|
|
||
|
/**
|
||
|
* Given the node dimensions of this grid instance, this method computes the
|
||
|
* node dimensions. The value in each dimension can will have a lowest value
|
||
|
* of "1" such that computing the total number of cells can be achieved by
|
||
|
* simply by cellDims[0]*cellDims[1]*cellDims[2].
|
||
|
*/
|
||
|
void GetCellDims(int cellDims[3]);
|
||
|
|
||
|
/**
|
||
|
* Reallocates and copies to set the Extent to the UpdateExtent.
|
||
|
* This is used internally when the exact extent is requested,
|
||
|
* and the source generated more than the update extent.
|
||
|
*/
|
||
|
void Crop(const int* updateExtent) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Retrieve an instance of this class from an information object.
|
||
|
*/
|
||
|
static vtkStructuredGrid* GetData(vtkInformation* info);
|
||
|
static vtkStructuredGrid* GetData(vtkInformationVector* v, int i = 0);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Get a point in the grid. If adjustForExtent is true, (i,j,k) is
|
||
|
* interpreted as a position relative to the beginning of the extent.
|
||
|
* If adjustForExtent is false, (i,j,k) is interpreted literally
|
||
|
* and the (i,j,k) point of the grid is returned regardless of the
|
||
|
* extent beginning.
|
||
|
* The point coordinate is returned in 'p'.
|
||
|
* The default adjustForExtent is true.
|
||
|
*/
|
||
|
void GetPoint(int i, int j, int k, double p[3], bool adjustForExtent = true);
|
||
|
|
||
|
protected:
|
||
|
vtkStructuredGrid();
|
||
|
~vtkStructuredGrid() override;
|
||
|
|
||
|
// for the GetCell method
|
||
|
vtkVertex* Vertex;
|
||
|
vtkLine* Line;
|
||
|
vtkQuad* Quad;
|
||
|
vtkHexahedron* Hexahedron;
|
||
|
vtkEmptyCell* EmptyCell;
|
||
|
|
||
|
int Dimensions[3];
|
||
|
int DataDescription;
|
||
|
|
||
|
int Extent[6];
|
||
|
|
||
|
/**
|
||
|
* Compute the range of the scalars and cache it into ScalarRange
|
||
|
* only if the cache became invalid (ScalarRangeComputeTime).
|
||
|
*/
|
||
|
void ComputeScalarRange() override;
|
||
|
|
||
|
private:
|
||
|
/**
|
||
|
* For legacy compatibility. Do not use.
|
||
|
*/
|
||
|
void GetCellNeighbors(vtkIdType cellId, vtkIdList& ptIds, vtkIdList& cellIds)
|
||
|
{
|
||
|
this->GetCellNeighbors(cellId, &ptIds, &cellIds);
|
||
|
}
|
||
|
|
||
|
// Internal method used by DeepCopy and ShallowCopy.
|
||
|
void InternalStructuredGridCopy(vtkStructuredGrid* src);
|
||
|
|
||
|
static unsigned char MASKED_CELL_VALUE;
|
||
|
|
||
|
private:
|
||
|
vtkStructuredGrid(const vtkStructuredGrid&) = delete;
|
||
|
void operator=(const vtkStructuredGrid&) = delete;
|
||
|
};
|
||
|
|
||
|
inline vtkIdType vtkStructuredGrid::GetNumberOfCells()
|
||
|
{
|
||
|
vtkIdType nCells = 1;
|
||
|
int dims[3];
|
||
|
int i;
|
||
|
|
||
|
this->GetDimensions(dims);
|
||
|
for (i = 0; i < 3; i++)
|
||
|
{
|
||
|
if (dims[i] <= 0)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
if (dims[i] > 1)
|
||
|
{
|
||
|
nCells *= (dims[i] - 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nCells;
|
||
|
}
|
||
|
|
||
|
inline int vtkStructuredGrid::GetDataDimension()
|
||
|
{
|
||
|
return vtkStructuredData::GetDataDimension(this->DataDescription);
|
||
|
}
|
||
|
|
||
|
#endif
|