30 #include <QApplication>
31 #include <QMetaObject>
34 #include <QtDesigner/abstractpropertyeditor.h>
36 #include <SimoxUtility/json.h>
46 controller::Controller::Controller() : QObject(), lastSelected(NULL)
48 qRegisterMetaType<OperationPtrListPtr>(
"OperationPtrListPtr");
71 QMetaObject::invokeMethod(
74 blocking ? (QApplication::instance()->thread() == QThread::currentThread() ||
75 QApplication::instance()->thread() == NULL
76 ? Qt::DirectConnection
77 : Qt::BlockingQueuedConnection)
78 : Qt::QueuedConnection,
86 std::unique_lock lock(execute_mutex);
89 std::vector<controller::OperationPtr>::size_type i = 0;
91 for (; i != operations->size(); i++)
93 if (!operations->at(i)->isExecuteable())
95 std::unique_lock lock(queue_mutex);
96 queuedOperations.push_back(std::make_pair(flags, operations->at(i)));
102 std::string tmp = operations->at(i)->getObjectId();
106 op->executeOnWorkingMemory();
108 catch (std::exception& e)
110 ARMARX_ERROR_S <<
"executeOnWorkingMemory failed: " << op->getObjectId()
121 if (tmp != operations->at(i)->getObjectId())
123 if (getScene()->getObjectManager()->getObjectById(operations->at(i)->getObjectId()))
126 throw std::runtime_error(
"New id is already used in local scene.");
129 std::string
newId = operations->at(i)->getObjectId();
130 undoRedoStack->updateObjectId(tmp,
newId);
133 if (operations->at(i)->getObjectId() ==
newId)
135 for (
auto ito = operations->begin(); ito != operations->end(); ito++)
137 if (ito->get()->getObjectId() == tmp)
139 ito->get()->setObjectId(
newId);
141 else if (ito->get()->getObjectId() ==
newId)
143 ito->get()->setObjectId(tmp);
150 operations->at(i)->setObjectId(
newId);
156 std::string tmp = operations->at(i)->getObjectId();
160 op->executeOnScene();
162 catch (std::exception& e)
164 ARMARX_ERROR_S <<
"executeOnScene failed: " << op->getObjectId() << e.what();
174 if (tmp != operations->at(i)->getObjectId())
176 throw std::runtime_error(
"ID changed while execution on local Scene.");
180 objectIds.push_back(operations->at(i)->getObjectId());
185 std::cerr <<
"Could not execute operations. Trying to revert." << std::endl;
200 inverse->executeOnScene();
204 std::cerr <<
"Could not revert operation on the local scene. Trying to "
205 "revert the other operations."
214 inverse->executeOnWorkingMemory();
218 std::cerr <<
"Could not revert operation on WorkingMemory. Trying to "
219 "revert the other operations."
228 undoRedoStack->push(operations);
231 std::vector<scene3D::SceneObjectPtr> allSelected =
232 scene->getSelectionManager()->getAllSelected();
234 allSelected.size() == 0 ? NULL : allSelected[allSelected.size() - 1];
236 if (newSelected != lastSelected)
238 lastSelected = newSelected;
239 triggerSceneObjectSelected(newSelected);
242 qRegisterMetaType<controller::vector_string>(
"controller::vector_string");
243 emit operationExecuted(objectIds);
250 std::unique_lock lock(queue_mutex);
252 for (
auto it = queuedOperations.begin(); it != queuedOperations.end(); ++it)
255 new std::vector<controller::OperationPtr>);
256 queuedOperationsTmp->push_back((*it).second);
257 this->
execute((*it).first, queuedOperationsTmp, blocking);
260 queuedOperations.clear();
267 if (!memoryXController->getWorkingMemoryController())
269 throw std::runtime_error(
"Not initialized");
273 std::vector<scene3D::SceneObjectPtr> currentLocalObjects =
274 scene->getObjectManager()->getAllObjects();
278 scene->getObjectManager()->removeObject(
object);
282 undoRedoStack->clear();
284 memoryXController->getWorkingMemoryController()->addAllInstancesToLocalScene();
288 const std::shared_ptr<scene3D::Scene>
294 const std::shared_ptr<memoryxcontroller::MemoryXController>
297 return memoryXController;
300 const std::shared_ptr<gui::ShortcutController>
303 return shortcutController;
310 undoRedoStack->undo());
317 undoRedoStack->redo());
322 const std::string& collection)
324 emit objectClassSelected(objectClass, collection);
330 emit sceneObjectSelected(
object);
336 emit minimapClicked();
342 emit objectsChanged(objectIds);
348 std::shared_ptr<std::vector<controller::OperationPtr>> operations(
349 new std::vector<controller::OperationPtr>());
350 std::vector<scene3D::SceneObjectPtr> selectedObjects =
351 getScene()->getSelectionManager()->getAllSelected();
353 for (
auto it = selectedObjects.rbegin(); it != selectedObjects.rend(); ++it)
356 getMemoryXController(), getScene(), (*it)->getObjectId()));
357 operations->push_back(operation);
360 std::vector<scene3D::SceneObjectPtr> allObjects =
361 getScene()->getObjectManager()->getAllObjects();
362 std::vector<scene3D::SceneGroupPtr> groups = getScene()->getGroupManager()->getAllGroups();
364 for (
auto itG = groups.begin(); itG != groups.end(); ++itG)
366 std::vector<scene3D::SceneObjectPtr> groupObjects = (*itG)->getAllObjects();
368 for (
auto it = groupObjects.rbegin(); it != groupObjects.rend(); ++it)
373 (*itG)->getGroupId(),
374 (*it)->getObjectId()));
375 operations->push_back(removeFromGroupOperation);
379 getMemoryXController(), getScene(), (*itG)->getGroupId()));
380 operations->push_back(deleteGroupOperation);
383 for (
auto it = allObjects.rbegin(); it != allObjects.rend(); ++it)
386 getMemoryXController(), getScene(), (*it)->getObjectId()));
387 operations->push_back(operation);
398 std::shared_ptr<scene3D::Scene> scene = getScene();
400 std::vector<scene3D::SceneObjectPtr> objects = objectManager->getAllObjects();
407 SbVec3f translation =
object->getTranslation();
408 objData.
position.x() = translation[0];
409 objData.
position.y() = translation[1];
410 objData.
position.z() = translation[2];
413 SbRotation rotation =
object->getRotation();
421 objData.
className =
object->getClassId();
423 nlohmann::json j =
data;
426 const std::string
filename = snapshotName +
".json";
429 nlohmann::write_json(
filename, j, 2);
432 catch (
const std::ios_base::failure& e)
435 << std::filesystem::absolute(
filename) <<
":\n"