SceneEditorWidget.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package MemoryX::gui-plugins::SceneEditor
19  * @date 2015
20  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
21  * GNU General Public License
22  */
23 
24 #include <QtConcurrent/qtconcurrentrun.h>
25 #include "SceneEditorWidget.h"
26 #include "../controller/DeselectOperation.h"
27 #include "../controller/RemoveOperation.h"
28 #include "../controller/RemoveFromGroupOperation.h"
29 #include "OverrideAction.h"
30 
32  QWidget(parent),
34  sceneGraph(new ScenegraphWidget(control, this)),
35  collisionMeshToggleButton(new QPushButton(this)),
36  rotateManipulatorToggleButton(new QPushButton(this)),
37  translateManipulatorToggleButton(new QPushButton(this)),
38  undoButton(new QPushButton(this)),
39  redoButton(new QPushButton(this)),
40  removeSelectedObjectsButton(new QPushButton(this)),
41  editorToggleButton(new QPushButton(this)),
42  viewerToggleButton(new QPushButton(this)),
43  editorViewerButtonGroup(new QButtonGroup(this)),
44  mainLayout(new QVBoxLayout(this)),
45  leftButtonsSize(30, 30),
46  buttonColor("lightgray"),
47  margin(20),
48  spacing(10),
49  showCollisionMesh(false),
50  showTranslateManipulator(false),
51  showRotateManipulator(false)
52 {
53  setPalette(Qt::transparent);
54 
55  setObjectName(QString::fromUtf8("SceneEditorWidget"));
56 
57  mainLayout->addWidget(sceneGraph);
58 
59  this->setLayout(mainLayout);
60 
61  editorViewerButtonGroup->setExclusive(true);
62 
63  QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
64  sizePolicy.setHorizontalStretch(0);
65  sizePolicy.setVerticalStretch(0);
66 
67  collisionMeshToggleButton->setObjectName(QString::fromUtf8("collisionMeshToggleButton"));
68  sizePolicy.setHeightForWidth(collisionMeshToggleButton->sizePolicy().hasHeightForWidth());
69  collisionMeshToggleButton->setSizePolicy(sizePolicy);
70  QIcon icon1;
71  icon1.addFile(QString::fromUtf8(":/images/Collision.png"), QSize(), QIcon::Normal, QIcon::Off);
72  collisionMeshToggleButton->setIcon(icon1);
73  collisionMeshToggleButton->setToolTip(tr("Toggle Collisionmesh"));
74  collisionMeshToggleButton->setIconSize(leftButtonsSize);
75  collisionMeshToggleButton->setCheckable(true);
76  collisionMeshToggleButton->setFixedSize(leftButtonsSize);
77  collisionMeshToggleButton->setStyleSheet("background-color: " + buttonColor);
78  collisionMeshToggleButton->move(margin, margin);
79  collisionMeshToggleButton->show();
80 
81  rotateManipulatorToggleButton->setObjectName(QString::fromUtf8("rotateManipulatorToggleButton"));
82  sizePolicy.setHeightForWidth(rotateManipulatorToggleButton->sizePolicy().hasHeightForWidth());
83  rotateManipulatorToggleButton->setSizePolicy(sizePolicy);
84  QIcon icon2;
85  icon2.addFile(QString::fromUtf8(":/images/Rotate.png"), QSize(), QIcon::Normal, QIcon::Off);
86  rotateManipulatorToggleButton->setIcon(icon2);
87  rotateManipulatorToggleButton->setToolTip(tr("Toggle Rotationmanipulator"));
88  rotateManipulatorToggleButton->setIconSize(leftButtonsSize);
89  rotateManipulatorToggleButton->setCheckable(true);
90  rotateManipulatorToggleButton->setFixedSize(leftButtonsSize);
91  rotateManipulatorToggleButton->setStyleSheet("background-color: " + buttonColor);
92  rotateManipulatorToggleButton->move(margin, collisionMeshToggleButton->pos().y() + leftButtonsSize.height() + spacing);
93  rotateManipulatorToggleButton->show();
94 
95  translateManipulatorToggleButton->setObjectName(QString::fromUtf8("translateManipulatorToggleButton"));
96  sizePolicy.setHeightForWidth(translateManipulatorToggleButton->sizePolicy().hasHeightForWidth());
97  translateManipulatorToggleButton->setSizePolicy(sizePolicy);
98  QIcon icon3;
99  icon3.addFile(QString::fromUtf8(":/images/Translate.png"), QSize(), QIcon::Normal, QIcon::Off);
100  translateManipulatorToggleButton->setIcon(icon3);
101  translateManipulatorToggleButton->setToolTip(tr("Toggle Translationmanipulator"));
102  translateManipulatorToggleButton->setIconSize(leftButtonsSize);
103  translateManipulatorToggleButton->setCheckable(true);
104  translateManipulatorToggleButton->setFixedSize(leftButtonsSize);
105  translateManipulatorToggleButton->setStyleSheet("background-color: " + buttonColor);
106  translateManipulatorToggleButton->move(margin, rotateManipulatorToggleButton->pos().y() + leftButtonsSize.height() + spacing);
107  translateManipulatorToggleButton->show();
108 
109 
110  undoButton->setObjectName(QString::fromUtf8("undoButton"));
111  sizePolicy.setHeightForWidth(undoButton->sizePolicy().hasHeightForWidth());
112  undoButton->setSizePolicy(sizePolicy);
113  QIcon icon4;
114  icon4.addFile(QString::fromUtf8(":/icons/edit-undo-3.svg"), QSize(), QIcon::Normal, QIcon::Off);
115  undoButton->setIcon(icon4);
116  undoButton->setToolTip(tr("Undo last Action"));
117  undoButton->setIconSize(leftButtonsSize);
118  undoButton->setFixedSize(leftButtonsSize);
119  undoButton->setStyleSheet("background-color: " + buttonColor);
120  undoButton->move(margin, translateManipulatorToggleButton->pos().y() + leftButtonsSize.height() + spacing);
121  undoButton->show();
122 
123  redoButton = new QPushButton(this);
124  redoButton->setObjectName(QString::fromUtf8("redoButton"));
125  sizePolicy.setHeightForWidth(redoButton->sizePolicy().hasHeightForWidth());
126  redoButton->setSizePolicy(sizePolicy);
127  QIcon icon5;
128  icon5.addFile(QString::fromUtf8(":/icons/edit-redo-3.svg"), QSize(), QIcon::Normal, QIcon::Off);
129  redoButton->setIcon(icon5);
130  redoButton->setToolTip(tr("Redo last Action"));
131  redoButton->setIconSize(leftButtonsSize);
132  redoButton->setFixedSize(leftButtonsSize);
133  redoButton->setStyleSheet("background-color: " + buttonColor);
134  redoButton->move(margin, undoButton->pos().y() + leftButtonsSize.height() + spacing);
135  redoButton->show();
136 
137  removeSelectedObjectsButton = new QPushButton(this);
138  removeSelectedObjectsButton->setObjectName(QString::fromUtf8("removeSelectedObjectsButton"));
139  sizePolicy.setHeightForWidth(removeSelectedObjectsButton->sizePolicy().hasHeightForWidth());
140  removeSelectedObjectsButton->setSizePolicy(sizePolicy);
141  QIcon icon6;
142  icon6.addFile(QString::fromUtf8(":/icons/dialog-close.ico"), QSize(), QIcon::Normal, QIcon::Off);
143  removeSelectedObjectsButton->setIcon(icon6);
144  removeSelectedObjectsButton->setToolTip(tr("Remove selected Objects from scene"));
145  removeSelectedObjectsButton->setIconSize(leftButtonsSize);
146  removeSelectedObjectsButton->setFixedSize(leftButtonsSize);
147  removeSelectedObjectsButton->setStyleSheet("background-color: " + buttonColor);
148  removeSelectedObjectsButton->move(margin, redoButton->pos().y() + leftButtonsSize.height() + spacing);
149  removeSelectedObjectsButton->show();
150 
151  viewerToggleButton->setObjectName(QString::fromUtf8("viewerToggleButton"));
152  viewerToggleButton->setText(tr("Viewer"));
153  viewerToggleButton->setCheckable(true);
154  viewerToggleButton->adjustSize();
155  viewerToggleButton->setStyleSheet("background-color: " + buttonColor);
156  viewerToggleButton->show();
157  editorViewerButtonGroup->addButton(viewerToggleButton, VIEWER_BUTTON_ID);
158 
159  editorToggleButton->setObjectName(QString::fromUtf8("editorToggleButton"));
160  editorToggleButton->setText(tr("Editor"));
161  editorToggleButton->setCheckable(true);
162  editorToggleButton->setChecked(true);
163  editorToggleButton->adjustSize();
164  editorToggleButton->setStyleSheet("background-color: " + buttonColor);
165  editorToggleButton->show();
166  editorViewerButtonGroup->addButton(editorToggleButton, EDITOR_BUTTON_ID);
167 
168  connect(this, SIGNAL(sizeChangedSignal(QSize)), this, SLOT(sizeChanged(QSize)));
169  connect(undoButton, SIGNAL(released()), this, SLOT(undoButtonReleased()));
170  connect(redoButton, SIGNAL(released()), this, SLOT(redoButtonReleased()));
171  connect(removeSelectedObjectsButton, SIGNAL(released()), this, SLOT(removeSelectedObjectsButtonReleased()));
172  connect(collisionMeshToggleButton, SIGNAL(toggled(bool)), this, SLOT(collisionMeshToggleButtonToggled(bool)));
173  connect(rotateManipulatorToggleButton, SIGNAL(toggled(bool)), this, SLOT(rotateManipulatorToggleButtonToggled(bool)));
174  connect(translateManipulatorToggleButton, SIGNAL(toggled(bool)), this, SLOT(translateManipulatorToggleButtonToggled(bool)));
175  connect(editorViewerButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(editorViewerButtonGroupButtonClicked(int)));
176 
177  std::shared_ptr<gui::ShortcutController> shortcutController = control->getShortcutController();
178 
179  QPointer<QAction> undoAction(new OverrideAction("Scene: Undo last Action", this));
180  this->addAction(undoAction);
181  connect(undoAction, SIGNAL(triggered()), undoButton, SLOT(click()));
182  shortcutController->registerAction(undoAction->text(), undoAction);
183 
184  QPointer<QAction> redoAction(new OverrideAction("Scene: Redo last Action", this));
185  this->addAction(redoAction);
186  connect(redoAction, SIGNAL(triggered()), redoButton, SLOT(click()));
187  shortcutController->registerAction(redoAction->text(), redoAction);
188 
189  QPointer<QAction> removeSelectedObjectsAction(new OverrideAction("Scene: Remove the selected Objects", this));
190  this->addAction(removeSelectedObjectsAction);
191  connect(removeSelectedObjectsAction, SIGNAL(triggered()), removeSelectedObjectsButton, SLOT(click()));
192  shortcutController->registerAction(removeSelectedObjectsAction->text(), removeSelectedObjectsAction);
193 
194  QPointer<QAction> collisionAction(new OverrideAction("Scene: Toggle Collision Meshes", this));
195  this->addAction(collisionAction);
196  connect(collisionAction, SIGNAL(triggered()), collisionMeshToggleButton, SLOT(toggle()));
197  shortcutController->registerAction(collisionAction->text(), collisionAction);
198 
199  QPointer<QAction> rotateAction(new OverrideAction("Scene: Toggle Rotation Manipulator", this));
200  this->addAction(rotateAction);
201  connect(rotateAction, SIGNAL(triggered()), rotateManipulatorToggleButton, SLOT(toggle()));
202  shortcutController->registerAction(rotateAction->text(), rotateAction);
203 
204  QPointer<QAction> translateAction(new OverrideAction("Scene: Toggle Translation Manipulator", this));
205  this->addAction(translateAction);
206  connect(translateAction, SIGNAL(triggered()), translateManipulatorToggleButton, SLOT(toggle()));
207  shortcutController->registerAction(translateAction->text(), translateAction);
208 
209  QPointer<QAction> editorAction(new OverrideAction("Scene: Switch to Editor Mode", this));
210  this->addAction(editorAction);
211  connect(editorAction, SIGNAL(triggered()), editorToggleButton, SLOT(click()));
212  shortcutController->registerAction(editorAction->text(), editorAction);
213 
214  QPointer<QAction> viewerAction(new OverrideAction("Scene: Switch to Viewer Mode", this));
215  this->addAction(viewerAction);
216  connect(viewerAction, SIGNAL(triggered()), viewerToggleButton, SLOT(click()));
217  shortcutController->registerAction(viewerAction->text(), viewerAction);
218 
219  QPointer<QAction> switchEditorViewerAction(new OverrideAction("Scene: Switch between Editor and Viewer Mode", this));
220  this->addAction(switchEditorViewerAction);
221  connect(switchEditorViewerAction, SIGNAL(triggered()), this, SLOT(toggleEditorViewerMode()));
222  shortcutController->registerAction(switchEditorViewerAction->text(), switchEditorViewerAction);
223 
224  emit sizeChanged(this->size());
225 }
226 
228 {
229 }
230 
231 void gui::SceneEditorWidget::resizeEvent(QResizeEvent* event)
232 {
233  QWidget::resizeEvent(event);
234  emit sizeChangedSignal(event->size());
235 }
236 
237 void gui::SceneEditorWidget::sizeChanged(QSize newSize)
238 {
239  viewerToggleButton->move(newSize.width() - margin - viewerToggleButton->size().width(), margin);
240  editorToggleButton->move(viewerToggleButton->pos().x() - editorToggleButton->size().width(), margin);
241 }
242 
243 void gui::SceneEditorWidget::undoButtonReleased()
244 {
245  if (controller::ControllerPtr sharedController = control.lock())
246  {
247  sharedController->undo();
248  }
249 }
250 
251 void gui::SceneEditorWidget::redoButtonReleased()
252 {
253  if (controller::ControllerPtr sharedController = control.lock())
254  {
255  sharedController->redo();
256  }
257 }
258 
259 void gui::SceneEditorWidget::removeSelectedObjectsButtonReleased()
260 {
261  if (controller::ControllerPtr sharedController = control.lock())
262  {
263  std::shared_ptr<std::vector<controller::OperationPtr> > operations(new std::vector<controller::OperationPtr>());
264  std::vector<scene3D::SceneObjectPtr> selectedObjects = sharedController->getScene()->getSelectionManager()->getAllSelected();
265  std::vector<scene3D::SceneGroupPtr> groups = sharedController->getScene()->getGroupManager()->getAllGroups();
266 
267  for (auto it = selectedObjects.rbegin(); it != selectedObjects.rend(); ++it)
268  {
269  controller::OperationPtr deselectOperation(new controller::DeselectOperation(sharedController->getMemoryXController(), sharedController->getScene(), (*it)->getObjectId()));
270  operations->push_back(deselectOperation);
271 
272  for (auto itG = groups.begin(); itG != groups.end(); ++itG)
273  {
274  if ((*itG)->contains(*it))
275  {
276  controller::OperationPtr removeFromGroupOperation(new controller::RemoveFromGroupOperation(sharedController->getMemoryXController(), sharedController->getScene(), (*itG)->getGroupId(), (*it)->getObjectId()));
277  operations->push_back(removeFromGroupOperation);
278  }
279  }
280 
281  controller::OperationPtr removeOperation(new controller::RemoveOperation(sharedController->getMemoryXController(), sharedController->getScene(), (*it)->getObjectId()));
282  operations->push_back(removeOperation);
283  }
284 
286  }
287 }
288 
289 void gui::SceneEditorWidget::collisionMeshToggleButtonToggled(bool checked)
290 {
291  if (controller::ControllerPtr sharedController = control.lock())
292  {
293  for (scene3D::SceneObjectPtr object : sharedController->getScene()->getObjectManager()->getAllObjects())
294  {
295  object->showCollisionMesh(checked);
296  }
297  }
298 }
299 
300 void gui::SceneEditorWidget::rotateManipulatorToggleButtonToggled(bool checked)
301 {
302  if (controller::ControllerPtr sharedController = control.lock())
303  {
305 
306  if (checked)
307  {
308  if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode()
310  {
312  }
313  else
314  {
316  }
317  }
318  else
319  {
320  if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode()
322  {
324  }
325  else
326  {
328  }
329  }
330 
331  sharedController->getScene()->getManipulatorManager()->setManipulatorMode(mode);
332  }
333 }
334 
335 void gui::SceneEditorWidget::translateManipulatorToggleButtonToggled(bool checked)
336 {
337  if (controller::ControllerPtr sharedController = control.lock())
338  {
340 
341  if (checked)
342  {
343  if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode()
345  {
347  }
348  else
349  {
351  }
352  }
353  else
354  {
355  if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode()
357  {
359  }
360  else
361  {
363  }
364  }
365 
366  sharedController->getScene()->getManipulatorManager()->setManipulatorMode(mode);
367  }
368 }
369 
370 void gui::SceneEditorWidget::editorViewerButtonGroupButtonClicked(int id)
371 {
372  if (controller::ControllerPtr sharedController = control.lock())
373  {
374  if (id == VIEWER_BUTTON_ID)
375  {
376  showCollisionMesh = collisionMeshToggleButton->isChecked();
377 
378  if (showCollisionMesh)
379  {
380  collisionMeshToggleButton->click();
381  }
382 
383  collisionMeshToggleButton->hide();
384  collisionMeshToggleButton->setEnabled(false);
385  collisionMeshToggleButton->setCheckable(false);
386  showRotateManipulator = rotateManipulatorToggleButton->isChecked();
387 
388  if (showRotateManipulator)
389  {
390  rotateManipulatorToggleButton->click();
391  }
392 
393  rotateManipulatorToggleButton->hide();
394  rotateManipulatorToggleButton->setEnabled(false);
395  rotateManipulatorToggleButton->setCheckable(false);
396  showTranslateManipulator = translateManipulatorToggleButton->isChecked();
397 
398  if (showTranslateManipulator)
399  {
400  translateManipulatorToggleButton->click();
401  }
402 
403  translateManipulatorToggleButton->hide();
404  translateManipulatorToggleButton->setEnabled(false);
405  translateManipulatorToggleButton->setCheckable(false);
406  undoButton->hide();
407  undoButton->setEnabled(false);
408  redoButton->hide();
409  redoButton->setEnabled(false);
410  removeSelectedObjectsButton->hide();
411  removeSelectedObjectsButton->setEnabled(false);
412 
413  sharedController->getScene()->enterViewerMode();
414  }
415  else if (id == EDITOR_BUTTON_ID)
416  {
417  collisionMeshToggleButton->show();
418  collisionMeshToggleButton->setEnabled(true);
419  collisionMeshToggleButton->setCheckable(true);
420 
421  if (showCollisionMesh)
422  {
423  collisionMeshToggleButton->click();
424  }
425 
426  rotateManipulatorToggleButton->show();
427  rotateManipulatorToggleButton->setEnabled(true);
428  rotateManipulatorToggleButton->setCheckable(true);
429 
430  if (showRotateManipulator)
431  {
432  rotateManipulatorToggleButton->click();
433  }
434 
435  translateManipulatorToggleButton->show();
436  translateManipulatorToggleButton->setEnabled(true);
437  translateManipulatorToggleButton->setCheckable(true);
438 
439  if (showTranslateManipulator)
440  {
441  translateManipulatorToggleButton->click();
442  }
443 
444  undoButton->show();
445  undoButton->setEnabled(true);
446  redoButton->show();
447  redoButton->setEnabled(true);
448  removeSelectedObjectsButton->show();
449  removeSelectedObjectsButton->setEnabled(true);
450 
451  sharedController->getScene()->enterEditorMode();
452  }
453  }
454 }
455 
456 void gui::SceneEditorWidget::toggleEditorViewerMode()
457 {
458  switch (this->editorViewerButtonGroup->checkedId())
459  {
460  case VIEWER_BUTTON_ID:
461  this->editorToggleButton->click();
462  break;
463 
464  case EDITOR_BUTTON_ID:
465  this->viewerToggleButton->click();
466  break;
467  }
468 }
469 
471 {
472  collisionMeshToggleButton->setToolTip(tr("Toggle Collisionmesh"));
473  rotateManipulatorToggleButton->setToolTip(tr("Toggle Rotationmanipulator"));
474  translateManipulatorToggleButton->setToolTip(tr("Toggle Translationmanipulator"));
475  undoButton->setToolTip(tr("Undo last Action"));
476  redoButton->setToolTip(tr("Redo last Action"));
477  removeSelectedObjectsButton->setToolTip(tr("Remove selected Objects from scene"));
478  viewerToggleButton->setText(tr("Viewer"));
479  editorToggleButton->setText(tr("Editor"));
480 }
481 
483 {
484  sceneGraph->postDocking();
485 }
gui::SceneEditorWidget::sizeChangedSignal
void sizeChangedSignal(QSize newSize)
Signal emitted when the size of the widget has changed.
scene3D::ManipulatorMode
ManipulatorMode
Definition: ManipulatorMode.h:33
gui::SceneEditorWidget::postDocking
void postDocking()
Definition: SceneEditorWidget.cpp:482
gui::OverrideAction
Definition: OverrideAction.h:31
controller::Controller::EXECUTE_ON_SCENE
static const int EXECUTE_ON_SCENE
A flag to execute operations on the Scene.
Definition: Controller.h:73
gui::SceneEditorWidget::retranslate
void retranslate()
Translates all translatable strings in this dialog.
Definition: SceneEditorWidget.cpp:470
gui::SceneEditorWidget::SceneEditorWidget
SceneEditorWidget(const controller::ControllerPtr &control, QWidget *parent=0)
Constructor.
Definition: SceneEditorWidget.cpp:31
SceneEditorWidget.h
gui::SceneEditorWidget::~SceneEditorWidget
~SceneEditorWidget() override
Definition: SceneEditorWidget.cpp:227
controller::Controller::UNDOABLE
static const int UNDOABLE
A flag to save the executed operations to the history.
Definition: Controller.h:80
scene3D::ALL
@ ALL
Definition: ManipulatorMode.h:35
controller::ControllerPtr
std::shared_ptr< Controller > ControllerPtr
Definition: ClassDefinitions.h:41
OverrideAction.h
gui::ScenegraphWidget
This class provides a widget which holds a scene3D::SceneViewer in which the scene graph is rendered.
Definition: ScenegraphWidget.h:49
controller::RemoveFromGroupOperation
A operation to removes a object from a existing group.
Definition: RemoveFromGroupOperation.h:41
GfxTL::Off
OnOff< false > Off
Definition: OnOff.h:11
controller::DeselectOperation
A operation to deselect a object.
Definition: DeselectOperation.h:41
scene3D::TRANSLATION
@ TRANSLATION
Definition: ManipulatorMode.h:37
armarx::aron::similarity::FloatSimilarity::NONE
@ NONE
Definition: FloatSimilarity.h:11
controller::OperationPtr
std::shared_ptr< Operation > OperationPtr
Definition: ClassDefinitions.h:54
scene3D::SceneObjectPtr
boost::intrusive_ptr< SceneObject > SceneObjectPtr
Definition: PointerDefinitions.h:40
controller::Controller::EXECUTE_ON_WM
static const int EXECUTE_ON_WM
A Flag to execute operations on the WorkingMemory.
Definition: Controller.h:66
armarx::transparent
QColor transparent()
Definition: StyleSheets.h:84
armarx::RemoteGui::buttonClicked
bool buttonClicked(RemoteGui::ValueMap const &newValues, RemoteGui::ValueMap const &oldValues, std::string const &name)
Definition: Storage.cpp:6
control
This file is part of ArmarX.
controller::RemoveOperation
A Operation to remove a object in the scene and the WorkingMemory.
Definition: RemoveOperation.h:47
scene3D::ROTATION
@ ROTATION
Definition: ManipulatorMode.h:36