From 47e3649298d852f0444af5eaf9abaabba0c1795a Mon Sep 17 00:00:00 2001 From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com> Date: Thu, 6 Aug 2020 22:28:32 -0400 Subject: [PATCH] Incremental suffix to duplicated entities This enhancement adds an incremental suffix to the name of the cloned entities resulting from "Duplicate" and "Paste". The goal is to help to figure which entities is the coned one. This addresses issue #575 --- .../entitySelectionTool.js | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/scripts/system/create/entitySelectionTool/entitySelectionTool.js b/scripts/system/create/entitySelectionTool/entitySelectionTool.js index 9bab739060..d53349821e 100644 --- a/scripts/system/create/entitySelectionTool/entitySelectionTool.js +++ b/scripts/system/create/entitySelectionTool/entitySelectionTool.js @@ -6,6 +6,7 @@ // Modified by Daniela Fontes * @DanielaFifo and Tiago Andrade @TagoWill on 4/7/2017 // Modified by David Back on 1/9/2018 // Copyright 2014 High Fidelity, Inc. +// Copyright 2020 Vircadia contributors // // This script implements a class useful for building tools for editing entities. // @@ -19,6 +20,7 @@ const SPACE_LOCAL = "local"; const SPACE_WORLD = "world"; const HIGHLIGHT_LIST_NAME = "editHandleHighlightList"; +const ENTIRE_DOMAIN_SCAN_RADIUS = 27713; Script.include([ "../../libraries/controllers.js", @@ -31,6 +33,55 @@ function deepCopy(v) { return JSON.parse(JSON.stringify(v)); } +function getDuplicateAppendedName(originalName, forcedIncrement) { + var duplicateName, existingNames; + var delayCounter = forcedIncrement; + var duplicateNumber = 1; + var rippedOriginalName = removeNameAppendice(originalName); + + do { + duplicateNumber++; + if (rippedOriginalName === "") { + duplicateName = "(" + duplicateNumber + ")"; + } else { + duplicateName = rippedOriginalName + " (" + duplicateNumber + ")"; + } + existingNames = Entities.findEntitiesByName(duplicateName, Vec3.ZERO, ENTIRE_DOMAIN_SCAN_RADIUS, false); + if (existingNames.length === 0) { + delayCounter--; + } + } while (existingNames.length !== 0 || delayCounter >= 0); + return duplicateName; +} + +function removeNameAppendice(name) { + var appendiceChar = "(0123456789)"; + var rippedName = name; + + for (var i = name.length - 1; i >= 0; i--) { + if (i === (name.length - 1) && name.charAt(i) !== ")") { + rippedName = name; + break; + } else { + if (appendiceChar.indexOf(name.charAt(i)) === -1) { + rippedName = name; + break; + } else { + if (name.charAt(i) == "(" && i === name.length - 2) { + rippedName = name; + break; + } else { + if (name.charAt(i) == "(") { + rippedName = name.substr(0, i-1); + break; + } + } + } + } + } + return rippedName.trim(); +} + SelectionManager = (function() { var that = {}; @@ -289,6 +340,8 @@ SelectionManager = (function() { properties.localRotation = properties.rotation; } + properties.name = getDuplicateAppendedName(properties.name, 0); + properties.localVelocity = Vec3.ZERO; properties.localAngularVelocity = Vec3.ZERO; @@ -477,6 +530,7 @@ SelectionManager = (function() { var copiedProperties = []; var ids = []; + var selectionNo = 0; entityClipboard.entities.forEach(function(originalProperties) { var properties = deepCopy(originalProperties); if (properties.root) { @@ -485,6 +539,8 @@ SelectionManager = (function() { } else { delete properties.position; } + properties.name = getDuplicateAppendedName(properties.name, selectionNo); + selectionNo++; copiedProperties.push(properties); });