如何判断一个vtkActor的类型

在VTK管线流程中,有个重要的角色就是vtkActor,本文旨在学习示例代码,学习使用方法。


#include <vtkSmartPointer.h>

#include <vtkActor.h>
#include <vtkActorCollection.h>
#include <vtkCubeAxesActor.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>

int main(int, char *[])
{
	// Sphere
	vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
	sphereSource->Update();

	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(sphereSource->GetOutputPort());

	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);

	// Cube axes
	vtkSmartPointer<vtkCubeAxesActor> cubeAxesActor = vtkSmartPointer<vtkCubeAxesActor>::New();

	// Create a renderer and render window
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	cubeAxesActor->SetCamera(renderer->GetActiveCamera());

	renderer->AddActor(actor);
	renderer->AddActor(cubeAxesActor);

	// Determine the types of the actors - method 1
	{
		std::cout << "Method 1:" << std::endl;
		vtkActorCollection* actorCollection = renderer->GetActors();
		actorCollection->InitTraversal();

		for(vtkIdType i = 0; i < actorCollection->GetNumberOfItems(); i++)
		{
			vtkActor* nextActor = actorCollection->GetNextActor();
			std::cout << "nextActor " << i << " : " << nextActor->GetClassName() << std::endl;
			std::string className = nextActor->GetClassName();
			std::string wantedClass = "vtkCubeAxesActor";
			if(className == wantedClass)
			{
				std::cout << "nextActor " << i << " is a vtkCubeAxesActor!" << std::endl;
			}
			else
			{
				std::cout << "nextActor " << i << " is NOT a vtkCubeAxesActor!" << std::endl;
			}
		}
	}

	// Determine the types of the actors - method 2
	{
		std::cout << "Method 2:" << std::endl;
		vtkActorCollection* actorCollection = renderer->GetActors();
		actorCollection->InitTraversal();

		for(vtkIdType i = 0; i < actorCollection->GetNumberOfItems(); i++)
		{
			vtkActor* nextActor = actorCollection->GetNextActor();
			std::cout << "nextActor " << i << " : " << nextActor->GetClassName() << std::endl;
			if(nextActor->IsA("vtkCubeAxesActor"))
			{
				std::cout << "nextActor " << i << " is a vtkCubeAxesActor!" << std::endl;
			}
			else
			{
				std::cout << "nextActor " << i << " is NOT a vtkCubeAxesActor!" << std::endl;
			}
		}
	}

	// Determine the types of the actors - method 3
	{
		std::cout << "Method 3:" << std::endl;
		vtkActorCollection* actorCollection = renderer->GetActors();
		actorCollection->InitTraversal();

		for(vtkIdType i = 0; i < actorCollection->GetNumberOfItems(); i++)
		{
			vtkActor* nextActor = actorCollection->GetNextActor();
			std::cout << "nextActor " << i << " : " << nextActor->GetClassName() << std::endl;

			if(vtkCubeAxesActor::SafeDownCast(nextActor) != 0)
			{
				std::cout << "nextActor " << i << " is a vtkCubeAxesActor!" << std::endl;
			}
			else
			{
				std::cout << "nextActor " << i << " is NOT a vtkCubeAxesActor!" << std::endl;
			}
		}
	}

	// Determine the types of the actors - method 4
	{
		std::cout << "Method 4:" << std::endl;
		vtkActorCollection* actorCollection = renderer->GetActors();
		actorCollection->InitTraversal();

		for(vtkIdType i = 0; i < actorCollection->GetNumberOfItems(); i++)
		{
			vtkActor* nextActor = actorCollection->GetNextActor();
			std::cout << "nextActor " << i << " : " << nextActor->GetClassName() << std::endl;

			if(dynamic_cast<vtkCubeAxesActor*>(nextActor) != 0)
			{
				std::cout << "nextActor " << i << " is a vtkCubeAxesActor!" << std::endl;
			}
			else
			{
				std::cout << "nextActor " << i << " is NOT a vtkCubeAxesActor!" << std::endl;
			}
		}
	}

	// Render the scene
	vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);

	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);

	renderer->ResetCamera();
	renderWindow->Render();
	renderWindowInteractor->Initialize();
	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

获取当前vtkRenderer的所有ACTORS:

vtkActorCollection* actorCollection = renderer->GetActors();
遍历:

actorCollection->InitTraversal();

for(vtkIdType i = 0; i < actorCollection->GetNumberOfItems(); i++)
{
	vtkActor* nextActor = actorCollection->GetNextActor();
	···
}

获取ACTOR类名

std::string className = nextActor->GetClassName();

四种不同的判断方法

/****************方法一**************************/
std::string wantedClass = "vtkCubeAxesActor";
if(className == wantedClass)
{
	// true
}
else
{
	// false
}

/****************方法二**************************/
if(nextActor->IsA("vtkCubeAxesActor"))
{
	// true
}
else
{
	// false
}

/****************方法三**************************/
if(vtkCubeAxesActor::SafeDownCast(nextActor) != 0)
{
	// true
}
else
{
	// false
}

/****************方法四**************************/
if(dynamic_cast<vtkCubeAxesActor*>(nextActor) != 0)
{
	// true
}
else
{
	// false
}



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值