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 1/3] 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); }); From 91ebd378f55f283958d87e9d5bcf276e4d0de08f Mon Sep 17 00:00:00 2001 From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com> Date: Fri, 7 Aug 2020 12:51:24 -0400 Subject: [PATCH 2/3] Clone suffix without uniqueness check Simpler solution without any hazardous uniqueness check. Cloned entities will systematically get the suffix " (2)", unless their name has already a suffix. In that case, we simply increment the suffix. --- .../entitySelectionTool.js | 52 +++++++------------ 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/scripts/system/create/entitySelectionTool/entitySelectionTool.js b/scripts/system/create/entitySelectionTool/entitySelectionTool.js index d53349821e..cbfaf7f5a6 100644 --- a/scripts/system/create/entitySelectionTool/entitySelectionTool.js +++ b/scripts/system/create/entitySelectionTool/entitySelectionTool.js @@ -20,7 +20,6 @@ const SPACE_LOCAL = "local"; const SPACE_WORLD = "world"; const HIGHLIGHT_LIST_NAME = "editHandleHighlightList"; -const ENTIRE_DOMAIN_SCAN_RADIUS = 27713; Script.include([ "../../libraries/controllers.js", @@ -33,52 +32,43 @@ 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) { +function getDuplicateAppendedName(name) { var appendiceChar = "(0123456789)"; + var currentChar = ""; var rippedName = name; - + var existingSequence = 0; + var sequenceReader = ""; for (var i = name.length - 1; i >= 0; i--) { - if (i === (name.length - 1) && name.charAt(i) !== ")") { + currentChar = name.charAt(i); + if (i === (name.length - 1) && currentChar !== ")") { rippedName = name; break; } else { - if (appendiceChar.indexOf(name.charAt(i)) === -1) { + if (appendiceChar.indexOf(currentChar) === -1) { rippedName = name; break; } else { - if (name.charAt(i) == "(" && i === name.length - 2) { + if (currentChar == "(" && i === name.length - 2) { rippedName = name; break; } else { - if (name.charAt(i) == "(") { + if (currentChar == "(") { rippedName = name.substr(0, i-1); + existingSequence = parseInt(sequenceReader); break; + } else { + sequenceReader = currentChar + sequenceReader; } } } } } + if (existingSequence === 0) { + rippedName = rippedName.trim() + " (2)"; + } else { + existingSequence++; + rippedName = rippedName.trim() + " (" + existingSequence + ")"; + } return rippedName.trim(); } @@ -340,7 +330,7 @@ SelectionManager = (function() { properties.localRotation = properties.rotation; } - properties.name = getDuplicateAppendedName(properties.name, 0); + properties.name = getDuplicateAppendedName(properties.name); properties.localVelocity = Vec3.ZERO; properties.localAngularVelocity = Vec3.ZERO; @@ -530,7 +520,6 @@ SelectionManager = (function() { var copiedProperties = []; var ids = []; - var selectionNo = 0; entityClipboard.entities.forEach(function(originalProperties) { var properties = deepCopy(originalProperties); if (properties.root) { @@ -539,8 +528,7 @@ SelectionManager = (function() { } else { delete properties.position; } - properties.name = getDuplicateAppendedName(properties.name, selectionNo); - selectionNo++; + properties.name = getDuplicateAppendedName(properties.name); copiedProperties.push(properties); }); From 2cd1fc84711c01716a179ddcb1657cc8de472302 Mon Sep 17 00:00:00 2001 From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com> Date: Tue, 11 Aug 2020 22:50:12 -0400 Subject: [PATCH 3/3] Keep the suffix only for Duplicate This update removes the incremental suffix from the "Paste" since this can't really work. This will be only for "Duplicate". --- scripts/system/create/entitySelectionTool/entitySelectionTool.js | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/system/create/entitySelectionTool/entitySelectionTool.js b/scripts/system/create/entitySelectionTool/entitySelectionTool.js index cbfaf7f5a6..e224e28fca 100644 --- a/scripts/system/create/entitySelectionTool/entitySelectionTool.js +++ b/scripts/system/create/entitySelectionTool/entitySelectionTool.js @@ -528,7 +528,6 @@ SelectionManager = (function() { } else { delete properties.position; } - properties.name = getDuplicateAppendedName(properties.name); copiedProperties.push(properties); });