Developer documentation | Axl-2.5.1

axlActorBSpline.cpp
Go to the documentation of this file.
1 /* axlActorBSpline.cpp ---
2  *
3  * Author: Meriadeg Perrinel
4  * Copyright (C) 2008 - Meriadeg Perrinel, Inria.
5  * Created: Fri Dec 17 10:59:21 2010 (+0100)
6  * Version: $Id$
7  * Last-Updated: Mon Dec 17 14:02:41 2012 (+0100)
8  * By: Julien Wintz
9  * Update #: 86
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
20 #include "axlActorBSpline.h"
21 #include "axlActorComposite.h"
22 #include "axlControlPointsWidget.h"
23 #include "axlActorCurveBSpline.h"
24 
25 #include <axlCore/axlPoint.h>
30 
31 #include <vtkActor.h>
32 #include <vtkActorCollection.h>
33 #include <vtkCommand.h>
34 #include <vtkPolyDataMapper.h>
35 #include <vtkDataSetMapper.h>
36 #include <vtkPolyData.h>
37 #include <vtkUnstructuredGrid.h>
38 #include <vtkProperty.h>
39 #include <vtkRenderWindowInteractor.h>
40 #include <vtkSmartPointer.h>
41 #include <vtkSphereSource.h>
42 #include <vtkVersion.h>
43 
44 // /////////////////////////////////////////////////////////////////
45 // axlActorBSplinePrivate
46 // /////////////////////////////////////////////////////////////////
47 
48 class axlActorBSplinePrivate
49 {
50 public:
51  axlControlPointsWidget *controlPoints;
52  vtkSmartPointer<vtkSphereSource> sphereParam;
53  vtkSmartPointer<vtkDataSetMapper> mapperSphereParam;
54  vtkSmartPointer<vtkActor> actorSphereParam;
55 };
56 
57 void axlActorBSpline::setDisplay(bool display)
58 {
59  axlActor::setDisplay(display);
60 
61  if(display && this->getControlPoints()){
62  this->showControlPoints(true);
63  }
64 
65  if(!display && this->getControlPoints()){
66  this->showControlPoints(false);
67  }
68 }
69 
71 {
72  d->sphereParam = vtkSmartPointer<vtkSphereSource>::New();
73  d->sphereParam->SetPhiResolution(20);
74  d->sphereParam->SetThetaResolution(20);
75  d->sphereParam->SetRadius(0.05);
76  d->sphereParam->SetCenter(0.0, 0.0, 0.0);
77 
78  d->mapperSphereParam = vtkSmartPointer<vtkDataSetMapper>::New();
79 #if (VTK_MAJOR_VERSION <= 5)
80  d->mapperSphereParam->SetInput(d->sphereParam->GetOutput());
81 #else
82  d->mapperSphereParam->SetInputData(d->sphereParam->GetOutput());
83 #endif
84 
85  d->actorSphereParam = vtkSmartPointer<vtkActor>::New();
86  d->actorSphereParam->SetMapper(d->mapperSphereParam);
87  d->actorSphereParam->SetVisibility(false);
88 
89  this->AddPart(d->actorSphereParam);
90 }
91 
92 void axlActorBSpline::setMode(int state)
93 {
94  this->onModeChanged(state);
95 
96  emit stateChanged(this->data(), state);
97 }
98 
100 {
101  if(!this->getControlPoints()) {
102  qDebug() << "No tet actor computed for this axlActorBSpline.";
103  return;
104  }
105 
106  if(show){
107  this->getControlPoints()->SetEnabled(1);
108  }
109 
110  if(!show){
111  this->getControlPoints()->SetEnabled(0);
112  }
113 
114 }
115 
117 {
118  if(control) {
119 
120  if (!this->getControlPoints()) {
121  //widget drawing
123  this->getControlPoints()->SetInteractor(this->getInteractor());
124  this->getControlPoints()->SetProp3D(this->getActor());
125  this->getControlPoints()->setSpline(this->data());
127  this->getControlPoints()->PlaceWidget();
128 
129  this->AddPart(this->getControlPoints()->netActor());
130 
131  this->getControlPoints()->ptsActors()->InitTraversal();
132 
133  for (vtkIdType i = 0; i < this->getControlPoints()->ptsActors()->GetNumberOfItems(); i++) {
134  this->AddPart(this->getControlPoints()->ptsActors()->GetNextActor());
135  }
136  }
137 
138  if (this->getObserver()) {
139  this->addToObserver(vtkCommand::InteractionEvent, (vtkCommand *)this->getObserver());
140  }
141 
142  //there is always the controlPoints here
143  this->getControlPoints()->SetEnabled(true);
144  }
145 
146  if (!control) {
147  if (this->getActor()) {
148  if (this->getObserver()) {
149 
150 #if (VTK_MAJOR_VERSION <= 5)
151  if (dynamic_cast<axlAbstractVolumeBSpline *> (this->getObserverData())) {
152  this->getDataSetMapper()->SetInput(this->getUnstructuredGrid());
153  } else if (axlActorCurveBSpline* c = dynamic_cast<axlActorCurveBSpline *> (this)) {
154  this->getMapper()->SetInputData(c->getCurveMapperInput());
155  } else {
156  this->getMapper()->SetInputData(this->getPolyData());
157  }
158 #else
159  if (dynamic_cast<axlAbstractVolumeBSpline *> (this->getObserverData())) {
160  this->getDataSetMapper()->SetInputData(this->getUnstructuredGrid());
161  } else if (axlActorCurveBSpline* c = dynamic_cast<axlActorCurveBSpline *> (this)) {
162  this->getMapper()->SetInputData(c->getCurveMapperInput());
163  } else
164  this->getMapper()->SetInputData(this->getPolyData());
165 #endif
166  }
167 
168  // if the control points are existing, just remove them
169  if (this->getControlPoints()) {
170  this->RemovePart(this->getControlPoints()->netActor());
171  this->getControlPoints()->ptsActors()->InitTraversal();
172  for (vtkIdType i = 0; i < this->getControlPoints()->ptsActors()->GetNumberOfItems(); i++) {
173  this->RemovePart(this->getControlPoints()->ptsActors()->GetNextActor());
174  }
175 
176  this->getControlPoints()->SetEnabled(false);
177  this->getControlPoints()->Delete(); // warning not sure
178  this->setControlPoints(NULL);
179  }
180  }
181  }
182 }
183 
185 {
186  if(!this->getControlPoints()) {
187  qDebug() << "No tet actor computed for this axlActorBSpline.";
188  return false;
189  }
190 
191  return this->getControlPoints()->GetEnabled();
192 }
193 
195 {
196  return d->controlPoints;
197 }
198 
200 {
201  d->controlPoints = controlPoints;
202 }
203 
205 {
206 
207  if(state == 0)
208  {
210  this->getActor()->SetPickable(1);
211  this->getActor()->SetDragable(1);
212 
213  if(axlAbstractData *data = dynamic_cast<axlAbstractData *>(this->data()))
214  {
215  QColor color = data->color();
216  this->getActor()->GetProperty()->SetColor(color.redF(), color.greenF(), color.blueF());
217  }
218 
219  this->setControlPolygon(false);
220  }
221  else if(state == 1)
222  {
224  this->setControlPolygon(false);
225  this->getActor()->SetPickable(1);
226  this->getActor()->SetDragable(1);
227  vtkProperty *prop = this->getActor()->GetProperty();
228 
229  if(axlAbstractData *data = dynamic_cast<axlAbstractData *>(this->data()))
230  {
231  QColor color = data->color();
232  qreal *h = new qreal(0.0);
233  qreal *s = new qreal(0.0);
234  qreal *l = new qreal(0.0);
235  color.getHslF(h, s, l);
236  color.setHslF(*h, *s, *l + (1.0 - *l) / 2.0);
237  prop->SetColor(color.redF(), color.greenF(), color.blueF());
238  }
239 
240  }
241  else if(state == 2)
242  {
244  this->setControlPolygon(true);
245  this->getActor()->SetPickable(0);
246  this->getActor()->SetDragable(0);
247  vtkProperty *prop = this->getActor()->GetProperty();
248  if(axlAbstractData *data = dynamic_cast<axlAbstractData *>(this->data()))
249  {
250  QColor color = data->color();
251  qreal *h = new qreal(0.0);
252  qreal *s = new qreal(0.0);
253  qreal *l = new qreal(0.0);
254  color.getHslF(h, s, l);
255  color.setHslF(*h, *s, *l + (1.0 - *l)/2.0);
256  prop->SetColor(color.redF(), color.greenF(), color.blueF());
257  }
258  }
259 
260  this->Modified();
261 }
262 
264 {
265  this->onSamplingChanged();
266 }
267 
268 void axlActorBSpline::addToObserver(int idEvent, vtkCommand *observer)
269 {
270  this->getControlPoints()->AddObserver(idEvent, observer);
271 }
272 
273 
274 void axlActorBSpline::showCurrentPoint(double u, double v, dtkAbstractData *data)
275 {
276  if(data == this->data())
277  {
278  d->actorSphereParam->SetVisibility(true);
279  d->actorSphereParam->Modified();
280  }
281 }
282 
283 void axlActorBSpline::moveCurrentPoint(double u, double v, dtkAbstractData *data)
284 {
285  if(data == this->data())
286  {
287  axlPoint point;
288 
289  if(axlAbstractCurveBSpline *curve = dynamic_cast<axlAbstractCurveBSpline *>(this->data()))
290  point = curve->eval(u);
291 
292  if(axlAbstractSurfaceBSpline *surface = dynamic_cast<axlAbstractSurfaceBSpline *>(this->data()))
293  point = surface->eval(u,v);
294 
295  d->actorSphereParam->SetPosition(point.x(), point.y(), point.z());
296 
297  d->actorSphereParam->Modified();
298  }
299 }
300 
301 void axlActorBSpline::hideCurrentPoint(double u, double v, dtkAbstractData *data)
302 {
303  if(data == this->data())
304  {
305  d->actorSphereParam->SetVisibility(false);
306 
307  d->actorSphereParam->Modified();
308  }
309 }
311 {
312  this->deleteObserver();
313  this->RemoveAllObservers();
314  this->RemovePart(this->getActor());
315  this->getActor()->RemoveAllObservers();
316 
317  if(axlActorComposite *actorComposite = dynamic_cast<axlActorComposite *>(this->parent()) )
318  actorComposite->removeActorReference(this);
319 
320  if(d->controlPoints)
321  this->setControlPolygon(false);
322 }
323 
324 
325 axlActorBSpline::axlActorBSpline(void) : axlActor(), d(new axlActorBSplinePrivate)
326 {
327  d->controlPoints = NULL;
328 }
329 
331 {
332  delete d;
333 
334  d = NULL;
335 }
virtual void initCurrentPoint(void)
Class axlPoint defines 3D points.
Definition: axlPoint.h:34
virtual void setDisplay(bool display)
Definition: axlActor.cpp:440
virtual axlControlPointsWidget * getControlPoints(void)
vtkActorCollection * ptsActors(void)
void stateChanged(dtkAbstractData *data, int mode)
virtual void setMode(int state)
dtkAbstractData * getObserverData(void)
Definition: axlActor.cpp:270
vtkSmartPointer< vtkPolyData > getPolyData(void)
Definition: axlActor.cpp:295
virtual void onModeChanged(int state)
virtual void setState(int state)
Definition: axlActor.cpp:434
virtual void setControlPolygon(bool control)
virtual dtkAbstractData * data(void)=0
virtual void setDisplay(bool display)
static axlControlPointsWidget * New()
void deleteObserver(void)
Definition: axlActor.cpp:405
virtual void showControlPoints(bool show)
virtual void hideCurrentPoint(double u, double v, dtkAbstractData *data)
virtual axlAbstractActor * parent(void)
virtual void moveCurrentPoint(double u, double v, dtkAbstractData *data)
virtual void onControlPointChanged()
virtual bool isShowControlPoints(void)
vtkSmartPointer< vtkUnstructuredGrid > getUnstructuredGrid(void)
Definition: axlActor.cpp:376
vtkSmartPointer< vtkDataSetMapper > getDataSetMapper(void)
Definition: axlActor.cpp:347
vtkSmartPointer< vtkActor > getActor(void)
Definition: axlActor.cpp:317
double y
Definition: axlPoint.h:37
vtkSmartPointer< vtkPolyDataMapper > getMapper(void)
Definition: axlActor.cpp:327
virtual void onSamplingChanged(void)
double z
Definition: axlPoint.h:38
virtual void addToObserver(int idEvent, vtkCommand *observer)
axlActorControlPolygonObserver * getObserver(void)
Definition: axlActor.cpp:366
double x
Definition: axlPoint.h:37
virtual vtkRenderWindowInteractor * getInteractor(void)
Definition: axlActor.cpp:264
void PlaceWidget(double bounds[6]) override
Class axlAbstractData defines an API for all type of axel data.
virtual void setControlPoints(axlControlPointsWidget *controlPoints)
virtual void showCurrentPoint(double u, double v, dtkAbstractData *data)
virtual void onRemoved(void)
void setSpline(dtkAbstractData *spline)