def setUp(self): ''' Called initially to set up the maya test environment ''' # Load plugins self.assertTrue(self.pluginsLoaded) # These tests requires no additional setup. if self._testMethodName in [ 'testAddNewPrim', 'testAddNewPrimWithDelete' ]: return # Open top_layer.ma scene in test-samples mayaUtils.openTopLayerScene() # Clear selection to start off. ufe.GlobalSelection.get().clear() # Select Ball_35. ball35Path = ufe.Path([ mayaUtils.createUfePathSegment("|world|transform1|proxyShape1"), usdUtils.createUfePathSegment("/Room_set/Props/Ball_35") ]) self.ball35Item = ufe.Hierarchy.createItem(ball35Path) self.ball35Prim = usdUtils.getPrimFromSceneItem(self.ball35Item) ufe.GlobalSelection.get().append(self.ball35Item) # Create a ContextOps interface for it. self.contextOps = ufe.ContextOps.contextOps(self.ball35Item)
def usdSceneItemScale(item): prim = usdUtils.getPrimFromSceneItem(ball35Item) if not prim.HasAttribute('xformOp:scale'): return proxyShapeXformFn.scale() else: return combineScales(proxyShapeXformFn.scale(), prim.GetAttribute('xformOp:scale').Get())
def usdSceneItemRotation(item): prim = usdUtils.getPrimFromSceneItem(item) if not prim.HasAttribute('xformOp:rotateXYZ'): return proxyShapeXformFn.rotation(om.MSpace.kTransform) else: x,y,z = prim.GetAttribute('xformOp:rotateXYZ').Get() return proxyShapeXformFn.rotation(om.MSpace.kTransform) + om.MEulerRotation(radians(x), radians(y), radians(z))
def usdSceneItemTranslation(item): prim = usdUtils.getPrimFromSceneItem(item) if not prim.HasAttribute('xformOp:translate'): return proxyShapeXformFn.translation(om.MSpace.kTransform) else: return addVec( proxyShapeXformFn.translation(om.MSpace.kTransform), prim.GetAttribute('xformOp:translate').Get())
def runTestAttribute(self, path, attrName, ufeAttrClass, ufeAttrType): '''Engine method to run attribute test.''' # Create the UFE/USD attribute for this test from the input path. # Get a UFE scene item the input path in the scene. itemPath = ufe.Path([ mayaUtils.createUfePathSegment("|world|transform1|proxyShape1"), usdUtils.createUfePathSegment(path) ]) ufeItem = ufe.Hierarchy.createItem(itemPath) # Get the USD prim for this item. usdPrim = usdUtils.getPrimFromSceneItem(ufeItem) # Create the attributes interface for the item. ufeAttrs = ufe.Attributes.attributes(ufeItem) self.assertIsNotNone(ufeAttrs) # Get the USDAttribute for the input attribute name so we can use it to # compare to UFE. usdAttr = usdPrim.GetAttribute(attrName) self.assertIsNotNone(usdAttr) # Get the attribute that matches the input name and make sure it matches # the class type of UFE attribute class passed in. self.assertTrue(ufeAttrs.hasAttribute(attrName)) ufeAttr = ufeAttrs.attribute(attrName) self.assertIsInstance(ufeAttr, ufeAttrClass) # Verify that the attribute type matches the input UFE type. self.assertEqual(ufeAttr.type, ufeAttrType) # Verify that the scene item the attribute was created with matches # what is stored in the UFE attribute. self.assertEqual(ufeAttr.sceneItem(), ufeItem) # Verify that this attribute has a value. Note: all the attributes that # are tested by this method are assumed to have a value. self.assertTrue(ufeAttr.hasValue()) # Verify that the name matched what we created the attribute from. self.assertEqual(ufeAttr.name, attrName) # Test that the string representation of the value is not empty. self.assertTrue(str(ufeAttr)) return ufeAttr, usdAttr
def testObservation(self): '''Test Transform3d observation interface. As of 11-Apr-2018 only implemented for USD objects. ''' # Select Ball_35 to move it. ball35Path = ufe.Path([ mayaUtils.createUfePathSegment("|world|transform1|proxyShape1"), usdUtils.createUfePathSegment("/Room_set/Props/Ball_35") ]) ball35Item = ufe.Hierarchy.createItem(ball35Path) # Create a Transform3d interface for it. transform3d = ufe.Transform3d.transform3d(ball35Item) t3dObs = TestObserver() # We start off with no observers for Ball_35. self.assertFalse(ufe.Transform3d.hasObservers(ball35Path)) self.assertFalse(ufe.Transform3d.hasObserver(ball35Item, t3dObs)) self.assertEqual(ufe.Transform3d.nbObservers(ball35Item), 0) # Set the observer to observe Ball_35. ufe.Transform3d.addObserver(ball35Item, t3dObs) self.assertTrue(ufe.Transform3d.hasObservers(ball35Path)) self.assertTrue(ufe.Transform3d.hasObserver(ball35Item, t3dObs)) self.assertEqual(ufe.Transform3d.nbObservers(ball35Item), 1) # No notifications yet. self.assertEqual(t3dObs.notifications(), 0) # We only select the ball AFTER doing our initial tests because # the MayaUSD plugin creates a transform3d observer on selection # change to update the bounding box. ufe.GlobalSelection.get().append(ball35Item) # Move the prim. ball35Prim = usdUtils.getPrimFromSceneItem(ball35Item) ball35Prim.GetAttribute('xformOp:translate').Set(Gf.Vec3d(10, 20, 30)) # Notified. self.assertEqual(t3dObs.notifications(), 1)
def ball35Translation(): ball35Prim = usdUtils.getPrimFromSceneItem(ball35Item) return addVec(proxyShapeXformFn.translation(om.MSpace.kTransform), ball35Prim.GetAttribute('xformOp:translate').Get())
def ball35SetTranslation(xlation): ball35Prim = usdUtils.getPrimFromSceneItem(ball35Item) ball35Prim.GetAttribute('xformOp:translate').Set( Gf.Vec3d(*xlation))
def testUsdGroup(self): '''Creation of USD group objects.''' mayaPathSegment = mayaUtils.createUfePathSegment( "|world|transform1|proxyShape1") usdSegmentBall5 = usdUtils.createUfePathSegment( "/Ball_set/Props/Ball_5") ball5Path = ufe.Path([mayaPathSegment, usdSegmentBall5]) ball5Item = ufe.Hierarchy.createItem(ball5Path) usdSegmentBall3 = usdUtils.createUfePathSegment( "/Ball_set/Props/Ball_3") ball3Path = ufe.Path([mayaPathSegment, usdSegmentBall3]) ball3Item = ufe.Hierarchy.createItem(ball3Path) usdSegmentProps = usdUtils.createUfePathSegment("/Ball_set/Props") parentPath = ufe.Path([mayaPathSegment, usdSegmentProps]) parentItem = ufe.Hierarchy.createItem(parentPath) parentHierarchy = ufe.Hierarchy.hierarchy(parentItem) parentChildrenPre = parentHierarchy.children() self.assertEqual(len(parentChildrenPre), 6) newGroupName = ufe.PathComponent("newGroup") # get the USD stage stage = mayaUsd.ufe.getStage(str(mayaPathSegment)) # set the edit target to balls.usda layer = stage.GetLayerStack()[1] self.assertEqual("ballset.usda", layer.GetDisplayName()) stage.SetEditTarget(layer) ufeSelectionList = ufe.Selection() ufeSelectionList.append(ball5Item) ufeSelectionList.append(ball3Item) groupCmd = parentHierarchy.createGroupCmd(ufeSelectionList, newGroupName) groupCmd.execute() parentChildrenPost = parentHierarchy.children() self.assertEqual(len(parentChildrenPost), 5) # The command will now append a number 1 at the end to match the naming # convention in Maya. newGroupPath = parentPath + ufe.PathComponent("newGroup1") # Make sure the new group item has the correct Usd type newGroupItem = ufe.Hierarchy.createItem(newGroupPath) newGroupPrim = usdUtils.getPrimFromSceneItem(newGroupItem) newGroupType = newGroupPrim.GetTypeName() self.assertEqual(newGroupType, 'Xform') childPaths = set([child.path() for child in parentChildrenPost]) self.assertTrue(newGroupPath in childPaths) self.assertTrue(ball5Path not in childPaths) self.assertTrue(ball3Path not in childPaths) groupCmd.undo() parentChildrenUndo = parentHierarchy.children() self.assertEqual(len(parentChildrenUndo), 6) childPathsUndo = set([child.path() for child in parentChildrenUndo]) self.assertTrue(newGroupPath not in childPathsUndo) self.assertTrue(ball5Path in childPathsUndo) self.assertTrue(ball3Path in childPathsUndo) groupCmd.redo() parentChildrenRedo = parentHierarchy.children() self.assertEqual(len(parentChildrenRedo), 5) childPathsRedo = set([child.path() for child in parentChildrenRedo]) self.assertTrue(newGroupPath in childPathsRedo) self.assertTrue(ball5Path not in childPathsRedo) self.assertTrue(ball3Path not in childPathsRedo)
def testDuplicate(self): '''Duplicate Maya and USD objects.''' # Select two objects, one Maya, one USD. spherePath = ufe.Path(mayaUtils.createUfePathSegment("|pSphere1")) sphereItem = ufe.Hierarchy.createItem(spherePath) sphereHierarchy = ufe.Hierarchy.hierarchy(sphereItem) worldItem = sphereHierarchy.parent() ball35Path = ufe.Path([ mayaUtils.createUfePathSegment( "|world|transform1|proxyShape1"), usdUtils.createUfePathSegment("/Room_set/Props/Ball_35")]) ball35Item = ufe.Hierarchy.createItem(ball35Path) ball35Hierarchy = ufe.Hierarchy.hierarchy(ball35Item) propsItem = ball35Hierarchy.parent() worldHierarchy = ufe.Hierarchy.hierarchy(worldItem) worldChildrenPre = worldHierarchy.children() propsHierarchy = ufe.Hierarchy.hierarchy(propsItem) propsChildrenPre = propsHierarchy.children() ufe.GlobalSelection.get().append(sphereItem) ufe.GlobalSelection.get().append(ball35Item) # Set the edit target to the layer in which Ball_35 is defined (has a # primSpec, in USD terminology). Otherwise, duplication will not find # a source primSpec to copy. Layers are the (anonymous) session layer, # the root layer, then the Assembly_room_set sublayer. Trying to find # the layer by name is not practical, as it requires the full path # name, which potentially differs per run-time environment. ball35Prim = usdUtils.getPrimFromSceneItem(ball35Item) stage = ball35Prim.GetStage() layer = stage.GetLayerStack()[2] stage.SetEditTarget(layer) cmds.duplicate() # The duplicate command doesn't return duplicated non-Maya UFE objects. # They are in the selection, in the same order as the sources. snIter = iter(ufe.GlobalSelection.get()) sphereDupItem = next(snIter) sphereDupName = str(sphereDupItem.path().back()) ball35DupItem = next(snIter) ball35DupName = str(ball35DupItem.path().back()) # MAYA-92350: should not need to re-bind hierarchy interface objects # with their item. worldHierarchy = ufe.Hierarchy.hierarchy(worldItem) worldChildren = worldHierarchy.children() propsHierarchy = ufe.Hierarchy.hierarchy(propsItem) propsChildren = propsHierarchy.children() self.assertEqual(len(worldChildren)-len(worldChildrenPre), 1) self.assertEqual(len(propsChildren)-len(propsChildrenPre), 1) self.assertIn(sphereDupItem, worldChildren) self.assertIn(ball35DupItem, propsChildren) cmds.undo() # The duplicated items should no longer appear in the child list of # their parents. def childrenNames(children): return [str(child.path().back()) for child in children] worldHierarchy = ufe.Hierarchy.hierarchy(worldItem) worldChildren = worldHierarchy.children() propsHierarchy = ufe.Hierarchy.hierarchy(propsItem) propsChildren = propsHierarchy.children() worldChildrenNames = childrenNames(worldChildren) propsChildrenNames = childrenNames(propsChildren) self.assertNotIn(sphereDupName, worldChildrenNames) self.assertNotIn(ball35DupName, propsChildrenNames) # MAYA-92264: because of USD bug, redo doesn't work. return cmds.redo() snIter = iter(ufe.GlobalSelection.get()) sphereDupItem = next(snIter) ball35DupItem = next(snIter) # MAYA-92350: should not need to re-bind hierarchy interface objects # with their item. worldHierarchy = ufe.Hierarchy.hierarchy(worldItem) worldChildren = worldHierarchy.children() propsHierarchy = ufe.Hierarchy.hierarchy(propsItem) propsChildren = propsHierarchy.children() self.assertEqual(len(worldChildren)-len(worldChildrenPre), 1) self.assertEqual(len(propsChildren)-len(propsChildrenPre), 1) self.assertIn(sphereDupItem, worldChildren) self.assertIn(ball35DupItem, propsChildren)