Developer documentation | Axl-2.5.1

axlInspectorToolCreatorCylinder.cpp
Go to the documentation of this file.
1 /* axlInspectorToolCreatorCylinder.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/axlCylinder.h>
27 #include <dtkCoreSupport/dtkAbstractProcessFactory.h>
28 #include <dtkCoreSupport/dtkAbstractProcess.h>
29 #include <dtkGuiSupport/dtkColorButton.h>
30 
31 #include <axlCore/axlDataDynamic.h>
33 #include <axlCore/axlDouble.h>
34 
35 #include <QtGui>
36 
37 class axlInspectorToolCreatorCylinderPrivate
38 {
39 public:
40  QSlider *sliderOpacity;
41  dtkColorButton *colorButton;
42  axlInspectorObjectController *controller;
43 
44  QDoubleSpinBox *spinBoxCoordinateFirst_x;
45  QDoubleSpinBox *spinBoxCoordinateFirst_y;
46  QDoubleSpinBox *spinBoxCoordinateFirst_z;
47 
48  QDoubleSpinBox *spinBoxCoordinateSecond_x;
49  QDoubleSpinBox *spinBoxCoordinateSecond_y;
50  QDoubleSpinBox *spinBoxCoordinateSecond_z;
51 
52  QDoubleSpinBox *spinBoxRadius;
53  QGroupBox *coordinates;
54 
55  QLabel *messageToDisplay;
56 };
57 
58 axlInspectorToolCreatorCylinder::axlInspectorToolCreatorCylinder(QWidget *parent) : axlInspectorToolCreator(parent), d(new axlInspectorToolCreatorCylinderPrivate)
59 {
60  QVBoxLayout *layout = new QVBoxLayout(this);
61 
62  //OPACITY//
63  d->sliderOpacity = new QSlider(Qt::Horizontal, this);
64 
65  QHBoxLayout *layoutOpacity = new QHBoxLayout;
66  layoutOpacity->addWidget(new QLabel("Opacity",this));
67  layoutOpacity->addWidget(d->sliderOpacity);
68  d->sliderOpacity->setMaximum(100);
69 
70  //COLOR//
71  d->colorButton = new dtkColorButton(this);
72 
73  QHBoxLayout *layoutColorButton = new QHBoxLayout;
74  layoutColorButton->addWidget(new QLabel("Color",this));
75  layoutColorButton->addWidget(d->colorButton);
76  d->colorButton->setColor(QColor("#a0a0a4"));
77 
78 
79  QVBoxLayout *layoutCoordonate = new QVBoxLayout();
80  QHBoxLayout *layoutCoordinateFirst_x = new QHBoxLayout();
81  QHBoxLayout *layoutCoordinateFirst_y = new QHBoxLayout();
82  QHBoxLayout *layoutCoordinateFirst_z = new QHBoxLayout();
83  QLabel *labelCoordinateFirst_x = new QLabel("x",this);
84  QLabel *labelCoordinateFirst_y = new QLabel("y",this);
85  QLabel *labelCoordinateFirst_z = new QLabel("z",this);
86  d->spinBoxCoordinateFirst_x = new QDoubleSpinBox(this);
87  d->spinBoxCoordinateFirst_y = new QDoubleSpinBox(this);
88  d->spinBoxCoordinateFirst_z = new QDoubleSpinBox(this);
89 
90  QHBoxLayout *layoutCoordinateSecond_x = new QHBoxLayout();
91  QHBoxLayout *layoutCoordinateSecond_y = new QHBoxLayout();
92  QHBoxLayout *layoutCoordinateSecond_z = new QHBoxLayout();
93  QLabel *labelCoordinateSecond_x = new QLabel("x",this);
94  QLabel *labelCoordinateSecond_y = new QLabel("y",this);
95  QLabel *labelCoordinateSecond_z = new QLabel("z",this);
96  d->spinBoxCoordinateSecond_x = new QDoubleSpinBox(this);
97  d->spinBoxCoordinateSecond_y = new QDoubleSpinBox(this);
98  d->spinBoxCoordinateSecond_z = new QDoubleSpinBox(this);
99 
100  QHBoxLayout *layoutRadius = new QHBoxLayout();
101  QLabel *labelRadius = new QLabel("radius :",this);
102  d->spinBoxRadius = new QDoubleSpinBox(this);
103 
104  d->spinBoxCoordinateFirst_x->setValue(0.0);
105  d->spinBoxCoordinateFirst_y->setValue(0.0);
106  d->spinBoxCoordinateFirst_z->setValue(0.0);
107 
108 
109  d->spinBoxCoordinateFirst_x->setRange(-1000, 1000);
110  d->spinBoxCoordinateFirst_y->setRange(-1000, 1000);
111  d->spinBoxCoordinateFirst_z->setRange(-1000, 1000);
112  layoutCoordinateFirst_x->addWidget(labelCoordinateFirst_x);
113  layoutCoordinateFirst_x->addWidget(d->spinBoxCoordinateFirst_x);
114  layoutCoordinateFirst_y->addWidget(labelCoordinateFirst_y);
115  layoutCoordinateFirst_y->addWidget(d->spinBoxCoordinateFirst_y);
116  layoutCoordinateFirst_z->addWidget(labelCoordinateFirst_z);
117  layoutCoordinateFirst_z->addWidget(d->spinBoxCoordinateFirst_z);
118  layoutCoordonate->addWidget(new QLabel("First point :", this));
119  layoutCoordonate->addLayout(layoutCoordinateFirst_x);
120  layoutCoordonate->addLayout(layoutCoordinateFirst_y);
121  layoutCoordonate->addLayout(layoutCoordinateFirst_z);
122 
123  d->spinBoxCoordinateSecond_x->setValue(1.0);
124  d->spinBoxCoordinateSecond_y->setValue(0.0);
125  d->spinBoxCoordinateSecond_z->setValue(0.0);
126 
127  d->spinBoxCoordinateSecond_x->setRange(-1000, 1000);
128  d->spinBoxCoordinateSecond_y->setRange(-1000, 1000);
129  d->spinBoxCoordinateSecond_z->setRange(-1000, 1000);
130  layoutCoordinateSecond_x->addWidget(labelCoordinateSecond_x);
131  layoutCoordinateSecond_x->addWidget(d->spinBoxCoordinateSecond_x);
132  layoutCoordinateSecond_y->addWidget(labelCoordinateSecond_y);
133  layoutCoordinateSecond_y->addWidget(d->spinBoxCoordinateSecond_y);
134  layoutCoordinateSecond_z->addWidget(labelCoordinateSecond_z);
135  layoutCoordinateSecond_z->addWidget(d->spinBoxCoordinateSecond_z);
136  layoutCoordonate->addWidget(new QLabel("Second point :", this));
137  layoutCoordonate->addLayout(layoutCoordinateSecond_x);
138  layoutCoordonate->addLayout(layoutCoordinateSecond_y);
139  layoutCoordonate->addLayout(layoutCoordinateSecond_z);
140 
141  layoutRadius->addWidget(labelRadius);
142  layoutRadius->addWidget(d->spinBoxRadius);
143  d->spinBoxRadius->setValue(1.0);
144 
145  d->spinBoxCoordinateFirst_x->setSingleStep(0.1);
146  d->spinBoxCoordinateFirst_y->setSingleStep(0.1);
147  d->spinBoxCoordinateFirst_z->setSingleStep(0.1);
148  d->spinBoxCoordinateSecond_x->setSingleStep(0.1);
149  d->spinBoxCoordinateSecond_y->setSingleStep(0.1);
150  d->spinBoxCoordinateSecond_z->setSingleStep(0.1);
151  d->spinBoxRadius->setSingleStep(0.1);
152 
153  d->coordinates = new QGroupBox(tr("Enter coordinates"),this);
154  d->coordinates->setLayout(layoutCoordonate);
155 
156  //message to display
157  d->messageToDisplay = new QLabel("",this);
158  axlCylinderCreator *creator = new axlCylinderCreator();
159  d->messageToDisplay->setText(creator->description());
160  delete creator;
161  d->messageToDisplay->setStyleSheet("color: #ff0000;");
162 
163  QPushButton *button = new QPushButton("Create", this);
164  connect(button, SIGNAL(clicked()), this, SLOT(run()));
165 
166  layout->addWidget(new QLabel("axlInspectorToolCreatorCylinder", this));
167  // layout->addLayout(layoutCoordonate);
168  layout->addWidget(d->messageToDisplay);
169  layout->addWidget(d->coordinates);
170  layout->addLayout(layoutRadius);
171  layout->addLayout(layoutOpacity);
172  layout->addLayout(layoutColorButton);
173  layout->addWidget(button);
174  d->coordinates->hide();
175 }
176 
178 {
179  delete d;
180 
181  d = NULL;
182 }
183 
185 {
186  d->controller = controller;
187  if(d->controller->size() < 2){
188  d->messageToDisplay->hide();
189  d->coordinates->show();
190  }else{
191  d->coordinates->hide();
192  bool hasRigthType = false;
193  int nbRigthType = 0;
194  foreach(axlInspectorObjectManagerTreeItem *item, d->controller->items()){
195  if(dynamic_cast<axlPoint *>(d->controller->data(item)))
196  nbRigthType++;
197  else if(dynamic_cast<axlDataDynamic *>(d->controller->data(item)))
198  if(dynamic_cast<axlDataDynamic *>(d->controller->data(item))->outputs())
199  if(dynamic_cast<axlPoint *>(dynamic_cast<axlDataDynamic *>(d->controller->data(item))->outputs()))
200  nbRigthType++;
201  }
202 
203  if(nbRigthType > 1)
204  hasRigthType = true;
205  if(!hasRigthType){
206  d->coordinates->show();
207  d->messageToDisplay->hide();
208  }
209  }
210 }
211 
212 
213 
215  QList<axlAbstractData *>list;
216  if(d->coordinates->isVisible()){
217 
218  axlPoint *firstPoint = new axlPoint(d->spinBoxCoordinateFirst_x->value(), d->spinBoxCoordinateFirst_y->value(), d->spinBoxCoordinateFirst_z->value());
219  axlPoint *secondPoint = new axlPoint(d->spinBoxCoordinateSecond_x->value(), d->spinBoxCoordinateSecond_y->value(), d->spinBoxCoordinateSecond_z->value());
220 
221  axlDouble *radius =new axlDouble(d->spinBoxRadius->value());
222 
223  list << firstPoint << secondPoint << radius;
224  }
225  return list;
226 
227 }
228 
230 {
231 
232  if(/*d->firstRun &&*/ !d->coordinates->isVisible()){
233  d->messageToDisplay->show();
234  axlCylinderCreator *creator = new axlCylinderCreator();
235  int nbPoints = 0;
236  if(d->controller->size()!=0){
237  foreach(axlInspectorObjectManagerTreeItem *item, d->controller->items()){
238 
239  if(item->text(2) == "Selected"|| item->text(2) == "Editable")
240  {
241  if(nbPoints < 2){
242  if(dynamic_cast<axlPoint *>(d->controller->data(item))) {
243  axlPoint *point = dynamic_cast<axlPoint *>(d->controller->data(item));
244  creator->setInput(point,nbPoints);
245  nbPoints++;
246  }
247  }else{
248  qDebug() << "To many inputs selected, only the two first points were used";
249  }
250  }
251 
252  }
253  }
254 
255  if(nbPoints == 2){
256  creator->setParameter(d->spinBoxRadius->value());
257  creator->update();
258  axlCylinder *cylinder = dynamic_cast<axlCylinder *>(creator->output());
259  cylinder->setColor(d->colorButton->color());
260  double opacity = 1.0 - 0.01 * d->sliderOpacity->value();
261  cylinder->setOpacity(opacity);
262  emit dataInserted(cylinder);
263  d->coordinates->hide();
264 
265  }else {
266  //display the coordinates to be chosen for the extremal points
267  d->coordinates->show();
268  d->messageToDisplay->hide();
269  }
270 
271  delete creator;
272  }else{
273 
274  d->messageToDisplay->hide();
275 
276  axlPoint *firstPoint = new axlPoint(d->spinBoxCoordinateFirst_x->value(), d->spinBoxCoordinateFirst_y->value(), d->spinBoxCoordinateFirst_z->value());
277  axlPoint *secondPoint = new axlPoint(d->spinBoxCoordinateSecond_x->value(), d->spinBoxCoordinateSecond_y->value(), d->spinBoxCoordinateSecond_z->value());
278 
279 
280  axlCylinder* cylinder = new axlCylinder(firstPoint, secondPoint, d->spinBoxRadius->value());
281  cylinder->setColor(d->colorButton->color());
282  double opacity = 1.0 - 0.01 * d->sliderOpacity->value();
283  cylinder->setOpacity(opacity);
284 
285  emit dataInserted(cylinder);
286  }
287 }
288 
290 {
292 }
void dataInserted(axlAbstractData *data)
Class axlPoint defines 3D points.
Definition: axlPoint.h:34
void setController(axlInspectorObjectController *controller)
Class axlDouble defines a double.
Definition: axlDouble.h:29
Class axlCylinder defines 3D cylinders.
Definition: axlCylinder.h:33
virtual dtkAbstractData * output(void)
virtual QString description(void) const
QList< axlAbstractData * > returnInputsList(void)
axlInspectorToolInterface * createaxlInspectorToolCreatorCylinder(void)
virtual int update(void)
void setOpacity(const double &opacity)
virtual void setParameter(double data)
void setColor(double r, double g, double b)
virtual void setInput(dtkAbstractData *newData, int channel)