VTK vtkExtractSelection 获取 选择部分 非选择部分

VTK vtkExtractSelection 获取 选择部分 非选择部分,

有时需要获取两部分, 这里有实现,共同学习一下;

 

#include <vtkCamera.h>
#include <vtkDataSetMapper.h>
#include <vtkExtractSelection.h>
#include <vtkIdTypeArray.h>
#include <vtkInformation.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointSource.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSelection.h>
#include <vtkSelectionNode.h>
#include <vtkSphereSource.h>
#include <vtkUnstructuredGrid.h>
#include <vtkVertexGlyphFilter.h>

//#include <array>

int main(int, char*[])
{

	vtkNew<vtkNamedColors> colors;
 

	vtkNew<vtkPointSource> pointSource;
	pointSource->SetNumberOfPoints(50);
	pointSource->Update();

	std::cout << "There are " << pointSource->GetOutput()->GetNumberOfPoints()
		<< " input points." << std::endl;

	vtkNew<vtkIdTypeArray> ids;
	ids->SetNumberOfComponents(1);

	// Set values.
	for (unsigned int i = 10; i < 20; i++)
	{
		ids->InsertNextValue(i);
	}

	vtkNew<vtkSelectionNode> selectionNode;
	selectionNode->SetFieldType(vtkSelectionNode::POINT);
	selectionNode->SetContentType(vtkSelectionNode::INDICES);
	selectionNode->SetSelectionList(ids);

	vtkNew<vtkSelection> selection;
	selection->AddNode(selectionNode);

	vtkNew<vtkExtractSelection> extractSelection;
	extractSelection->SetInputConnection(0, pointSource->GetOutputPort());
	extractSelection->SetInputData(1, selection);
	extractSelection->Update();

	// In selection.
	vtkNew<vtkUnstructuredGrid> selected;
	selected->ShallowCopy(extractSelection->GetOutput());

	std::cout << "There are " << selected->GetNumberOfPoints()
		<< " points and ";
	std::cout << selected->GetNumberOfCells()
		<< " cells in the selection." << std::endl;

	// Get points that are NOT in the selection.
	selectionNode->GetProperties()->Set(vtkSelectionNode::INVERSE(),
		1); // invert the selection
	extractSelection->Update();

	vtkNew<vtkUnstructuredGrid> notSelected;
	notSelected->ShallowCopy(extractSelection->GetOutput());

	std::cout << "There are " << notSelected->GetNumberOfPoints()
		<< " points and ";
	std::cout << notSelected->GetNumberOfCells()
		<< " cells NOT in the selection." << std::endl;

	vtkNew<vtkDataSetMapper> inputMapper;
	inputMapper->SetInputConnection(pointSource->GetOutputPort());
	vtkNew<vtkActor> inputActor;
	inputActor->SetMapper(inputMapper);
	inputActor->GetProperty()->SetColor(
		colors->GetColor3d("MidnightBlue").GetData());
	inputActor->GetProperty()->SetPointSize(5);

	vtkNew<vtkDataSetMapper> selectedMapper;
	selectedMapper->SetInputData(selected);

	vtkNew<vtkActor> selectedActor;
	selectedActor->SetMapper(selectedMapper);
	selectedActor->GetProperty()->SetColor(
		colors->GetColor3d("MidnightBlue").GetData());
	selectedActor->GetProperty()->SetPointSize(5);

	vtkNew<vtkDataSetMapper> notSelectedMapper;
	notSelectedMapper->SetInputData(notSelected);

	vtkNew<vtkActor> notSelectedActor;
	notSelectedActor->SetMapper(notSelectedMapper);
	notSelectedActor->GetProperty()->SetColor(
		colors->GetColor3d("MidnightBlue").GetData());
	notSelectedActor->GetProperty()->SetPointSize(5);

	// There will be one render window.
	vtkNew<vtkRenderWindow> renderWindow;
	renderWindow->SetSize(900, 300);
	renderWindow->SetWindowName("ExtractSelection");

	// And one interactor.
	vtkNew<vtkRenderWindowInteractor> interactor;
	interactor->SetRenderWindow(renderWindow);

	// Define viewport ranges (xmin, ymin, xmax, ymax).
	double leftViewport[4] = { 0.0, 0.0, 0.33, 1.0 };
	double centerViewport[4] = { 0.33, 0.0, .66, 1.0 };
	double rightViewport[4] = { 0.66, 0.0, 1.0, 1.0 };

	// Create a camera for all renderers.
	vtkNew<vtkCamera> camera;

	// Setup the renderers.
	vtkNew<vtkRenderer> leftRenderer;
	renderWindow->AddRenderer(leftRenderer);
	leftRenderer->SetViewport(leftViewport);
	leftRenderer->SetBackground(colors->GetColor3d("BurlyWood").GetData());
	leftRenderer->SetActiveCamera(camera);

	vtkNew<vtkRenderer> centerRenderer;
	renderWindow->AddRenderer(centerRenderer);
	centerRenderer->SetViewport(centerViewport);
	centerRenderer->SetBackground(colors->GetColor3d("orchid_dark").GetData());
	centerRenderer->SetActiveCamera(camera);

	vtkNew<vtkRenderer> rightRenderer;
	renderWindow->AddRenderer(rightRenderer);
	rightRenderer->SetViewport(rightViewport);
	rightRenderer->SetBackground(colors->GetColor3d("CornflowerBlue").GetData());
	rightRenderer->SetActiveCamera(camera);

	leftRenderer->AddActor(inputActor);
	centerRenderer->AddActor(selectedActor);
	rightRenderer->AddActor(notSelectedActor);

	leftRenderer->ResetCamera();

	renderWindow->Render();
	interactor->Start();

	return EXIT_SUCCESS;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值