diff --git a/lib/mayaUsd/ufe/UsdUndoDuplicateSelectionCommand.cpp b/lib/mayaUsd/ufe/UsdUndoDuplicateSelectionCommand.cpp index 7edcb06587..7bd3e56a2f 100644 --- a/lib/mayaUsd/ufe/UsdUndoDuplicateSelectionCommand.cpp +++ b/lib/mayaUsd/ufe/UsdUndoDuplicateSelectionCommand.cpp @@ -131,7 +131,7 @@ void UsdUndoDuplicateSelectionCommand::execute() sources, duplicatePair, stageData.second, _copyExternalInputs)) { if (sources.empty()) { attr.ClearConnections(); - if (!attr.HasValue()) { + if (!attr.HasValue() && !UsdShadeNodeGraph(attr.GetPrim())) { p.RemoveProperty(prop.GetName()); } } else { diff --git a/test/lib/ufe/testBatchOpsHandler.py b/test/lib/ufe/testBatchOpsHandler.py index 253aebcd19..8fd48b79cb 100644 --- a/test/lib/ufe/testBatchOpsHandler.py +++ b/test/lib/ufe/testBatchOpsHandler.py @@ -363,6 +363,28 @@ def checkStatus(self, cmd, feomItem): checkStatus(self, cmd, geomItem) + def testDuplicatedNodeGraph(self): + """When cleaning the incoming connections of a duplicated NodeGraph, we want to keep the + unconnected attributes since they are not intrinsic (like for shader nodes).""" + testFile = testUtils.getTestScene('MaterialX', 'BatchOpsTestScene.usda') + shapeNode,shapeStage = mayaUtils.createProxyFromFile(testFile) + + ngItem = ufeUtils.createUfeSceneItem(shapeNode, '/mtl/ss4SG/MayaNG_ss4SG') + self.assertIsNotNone(ngItem) + + batchOpsHandler = ufe.RunTimeMgr.instance().batchOpsHandler(ngItem.runTimeId()) + self.assertIsNotNone(batchOpsHandler) + + sel = ufe.Selection() + sel.append(ngItem) + + cmd = batchOpsHandler.duplicateSelectionCmd(sel, {"inputConnections": False}) + cmd.execute() + + dNgPrim = usdUtils.getPrimFromSceneItem(cmd.targetItem(ngItem.path())) + self.assertTrue(dNgPrim.HasProperty("inputs:file4:varname")) + self.assertTrue(dNgPrim.HasProperty("outputs:baseColor")) + if __name__ == '__main__': unittest.main(verbosity=2)