Developer documentation | Axl-2.5.1

axlInspectorToolCreatorEllipsoid.cpp
Go to the documentation of this file.
1 /* axlInspectorToolCreatorEllipsoid.cpp ---
2  *
3  * Author: Julien Wintz
4  * Copyright (C) 2008 - Julien Wintz, Inria.
5  * Created: Wed Mar 16 17:19:51 2011 (+0100)
6  * Version: $Id$
7  * Last-Updated: Wed Mar 16 17:38:31 2011 (+0100)
8  * By: Julien Wintz
9  * Update #: 31
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
23 
24 #include <axlCore/axlPoint.h>
25 #include <axlCore/axlEllipsoid.h>
27 #include <dtkCoreSupport/dtkAbstractProcessFactory.h>
28 #include <dtkCoreSupport/dtkAbstractProcess.h>
29 #include <dtkGuiSupport/dtkColorButton.h>
30 
31 #include <axlCore/axlDataDynamic.h>
33 
34 #include <QtGui>
35 
36 class axlInspectorToolCreatorEllipsoidPrivate {
37 public:
38  QSlider *sliderOpacity;
39  dtkColorButton *colorButton;
40  axlInspectorObjectController *controller;
41 
42  QDoubleSpinBox *center_x;
43  QDoubleSpinBox *center_y;
44  QDoubleSpinBox *center_z;
45  QDoubleSpinBox *semix;
46  QDoubleSpinBox *semix_x;
47  QDoubleSpinBox *semix_y;
48  QDoubleSpinBox *semix_z;
49  QDoubleSpinBox *semiy;
50  QDoubleSpinBox *semiy_x;
51  QDoubleSpinBox *semiy_y;
52  QDoubleSpinBox *semiy_z;
53  QDoubleSpinBox *semiz;
54  QDoubleSpinBox *semiz_x;
55  QDoubleSpinBox *semiz_y;
56  QDoubleSpinBox *semiz_z;
57 
58  QLabel *warningMessage;
59  QLabel *errorMessage;
60 
61  QGroupBox *centerGroupBox;
62  QGroupBox *semiXGroupBox;
63  QGroupBox *semiYGroupBox;
64  QGroupBox *semiZGroupBox;
65 
66  QLabel *messageToDisplay;
67 };
68 
69 axlInspectorToolCreatorEllipsoid::axlInspectorToolCreatorEllipsoid(QWidget *parent) : axlInspectorToolCreator(parent), d(new axlInspectorToolCreatorEllipsoidPrivate) {
70  QVBoxLayout *layout = new QVBoxLayout(this);
71 
72  //WARNING MESSAGE//
73  d->warningMessage = new QLabel("Warning: your axis have been orthogonalized.");
74  d->warningMessage->setStyleSheet("color: #FF6600;");
75  d->warningMessage->setVisible(false);
76 
77 
78  //ERROR MESSAGE//
79  d->errorMessage = new QLabel("Error: axis are parallele or nul.\nPlease check out your data and run again.");
80  d->errorMessage->setStyleSheet("color: #FF0000;");
81  d->errorMessage->setVisible(false);
82 
83 
84  //OPACITY//
85  d->sliderOpacity = new QSlider(Qt::Horizontal, this);
86 
87  QHBoxLayout *layoutOpacity = new QHBoxLayout;
88  layoutOpacity->addWidget(new QLabel("Opacity",this));
89  layoutOpacity->addWidget(d->sliderOpacity);
90  d->sliderOpacity->setMaximum(100);
91 
92 
93  //COLOR//
94  d->colorButton = new dtkColorButton(this);
95 
96  QHBoxLayout *layoutColorButton = new QHBoxLayout;
97  layoutColorButton->addWidget(new QLabel("Color",this));
98  layoutColorButton->addWidget(d->colorButton);
99  d->colorButton->setColor(QColor("#a0a0a4"));
100 
102  d->center_x = new QDoubleSpinBox(this);
103  d->center_x->setRange(-1000, 1000);
104  d->center_x->setValue(0.0);
105  d->center_x->setSingleStep(0.1);
106 
107  d->center_y = new QDoubleSpinBox(this);
108  d->center_y->setRange(-1000, 1000);
109  d->center_y->setValue(0.0);
110  d->center_y->setSingleStep(0.1);
111 
112  d->center_z = new QDoubleSpinBox(this);
113  d->center_z->setRange(-1000, 1000);
114  d->center_z->setValue(0.0);
115  d->center_z->setSingleStep(0.1);
116 
117  QHBoxLayout *layoutCenter_x = new QHBoxLayout;
118  layoutCenter_x->addWidget(new QLabel("X",this));
119  layoutCenter_x->addWidget(d->center_x);
120 
121  QHBoxLayout *layoutCenter_y = new QHBoxLayout;
122  layoutCenter_y->addWidget(new QLabel("Y",this));
123  layoutCenter_y->addWidget(d->center_y);
124 
125  QHBoxLayout *layoutCenter_z = new QHBoxLayout;
126  layoutCenter_z->addWidget(new QLabel("Z",this));
127  layoutCenter_z->addWidget(d->center_z);
128 
129  QVBoxLayout* layoutCenter = new QVBoxLayout;
130  layoutCenter->addLayout(layoutCenter_x);
131  layoutCenter->addLayout(layoutCenter_y);
132  layoutCenter->addLayout(layoutCenter_z);
133 
134  d->centerGroupBox = new QGroupBox("Center");
135  d->centerGroupBox->setLayout(layoutCenter);
136 
137 
139  d->semix = new QDoubleSpinBox(this);
140  d->semix->setRange(-1000, 1000);
141  d->semix->setValue(1.00);
142  d->semix->setSingleStep(0.1);
143 
144  d->semix_x = new QDoubleSpinBox(this);
145  d->semix_x->setRange(-1000, 1000);
146  d->semix_x->setValue(1.0);
147  d->semix_x->setSingleStep(0.1);
148 
149  d->semix_y = new QDoubleSpinBox(this);
150  d->semix_y->setRange(-1000, 1000);
151  d->semix_y->setValue(0.0);
152  d->semix_y->setSingleStep(0.1);
153 
154  d->semix_z = new QDoubleSpinBox(this);
155  d->semix_z->setRange(-1000, 1000);
156  d->semix_z->setValue(0.0);
157  d->semix_z->setSingleStep(0.1);
158 
159  QHBoxLayout *layoutSemixRadius = new QHBoxLayout;
160  layoutSemixRadius->addWidget(new QLabel("X radius", this));
161  layoutSemixRadius->addWidget(d->semix);
162 
163  QHBoxLayout *layoutSemix_x = new QHBoxLayout;
164  layoutSemix_x->addWidget(new QLabel("X",this));
165  layoutSemix_x->addWidget(d->semix_x);
166 
167  QHBoxLayout *layoutSemix_y = new QHBoxLayout;
168  layoutSemix_y->addWidget(new QLabel("Y",this));
169  layoutSemix_y->addWidget(d->semix_y);
170 
171  QHBoxLayout *layoutSemix_z = new QHBoxLayout;
172  layoutSemix_z->addWidget(new QLabel("Z",this));
173  layoutSemix_z->addWidget(d->semix_z);
174 
175  QVBoxLayout* layoutSemiX = new QVBoxLayout;
176  layoutSemiX->addLayout(layoutSemixRadius);
177  layoutSemiX->addLayout(layoutSemix_x);
178  layoutSemiX->addLayout(layoutSemix_y);
179  layoutSemiX->addLayout(layoutSemix_z);
180 
181  d->semiXGroupBox = new QGroupBox("Semi Axis X");
182  d->semiXGroupBox->setLayout(layoutSemiX);
183 
184 
186  d->semiy = new QDoubleSpinBox(this);
187  d->semiy->setRange(-1000, 1000);
188  d->semiy->setValue(1.00);
189  d->semiy->setSingleStep(0.1);
190 
191  d->semiy_x = new QDoubleSpinBox(this);
192  d->semiy_x->setRange(-1000, 1000);
193  d->semiy_x->setValue(0.0);
194  d->semiy_x->setSingleStep(0.1);
195 
196  d->semiy_y = new QDoubleSpinBox(this);
197  d->semiy_y->setRange(-1000, 1000);
198  d->semiy_y->setValue(1.0);
199  d->semiy_y->setSingleStep(0.1);
200 
201  d->semiy_z = new QDoubleSpinBox(this);
202  d->semiy_z->setRange(-1000, 1000);
203  d->semiy_z->setValue(0.0);
204  d->semiy_z->setSingleStep(0.1);
205 
206  QHBoxLayout *layoutSemiyRadius = new QHBoxLayout;
207  layoutSemiyRadius->addWidget(new QLabel("Y radius", this));
208  layoutSemiyRadius->addWidget(d->semiy);
209 
210  QHBoxLayout *layoutSemiy_x = new QHBoxLayout;
211  layoutSemiy_x->addWidget(new QLabel("X",this));
212  layoutSemiy_x->addWidget(d->semiy_x);
213 
214  QHBoxLayout *layoutSemiy_y = new QHBoxLayout;
215  layoutSemiy_y->addWidget(new QLabel("Y",this));
216  layoutSemiy_y->addWidget(d->semiy_y);
217 
218  QHBoxLayout *layoutSemiy_z = new QHBoxLayout;
219  layoutSemiy_z->addWidget(new QLabel("Z",this));
220  layoutSemiy_z->addWidget(d->semiy_z);
221 
222  QVBoxLayout* layoutSemiY = new QVBoxLayout;
223  layoutSemiY->addLayout(layoutSemiyRadius);
224  layoutSemiY->addLayout(layoutSemiy_x);
225  layoutSemiY->addLayout(layoutSemiy_y);
226  layoutSemiY->addLayout(layoutSemiy_z);
227 
228  d->semiYGroupBox = new QGroupBox("Semi Axis Y");
229  d->semiYGroupBox->setLayout(layoutSemiY);
230 
231 
233  d->semiz = new QDoubleSpinBox(this);
234  d->semiz->setRange(-1000, 1000);
235  d->semiz->setValue(1.00);
236  d->semiz->setSingleStep(0.1);
237 
238  d->semiz_x = new QDoubleSpinBox(this);
239  d->semiz_x->setRange(-1000, 1000);
240  d->semiz_x->setValue(0.0);
241  d->semiz_x->setSingleStep(0.1);
242 
243  d->semiz_y = new QDoubleSpinBox(this);
244  d->semiz_y->setRange(-1000, 1000);
245  d->semiz_y->setValue(0.0);
246  d->semiz_y->setSingleStep(0.1);
247 
248  d->semiz_z = new QDoubleSpinBox(this);
249  d->semiz_z->setRange(-1000, 1000);
250  d->semiz_z->setValue(1.0);
251  d->semiz_z->setSingleStep(0.1);
252 
253  QHBoxLayout *layoutSemizRadius = new QHBoxLayout;
254  layoutSemizRadius->addWidget(new QLabel("Z radius", this));
255  layoutSemizRadius->addWidget(d->semiz);
256 
257  QHBoxLayout *layoutSemiz_x = new QHBoxLayout;
258  layoutSemiz_x->addWidget(new QLabel("X",this));
259  layoutSemiz_x->addWidget(d->semiz_x);
260 
261  QHBoxLayout *layoutSemiz_y = new QHBoxLayout;
262  layoutSemiz_y->addWidget(new QLabel("Y",this));
263  layoutSemiz_y->addWidget(d->semiz_y);
264 
265  QHBoxLayout *layoutSemiz_z = new QHBoxLayout;
266  layoutSemiz_z->addWidget(new QLabel("Z",this));
267  layoutSemiz_z->addWidget(d->semiz_z);
268 
269  QVBoxLayout* layoutSemiZ = new QVBoxLayout;
270  layoutSemiZ->addLayout(layoutSemizRadius);
271  layoutSemiZ->addLayout(layoutSemiz_x);
272  layoutSemiZ->addLayout(layoutSemiz_y);
273  layoutSemiZ->addLayout(layoutSemiz_z);
274 
275  d->semiZGroupBox = new QGroupBox("Semi Axis Z");
276  d->semiZGroupBox->setLayout(layoutSemiZ);
277 
279  d->messageToDisplay = new QLabel("",this);
280  axlEllipsoidCreator *creator = new axlEllipsoidCreator();
281  d->messageToDisplay->setText(creator->description());
282  delete creator;
283  d->messageToDisplay->setStyleSheet("color: #ff0000;");
284 
286  QPushButton *button = new QPushButton("Create", this);
287  connect(button, SIGNAL(clicked()), this, SLOT(run()));
288 
289 
291  layout->addWidget(new QLabel("axlInspectorToolCreatorEllipsoid", this));
292  layout->addWidget(d->messageToDisplay);
293  layout->addWidget(d->centerGroupBox);
294  layout->addWidget(d->semiXGroupBox);
295  layout->addWidget(d->semiYGroupBox);
296  layout->addWidget(d->semiZGroupBox);
297 
298  layout->addLayout(layoutOpacity);
299  layout->addLayout(layoutColorButton);
300  layout->addWidget(d->warningMessage);
301  layout->addWidget(d->errorMessage);
302  layout->addWidget(button);
303 
304 
306  connect(d->semix_x, SIGNAL(valueChanged(double)), this, SLOT(onUpdateRadiusX(double)));
307  connect(d->semix_y, SIGNAL(valueChanged(double)), this, SLOT(onUpdateRadiusX(double)));
308  connect(d->semix_z, SIGNAL(valueChanged(double)), this, SLOT(onUpdateRadiusX(double)));
309 
310  connect(this, SIGNAL(radiusXUpdated(double)), d->semix, SLOT(setValue(double)));
311  connect(d->semix, SIGNAL(valueChanged(double)), this, SLOT(onUpdateSemix(double)));
312 
313  connect(d->semiy_x, SIGNAL(valueChanged(double)), this, SLOT(onUpdateRadiusY(double)));
314  connect(d->semiy_y, SIGNAL(valueChanged(double)), this, SLOT(onUpdateRadiusY(double)));
315  connect(d->semiy_z, SIGNAL(valueChanged(double)), this, SLOT(onUpdateRadiusY(double)));
316 
317  connect(this, SIGNAL(radiusYUpdated(double)), d->semiy, SLOT(setValue(double)));
318  connect(d->semiy, SIGNAL(valueChanged(double)), this, SLOT(onUpdateSemiy(double)));
319 
320  connect(d->semiz_x, SIGNAL(valueChanged(double)), this, SLOT(onUpdateRadiusZ(double)));
321  connect(d->semiz_y, SIGNAL(valueChanged(double)), this, SLOT(onUpdateRadiusZ(double)));
322  connect(d->semiz_z, SIGNAL(valueChanged(double)), this, SLOT(onUpdateRadiusZ(double)));
323 
324  connect(this, SIGNAL(radiusZUpdated(double)), d->semiz, SLOT(setValue(double)));
325  connect(d->semiz, SIGNAL(valueChanged(double)), this, SLOT(onUpdateSemiz(double)));
326 
327  d->centerGroupBox->hide();
328  d->semiXGroupBox->hide();
329  d->semiYGroupBox->hide();
330  d->semiZGroupBox->hide();
331 
332 }
333 
335  delete d;
336  d = NULL;
337 }
338 
340  d->controller = controller;
341  if(d->controller->size() < 4){
342  d->messageToDisplay->hide();
343  d->centerGroupBox->show();
344  d->semiXGroupBox->show();
345  d->semiYGroupBox->show();
346  d->semiZGroupBox->show();
347  }else{
348  d->centerGroupBox->hide();
349  d->semiXGroupBox->hide();
350  d->semiYGroupBox->hide();
351  d->semiZGroupBox->hide();
352  bool hasRigthType = false;
353  int nbRigthType = 0;
354  foreach(axlInspectorObjectManagerTreeItem *item, d->controller->items()){
355  if(dynamic_cast<axlPoint *>(d->controller->data(item)))
356  nbRigthType++;
357  else if(dynamic_cast<axlDataDynamic *>(d->controller->data(item)))
358  if(dynamic_cast<axlDataDynamic *>(d->controller->data(item))->outputs())
359  if(dynamic_cast<axlPoint *>(dynamic_cast<axlDataDynamic *>(d->controller->data(item))->outputs()))
360  nbRigthType++;
361  }
362 
363  if(nbRigthType > 3)
364  hasRigthType = true;
365  if(!hasRigthType){
366  d->messageToDisplay->hide();
367  d->centerGroupBox->show();
368  d->semiXGroupBox->show();
369  d->semiYGroupBox->show();
370  d->semiZGroupBox->show();
371  }
372  }
373 }
374 
375 
377  QList<axlAbstractData *> list;
378  if(d->centerGroupBox->isVisible()){
379  axlPoint *center = new axlPoint(d->center_x->value(), d->center_y->value(), d->center_z->value());
380  axlPoint *semiX = new axlPoint(d->semix_x->value(), d->semix_y->value(), d->semix_z->value());
381  axlPoint *semiY = new axlPoint(d->semiy_x->value(), d->semiy_y->value(), d->semiy_z->value());
382  axlPoint *semiZ = new axlPoint(d->semiz_x->value(), d->semiz_y->value(), d->semiz_z->value());
383 
384  list << center << semiX << semiY << semiZ;
385  }
386  return list;
387 
388 
389 }
390 
392  axlPoint semix(d->semix_x->value(), d->semix_y->value(), d->semix_z->value());
393  axlPoint startSemix(semix);
394  double semixRadius = semix.norm();
395  semix.normalize();
396 
397  axlPoint semiy(d->semiy_x->value(), d->semiy_y->value(), d->semiy_z->value());
398  axlPoint startSemiy(semiy);
399  double semiyRadius = semiy.norm();
400  semiy.normalize();
401 
402  axlPoint semiz(d->semiz_x->value(), d->semiz_y->value(), d->semiz_z->value());
403  axlPoint startSemiz(semiz);
404  double semizRadius = semiz.norm();
405  semiz.normalize();
406 
407  if (semix.norm() < 0.001) {
408  axlPoint pv = axlPoint::crossProduct(semiy, semiz);
409  if (pv.norm() < 0.001) {
410  status = 2;
411  return;
412  } else {
413  semix = pv;
414  semix.normalize();
415  semiy = axlPoint::crossProduct(semiz, semix);
416  semiy.normalize();
417  }
418  } else {
419  axlPoint pv = axlPoint::crossProduct(semix, semiy);
420  if (pv.norm() < 0.001) {
421  pv = axlPoint::crossProduct(semiz, semix);
422  if (pv.norm() < 0.001) {
423  status = 2;
424  return;
425  } else {
426  semiy = pv;
427  semiy.normalize();
428  semiz = axlPoint::crossProduct(semix, semiy);
429  semiz.normalize();
430  }
431  } else {
432  semiz = pv;
433  semiz.normalize();
434  semiy = axlPoint::crossProduct(semiz, semix);
435  semiy.normalize();
436  }
437  }
438 
439  semix *= semixRadius;
440  d->semix_x->setValue(semix.x());
441  d->semix_y->setValue(semix.y());
442  d->semix_z->setValue(semix.z());
443  semiy *= semiyRadius;
444  d->semiy_x->setValue(semiy.x());
445  d->semiy_y->setValue(semiy.y());
446  d->semiy_z->setValue(semiy.z());
447  semiz *= semizRadius;
448  d->semiz_x->setValue(semiz.x());
449  d->semiz_y->setValue(semiz.y());
450  d->semiz_z->setValue(semiz.z());
451 
452  if (axlPoint::distance(&startSemix, &semix) < 0.001
453  && axlPoint::distance(&startSemiy, &semiy) < 0.001
454  && axlPoint::distance(&startSemiz, &semiz) < 0.001) {
455  status = 0;
456  } else {
457  status = 1;
458  }
459 }
460 
462  emit radiusXUpdated(
463  sqrt(
464  d->semix_x->value()*d->semix_x->value()
465  + d->semix_y->value()*d->semix_y->value()
466  + d->semix_z->value()*d->semix_z->value()
467  )
468  );
469 }
470 
472  emit radiusYUpdated(
473  sqrt(
474  d->semiy_x->value()*d->semiy_x->value()
475  + d->semiy_y->value()*d->semiy_y->value()
476  + d->semiy_z->value()*d->semiy_z->value()
477  )
478  );
479 }
480 
482  emit radiusZUpdated(
483  sqrt(
484  d->semiz_x->value()*d->semiz_x->value()
485  + d->semiz_y->value()*d->semiz_y->value()
486  + d->semiz_z->value()*d->semiz_z->value()
487  )
488  );
489 }
490 
492  axlPoint semix(d->semix_x->value(), d->semix_y->value(), d->semix_z->value());
493 
494  semix.normalize();
495  semix *= radius;
496 
497  d->semix_x->setValue(semix.x());
498  d->semix_y->setValue(semix.y());
499  d->semix_z->setValue(semix.z());
500 }
501 
503  axlPoint semiy(d->semiy_x->value(), d->semiy_y->value(), d->semiy_z->value());
504 
505  semiy.normalize();
506  semiy *= radius;
507 
508  d->semiy_x->setValue(semiy.x());
509  d->semiy_y->setValue(semiy.y());
510  d->semiy_z->setValue(semiy.z());
511 }
512 
514  axlPoint semiz(d->semiz_x->value(), d->semiz_y->value(), d->semiz_z->value());
515 
516  semiz.normalize();
517  semiz *= radius;
518 
519  d->semiz_x->setValue(semiz.x());
520  d->semiz_y->setValue(semiz.y());
521  d->semiz_z->setValue(semiz.z());
522 }
523 
525  int status = -1;
526  orthogonalise(status);
527 
528  d->warningMessage->setVisible(status == 1);
529  d->errorMessage->setVisible(status == 2);
530 
531  if (status == 2) {
532  return;
533  } else {
534 
535 
536  if(!d->centerGroupBox->isVisible()){
537  // all group box are hidden or visible at the same time.
538  d->messageToDisplay->show();
539  axlEllipsoidCreator *creator = new axlEllipsoidCreator();
540  int nbPoints = 0;
541  if(!(d->controller->size()==0)) {
542  foreach(axlInspectorObjectManagerTreeItem *item, d->controller->items()){
543 
544  if(item->text(2) == "Selected"|| item->text(2) == "Editable")
545  {
546  if(nbPoints < 4){
547  if(dynamic_cast<axlPoint *>(d->controller->data(item))) {
548  axlPoint *point = dynamic_cast<axlPoint *>(d->controller->data(item));
549  creator->setInput(point,nbPoints);
550  nbPoints++;
551  }
552  } else {
553  qDebug() << "To many inputs selected, only the two first points were used";
554  }
555  }
556  }
557  }
558 
559  if(nbPoints == 4) {
560  creator->update();
561  axlEllipsoid *ellipse = dynamic_cast<axlEllipsoid *>(creator->output());
562  ellipse->setColor(d->colorButton->color());
563  double opacity = 1.0 - 0.01 * d->sliderOpacity->value();
564  ellipse->setOpacity(opacity);
565  emit dataInserted(ellipse);
566 
567  } else {
568  //display the coordinates to be chosen for the extremal points
569  d->messageToDisplay->hide();
570  d->centerGroupBox->show();
571  d->semiXGroupBox->show();
572  d->semiYGroupBox->show();
573  d->semiZGroupBox->show();
574  }
575  delete creator;
576  } else {
577 
578  d->messageToDisplay->hide();
579 
580  axlPoint *center = new axlPoint(d->center_x->value(), d->center_y->value(), d->center_z->value());
581 
582  axlPoint *semiX = new axlPoint(d->semix_x->value(), d->semix_y->value(), d->semix_z->value());
583  axlPoint *semiY = new axlPoint(d->semiy_x->value(), d->semiy_y->value(), d->semiy_z->value());
584  axlPoint *semiZ = new axlPoint(d->semiz_x->value(), d->semiz_y->value(), d->semiz_z->value());
585 
586  axlEllipsoid* ellipsoid = new axlEllipsoid(center, semiX, semiY, semiZ);
587 
588  double opacity = 1.0 - 0.01 * d->sliderOpacity->value();
589 
590  ellipsoid->setColor(d->colorButton->color());
591  ellipsoid->setOpacity(opacity);
592  emit dataInserted(ellipsoid);
593  d->centerGroupBox->hide();
594  d->semiXGroupBox->hide();
595  d->semiYGroupBox->hide();
596  d->semiZGroupBox->hide();
597  }
598  }
599 }
600 
603 }
Class axlPoint defines 3D points.
Definition: axlPoint.h:34
virtual QString description(void) const
virtual int update(void)
void setController(axlInspectorObjectController *controller)
virtual dtkAbstractData * output(void)
void radiusXUpdated(double radiusX)
void dataInserted(axlAbstractData *data)
void normalize(void)
Definition: axlPoint.cpp:410
void radiusYUpdated(double radiusY)
double norm(void) const
Definition: axlPoint.cpp:450
QList< axlAbstractData * > returnInputsList(void)
axlInspectorToolInterface * createaxlInspectorToolCreatorEllipsoid(void)
virtual void setInput(dtkAbstractData *newData, int channel)
void setOpacity(const double &opacity)
static axlPoint crossProduct(const axlPoint &lhs, const axlPoint &rhs)
Returns the cross product between lhs (coords) and rhs (coords).
Definition: axlPoint.cpp:485
void radiusZUpdated(double radiusZ)
void setColor(double r, double g, double b)
static double distance(const axlPoint &lhs, const axlPoint &rhs)
Returns the distance between lhs point and rhs point.
Definition: axlPoint.cpp:459
Class axlEllipsoid defines 3D ellipsoids.
Definition: axlEllipsoid.h:35