Developer documentation | Axl-2.5.1

axlInteractorStyleRubberBandPick.cpp
Go to the documentation of this file.
1 /* axlInteractorStyleRubberBandPick.h ---
2  *
3  * Author: Meriadeg Perrinel
4  * Copyright (C) 2008 - Meriadeg Perrinel, Inria.
5  * Created: Fri Feb 18 17:25:39 2011 (+0100)
6  * Version: $Id$
7  * Last-Updated: Fri Feb 18 17:28:34 2011 (+0100)
8  * By: Meriadeg Perrinel
9  * Update #: 18
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
20 
21 
23 
24 #include <vtkVersion.h>
25 #include <vtkSmartPointer.h>
26 #include <vtkPointData.h>
27 #include <vtkIdTypeArray.h>
28 #include <vtkDataSetSurfaceFilter.h>
29 #include <vtkRendererCollection.h>
30 #include <vtkProperty.h>
31 #include <vtkPlanes.h>
32 #include <vtkObjectFactory.h>
33 #include <vtkPolyDataMapper.h>
34 #include <vtkActor.h>
35 #include <vtkRenderWindow.h>
36 #include <vtkRenderer.h>
37 #include <vtkRenderWindowInteractor.h>
38 #include <vtkPolyData.h>
39 #include <vtkPointSource.h>
40 #include <vtkAreaPicker.h>
41 #include <vtkExtractGeometry.h>
42 #include <vtkDataSetMapper.h>
43 #include <vtkUnstructuredGrid.h>
44 #include <vtkVertexGlyphFilter.h>
45 #include <vtkIdFilter.h>
46 #include <vtkLine.h>
47 #include <vtkCellArray.h>
48 
49 #include <vtkFeatureEdges.h>
50 
51 
52 #include <QDebug>
53 
54 
56 
57 #define VTKISRBP_ORIENT 0
58 #define VTKISRBP_SELECT 1
59 
60 class axlInteractorStyleRubberBandPickPrivate
61 {
62 public:
63  vtkSmartPointer<vtkPolyData> Points;
64  vtkSmartPointer<vtkActor> SelectedActor;
65  vtkSmartPointer<vtkDataSetMapper> SelectedMapper;
66 
67  QVector<int> ids;
68 };
69 
71 {
72  // Forward events
73  vtkInteractorStyleRubberBandPick::OnLeftButtonUp();
74 
75  vtkPlanes* frustum = static_cast<vtkAreaPicker*>(this->GetInteractor()->GetPicker())->GetFrustum();
76 
77  vtkSmartPointer<vtkExtractGeometry> extractGeometry =
78  vtkSmartPointer<vtkExtractGeometry>::New();
79  extractGeometry->SetImplicitFunction(frustum);
80 #if VTK_MAJOR_VERSION <= 5
81  extractGeometry->SetInput(d->Points);
82 #else
83  extractGeometry->SetInputData(d->Points);
84 #endif
85  extractGeometry->Update();
86 
87  //Create a polyData with points only.
88  vtkSmartPointer<vtkVertexGlyphFilter> glyphFilter =
89  vtkSmartPointer<vtkVertexGlyphFilter>::New();
90  glyphFilter->SetInputConnection(extractGeometry->GetOutputPort());
91  glyphFilter->Update();
92 
93  // //Create a polyData with edges only.
94  // vtkSmartPointer<vtkExtractEdges> glyphFilter =
95  // vtkSmartPointer<vtkExtractEdges>::New();
96  // glyphFilter->SetInputConnection(extractGeometry->GetOutputPort());
97  // glyphFilter->Update();
98 
99  vtkPolyData* selected = glyphFilter->GetOutput();
100  std::cout << "Selected " << selected->GetNumberOfPoints() << " points." << std::endl;
101  std::cout << "Selected " << selected->GetNumberOfCells() << " cells." << std::endl;
102 #if VTK_MAJOR_VERSION <= 5
103  d->SelectedMapper->SetInput(selected);
104 #else
105  d->SelectedMapper->SetInputData(selected);
106 #endif
107  d->SelectedMapper->ScalarVisibilityOff();
108 
109  d->ids.clear();
110  vtkIdTypeArray* ids = vtkIdTypeArray::SafeDownCast(selected->GetPointData()->GetArray("OriginalIds"));
111  if(ids){
112  for(vtkIdType i = 0; i < ids->GetNumberOfTuples(); i++)
113  {
114  std::cout << "Id " << i << " : " << ids->GetValue(i) << std::endl;
115  d->ids.append(ids->GetValue(i));
116  }
117  }
118 
119  d->SelectedActor->GetProperty()->SetColor(1.0, 0.0, 0.0); //(R,G,B)
120  d->SelectedActor->GetProperty()->SetPointSize(3);
121 
122  this->CurrentRenderer->AddActor(d->SelectedActor);
123 
124  this->GetInteractor()->GetRenderWindow()->Render();
125  this->HighlightProp(NULL);
126 
127  emit IdsSelectedChanged();
128 }
129 
130 void axlInteractorStyleRubberBandPick::SetPolyData(vtkSmartPointer<vtkPolyData> points){
131 
132  vtkSmartPointer<vtkFeatureEdges> featureEdges =
133  vtkSmartPointer<vtkFeatureEdges>::New();
134 #if (VTK_MAJOR_VERSION <= 5)
135  featureEdges->SetInput(points);
136 #else
137  featureEdges->SetInputData(points);
138 #endif
139  featureEdges->BoundaryEdgesOn();
140  featureEdges->FeatureEdgesOff();
141  featureEdges->ManifoldEdgesOff();
142  featureEdges->NonManifoldEdgesOff();
143  featureEdges->Update();
144 
145 // vtkSmartPointer<vtkPolyDataMapper> edgeMapper =
146 // vtkSmartPointer<vtkPolyDataMapper>::New();
147 // edgeMapper->SetInputConnection(featureEdges->GetOutputPort());
148 // vtkSmartPointer<vtkActor> edgeActor =
149 // vtkSmartPointer<vtkActor>::New();
150 // edgeActor->SetMapper(edgeMapper);
151 
152  vtkSmartPointer<vtkPolyData> poly = featureEdges->GetOutput();
153 
154  d->Points = poly;
155 }
156 
158  return d->ids;
159 }
160 
161 axlInteractorStyleRubberBandPick::axlInteractorStyleRubberBandPick(QObject *parent) : QObject(parent), d(new axlInteractorStyleRubberBandPickPrivate)
162 {
163  d->SelectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();
164  d->SelectedActor = vtkSmartPointer<vtkActor>::New();
165  d->SelectedActor->SetMapper(d->SelectedMapper);
166 }
167 
169 {
170  delete d;
171  d = NULL;
172 }
void SetPolyData(vtkSmartPointer< vtkPolyData > points)
vtkStandardNewMacro(axlInteractorStyleRubberBandPick)