VTK: 选取区域(vtkAreaPicker + vtkInteractorStyleRubberBandPick )

目的:显示对直接体绘制和网格数据的任意裁剪。

根据VTK官网的例子,显示了下面的矩形区域选取。下一步实现任意区域的选取与裁剪。

VTK官网例子:https://kitware.github.io/vtk-examples/site/Cxx/Picking/HighlightSelection/ 

注意:按下键盘< r >进行模式切换,

#include <vtkActor.h>
#include <vtkAreaPicker.h>
#include <vtkDataSetMapper.h>
#include <vtkDataSetSurfaceFilter.h>
#include <vtkExtractPolyDataGeometry.h>
#include <vtkIdFilter.h>
#include <vtkIdTypeArray.h>
#include <vtkInteractorStyleRubberBandPick.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkObjectFactory.h>
#include <vtkPlanes.h>
#include <vtkPointData.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkRendererCollection.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkUnstructuredGrid.h>
#include <vtkVersion.h>
#include <vtkVertexGlyphFilter.h>
#include <vtkPolyDataReader.h>
#include <vtkSTLReader.h>


#define VTKISRBP_ORIENT 0
#define VTKISRBP_SELECT 1

namespace {
	// Define interaction style
	class HighlightInteractorStyle : public vtkInteractorStyleRubberBandPick
	{
	public:
		static HighlightInteractorStyle* New();
		vtkTypeMacro(HighlightInteractorStyle, vtkInteractorStyleRubberBandPick);

		HighlightInteractorStyle() : vtkInteractorStyleRubberBandPick()
		{
			this->SelectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
			this->SelectedActor = vtkSmartPointer<vtkActor>::New();
			this->SelectedActor->SetMapper(SelectedMapper);
		}

		virtual void OnLeftButtonUp() override
		{
			// Forward events
			vtkInteractorStyleRubberBandPick::OnLeftButtonUp();

			if (this->CurrentMode == VTKISRBP_SELECT)
			{
				vtkNew<vtkNamedColors> colors;

				vtkPlanes* frustum =static_cast<vtkAreaPicker*>(this->GetInteractor()->GetPicker())->GetFrustum();

				vtkNew<vtkExtractPolyDataGeometry> extractPolyDataGeometry;
				extractPolyDataGeometry->SetInputData(this->PolyData);
				extractPolyDataGeometry->SetImplicitFunction(frustum);
				extractPolyDataGeometry->Update();

				std::cout << "Extracted "
					<< extractPolyDataGeometry->GetOutput()->GetNumberOfCells()
					<< " cells." << std::endl;
				this->SelectedMapper->SetInputData(extractPolyDataGeometry->GetOutput());
				this->SelectedMapper->ScalarVisibilityOff();

				//        vtkIdTypeArray* ids =
				//        dynamic_cast<vtkIdTypeArray*>(selected->GetPointData()->GetArray("OriginalIds"));

				this->SelectedActor->GetProperty()->SetColor(
					colors->GetColor3d("Tomato").GetData());
				this->SelectedActor->GetProperty()->SetPointSize(5);
				this->SelectedActor->GetProperty()->SetRepresentationToWireframe();

				this->GetInteractor()
					->GetRenderWindow()
					->GetRenderers()
					->GetFirstRenderer()
					->AddActor(SelectedActor);
				this->GetInteractor()->GetRenderWindow()->Render();
				this->HighlightProp(NULL);
			}
		}

		void SetPolyData(vtkSmartPointer<vtkPolyData> polyData)
		{
			this->PolyData = polyData;
		}

	private:
		vtkSmartPointer<vtkPolyData> PolyData;
		vtkSmartPointer<vtkActor> SelectedActor;
		vtkSmartPointer<vtkDataSetMapper> SelectedMapper;
	};
	vtkStandardNewMacro(HighlightInteractorStyle);

	vtkSmartPointer<vtkPolyData> ReadPolyData(const char* fileName);
} // namespace

int main(int argc, char* argv[])
{
	//vtkNew<vtkSTLReader> reader;
	//reader->SetFileName("D:\\CT+MR\\STL\\HeYuFang MR.stl");
	//reader->Update();
	vtkNew<vtkSphereSource> source;
	source->SetPhiResolution(49);
	source->SetThetaResolution(200);
	source->Update();
	auto polyData = source->GetOutput();


	vtkNew<vtkNamedColors> colors;

	vtkNew<vtkIdFilter> idFilter;
	idFilter->SetInputData(polyData);
	idFilter->SetIdsArrayName("OriginalIds");
	idFilter->Update();

	// This is needed to convert the ouput of vtkIdFilter (vtkDataSet) back to
	// vtkPolyData
	vtkNew<vtkDataSetSurfaceFilter> surfaceFilter;
	surfaceFilter->SetInputConnection(idFilter->GetOutputPort());
	surfaceFilter->Update();

	vtkPolyData* input = surfaceFilter->GetOutput();

	// Create a mapper and actor
	vtkNew<vtkPolyDataMapper> mapper;
	mapper->SetInputData(polyData);
	mapper->ScalarVisibilityOff();

	vtkNew<vtkActor> actor;
	actor->SetMapper(mapper);
	actor->GetProperty()->SetPointSize(5);
	actor->GetProperty()->SetDiffuseColor(colors->GetColor3d("Peacock").GetData());
	// Visualize
	vtkNew<vtkRenderer> renderer;
	renderer->UseHiddenLineRemovalOn();

	vtkNew<vtkRenderWindow> renderWindow;
	renderWindow->AddRenderer(renderer);
	renderWindow->SetSize(640, 480);
	renderWindow->SetWindowName("HighlightSelection");

	vtkNew<vtkAreaPicker> areaPicker;
	vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
	renderWindowInteractor->SetPicker(areaPicker);
	renderWindowInteractor->SetRenderWindow(renderWindow);

	renderer->AddActor(actor);
	renderer->SetBackground(colors->GetColor3d("Tan").GetData());

	renderWindow->Render();

	vtkNew<HighlightInteractorStyle> style;
	style->SetPolyData(input);
	style->SetCurrentRenderer(renderer);
	renderWindowInteractor->SetInteractorStyle(style);

	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值