1 #include "vtkAutoInit.h"
2 VTK_MODULE_INIT(vtkRenderingOpenGL2);
3 VTK_MODULE_INIT(vtkInteractionStyle);
4 VTK_MODULE_INIT(vtkRenderingFreeType)
5
6 #include <vtkActor.h>
7 #include <vtkInteractorStyleTrackballCamera.h>
8 #include <vtkNamedColors.h>
9 #include <vtkNew.h>
10 #include <vtkObjectFactory.h>
11 #include <vtkPointPicker.h>
12 #include <vtkPolyDataMapper.h>
13 #include <vtkProperty.h>
14 #include <vtkRenderWindow.h>
15 #include <vtkRenderWindowInteractor.h>
16 #include <vtkRenderer.h>
17 #include <vtkRendererCollection.h>
18 #include <vtkSphereSource.h>
19 #include <vtkRendererCollection.h>
20 #include <vtkObjectFactory.h>
21 #include <vtkCellPicker.h>
22 #include <vtkSelectionNode.h>
23 #include <vtkPolyData.h>
24 #include <vtkUnstructuredGrid.h>
25 #include <vtkSelection.h>
26 #include <vtkExtractSelection.h>
27 #include <vtkNamedColors.h>
28 #include <vtkDataSetMapper.h>
29 #include <vtkPoints.h>
30 #include <vtkidList.h>
31
32 namespace {
33 class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera
34 {
35 public:
36 static MouseInteractorStyle* New();
37
38 vtkTypeMacro(MouseInteractorStyle, vtkInteractorStyleTrackballCamera);
39
40 MouseInteractorStyle() {
41 displayActor = vtkSmartPointer<vtkActor>::New();
42 displayActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
43 }
44
45 virtual void OnLeftButtonDown() override
46 {
47 vtkNew<vtkNamedColors> colors;
48
49 // 鼠标点击位置[x, y]
50 int* pos = this->Interactor->GetEventPosition();
51 // 上一次的鼠标点击位置
52 int* lastPos = this->Interactor->GetLastEventPosition();
53
54 auto picker = this->Interactor->GetPicker();
55 // Pick(x, y, z, vtkRenderer)
56 picker->Pick(pos[0], pos[1], 0, this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
57
58 // 点击点的世界坐标
59 double worldPos[3];
60 picker->GetPickPosition(worldPos);
61
62 if (picker->IsA("vtkCellPicker")) {
63 auto cellPicker = vtkCellPicker::SafeDownCast(picker);
64 std::cout << "Pick Position: [" << worldPos[0] << ", " << worldPos[1] << ", " << worldPos[2] << "]" << std::endl;
65 std::cout << "CellId: " << cellPicker->GetCellId() << std::endl;
66 std::cout << "PointId: " << cellPicker->GetPointId() << std::endl;
67
68 if (cellPicker->GetCellId() != -1)
69 {
70 if (nullptr == data) {
71 std::cout << "Source data not found! " << std::endl;
72 return;
73 }
74 // 高亮选择的单元
75 auto cell = data->GetCell(cellPicker->GetCellId());
76 std::cout << "Cell Class Name: " << cell->GetClassName() << std::endl;
77 vtkNew<vtkUnstructuredGrid> selectedCells;
78 vtkNew<vtkCellArray> cellArray;
79 vtkNew<vtkPoints> pointList;
80 vtkNew<vtkIdList> idList;
81 auto points = cell->GetPoints();
82 auto num = points->GetNumberOfPoints();
83 double p[3];
84 for (size_t i = 0; i < num; i++)
85 {
86 points->GetPoint(i, p);
87 std::cout << "Point" << i << ": " << std::endl;
88 std::cout << "\tx = " << p[0] << std::endl;
89 std::cout << "\ty = " << p[1] << std::endl;
90 std::cout << "\tz = " << p[2] << std::endl;
91 idList->InsertNextId(pointList->InsertNextPoint(p));
92 }
93 selectedCells->SetPoints(pointList);
94 selectedCells->InsertNextCell(cell->GetCellType(), idList);
95
96 std::cout << "Number of points in the selection: "
97 << selectedCells->GetNumberOfPoints() << std::endl;
98 std::cout << "Number of cells in the selection : "
99 << selectedCells->GetNumberOfCells() << std::endl;
100 auto mapper = vtkSmartPointer<vtkDataSetMapper>::New();
101 mapper->SetInputData(selectedCells);
102 this->Interactor->GetRenderWindow()
103 ->GetRenderers()
104 ->GetFirstRenderer()
105 ->RemoveActor(displayActor);
106 displayActor->SetMapper(mapper);
107 displayActor->GetProperty()->EdgeVisibilityOn();
108 displayActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
109 displayActor->GetProperty()->SetPointSize(5.0);
110 this->Interactor->GetRenderWindow()
111 ->GetRenderers()
112 ->GetFirstRenderer()
113 ->AddActor(displayActor);
114 }
115
116 }
117 else {
118 std::cout << "WorldPos: [" << worldPos[0] << ", " << worldPos[1] << ", " << worldPos[2] << "]" << std::endl;
119 }
120
121 // 事件转发
122 vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
123 }
124
125 vtkPolyData* data = nullptr;
126 vtkSmartPointer<vtkActor> displayActor = nullptr;
127 };
128 vtkStandardNewMacro(MouseInteractorStyle)
129
130 }
131
132 int main(int, char* [])
133 {
134 vtkNew<vtkNamedColors> colors;
135
136 vtkNew<vtkSphereSource> sphereSource;
137 sphereSource->SetThetaResolution(20);
138 sphereSource->SetPhiResolution(20);
139 sphereSource->Update();
140
141 // Create a mapper and actor
142 vtkNew<vtkPolyDataMapper> mapper;
143 mapper->SetInputConnection(sphereSource->GetOutputPort());
144 vtkNew<vtkActor> actor;
145 actor->SetMapper(mapper);
146 actor->GetProperty()->SetColor(colors->GetColor3d("MistyRose").GetData());
147 actor->GetProperty()->SetRepresentationToWireframe();
148
149 // Create a renderer, render window, and interactor
150 vtkNew<vtkRenderer> renderer;
151 // 如果此标志为On并且渲染引擎支持它,则线框模式下几何图形的隐(非可见)藏线将会被移除。
152 //renderer->UseHiddenLineRemovalOn();
153 vtkNew<vtkRenderWindow> renderWindow;
154 renderWindow->AddRenderer(renderer);
155 renderWindow->SetWindowName("PointPicker");
156
157 vtkNew<vtkCellPicker> picker;
158 vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
159 renderWindowInteractor->SetPicker(picker);
160 renderWindowInteractor->SetRenderWindow(renderWindow);
161
162 vtkNew<MouseInteractorStyle> style;
163 style->data = sphereSource->GetOutput();
164 renderWindowInteractor->SetInteractorStyle(style);
165
166 // Add the actor to the scene
167 renderer->AddActor(actor);
168 renderer->SetBackground(colors->GetColor3d("SlateGray").GetData());
169
170 // Render and interact
171 renderWindow->Render();
172 renderWindowInteractor->Start();
173
174 return EXIT_SUCCESS;
175 }
