|
|
|
|
@ -6,7 +6,8 @@
|
|
|
|
|
#include <vtkCellData.h>
|
|
|
|
|
#include <vtkDataArray.h>
|
|
|
|
|
#include <vtkFieldData.h>
|
|
|
|
|
#include <vtkIdTypeArray.h>
|
|
|
|
|
#include <vtkIntArray.h>
|
|
|
|
|
#include <vtkMath.h>
|
|
|
|
|
#include <vtkPointData.h>
|
|
|
|
|
#include <vtkSmartPointer.h>
|
|
|
|
|
#include <vtkUnstructuredGrid.h>
|
|
|
|
|
@ -34,6 +35,36 @@ nmPebiCellMapping::MappingStatus failRead(
|
|
|
|
|
return nmPebiCellMapping::MappingStatus_Invalid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool isSupportedMappingArray(vtkDataArray* pArray)
|
|
|
|
|
{
|
|
|
|
|
if(pArray == NULL) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
const int nDataType = pArray->GetDataType();
|
|
|
|
|
return nDataType == VTK_INT || nDataType == VTK_ID_TYPE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool readMappingValue(
|
|
|
|
|
vtkDataArray* pArray,
|
|
|
|
|
vtkIdType nTupleId,
|
|
|
|
|
vtkIdType* pValue)
|
|
|
|
|
{
|
|
|
|
|
if(pArray == NULL || pValue == NULL) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
const double dValue = pArray->GetComponent(nTupleId, 0);
|
|
|
|
|
if(!vtkMath::IsFinite(dValue) || dValue < 0.0 ||
|
|
|
|
|
dValue > static_cast<double>(INT_MAX)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
const vtkIdType nValue = static_cast<vtkIdType>(dValue);
|
|
|
|
|
if(static_cast<double>(nValue) != dValue) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
*pValue = nValue;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool validateMappingValues(
|
|
|
|
|
const QVector<vtkIdType>& vecVtkToOriginal,
|
|
|
|
|
vtkIdType nOriginalCellCount,
|
|
|
|
|
@ -135,8 +166,8 @@ bool nmPebiCellMapping::attach(
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vtkSmartPointer<vtkIdTypeArray> pOriginalCellIds =
|
|
|
|
|
vtkSmartPointer<vtkIdTypeArray>::New();
|
|
|
|
|
vtkSmartPointer<vtkIntArray> pOriginalCellIds =
|
|
|
|
|
vtkSmartPointer<vtkIntArray>::New();
|
|
|
|
|
pOriginalCellIds->SetName(originalCellIdArrayName());
|
|
|
|
|
pOriginalCellIds->SetNumberOfComponents(1);
|
|
|
|
|
pOriginalCellIds->SetNumberOfTuples(
|
|
|
|
|
@ -145,15 +176,15 @@ bool nmPebiCellMapping::attach(
|
|
|
|
|
nVtkCellId < vecVtkToOriginal.size(); ++nVtkCellId) {
|
|
|
|
|
pOriginalCellIds->SetValue(
|
|
|
|
|
static_cast<vtkIdType>(nVtkCellId),
|
|
|
|
|
vecVtkToOriginal[nVtkCellId]);
|
|
|
|
|
static_cast<int>(vecVtkToOriginal[nVtkCellId]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vtkSmartPointer<vtkIdTypeArray> pOriginalCellCount =
|
|
|
|
|
vtkSmartPointer<vtkIdTypeArray>::New();
|
|
|
|
|
vtkSmartPointer<vtkIntArray> pOriginalCellCount =
|
|
|
|
|
vtkSmartPointer<vtkIntArray>::New();
|
|
|
|
|
pOriginalCellCount->SetName(originalCellCountArrayName());
|
|
|
|
|
pOriginalCellCount->SetNumberOfComponents(1);
|
|
|
|
|
pOriginalCellCount->SetNumberOfTuples(1);
|
|
|
|
|
pOriginalCellCount->SetValue(0, nOriginalCellCount);
|
|
|
|
|
pOriginalCellCount->SetValue(0, static_cast<int>(nOriginalCellCount));
|
|
|
|
|
|
|
|
|
|
vtkDataArray* pPreviousScalars = pCellData->GetScalars();
|
|
|
|
|
if(pCellData->AddArray(pOriginalCellIds) < 0) {
|
|
|
|
|
@ -236,13 +267,14 @@ nmPebiCellMapping::MappingStatus nmPebiCellMapping::read(
|
|
|
|
|
"PEBI grid contains an incomplete cell mapping.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vtkIdTypeArray* pOriginalCellIds =
|
|
|
|
|
vtkIdTypeArray::SafeDownCast(pOriginalCellIdsAbstract);
|
|
|
|
|
vtkIdTypeArray* pOriginalCellCount =
|
|
|
|
|
vtkIdTypeArray::SafeDownCast(pOriginalCellCountAbstract);
|
|
|
|
|
if(pOriginalCellIds == NULL || pOriginalCellCount == NULL) {
|
|
|
|
|
vtkDataArray* pOriginalCellIds =
|
|
|
|
|
vtkDataArray::SafeDownCast(pOriginalCellIdsAbstract);
|
|
|
|
|
vtkDataArray* pOriginalCellCount =
|
|
|
|
|
vtkDataArray::SafeDownCast(pOriginalCellCountAbstract);
|
|
|
|
|
if(!isSupportedMappingArray(pOriginalCellIds) ||
|
|
|
|
|
!isSupportedMappingArray(pOriginalCellCount)) {
|
|
|
|
|
return failRead(pError,
|
|
|
|
|
"PEBI cell mapping arrays have invalid types.");
|
|
|
|
|
"PEBI cell mapping arrays must use Int32 or vtkIdType integers.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const vtkIdType nVtkCellCount = pGrid->GetNumberOfCells();
|
|
|
|
|
@ -259,13 +291,23 @@ nmPebiCellMapping::MappingStatus nmPebiCellMapping::read(
|
|
|
|
|
"PEBI original cell IDs must not be active scalars.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const vtkIdType nOriginalCellCount = pOriginalCellCount->GetValue(0);
|
|
|
|
|
vtkIdType nOriginalCellCount = 0;
|
|
|
|
|
if(!readMappingValue(pOriginalCellCount, 0, &nOriginalCellCount) ||
|
|
|
|
|
nOriginalCellCount <= 0) {
|
|
|
|
|
return failRead(pError,
|
|
|
|
|
"PEBI original cell count is not a valid positive integer.");
|
|
|
|
|
}
|
|
|
|
|
QVector<vtkIdType> vecVtkToOriginal(
|
|
|
|
|
static_cast<int>(nVtkCellCount));
|
|
|
|
|
for(vtkIdType nVtkCellId = 0;
|
|
|
|
|
nVtkCellId < nVtkCellCount; ++nVtkCellId) {
|
|
|
|
|
vecVtkToOriginal[static_cast<int>(nVtkCellId)] =
|
|
|
|
|
pOriginalCellIds->GetValue(nVtkCellId);
|
|
|
|
|
vtkIdType nOriginalCellId = 0;
|
|
|
|
|
if(!readMappingValue(
|
|
|
|
|
pOriginalCellIds, nVtkCellId, &nOriginalCellId)) {
|
|
|
|
|
return failRead(pError,
|
|
|
|
|
"PEBI mapping contains a non-integer or out-of-range ID.");
|
|
|
|
|
}
|
|
|
|
|
vecVtkToOriginal[static_cast<int>(nVtkCellId)] = nOriginalCellId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QVector<vtkIdType> vecOriginalToVtk;
|
|
|
|
|
|