如何判断一个vtkActor的类型

原创 2016年08月31日 14:12:24

在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
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

一个完整版的HttpHelper.cs类型

  • 2017年11月29日 17:19
  • 28KB
  • 下载

C++面向对象程序设计中如何判断一个对象的类类型

在C++面向对象程序设计中,有时候需要判断某个对象的类类型,那么可以有下列两种方法: 方法1: 采用 typeid()函数进行判断:(缺点:当存在继承,并且子类指针赋值给父类指针时,此时判断的对象类...

python中如何判断一个变量的数据类型

python中如何判断一个变量的数据类型
  • samxx8
  • samxx8
  • 2011年04月02日 19:16
  • 34674

括号配对:假设一个数学算式中包括圆括号"()",方括号”[]"和花括号“{}”三种类型,编写一算法判断表达式的括号是否配对。

题目:假设一个数学算式中包括圆括号"()",方括号”[]"和花括号“{}”三种类型,编写一算法判断表达式的括号是否配对。 分析:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何判断一个vtkActor的类型
举报原因:
原因补充:

(最多只允许输入30个字)