Hi vtk developers,
I have a use case that my data is a composite nested vtkMultiBlockDatasets and I want to specify colors for its subblocks.
Ex.
Root node: 1 vtkMultiblockDataset(node 0)
First level node: 1 vtkMultiblockDataset(node 1)
Second level nodes; 9 vtkPolyDatas(node 2~ node 10)
The input for the mapper is node 0, and I want to use the vtkCompositeDatDisplayAttributes to set colors for node 2 ~10. However, I cannot find a clear way to specify colors for leaf nodes of a nested vtkMultiBlockDataSet without flatting all subblocks.
Any suggestions and ideas?
Thanks in advance!
Since new users are not allowed to upload a file, I copied my simple example here:
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkSphereSource.h"
#include "vtkCubeSource.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkSmartPointer.h"
#include "vtkMultiBlockDataSet.h"
#include "vtkCompositePolyDataMapper2.h"
#include "vtkCompositeDataDisplayAttributes.h"
#include "vtkRegressionTestImage.h"
#include "vtkLookupTable.h"
#include "vtkActor.h"
#include "vtkMath.h"
#include "vtkPointData.h"
#include "vtkPolyData.h"
#include "vtkDataArray.h"
#include <set>
static vtkSmartPointer<vtkMultiBlockDataSet> vtkCreateData()
{
auto data = vtkSmartPointer<vtkMultiBlockDataSet>::New();
data->SetNumberOfBlocks(3 * 3 * 2);
int blk = 0;
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
vtkNew<vtkSphereSource> ssrc;
ssrc->SetRadius(0.4);
ssrc->SetCenter(i, j, 0.0);
ssrc->Update();
vtkNew<vtkCubeSource> csrc;
csrc->SetBounds(i - 0.4, i + 0.4, j - 0.4, j + 0.4, 0.6, 1.4);
csrc->Update();
vtkNew<vtkPolyData> sphere;
vtkNew<vtkPolyData> cube;
sphere->DeepCopy(ssrc->GetOutputDataObject(0));
cube->DeepCopy(csrc->GetOutputDataObject(0));
data->SetBlock(blk++, sphere);
data->SetBlock(blk++, cube);
}
}
return data;
}
int main(int argc, char* argv[])
{
// Standard rendering classes
vtkSmartPointer< vtkRenderer > renderer = vtkSmartPointer< vtkRenderer >::New();
vtkSmartPointer< vtkRenderWindow > renWin = vtkSmartPointer< vtkRenderWindow >::New();
renWin->SetMultiSamples(0);
renWin->SetAlphaBitPlanes(1);
renWin->AddRenderer(renderer);
vtkSmartPointer< vtkRenderWindowInteractor > iren =
vtkSmartPointer< vtkRenderWindowInteractor >::New();
iren->SetRenderWindow(renWin);
auto subMbds = vtkCreateData();
vtkNew<vtkMultiBlockDataSet> mbds;
mbds->SetNumberOfBlocks(1);
mbds->SetBlock(0, subMbds);
vtkSmartPointer< vtkCompositePolyDataMapper2 > mapper =
vtkSmartPointer< vtkCompositePolyDataMapper2 >::New();
mapper->SetInputDataObject(mbds);
vtkSmartPointer< vtkCompositeDataDisplayAttributes > attrs =
vtkSmartPointer< vtkCompositeDataDisplayAttributes >::New();
mapper->SetCompositeDataDisplayAttributes(attrs);
/*******************/
// How to specify colors?
double rgb[3];
vtkMath::HSVToRGB(0.8*1,
1.0,
1.0,
rgb+0, rgb+1, rgb+2);
mapper->SetBlockColor(0, rgb);
std::cout << "Number of Blocks in root mbds: " << mbds->GetNumberOfBlocks() << std::endl;
/*******************/
vtkSmartPointer< vtkActor > actor = vtkSmartPointer< vtkActor >::New();
actor->SetMapper(mapper);
renderer->AddActor(actor);
// Standard testing code.
renderer->SetBackground(0.5,0.5,0.5);
renWin->SetSize(300,300);
renWin->Render();
int retVal = vtkRegressionTestImage( renWin );
if ( 3 == vtkRegressionTester::DO_INTERACTOR)
{
iren->Start();
}
return !retVal;
}