VTK: 选取区域(vtkAreaPicker + vtkInteractorStyleRubberBandPick )

本文介绍使用VTK实现三维数据的裁剪与选择功能。通过定制交互样式,支持矩形区域选择,并从原始数据中提取选定部分进行高亮显示。代码示例展示了如何设置交互样式、提取几何数据及更新渲染。

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

根据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;
}

 

<think>好的,我现在要解决用户提出的关于Maven依赖org.vtk:vtk:9.2.2解析失败的问题。首先,我需要了解这个问题的常见原因和可能的解决方案。根据用户提供的引用内容,我注意到有几个引用提到了Maven插件解析失败的问题,比如引用[3]、[4]、[5]提到的无法解析插件的问题,以及引用[1]提到的连接中央仓库失败的情况。虽然用户的问题是关于org.vtk:vtk而不是插件,但可能解决方案有类似之处。 首先,我应该考虑网络连接问题。如果Maven无法连接到中央仓库或者私服,可能会导致依赖下载失败。用户提到引用[1]中的情况是Maven处于离线模式,导致无法下载依赖。因此,我需要建议用户检查Maven的离线设置,确保没有启用离线模式。 其次,检查依赖的可用性。用户可能没有正确配置仓库,或者该特定版本的vtk在默认的中央仓库中不存在。这时候需要确认org.vtk:vtk:9.2.2是否存在于Maven中央仓库或其他公共仓库中。如果不存在,可能需要手动添加包含该依赖的仓库到pom.xml或者settings.xml中。 接下来,本地仓库的清理也是一个可能的解决步骤。引用[4]中提到删除本地仓库中的相关文件并重新下载可以解决插件解析问题。同样的方法可能适用于vtk依赖问题,即删除本地仓库中org/vtk目录下的相关文件,然后重新构建项目,让Maven重新下载依赖。 另外,Maven的配置问题,比如settings.xml中的代理设置或镜像配置错误,也可能导致无法下载依赖。用户需要检查这些配置是否正确,特别是如果他们在使用公司内部的私服,需要确认配置是否正确,如引用[5]中提到的项目集成的Maven路径不一致的问题。 还有可能的是依赖版本的问题。vtk的9.2.2版本是否存在,或者是否存在拼写错误?用户需要确认该版本是否真的在仓库中存在,或者是否有其他可用的替代版本。 最后,手动安装依赖也是一种解决方法,尤其是当依赖不在公共仓库中时。用户可以通过mvn install命令手动将jar包安装到本地仓库中。 总结可能的解决步骤:检查网络连接和Maven配置,确认依赖版本存在,清理本地仓库,添加正确的仓库配置,手动安装依赖。需要一步步引导用户进行排查,从最常见的网络和配置问题开始,逐步深入。</think>### 解决Maven依赖`org.vtk:vtk:9.2.2`解析失败的步骤 1. **检查依赖仓库配置** 确保`org.vtk:vtk:9.2.2`存在于当前配置的仓库中。默认Maven中央仓库可能不包含该依赖。 - 在`pom.xml`中添加包含该依赖的仓库(例如JCenter或特定私有仓库): ```xml <repositories> <repository> <id>vtk-repo</id> <url>https://repo.example.com/maven2</url> <!-- 替换为实际仓库地址 --> </repository> </repositories> ``` - 若使用私服,检查`settings.xml`中的镜像配置是否正确[^1]。 2. **检查Maven网络连接** - 确认Maven未处于**离线模式**(检查`settings.xml`中`<offline>false</offline>`)。 - 若需代理,在`settings.xml`中配置代理信息: ```xml <proxies> <proxy> <active>true</active> <protocol>http</protocol> <host>proxy.example.com</host> <port>8080</port> </proxy> </proxies> ``` 3. **清理本地仓库并重新下载** - 删除本地仓库中相关目录: ```bash rm -rf ~/.m2/repository/org/vtk ``` - 在IDE中执行**Maven → Reload Project**或命令行运行`mvn clean install -U`强制更新依赖[^4]。 4. **验证依赖版本是否存在** 访问[Maven中央仓库](https://search.maven.org/)或对应仓库的网页,手动搜索`org.vtk:vtk:9.2.2`。若不存在,需联系依赖提供方或切换可用版本。 5. **手动安装依赖(备用方案)** 如果依赖仅存在于本地文件: ```bash mvn install:install-file -DgroupId=org.vtk -DartifactId=vtk -Dversion=9.2.2 -Dfile=vtk-9.2.2.jar -Dpackaging=jar ``` --- ### 常见错误排查 - **错误信息示例**: ```text Could not resolve dependencies for project: Failed to collect dependencies at org.vtk:vtk:jar:9.2.2 ``` **原因**:依赖未正确配置或网络问题导致无法下载[^2][^3]。 - **若提示插件解析失败**(如`maven-compiler-plugin`),参考引用[4]清理本地仓库并刷新项目。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

伍心

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值