Skip to content
Snippets Groups Projects
Commit 70743624 authored by Cory Quammen's avatar Cory Quammen
Browse files

Ensure that field data is copied to output of vtkExtractBlocks

Add an actual test of vtkExtractBlock to TestExtractBlock. Previously,
the test only exercised vtkExtractSelection with a vtkSelection of
blocks.
parent 16a83443
No related branches found
No related tags found
No related merge requests found
......@@ -12,9 +12,13 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// This tests an extraction of a block from vtkSelection
// This tests an extraction of a block using first vtkExtractBlock then
// a block selection from a vtkSelection and vtkExtractSelection
#include <vtkExtractBlock.h>
#include <vtkExtractSelection.h>
#include <vtkFieldData.h>
#include <vtkIntArray.h>
#include <vtkMultiBlockDataSet.h>
#include <vtkNew.h>
#include <vtkSelectionSource.h>
......@@ -37,6 +41,39 @@ int TestExtractBlock(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
mb0->SetBlock(0, GetSphere(0, 0, -2));
mb0->SetBlock(1, GetSphere(0, 0, 2));
// Add a field data to the multiblock dataset
vtkNew<vtkIntArray> fieldData;
std::string globalIdName("GlobalID");
fieldData->SetName(globalIdName.c_str());
fieldData->SetNumberOfComponents(1);
fieldData->SetNumberOfTuples(1);
fieldData->SetValue(0, 5);
mb0->GetFieldData()->AddArray(fieldData);
// Test vtkExtractBlock
vtkNew<vtkExtractBlock> extractBlock;
extractBlock->AddIndex(2);
extractBlock->SetPruneOutput(1);
extractBlock->SetInputData(mb0);
extractBlock->Update();
auto output = vtkMultiBlockDataSet::SafeDownCast(extractBlock->GetOutput());
if (output->GetBlock(0) == nullptr)
{
std::cerr << "Invalid block extracted by vtkExtractBlock. Should be block 0." << std::endl;
std::cerr << *output << std::endl;
return EXIT_FAILURE;
}
vtkIntArray* outputFDArray =
vtkIntArray::SafeDownCast(output->GetFieldData()->GetArray(globalIdName.c_str()));
if (outputFDArray == nullptr || outputFDArray->GetValue(0) != 5)
{
std::cerr << "Field data not copied to output. Should be." << std::endl;
std::cerr << *output << std::endl;
return EXIT_FAILURE;
}
// Now test a block selection
vtkNew<vtkSelectionSource> selectionSource;
selectionSource->SetContentType(vtkSelectionNode::BLOCKS);
selectionSource->AddBlock(2);
......@@ -46,13 +83,19 @@ int TestExtractBlock(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
extract->SetSelectionConnection(selectionSource->GetOutputPort());
extract->Update();
auto output = vtkMultiBlockDataSet::SafeDownCast(extract->GetOutput());
output = vtkMultiBlockDataSet::SafeDownCast(extract->GetOutput());
if (output->GetBlock(0) != nullptr || output->GetBlock(1) == nullptr)
{
std::cerr << "Invalid block extracted. Should be block 1." << std::endl;
std::cerr << *output << std::endl;
return EXIT_FAILURE;
}
outputFDArray = vtkIntArray::SafeDownCast(output->GetFieldData()->GetArray(globalIdName.c_str()));
if (outputFDArray == nullptr || outputFDArray->GetValue(0) != 5)
{
std::cerr << "Field data not copied to output. Should be." << std::endl;
return EXIT_FAILURE;
}
// now extract non-leaf block.
selectionSource->RemoveAllBlocks();
......
......@@ -16,6 +16,7 @@
#include "vtkDataObjectTreeIterator.h"
#include "vtkDataSet.h"
#include "vtkFieldData.h"
#include "vtkInformation.h"
#include "vtkInformationIntegerKey.h"
#include "vtkInformationVector.h"
......@@ -197,6 +198,10 @@ bool vtkExtractBlock::Prune(vtkMultiPieceDataSet* mpiece)
{
// * Remove any children on mpiece that don't have DONT_PRUNE set.
vtkMultiPieceDataSet* clone = vtkMultiPieceDataSet::New();
// Copy global field data, otherwise it will be lost
clone->GetFieldData()->ShallowCopy(mpiece->GetFieldData());
unsigned int index = 0;
unsigned int numChildren = mpiece->GetNumberOfPieces();
for (unsigned int cc = 0; cc < numChildren; cc++)
......@@ -219,6 +224,10 @@ bool vtkExtractBlock::Prune(vtkMultiPieceDataSet* mpiece)
bool vtkExtractBlock::Prune(vtkMultiBlockDataSet* mblock)
{
vtkMultiBlockDataSet* clone = vtkMultiBlockDataSet::New();
// Copy global field data, otherwise it will be lost
clone->GetFieldData()->ShallowCopy(mblock->GetFieldData());
unsigned int index = 0;
unsigned int numChildren = mblock->GetNumberOfBlocks();
for (unsigned int cc = 0; cc < numChildren; cc++)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment