def test_FlattenTimeCodeWithOffsets(self): """Tests that layer offsets are taken into account when flattening attribute time samples and defaults of time code value attributes.""" propName = "a" srcAttr = self.stage.GetPrimAtPath("/OffsetTimeCodeTimeSamples") \ .GetAttribute(propName) if Usd.UsesInverseLayerOffset(): self.assertEqual(self._GetDefault(srcAttr), Sdf.TimeCode(-10)) self.assertEqual(self._GetTimeSamples(srcAttr), { -10: Sdf.TimeCode(90), 0: Sdf.TimeCode(990) }) else: self.assertEqual(self._GetDefault(srcAttr), Sdf.TimeCode(10)) self.assertEqual(self._GetTimeSamples(srcAttr), { 10: Sdf.TimeCode(110), 20: Sdf.TimeCode(1010) }) rootPrimPath = Sdf.Path("/OffsetTimeCodeTimeSamplesRoot") dstAttr = srcAttr.FlattenTo( self.stage.OverridePrim(rootPrimPath)) if Usd.UsesInverseLayerOffset(): self.assertEqual(self._GetDefault(dstAttr), Sdf.TimeCode(-10)) self.assertEqual( self._GetTimeSamples(dstAttr), { -10: Sdf.TimeCode(90), 0: Sdf.TimeCode(990) }) self.assertEqual( self._GetDefaultInLayer( self.rootLayer, rootPrimPath.AppendProperty(propName)), Sdf.TimeCode(-10)) self.assertEqual( self._GetTimeSamplesInLayer( self.rootLayer, rootPrimPath.AppendProperty(propName)), { -10: Sdf.TimeCode(90), 0: Sdf.TimeCode(990) }) else: self.assertEqual(self._GetDefault(dstAttr), Sdf.TimeCode(10)) self.assertEqual( self._GetTimeSamples(dstAttr), { 10: Sdf.TimeCode(110), 20: Sdf.TimeCode(1010) }) self.assertEqual( self._GetDefaultInLayer( self.rootLayer, rootPrimPath.AppendProperty(propName)), Sdf.TimeCode(10)) self.assertEqual( self._GetTimeSamplesInLayer( self.rootLayer, rootPrimPath.AppendProperty(propName)), { 10: Sdf.TimeCode(110), 20: Sdf.TimeCode(1010) }) subPrimPath = Sdf.Path("/OffsetTimeCodeTimeSamplesSublayer") with Usd.EditContext( self.stage, self.stage.GetEditTargetForLocalLayer(self.subLayer)): dstAttr = srcAttr.FlattenTo( self.stage.OverridePrim(subPrimPath)) if Usd.UsesInverseLayerOffset(): self.assertEqual(self._GetDefault(dstAttr), Sdf.TimeCode(-10)) self.assertEqual( self._GetTimeSamples(dstAttr), { -10: Sdf.TimeCode(90), 0: Sdf.TimeCode(990) }) self.assertEqual( self._GetDefaultInLayer( self.subLayer, subPrimPath.AppendProperty(propName)), Sdf.TimeCode(0)) self.assertEqual( self._GetTimeSamplesInLayer( self.subLayer, subPrimPath.AppendProperty(propName)), { 0: Sdf.TimeCode(100), 10: Sdf.TimeCode(1000) }) else: self.assertEqual(self._GetDefault(dstAttr), Sdf.TimeCode(10)) self.assertEqual( self._GetTimeSamples(dstAttr), { 10: Sdf.TimeCode(110), 20: Sdf.TimeCode(1010) }) self.assertEqual( self._GetDefaultInLayer( self.subLayer, subPrimPath.AppendProperty(propName)), Sdf.TimeCode(0)) self.assertEqual( self._GetTimeSamplesInLayer( self.subLayer, subPrimPath.AppendProperty(propName)), { 0: Sdf.TimeCode(100), 10: Sdf.TimeCode(1000) })
def test_Basic(self): src_stage = Usd.Stage.Open('root.usda') layer = UsdUtils.FlattenLayerStack(src_stage, tag="test.usda") result_stage = Usd.Stage.Open(layer) # Confirm that the tag makde it into the display name. self.assertTrue('test.usda' in layer.GetDisplayName()) print '#' * 72 print 'Flattened layer:' print layer.ExportToString() print '#' * 72 # Run the same set of queries against the src and dest stages. # They should yield the same results. for stage in [src_stage, result_stage]: p = stage.GetPrimAtPath('/Sphere') # Composition arcs remain intact self.assertTrue(p.HasAuthoredReferences()) self.assertTrue(p.HasAuthoredInherits()) self.assertTrue(p.HasPayload()) self.assertTrue(p.HasVariantSets()) # Classes continue to exist self.assertTrue(stage.GetPrimAtPath('/_class_Sphere')) # Default in a strong layer wins over timeSamples in weak. a = p.GetAttribute('defaultOverTimeSamples') self.assertEqual(a.GetResolveInfo().GetSource(), Usd.ResolveInfoSourceDefault) a = p.GetAttribute('timeSamplesOverDefault') self.assertEqual(a.GetResolveInfo().GetSource(), Usd.ResolveInfoSourceTimeSamples) self.assertEqual(a.Get(), 123) # default self.assertEqual(a.Get(1), 1) # time sample # Layer offsets affect time samples a = p.GetAttribute('timeSamplesAcrossLayerOffset') if Usd.UsesInverseLayerOffset(): self.assertEqual(a.GetTimeSamples(), [11.0, 20.0]) else: self.assertEqual(a.GetTimeSamples(), [-9.0, 0.0]) # Layer offsets get folded into reference arcs p = stage.GetPrimAtPath('/Sphere/ChildFromReference') a = p.GetAttribute('timeSamplesAcrossRef') if Usd.UsesInverseLayerOffset(): self.assertEqual(a.GetTimeSamples(), [11.0, 20.0]) else: self.assertEqual(a.GetTimeSamples(), [-9.0, 0.0]) # Confirm result of list-editing. p = stage.GetPrimAtPath('/ListOpTest') r = p.GetRelationship('foo') self.assertEqual(r.GetTargets(), [ Sdf.Path('/Pre_root'), Sdf.Path('/Pre_sub'), Sdf.Path('/App_sub'), Sdf.Path('/App_root') ]) # Confirm children from across various kinds of arcs. for childPath in [ '/Sphere/ChildFromPayload', '/Sphere/ChildFromReference', '/Sphere/ChildFromNestedVariant' ]: self.assertTrue(stage.GetPrimAtPath(childPath)) # Confirm time samples coming from (offset) clips. p = stage.GetPrimAtPath('/SphereUsingClip_LegacyForm') a = p.GetAttribute('xformOp:translate') self.assertEqual( a.GetResolveInfo(5).GetSource(), Usd.ResolveInfoSourceValueClips) p = stage.GetPrimAtPath('/SphereUsingClip') a = p.GetAttribute('xformOp:translate') self.assertEqual( a.GetResolveInfo(5).GetSource(), Usd.ResolveInfoSourceValueClips) # Confirm relative asset path handling in the output stage. p = result_stage.GetPrimAtPath('/Sphere') a = p.GetAttribute('relativePath') # It should have become an absolute path. self.assertTrue(os.path.isabs(a.Get().path)) # Check arrays of paths. a = p.GetAttribute('relativePathVec') for path in a.Get(): self.assertTrue(os.path.isabs(path.path)) # Confirm Sdf-level result of list-editing. p = layer.GetPrimAtPath('/ListOpTest') targets = p.relationships['foo'].targetPathList self.assertEqual(list(targets.prependedItems), ['/Pre_root', '/Pre_sub']) self.assertEqual(list(targets.appendedItems), ['/App_sub', '/App_root']) self.assertEqual(list(targets.deletedItems), ['/Del_sub', '/Del_root']) # Confirm offsets have been folded into value clips. p1 = layer.GetPrimAtPath('/SphereUsingClip_LegacyForm') p2 = layer.GetPrimAtPath('/SphereUsingClip') if Usd.UsesInverseLayerOffset(): self.assertEqual(p1.GetInfo('clipActive'), Vt.Vec2dArray(1, [(11, 0)])) self.assertEqual(p1.GetInfo('clipTimes'), Vt.Vec2dArray(2, [(11, 1), (20, 10)])) self.assertEqual( p2.GetInfo('clips')['default']['active'], Vt.Vec2dArray(1, [(11, 0)])) self.assertEqual( p2.GetInfo('clips')['default']['times'], Vt.Vec2dArray(2, [(11, 1), (20, 10)])) else: self.assertEqual(p1.GetInfo('clipActive'), Vt.Vec2dArray(1, [(-9.0, 0.0)])) self.assertEqual(p1.GetInfo('clipTimes'), Vt.Vec2dArray(2, [(-9.0, 1), (0.0, 10)])) self.assertEqual( p2.GetInfo('clips')['default']['active'], Vt.Vec2dArray(1, [(-9.0, 0)])) self.assertEqual( p2.GetInfo('clips')['default']['times'], Vt.Vec2dArray(2, [(-9.0, 1), (0.0, 10)])) # Confirm nested variant sets still exist self.assertTrue( layer.GetObjectAtPath( '/Sphere{vset_1=default}{vset_2=default}ChildFromNestedVariant' ))
def test_FlattenWithOffsets(self): """Tests that layer offsets are taken into account when flattening attribute time samples.""" srcAttr = self.stage.GetPrimAtPath("/OffsetTimeSamples") \ .GetAttribute("a") if Usd.UsesInverseLayerOffset(): self.assertEqual(self._GetTimeSamples(srcAttr), { -10: 100, 0: 1000 }) else: self.assertEqual(self._GetTimeSamples(srcAttr), { 10: 100, 20: 1000 }) dstAttr = srcAttr.FlattenTo( self.stage.OverridePrim("/OffsetTimeSamplesRoot")) if Usd.UsesInverseLayerOffset(): self.assertEqual(self._GetTimeSamples(dstAttr), { -10: 100, 0: 1000 }) self.assertEqual( self._GetTimeSamplesInLayer(self.rootLayer, "/OffsetTimeSamplesRoot.a"), { -10: 100, 0: 1000 }) else: self.assertEqual(self._GetTimeSamples(dstAttr), { 10: 100, 20: 1000 }) self.assertEqual( self._GetTimeSamplesInLayer(self.rootLayer, "/OffsetTimeSamplesRoot.a"), { 10: 100, 20: 1000 }) with Usd.EditContext( self.stage, self.stage.GetEditTargetForLocalLayer(self.subLayer)): dstAttr = srcAttr.FlattenTo( self.stage.OverridePrim("/OffsetTimeSamplesSublayer")) if Usd.UsesInverseLayerOffset(): self.assertEqual(self._GetTimeSamples(dstAttr), { -10: 100, 0: 1000 }) self.assertEqual( self._GetTimeSamplesInLayer( self.subLayer, "/OffsetTimeSamplesSublayer.a"), { 0: 100, 10: 1000 }) else: self.assertEqual(self._GetTimeSamples(dstAttr), { 10: 100, 20: 1000 }) self.assertEqual( self._GetTimeSamplesInLayer( self.subLayer, "/OffsetTimeSamplesSublayer.a"), { 0: 100, 10: 1000 })