From dde1c8b42f1f15fada810fc0bbec87d35b627d43 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 28 Sep 2015 15:02:06 -0700 Subject: [PATCH 1/3] Fix use of EntityTree in import/export operations The EntityTree needs to be references by a shared_ptr somewhere. The EntityTree does not start with a root element by default, which some operations rely on to work as expected. --- interface/src/Application.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 53e40b5bd3..84441e78c7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2337,7 +2337,8 @@ bool Application::exportEntities(const QString& filename, const QVector entities; auto entityTree = _entities.getTree(); - EntityTree exportTree; + auto exportTree = std::make_shared(); + exportTree->createRootElement(); glm::vec3 root(TREE_SCALE, TREE_SCALE, TREE_SCALE); for (auto entityID : entityIDs) { @@ -2364,10 +2365,10 @@ bool Application::exportEntities(const QString& filename, const QVectorgetProperties(); properties.setPosition(properties.getPosition() - root); - exportTree.addEntity(entityItem->getEntityItemID(), properties); + exportTree->addEntity(entityItem->getEntityItemID(), properties); } - exportTree.writeToJSONFile(filename.toLocal8Bit().constData()); + exportTree->writeToJSONFile(filename.toLocal8Bit().constData()); // restore the main window's active state _window->activateWindow(); @@ -2380,15 +2381,16 @@ bool Application::exportEntities(const QString& filename, float x, float y, floa if (entities.size() > 0) { glm::vec3 root(x, y, z); - EntityTree exportTree; + auto exportTree = std::make_shared(); + exportTree->createRootElement(); for (int i = 0; i < entities.size(); i++) { EntityItemProperties properties = entities.at(i)->getProperties(); EntityItemID id = entities.at(i)->getEntityItemID(); properties.setPosition(properties.getPosition() - root); - exportTree.addEntity(id, properties); + exportTree->addEntity(id, properties); } - exportTree.writeToSVOFile(filename.toLocal8Bit().constData()); + exportTree->writeToSVOFile(filename.toLocal8Bit().constData()); } else { qCDebug(interfaceapp) << "No models were selected"; return false; From 1a9cd59339d964a690da9b13c96dcb01219b86dd Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 28 Sep 2015 15:03:29 -0700 Subject: [PATCH 2/3] Fix ClipboardScriptingInterface to call methods on main app thread --- .../scripting/ClipboardScriptingInterface.cpp | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/interface/src/scripting/ClipboardScriptingInterface.cpp b/interface/src/scripting/ClipboardScriptingInterface.cpp index f833ad43cc..4cebb85648 100644 --- a/interface/src/scripting/ClipboardScriptingInterface.cpp +++ b/interface/src/scripting/ClipboardScriptingInterface.cpp @@ -19,17 +19,40 @@ float ClipboardScriptingInterface::getClipboardContentsLargestDimension() { } bool ClipboardScriptingInterface::exportEntities(const QString& filename, const QVector& entityIDs) { - return Application::getInstance()->exportEntities(filename, entityIDs); + bool retVal; + QMetaObject::invokeMethod(Application::getInstance(), "exportEntities", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(bool, retVal), + Q_ARG(const QString&, filename), + Q_ARG(const QVector&, entityIDs)); + return retVal; } bool ClipboardScriptingInterface::exportEntities(const QString& filename, float x, float y, float z, float s) { - return Application::getInstance()->exportEntities(filename, x, y, z, s); + bool retVal; + QMetaObject::invokeMethod(Application::getInstance(), "exportEntities", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(bool, retVal), + Q_ARG(const QString&, filename), + Q_ARG(float, x), + Q_ARG(float, y), + Q_ARG(float, z), + Q_ARG(float, s)); + return retVal; } bool ClipboardScriptingInterface::importEntities(const QString& filename) { - return Application::getInstance()->importEntities(filename); + bool retVal; + QMetaObject::invokeMethod(Application::getInstance(), "importEntities", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(bool, retVal), + Q_ARG(const QString&, filename)); + return retVal; } QVector ClipboardScriptingInterface::pasteEntities(glm::vec3 position) { - return Application::getInstance()->pasteEntities(position.x, position.y, position.z); + QVector retVal; + QMetaObject::invokeMethod(Application::getInstance(), "pasteEntities", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QVector, retVal), + Q_ARG(float, position.x), + Q_ARG(float, position.y), + Q_ARG(float, position.z)); + return retVal; } From 42c33ba69918cb14504e863423f556b98b9b9d8f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 28 Sep 2015 15:40:37 -0700 Subject: [PATCH 3/3] Fix edit.js import on Windows Forcefully prepend "file:///" to the local file url used for importing --- examples/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/edit.js b/examples/edit.js index 0d1164685a..f508de3cec 100644 --- a/examples/edit.js +++ b/examples/edit.js @@ -1035,7 +1035,7 @@ function handeMenuEvent(menuItem) { var importURL; if (menuItem == "Import Entities") { - importURL = Window.browse("Select models to import", "", "*.json"); + importURL = "file:///" + Window.browse("Select models to import", "", "*.json"); } else { importURL = Window.prompt("URL of SVO to import", ""); }