Developer documentation | Axl-2.5.1

axlInspectorToolCreatorLine.cpp
Go to the documentation of this file.
1 /* axlInspectorToolCreatorLine.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/axlLine.h>
27 #include <dtkCoreSupport/dtkAbstractProcessFactory.h>
28 #include <dtkCoreSupport/dtkAbstractProcess.h>
29 #include <dtkGuiSupport/dtkColorButton.h>
30 
31 #include <axlCore/axlDataDynamic.h>
32 #include <axlCore/axlLineCreator.h>
33 //#include <axlCore/axlMiddleLine.h>
34 
35 #include <QtGui>
36 
37 class axlInspectorToolCreatorLinePrivate
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  QGroupBox *coordinates;
52 
53  QLabel *messageToDisplay;
54 };
55 
56 axlInspectorToolCreatorLine::axlInspectorToolCreatorLine(QWidget *parent) : axlInspectorToolCreator(parent), d(new axlInspectorToolCreatorLinePrivate)
57 {
58  QVBoxLayout *layout = new QVBoxLayout(this);
59 
60  d->messageToDisplay = new QLabel("Select two points to create a line", this);
61  d->messageToDisplay->setStyleSheet("color: #ff0000;");
62 
63  //OPACITY//
64  d->sliderOpacity = new QSlider(Qt::Horizontal, this);
65 
66  QHBoxLayout *layoutOpacity = new QHBoxLayout;
67  layoutOpacity->addWidget(new QLabel("Opacity",this));
68  layoutOpacity->addWidget(d->sliderOpacity);
69  d->sliderOpacity->setMaximum(100);
70 
71  //COLOR//
72  d->colorButton = new dtkColorButton(this);
73 
74  QHBoxLayout *layoutColorButton = new QHBoxLayout;
75  layoutColorButton->addWidget(new QLabel("Color",this));
76  layoutColorButton->addWidget(d->colorButton);
77  d->colorButton->setColor(QColor("#a0a0a4"));
78 
79  QVBoxLayout *layoutCoordonate = new QVBoxLayout(this);
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  d->spinBoxCoordinateFirst_x->setValue(0.0);
101  d->spinBoxCoordinateFirst_y->setValue(0.0);
102  d->spinBoxCoordinateFirst_z->setValue(0.0);
103  d->spinBoxCoordinateFirst_x->setRange(-1000, 1000);
104  d->spinBoxCoordinateFirst_y->setRange(-1000, 1000);
105  d->spinBoxCoordinateFirst_z->setRange(-1000, 1000);
106  d->spinBoxCoordinateFirst_x->setSingleStep(0.1);
107  d->spinBoxCoordinateFirst_y->setSingleStep(0.1);
108  d->spinBoxCoordinateFirst_z->setSingleStep(0.1);
109  layoutCoordinateFirst_x->addWidget(labelCoordinateFirst_x);
110  layoutCoordinateFirst_x->addWidget(d->spinBoxCoordinateFirst_x);
111  layoutCoordinateFirst_y->addWidget(labelCoordinateFirst_y);
112  layoutCoordinateFirst_y->addWidget(d->spinBoxCoordinateFirst_y);
113  layoutCoordinateFirst_z->addWidget(labelCoordinateFirst_z);
114  layoutCoordinateFirst_z->addWidget(d->spinBoxCoordinateFirst_z);
115  layoutCoordonate->addWidget(new QLabel("First point :", this));
116  layoutCoordonate->addLayout(layoutCoordinateFirst_x);
117  layoutCoordonate->addLayout(layoutCoordinateFirst_y);
118  layoutCoordonate->addLayout(layoutCoordinateFirst_z);
119 
120  d->spinBoxCoordinateSecond_x->setValue(1.0);
121  d->spinBoxCoordinateSecond_y->setValue(0.0);
122  d->spinBoxCoordinateSecond_z->setValue(0.0);
123  d->spinBoxCoordinateSecond_x->setRange(-1000, 1000);
124  d->spinBoxCoordinateSecond_y->setRange(-1000, 1000);
125  d->spinBoxCoordinateSecond_z->setRange(-1000, 1000);
126  d->spinBoxCoordinateSecond_x->setSingleStep(0.1);
127  d->spinBoxCoordinateSecond_y->setSingleStep(0.1);
128  d->spinBoxCoordinateSecond_z->setSingleStep(0.1);
129 
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 
142  d->coordinates = new QGroupBox(tr("Enter coordinates"),this);
143  d->coordinates->setLayout(layoutCoordonate);
144 
145 
146 
147  QPushButton *button = new QPushButton("Create", this);
148  connect(button, SIGNAL(clicked()), this, SLOT(run()));
149 
150  layout->addWidget(new QLabel("axlInspectorToolCreatorLine", this));
151  //layout->addLayout(layoutCoordonate);
152  layout->addWidget(d->messageToDisplay);
153  layout->addWidget(d->coordinates);
154  // layout->addLayout(layoutDynamic);
155  layout->addLayout(layoutOpacity);
156  layout->addLayout(layoutColorButton);
157  layout->addWidget(button);
158 
159  d->coordinates->hide();
160  d->messageToDisplay->hide();
161 }
162 
164 {
165  delete d;
166 
167  d = NULL;
168 }
169 
171 {
172  d->controller = controller;
173  if(d->controller->size() < 2){
174  d->coordinates->show();
175  }else{
176  d->coordinates->hide();
177  bool hasRigthType = false;
178  int nbRigthType = 0;
179  foreach(axlInspectorObjectManagerTreeItem *item, d->controller->items()){
180  if(dynamic_cast<axlPoint *>(d->controller->data(item)))
181  nbRigthType++;
182  else if(dynamic_cast<axlDataDynamic *>(d->controller->data(item)))
183  if(dynamic_cast<axlDataDynamic *>(d->controller->data(item))->outputs())
184  if(dynamic_cast<axlPoint *>(dynamic_cast<axlDataDynamic *>(d->controller->data(item))->outputs()))
185  nbRigthType++;
186  }
187 
188  if(nbRigthType > 1)
189  hasRigthType = true;
190  if(!hasRigthType)
191  d->coordinates->show();
192  else{
193  d->messageToDisplay->show();
194  }
195  }
196 }
197 
198 QList<axlAbstractData *> axlInspectorToolCreatorLine::returnInputsList(void){
199  QList<axlAbstractData *> list;
200  if(d->coordinates->isVisible()){
201  axlPoint *firstPoint = new axlPoint(d->spinBoxCoordinateFirst_x->value(), d->spinBoxCoordinateFirst_y->value(), d->spinBoxCoordinateFirst_z->value());
202  axlPoint *secondPoint = new axlPoint(d->spinBoxCoordinateSecond_x->value(), d->spinBoxCoordinateSecond_y->value(), d->spinBoxCoordinateSecond_z->value());
203 
204 
205  list << firstPoint << secondPoint;
206  }
207  return list;
208 
209 }
210 
211 
213 {
214  if( !d->coordinates->isVisible()){
215  axlLineCreator *creator = new axlLineCreator();
216  int nbPoints = 0;
217  if(!d->controller->size()==0){
218  foreach(axlInspectorObjectManagerTreeItem *item, d->controller->items()){
219 
220  if(item->text(2) == "Selected"|| item->text(2) == "Editable")
221  {
222  if(nbPoints < 2){
223  if(dynamic_cast<axlPoint *>(d->controller->data(item))) {
224  axlPoint *point = dynamic_cast<axlPoint *>(d->controller->data(item));
225  creator->setInput(point,nbPoints);
226  nbPoints++;
227  }
228  }else{
229  qDebug() << "To many inputs selected, only the two first points were used";
230  }
231  }
232 
233  }
234  }
235  if(nbPoints == 2){
236  creator->update();
237  axlLine *line = dynamic_cast<axlLine *>(creator->output());
238  line->setColor(d->colorButton->color());
239  double opacity = 1.0 - 0.01 * d->sliderOpacity->value();
240  line->setOpacity(opacity);
241  emit dataInserted(line);
242 
243  }else {
244  //display the coordinates to be chosen for the extremal points
245  d->coordinates->show();
246  d->messageToDisplay->hide();
247  }
248 
249  delete creator;
250 
251  }else{
252  // WARNING THESE POINT ARE ONLY REFERENCED BY THE LINE : risk of memory leek when the line will be deleted
253  axlPoint *firstPoint = new axlPoint(d->spinBoxCoordinateFirst_x->value(), d->spinBoxCoordinateFirst_y->value(), d->spinBoxCoordinateFirst_z->value());
254  axlPoint *secondPoint = new axlPoint(d->spinBoxCoordinateSecond_x->value(), d->spinBoxCoordinateSecond_y->value(), d->spinBoxCoordinateSecond_z->value());
255 
256  axlLine *line = new axlLine(firstPoint, secondPoint);
257  double opacity = 1.0 - 0.01 * d->sliderOpacity->value();
258  line->setColor(d->colorButton->color());
259  line->setOpacity(opacity);
260  emit dataInserted(line);
261 
262 
263  d->coordinates->show();
264  d->messageToDisplay->hide();
265 
266  }
267 
268 }
269 
271 {
272  return new axlInspectorToolCreatorLine;
273 }
274 
Class axlPoint defines 3D points.
Definition: axlPoint.h:34
Class axlLine defines 3D lines.
Definition: axlLine.h:35
QList< axlAbstractData * > returnInputsList(void)
void setController(axlInspectorObjectController *controller)
virtual dtkAbstractData * output(void)
void dataInserted(axlAbstractData *data)
axlInspectorToolInterface * createaxlInspectorToolCreatorLine(void)
virtual void setInput(dtkAbstractData *newData, int channel)
virtual int update(void)
void setOpacity(const double &opacity)
void setColor(double r, double g, double b)