/*========================================================================= Program: Visualization Toolkit Module: TestLabelPlacer.cxx 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. =========================================================================*/ // .NAME Test of vtkLabelPlacer // .SECTION Description // this program tests vtkLabelPlacer which uses a sophisticated algorithm to // prune labels/icons preventing them from overlapping. #include "vtkActor.h" #include "vtkActor2D.h" #include "vtkImageData.h" #include "vtkLabelHierarchy.h" #include "vtkLabelPlacer.h" #include "vtkLabelSizeCalculator.h" #include "vtkLabeledDataMapper.h" #include "vtkPointSetToLabelHierarchy.h" #include "vtkPoints.h" #include "vtkPolyData.h" #include "vtkPolyDataMapper.h" #include "vtkPolyDataMapper2D.h" #include "vtkProperty.h" #include "vtkRectilinearGrid.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkSmartPointer.h" #include "vtkSphereSource.h" #include "vtkStructuredGrid.h" #include "vtkTextProperty.h" #include "vtkUnstructuredGrid.h" #include "vtkXMLPolyDataReader.h" #include "vtkXMLPolyDataWriter.h" #include #include int TestLabelPlacer(int argc, char* argv[]) { int maxLevels = 5; int targetLabels = 32; double labelRatio = 0.05; char* fname = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/uniform-001371-5x5x5.vtp"); // int iteratorType = vtkLabelHierarchy::FULL_SORT; int iteratorType = vtkLabelHierarchy::QUEUE; // int iteratorType = vtkLabelHierarchy::DEPTH_FIRST; bool showBounds = false; vtkSmartPointer sphere = vtkSmartPointer::New(); vtkSmartPointer sphereMapper = vtkSmartPointer::New(); vtkSmartPointer sphereActor = vtkSmartPointer::New(); sphere->SetRadius(5.0); sphereMapper->SetInputConnection(sphere->GetOutputPort()); sphereActor->SetMapper(sphereMapper); vtkSmartPointer labelSizeCalculator = vtkSmartPointer::New(); vtkSmartPointer labelHierarchy = vtkSmartPointer::New(); vtkSmartPointer labelPlacer = vtkSmartPointer::New(); vtkSmartPointer pointSetToLabelHierarchy = vtkSmartPointer::New(); vtkSmartPointer xmlPolyDataReader = vtkSmartPointer::New(); vtkSmartPointer polyDataMapper = vtkSmartPointer::New(); vtkSmartPointer actor = vtkSmartPointer::New(); vtkSmartPointer renderer = vtkSmartPointer::New(); vtkSmartPointer renWin = vtkSmartPointer::New(); vtkSmartPointer iren = vtkSmartPointer::New(); vtkSmartPointer labeledMapper = vtkSmartPointer::New(); vtkSmartPointer textActor = vtkSmartPointer::New(); xmlPolyDataReader->SetFileName(fname); delete[] fname; labelSizeCalculator->SetInputConnection(xmlPolyDataReader->GetOutputPort()); labelSizeCalculator->GetFontProperty()->SetFontSize(12); labelSizeCalculator->GetFontProperty()->SetFontFamily( vtkTextProperty::GetFontFamilyFromString("Arial")); labelSizeCalculator->SetInputArrayToProcess( 0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "PlaceNames"); labelSizeCalculator->SetLabelSizeArrayName("LabelSize"); pointSetToLabelHierarchy->AddInputConnection(labelSizeCalculator->GetOutputPort()); pointSetToLabelHierarchy->SetInputArrayToProcess( 0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "Priority"); pointSetToLabelHierarchy->SetInputArrayToProcess( 1, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "LabelSize"); pointSetToLabelHierarchy->SetInputArrayToProcess( 2, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "PlaceNames"); pointSetToLabelHierarchy->SetMaximumDepth(maxLevels); pointSetToLabelHierarchy->SetTargetLabelCount(targetLabels); labelPlacer->SetInputConnection(pointSetToLabelHierarchy->GetOutputPort()); labelPlacer->SetIteratorType(iteratorType); labelPlacer->SetOutputTraversedBounds(showBounds); labelPlacer->SetRenderer(renderer); labelPlacer->SetMaximumLabelFraction(labelRatio); labelPlacer->UseDepthBufferOn(); polyDataMapper->SetInputConnection(labelPlacer->GetOutputPort()); actor->SetMapper(polyDataMapper); // labelPlacer->Update(); labeledMapper->SetInputConnection(labelPlacer->GetOutputPort()); labeledMapper->SetLabelTextProperty(labelSizeCalculator->GetFontProperty()); labeledMapper->SetFieldDataName("LabelText"); labeledMapper->SetLabelModeToLabelFieldData(); labeledMapper->GetLabelTextProperty()->SetColor(0.0, 0.8, 0.2); textActor->SetMapper(labeledMapper); // renderer->AddActor(actor); renderer->AddActor(sphereActor); renderer->AddActor(textActor); renWin->SetSize(300, 300); renWin->AddRenderer(renderer); renderer->SetBackground(0.0, 0.0, 0.0); iren->SetRenderWindow(renWin); renWin->Render(); renderer->ResetCamera(); renderer->ResetCamera(); renderer->ResetCamera(); int retVal = vtkRegressionTestImage(renWin); if (retVal == vtkRegressionTester::DO_INTERACTOR) { iren->Start(); } return !retVal; }