void cloneSelected(const cmd::ArgumentList& args) { // Check for the correct editing mode (don't clone components) if (GlobalSelectionSystem().Mode() == SelectionSystem::eComponent) { return; } UndoableCommand undo("cloneSelected"); // Create the list that will take the cloned instances SelectionCloner::Map cloned; SelectionCloner cloner; GlobalSceneGraph().root()->traverse(cloner); // Create a new namespace and move all cloned nodes into it INamespacePtr clonedNamespace = GlobalNamespaceFactory().createNamespace(); assert(clonedNamespace != NULL); // Move items into the temporary namespace, this will setup the links clonedNamespace->connect(cloner.getCloneRoot()); // Get the namespace of the current map scene::IMapRootNodePtr mapRoot = GlobalMapModule().getRoot(); if (mapRoot == NULL) return; // not map root (this can happen) INamespacePtr nspace = mapRoot->getNamespace(); if (nspace) { // Prepare the nodes for import nspace->ensureNoConflicts(cloner.getCloneRoot()); // Now move all nodes into the target namespace nspace->connect(cloner.getCloneRoot()); } // Unselect the current selection GlobalSelectionSystem().setSelectedAll(false); // Finally, move the cloned nodes to their destination and select them cloner.moveClonedNodes(true); if (registry::getValue<int>(RKEY_OFFSET_CLONED_OBJECTS) == 1) { // Move the current selection by one grid unit to the "right" and "downwards" nudgeSelected(eNudgeDown); nudgeSelected(eNudgeRight); } }
bool Map::import(const std::string& filename) { ui::ScreenUpdateBlocker blocker(_("Importing..."), filename); bool success = false; { IMapResourcePtr resource = GlobalMapResourceManager().capture(filename); if (resource->load()) { // load() returned TRUE, this means that the resource node // is not the NULL node scene::INodePtr otherRoot = resource->getNode(); // Adjust all new names to fit into the existing map namespace, // this routine will be changing a lot of names in the importNamespace INamespacePtr nspace = getRoot()->getNamespace(); if (nspace) { // Prepare our namespace for import nspace->ensureNoConflicts(otherRoot); // Now add the imported names to the local namespace nspace->connect(otherRoot); } MergeMap(otherRoot); success = true; } } SceneChangeNotify(); return success; }