From 2831561355b1d789ab88f0ab2c3b554d6cd3d69f Mon Sep 17 00:00:00 2001 From: Sean Donnelly <23455376+seando-adsk@users.noreply.github.com> Date: Tue, 1 Mar 2022 16:00:10 -0500 Subject: [PATCH 1/2] MAYA-121937 - Renaming 2 prims w/illegal chars will crash Maya * Validate the name before making it unique. --- lib/mayaUsd/resources/scripts/mayaUsdAddMayaReference.py | 6 ++++-- lib/mayaUsd/ufe/UsdUndoRenameCommand.cpp | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/mayaUsd/resources/scripts/mayaUsdAddMayaReference.py b/lib/mayaUsd/resources/scripts/mayaUsdAddMayaReference.py index d9b9d2faee..6df52e06d8 100644 --- a/lib/mayaUsd/resources/scripts/mayaUsdAddMayaReference.py +++ b/lib/mayaUsd/resources/scripts/mayaUsdAddMayaReference.py @@ -107,13 +107,14 @@ def createMayaReferencePrim(ufePathStr, mayaReferencePath, mayaNamespace, # and validate the input name. # Note: it is allowed to be input as empty in which case a default is used. if groupPrimName: + groupPrimName = Tf.MakeValidIdentifier(groupPrimName) checkGroupPrimName = mayaUsd.ufe.uniqueChildName(parentPrim, groupPrimName) if checkGroupPrimName != groupPrimName: errorMsgFormat = getMayaUsdLibString('kErrorGroupPrimExists') errorMsg = cmds.format(errorMsgFormat, stringArg=(groupPrimName, ufePathStr)) om.MGlobal.displayError(errorMsg) return Usd.Prim() - groupPrimName = Tf.MakeValidIdentifier(checkGroupPrimName) + groupPrimName = checkGroupPrimName # If the group prim was either not provided or empty we use a default name. if not groupPrimName: @@ -130,13 +131,14 @@ def createMayaReferencePrim(ufePathStr, mayaReferencePath, mayaNamespace, # Note: if we are given a group prim to create, then we know that the # Maya Reference prim name will be unique since it will be the # only child (of the newly created group prim). + mayaReferencePrimName = Tf.MakeValidIdentifier(mayaReferencePrimName) checkName = mayaUsd.ufe.uniqueChildName(parentPrim, mayaReferencePrimName) if groupPrim is None else mayaReferencePrimName if checkName != mayaReferencePrimName: errorMsgFormat = getMayaUsdLibString('kErrorMayaRefPrimExists') errorMsg = cmds.format(errorMsgFormat, stringArg=(mayaReferencePrimName, ufePathStr)) om.MGlobal.displayError(errorMsg) return Usd.Prim() - validatedPrimName = Tf.MakeValidIdentifier(checkName) + validatedPrimName = checkName # Extract the USD path segment from the UFE path and append the Maya # reference prim to it. diff --git a/lib/mayaUsd/ufe/UsdUndoRenameCommand.cpp b/lib/mayaUsd/ufe/UsdUndoRenameCommand.cpp index 82d356a15d..cd3e90398c 100644 --- a/lib/mayaUsd/ufe/UsdUndoRenameCommand.cpp +++ b/lib/mayaUsd/ufe/UsdUndoRenameCommand.cpp @@ -74,7 +74,7 @@ UsdUndoRenameCommand::UsdUndoRenameCommand( ufe::applyCommandRestriction(prim, "rename"); // handle unique name for _newName - _newName = TfMakeValidIdentifier(uniqueChildName(prim.GetParent(), newName.string())); + _newName = uniqueChildName(prim.GetParent(), TfMakeValidIdentifier(newName.string())); } UsdUndoRenameCommand::~UsdUndoRenameCommand() { } From a5b9fe3eba6de71cbb7ab5109165ab209d7ca356 Mon Sep 17 00:00:00 2001 From: Sean Donnelly <23455376+seando-adsk@users.noreply.github.com> Date: Tue, 1 Mar 2022 17:24:14 -0500 Subject: [PATCH 2/2] MAYA-121937 - Renaming 2 prims w/illegal chars will crash Maya * Added test case for crash (fixed now). --- test/lib/ufe/testRename.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/lib/ufe/testRename.py b/test/lib/ufe/testRename.py index ba09a24cf3..5da884a2c6 100644 --- a/test/lib/ufe/testRename.py +++ b/test/lib/ufe/testRename.py @@ -522,6 +522,23 @@ def testRenameSpecialCharacter(self): newValidName = Tf.MakeValidIdentifier(newNameStartingWithDigit) self.assertEqual(usdPrim.GetName(), newValidName) + # [GitHub #2150] renaming 2 usd items with illegal characters will cause Maya to crash + cmds.file(new=True, force=True) + import mayaUsd_createStageWithNewLayer + psPathStr = mayaUsd_createStageWithNewLayer.createStageWithNewLayer() + stage = mayaUsd.lib.GetPrim(psPathStr).GetStage() + x1 = stage.DefinePrim('/Xform1', 'Xform') + x2 = stage.DefinePrim('/Xform2', 'Xform') + cmds.select('|stage1|stageShape1,/Xform1', replace=True) + cmds.rename('test.') # Rename first object with illegal name + cmds.select('|stage1|stageShape1,/Xform2', replace=True) + cmds.rename('test.') # Rename second object with same illegal name + + # Make sure they got renamed as we expect. + cmds.select('|stage1|stageShape1,/test_', '|stage1|stageShape1,/test_1', replace=True) + sel = ufe.GlobalSelection.get() + self.assertEqual(2, len(sel)) + def testRenameNotifications(self): '''Rename a USD node and test for the UFE notifications.'''