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
|
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
#include "vtkHyperTreeGridGeometry.h"
#include "vtkCellArray.h"
#include "vtkCellData.h"
#include "vtkDataSetAttributes.h"
#include "vtkHyperTreeGrid.h"
#include "vtkHyperTreeGridGeometry1DImpl.h"
#include "vtkHyperTreeGridGeometry2DImpl.h"
#include "vtkHyperTreeGridGeometry3DImpl.h"
#include "vtkHyperTreeGridGeometryImpl.h"
#include "vtkInformation.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include <limits>
#include <memory>
#include <vector>
VTK_ABI_NAMESPACE_BEGIN
//------------------------------------------------------------------------------
vtkStandardNewMacro(vtkHyperTreeGridGeometry);
//------------------------------------------------------------------------------
void vtkHyperTreeGridGeometry::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
os << indent << "PassThroughCellIds: " << this->PassThroughCellIds << endl;
os << indent << "OriginalCellIdArrayName: " << this->OriginalCellIdArrayName << endl;
os << indent << "Merging: " << this->Merging << endl;
}
//------------------------------------------------------------------------------
int vtkHyperTreeGridGeometry::FillOutputPortInformation(int, vtkInformation* info)
{
info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkPolyData");
return 1;
}
//------------------------------------------------------------------------------
int vtkHyperTreeGridGeometry::ProcessTrees(vtkHyperTreeGrid* input, vtkDataObject* outputDO)
{
// Downcast output data object to polygonal data set
vtkPolyData* output = vtkPolyData::SafeDownCast(outputDO);
if (!output)
{
vtkErrorMacro("Incorrect type of output: " << outputDO->GetClassName());
return 0;
}
// Retrieve useful grid parameters for speed of access
unsigned int dimension = input->GetDimension();
// Initialize output cell data
this->InData = input->GetCellData();
this->OutData = output->GetCellData();
this->OutData->CopyAllOn(); // Should be set before CopyAllocate to be taken into account
this->OutData->CopyAllocate(this->InData);
vtkNew<vtkPoints> outPoints;
vtkNew<vtkCellArray> outCells;
std::unique_ptr<vtkHyperTreeGridGeometryImpl> implementation;
// Create a custom internal class depending on the dimension of the input HTG.
switch (dimension)
{
case 1:
implementation = std::unique_ptr<vtkHyperTreeGridGeometry1DImpl>(
new vtkHyperTreeGridGeometry1DImpl(input, outPoints, outCells, this->InData, this->OutData,
this->PassThroughCellIds, this->OriginalCellIdArrayName, this->FillMaterial));
break;
case 2:
implementation = std::unique_ptr<vtkHyperTreeGridGeometry2DImpl>(
new vtkHyperTreeGridGeometry2DImpl(input, outPoints, outCells, this->InData, this->OutData,
this->PassThroughCellIds, this->OriginalCellIdArrayName, this->FillMaterial));
break;
case 3:
implementation =
std::unique_ptr<vtkHyperTreeGridGeometry3DImpl>(new vtkHyperTreeGridGeometry3DImpl(
this->Merging, input, outPoints, outCells, this->InData, this->OutData,
this->PassThroughCellIds, this->OriginalCellIdArrayName, this->FillMaterial));
break;
default:
vtkErrorMacro("Incorrect dimension of input: " << dimension);
return 0;
} // switch ( dimension )
// Execute
implementation->GenerateGeometry();
// Set output geometry and topology
output->SetPoints(outPoints);
if (dimension == 1 || !this->FillMaterial)
{
output->SetLines(outCells);
}
else
{
output->SetPolys(outCells);
}
return 1;
}
VTK_ABI_NAMESPACE_END
|