Example #1
0
    def test_InvalidPrimvar(self):
        p = UsdGeom.Primvar()
        # We can always call GetAttr, but it will return a null attribute
        # if we don't have a prim.
        self.assertEqual(p.GetAttr(), Usd.Attribute())
        # This used to crash before the Primvar __getattribute__ method
        # was overridden to test the validity of the underlying prim.
        with self.assertRaises(RuntimeError):
            p.BlockIndices()
        # We can't even call GetName, because there is no attribute.
        with self.assertRaises(RuntimeError):
            p.BlockIndices()

        # Now do some tests with a valid prim, but invalid attribute.
        stage = Usd.Stage.CreateInMemory('myTest.usda')
        gp = UsdGeom.Mesh.Define(stage, '/myMesh').GetPrim()
        u1 = UsdGeom.Primvar(gp.GetAttribute('primvars:u1'))
        # The attribute isn't valid, and the primvar isn't defined.
        self.assertFalse(u1.GetAttr().IsValid())
        self.assertFalse(u1.IsDefined())
        # But we can still get back to the source primitive.
        self.assertEqual(u1.GetAttr().GetPrim(), gp)
        # And we can still access name information.
        self.assertEqual(u1.GetName(), 'primvars:u1')
        self.assertEqual(u1.GetBaseName(), 'u1')
        # But attempting to access any real primvar information will raise
        # a RuntimeError exception.
        with self.assertRaises(RuntimeError):
            u1.GetElementSize()
Example #2
0
    def test_PrimvarAPI(self):
        # We'll put all our Primvar on a single mesh gprim
        stage = Usd.Stage.CreateInMemory('myTest.usda')
        gp = UsdGeom.Mesh.Define(stage, '/myMesh')

        nPasses = 3

        # Add three Primvars
        u1 = gp.CreatePrimvar('u_1', Sdf.ValueTypeNames.FloatArray)
        # Make sure it's OK to manually specify the classifier namespace
        v1 = gp.CreatePrimvar('primvars:v_1', Sdf.ValueTypeNames.FloatArray)
        _3dpmats = gp.CreatePrimvar('projMats',
                                    Sdf.ValueTypeNames.Matrix4dArray,
                                    "constant", nPasses)

        # ensure we can't create a primvar that contains namespaces.
        with self.assertRaises(Tf.ErrorException):
            gp.CreatePrimvar('no:can:do', Sdf.ValueTypeNames.FloatArray)

        self.assertEqual(len(gp.GetAuthoredPrimvars()), 3)
        self.assertEqual(len(gp.GetPrimvars()), 5)

        # Now add some random properties, and reverify
        p = gp.GetPrim()
        p.CreateRelationship("myBinding")
        p.CreateAttribute("myColor", Sdf.ValueTypeNames.Color3f)
        p.CreateAttribute("primvars:my:overly:namespaced:Color",
                          Sdf.ValueTypeNames.Color3f)

        datas = gp.GetAuthoredPrimvars()
        IsPrimvar = UsdGeom.Primvar.IsPrimvar

        self.assertEqual(len(datas), 3)
        self.assertTrue(IsPrimvar(datas[0]))
        self.assertTrue(IsPrimvar(datas[1]))
        # For variety, test the explicit Attribute extractor
        self.assertTrue(IsPrimvar(datas[2].GetAttr()))
        self.assertFalse(IsPrimvar(p.GetAttribute("myColor")))
        # Here we're testing that the speculative constructor fails properly
        self.assertFalse(IsPrimvar(UsdGeom.Primvar(p.GetAttribute("myColor"))))
        # And here that the speculative constructor succeeds properly
        self.assertTrue(
            IsPrimvar(UsdGeom.Primvar(p.GetAttribute(v1.GetName()))))

        # Some of the same tests, exercising the bool-type operator
        # for UsdGeomPrimvar; Primvar provides the easiest way to get INvalid attrs!
        self.assertTrue(datas[0])
        self.assertTrue(datas[1])
        self.assertTrue(datas[2])
        self.assertFalse(UsdGeom.Primvar(p.GetAttribute("myColor")))
        self.assertFalse(UsdGeom.Primvar(p.GetAttribute("myBinding")))
        self.assertTrue(UsdGeom.Primvar(p.GetAttribute(v1.GetName())))

        # Same classification test through GprimSchema API
        self.assertTrue(gp.HasPrimvar('u_1'))
        self.assertTrue(gp.HasPrimvar('v_1'))
        self.assertTrue(gp.HasPrimvar('projMats'))
        self.assertFalse(gp.HasPrimvar('myColor'))
        self.assertFalse(gp.HasPrimvar('myBinding'))

        # Test that the gpv's returned by GetPrimvars are REALLY valid,
        # and that the UsdAttribute metadata wrappers work
        self.assertEqual(datas[0].GetTypeName(),
                         Sdf.ValueTypeNames.Matrix4dArray)
        self.assertEqual(datas[1].GetTypeName(), Sdf.ValueTypeNames.FloatArray)
        self.assertEqual(datas[2].GetBaseName(), "v_1")

        # Now we'll add some extra configuration and verify that the
        # interrogative API works properly
        self.assertEqual(u1.GetInterpolation(),
                         UsdGeom.Tokens.constant)  # fallback
        self.assertFalse(u1.HasAuthoredInterpolation())
        self.assertFalse(u1.HasAuthoredElementSize())
        self.assertTrue(u1.SetInterpolation(UsdGeom.Tokens.vertex))
        self.assertTrue(u1.HasAuthoredInterpolation())
        self.assertEqual(u1.GetInterpolation(), UsdGeom.Tokens.vertex)

        self.assertFalse(v1.HasAuthoredInterpolation())
        self.assertFalse(v1.HasAuthoredElementSize())
        self.assertTrue(v1.SetInterpolation(UsdGeom.Tokens.uniform))
        self.assertTrue(v1.SetInterpolation(UsdGeom.Tokens.varying))
        self.assertTrue(v1.SetInterpolation(UsdGeom.Tokens.constant))
        self.assertTrue(v1.SetInterpolation(UsdGeom.Tokens.faceVarying))

        with self.assertRaises(Tf.ErrorException):
            v1.SetInterpolation("frobosity")
        # Should be the last good value set
        self.assertEqual(v1.GetInterpolation(), "faceVarying")

        self.assertTrue(_3dpmats.HasAuthoredInterpolation())
        self.assertTrue(_3dpmats.HasAuthoredElementSize())
        with self.assertRaises(Tf.ErrorException):
            _3dpmats.SetElementSize(0)
        # Failure to set shouldn't change the state...
        self.assertTrue(_3dpmats.HasAuthoredElementSize())
        self.assertTrue(_3dpmats.SetElementSize(nPasses))
        self.assertTrue(_3dpmats.HasAuthoredElementSize())

        # Make sure value Get/Set work
        self.assertEqual(u1.Get(), None)

        self.assertFalse(u1.IsIndexed())
        self.assertEqual(u1.ComputeFlattened(), None)

        uVal = Vt.FloatArray([1.1, 2.1, 3.1])
        self.assertTrue(u1.Set(uVal))
        self.assertEqual(u1.Get(), uVal)

        # Make sure indexed primvars work
        self.assertFalse(u1.IsIndexed())
        indices = Vt.IntArray([0, 1, 2, 2, 1, 0])
        self.assertTrue(u1.SetIndices(indices))
        self.assertTrue(u1.IsIndexed())

        self.assertEqual(u1.GetIndices(), indices)
        for a, b in zip(u1.ComputeFlattened(), [1.1, 2.1, 3.1, 3.1, 2.1, 1.1]):
            self.assertTrue(Gf.IsClose(a, b, 1e-5))
        self.assertNotEqual(u1.ComputeFlattened(), u1.Get())

        self.assertEqual(u1.GetUnauthoredValuesIndex(), -1)
        self.assertTrue(u1.SetUnauthoredValuesIndex(2))
        self.assertEqual(u1.GetUnauthoredValuesIndex(), 2)

        self.assertEqual(u1.GetTimeSamples(), [])
        self.assertFalse(u1.ValueMightBeTimeVarying())

        indicesAt1 = Vt.IntArray([1, 2, 0])
        indicesAt2 = Vt.IntArray([])

        self.assertTrue(u1.SetIndices(indicesAt1, 1.0))
        self.assertEqual(u1.GetIndices(1.0), indicesAt1)

        uValAt1 = Vt.FloatArray([2.1, 3.1, 4.1])
        self.assertTrue(u1.Set(uValAt1, 1.0))
        self.assertEqual(u1.Get(1.0), uValAt1)

        self.assertEqual(u1.GetTimeSamples(), [1.0])
        self.assertFalse(u1.ValueMightBeTimeVarying())

        self.assertTrue(u1.SetIndices(indicesAt2, 2.0))
        self.assertEqual(u1.GetIndices(2.0), indicesAt2)

        uValAt2 = Vt.FloatArray([3.1, 4.1, 5.1])
        self.assertTrue(u1.Set(uValAt2, 2.0))
        self.assertEqual(u1.Get(2.0), uValAt2)

        self.assertEqual(u1.GetTimeSamples(), [1.0, 2.0])
        self.assertEqual(u1.GetTimeSamplesInInterval(Gf.Interval(0.5, 1.5)),
                         [1.0])
        self.assertTrue(u1.ValueMightBeTimeVarying())

        for a, b in zip(u1.ComputeFlattened(1.0), [3.1, 4.1, 2.1]):
            self.assertTrue(Gf.IsClose(a, b, 1e-5))

        self.assertNotEqual(u1.ComputeFlattened(1.0), u1.Get(1.0))

        self.assertTrue(len(u1.ComputeFlattened(2.0)) == 0)
        self.assertNotEqual(u1.ComputeFlattened(2.0), u1.Get(2.0))

        # Ensure that primvars with indices only authored at timeSamples
        # (i.e. no default) are recognized as such.  Manual name-munging
        # necessitated by UsdGeomPrimvar's lack of API for accessing
        # the indices attribute directly!
        u1Indices = p.GetAttribute(u1.GetName() + ":indices")
        self.assertTrue(u1Indices)
        u1Indices.ClearDefault()
        self.assertTrue(u1.IsIndexed())

        # Finally, ensure the values returned by GetDeclarationInfo
        # (on new Primvar objects, to test the GprimSchema API)
        # is identical to the individual queries, and matches what we set above
        nu1 = gp.GetPrimvar("u_1")
        (name, typeName, interpolation, elementSize) = nu1.GetDeclarationInfo()
        self.assertEqual(name, u1.GetBaseName())
        self.assertEqual(typeName, u1.GetTypeName())
        self.assertEqual(interpolation, u1.GetInterpolation())
        self.assertEqual(elementSize, u1.GetElementSize())

        self.assertEqual(name, "u_1")
        self.assertEqual(typeName, Sdf.ValueTypeNames.FloatArray)
        self.assertEqual(interpolation, UsdGeom.Tokens.vertex)
        self.assertEqual(elementSize, 1)

        nv1 = gp.GetPrimvar("v_1")
        (name, typeName, interpolation, elementSize) = nv1.GetDeclarationInfo()
        self.assertEqual(name, v1.GetBaseName())
        self.assertEqual(typeName, v1.GetTypeName())
        self.assertEqual(interpolation, v1.GetInterpolation())
        self.assertEqual(elementSize, v1.GetElementSize())

        self.assertEqual(name, "v_1")
        self.assertEqual(typeName, Sdf.ValueTypeNames.FloatArray)
        self.assertEqual(interpolation, UsdGeom.Tokens.faceVarying)
        self.assertEqual(elementSize, 1)

        nmats = gp.GetPrimvar('projMats')
        (name, typeName, interpolation,
         elementSize) = nmats.GetDeclarationInfo()
        self.assertEqual(name, _3dpmats.GetBaseName())
        self.assertEqual(typeName, _3dpmats.GetTypeName())
        self.assertEqual(interpolation, _3dpmats.GetInterpolation())
        self.assertEqual(elementSize, _3dpmats.GetElementSize())

        self.assertEqual(name, 'projMats')
        self.assertEqual(typeName, Sdf.ValueTypeNames.Matrix4dArray)
        self.assertEqual(interpolation, UsdGeom.Tokens.constant)
        self.assertEqual(elementSize, nPasses)

        # Id primvar
        notId = gp.CreatePrimvar('notId', Sdf.ValueTypeNames.FloatArray)
        self.assertFalse(notId.IsIdTarget())
        with self.assertRaises(Tf.ErrorException):
            notId.SetIdTarget(gp.GetPath())

        handleid = gp.CreatePrimvar('handleid', Sdf.ValueTypeNames.String)

        # make sure we can still just set a string
        v = "handleid_value"
        self.assertTrue(handleid.Set(v))
        self.assertEqual(handleid.Get(), v)
        self.assertEqual(handleid.ComputeFlattened(), v)

        numPrimvars = len(gp.GetPrimvars())

        # This check below ensures that the "indices" attributes belonging to
        # indexed primvars aren't considered to be primvars themselves.
        self.assertEqual(numPrimvars, 7)

        self.assertTrue(handleid.SetIdTarget(gp.GetPath()))
        # make sure we didn't increase the number of primvars (also that
        # GetPrimvars doesn't break when we have relationships)
        self.assertEqual(len(gp.GetPrimvars()), numPrimvars)
        self.assertEqual(handleid.Get(), gp.GetPath())

        stringPath = '/my/string/path'
        self.assertTrue(handleid.SetIdTarget(stringPath))
        self.assertEqual(handleid.Get(), Sdf.Path(stringPath))

        p = Sdf.Path('/does/not/exist')
        self.assertTrue(handleid.SetIdTarget(p))
        self.assertEqual(handleid.Get(), p)

        handleid_array = gp.CreatePrimvar('handleid_array',
                                          Sdf.ValueTypeNames.StringArray)
        self.assertTrue(handleid_array.SetIdTarget(gp.GetPath()))
Example #3
0
    def test_PrimvarsAPI(self):
        IsPrimvar = UsdGeom.Primvar.IsPrimvar

        # We'll put all our Primvar on a single mesh gprim
        stage = Usd.Stage.CreateInMemory('myTest.usda')
        gp = UsdGeom.Mesh.Define(stage, '/myMesh')
        gp_pv = UsdGeom.PrimvarsAPI(gp)

        nPasses = 3

        # Add three Primvars
        u1 = gp_pv.CreatePrimvar('u_1', Sdf.ValueTypeNames.FloatArray)
        self.assertFalse(u1.NameContainsNamespaces())
        self.assertEqual(UsdGeom.Primvar.StripPrimvarsName(u1.GetName()),
                         "u_1")
        # Make sure it's OK to manually specify the classifier namespace
        v1 = gp_pv.CreatePrimvar('primvars:v_1', Sdf.ValueTypeNames.FloatArray)
        self.assertEqual(UsdGeom.Primvar.StripPrimvarsName(v1.GetName()),
                         "v_1")
        noPrimvarsPrefixName = "noPrimvarPrefixName"
        self.assertEqual(
            UsdGeom.Primvar.StripPrimvarsName(noPrimvarsPrefixName),
            noPrimvarsPrefixName)
        self.assertFalse(v1.NameContainsNamespaces())
        _3dpmats = gp_pv.CreatePrimvar('projMats',
                                       Sdf.ValueTypeNames.Matrix4dArray,
                                       "constant", nPasses)

        # ensure we can create a primvar that contains namespaces!
        primvarName = 'skel:jointWeights'
        jointWeights = gp_pv.CreatePrimvar(primvarName,
                                           Sdf.ValueTypeNames.FloatArray)
        self.assertTrue(IsPrimvar(jointWeights))
        self.assertTrue(
            UsdGeom.Primvar.IsValidPrimvarName(jointWeights.GetName()))
        self.assertTrue(jointWeights.NameContainsNamespaces())
        self.assertEqual(primvarName, jointWeights.GetPrimvarName())

        # Ensure we cannot create a primvar named indices or any namespace
        # ending in indices
        with self.assertRaises(Tf.ErrorException):
            gp_pv.CreatePrimvar("indices", Sdf.ValueTypeNames.IntArray)
        with self.assertRaises(Tf.ErrorException):
            gp_pv.CreatePrimvar("multi:aggregate:indices",
                                Sdf.ValueTypeNames.IntArray)

        self.assertEqual(len(gp_pv.GetAuthoredPrimvars()), 4)
        # displayColor and displayOpacity are builtins, not authored
        self.assertEqual(len(gp_pv.GetPrimvars()), 6)

        # Now add some random properties, plus a "manually" created, namespaced
        # primvar, and reverify
        p = gp.GetPrim()
        p.CreateRelationship("myBinding")
        p.CreateAttribute("myColor", Sdf.ValueTypeNames.Color3f)
        p.CreateAttribute("primvars:some:overly:namespaced:Color",
                          Sdf.ValueTypeNames.Color3f)

        datas = gp_pv.GetAuthoredPrimvars()

        self.assertEqual(len(datas), 5)
        self.assertTrue(IsPrimvar(datas[0]))
        self.assertTrue(UsdGeom.Primvar.IsValidPrimvarName(datas[0].GetName()))
        self.assertTrue(
            UsdGeom.Primvar.IsPrimvarRelatedPropertyName(datas[0].GetName()))
        self.assertTrue(IsPrimvar(datas[1]))
        self.assertTrue(UsdGeom.Primvar.IsValidPrimvarName(datas[1].GetName()))
        self.assertTrue(
            UsdGeom.Primvar.IsPrimvarRelatedPropertyName(datas[1].GetName()))
        # For variety, test the explicit Attribute extractor
        self.assertTrue(IsPrimvar(datas[2].GetAttr()))
        self.assertTrue(
            UsdGeom.Primvar.IsValidPrimvarName(datas[2].GetAttr().GetName()))
        self.assertTrue(
            UsdGeom.Primvar.IsPrimvarRelatedPropertyName(
                datas[2].GetAttr().GetName()))
        self.assertFalse(IsPrimvar(p.GetAttribute("myColor")))
        self.assertFalse(UsdGeom.Primvar.IsValidPrimvarName("myColor"))
        self.assertFalse(
            UsdGeom.Primvar.IsPrimvarRelatedPropertyName("myColor"))
        # Here we're testing that the speculative constructor fails properly
        self.assertFalse(IsPrimvar(UsdGeom.Primvar(p.GetAttribute("myColor"))))
        self.assertFalse(
            UsdGeom.Primvar.IsValidPrimvarName(
                datas[0].GetIndicesAttr().GetName()))
        self.assertTrue(
            UsdGeom.Primvar.IsPrimvarRelatedPropertyName(
                datas[0].GetIndicesAttr().GetName()))
        # And here that the speculative constructor succeeds properly
        self.assertTrue(
            IsPrimvar(UsdGeom.Primvar(p.GetAttribute(v1.GetName()))))

        # Some of the same tests, exercising the bool-type operator
        # for UsdGeomPrimvar; Primvar provides the easiest way to get INvalid attrs!
        self.assertTrue(datas[0])
        self.assertTrue(datas[1])
        self.assertTrue(datas[2])
        self.assertFalse(UsdGeom.Primvar(p.GetAttribute("myColor")))
        self.assertFalse(UsdGeom.Primvar(p.GetAttribute("myBinding")))
        self.assertTrue(UsdGeom.Primvar(p.GetAttribute(v1.GetName())))

        # Same classification test through GprimSchema API
        self.assertTrue(gp_pv.HasPrimvar('u_1'))
        self.assertTrue(gp_pv.HasPrimvar('v_1'))
        self.assertTrue(gp_pv.HasPrimvar('projMats'))
        self.assertTrue(gp_pv.HasPrimvar('skel:jointWeights'))
        self.assertFalse(gp_pv.HasPrimvar('myColor'))
        self.assertFalse(gp_pv.HasPrimvar('myBinding'))

        # Test that the gpv's returned by GetPrimvars are REALLY valid,
        # and that the UsdAttribute metadata wrappers work
        self.assertEqual(datas[0].GetTypeName(),
                         Sdf.ValueTypeNames.Matrix4dArray)
        self.assertEqual(datas[3].GetTypeName(), Sdf.ValueTypeNames.FloatArray)
        self.assertEqual(datas[4].GetBaseName(), "v_1")

        # Now we'll add some extra configuration and verify that the
        # interrogative API works properly
        self.assertEqual(u1.GetInterpolation(),
                         UsdGeom.Tokens.constant)  # fallback
        self.assertFalse(u1.HasAuthoredInterpolation())
        self.assertFalse(u1.HasAuthoredElementSize())
        self.assertTrue(u1.SetInterpolation(UsdGeom.Tokens.vertex))
        self.assertTrue(u1.HasAuthoredInterpolation())
        self.assertEqual(u1.GetInterpolation(), UsdGeom.Tokens.vertex)

        self.assertFalse(v1.HasAuthoredInterpolation())
        self.assertFalse(v1.HasAuthoredElementSize())
        self.assertTrue(v1.SetInterpolation(UsdGeom.Tokens.uniform))
        self.assertTrue(v1.SetInterpolation(UsdGeom.Tokens.varying))
        self.assertTrue(v1.SetInterpolation(UsdGeom.Tokens.constant))
        self.assertTrue(v1.SetInterpolation(UsdGeom.Tokens.faceVarying))

        with self.assertRaises(Tf.ErrorException):
            v1.SetInterpolation("frobosity")
        # Should be the last good value set
        self.assertEqual(v1.GetInterpolation(), "faceVarying")

        self.assertTrue(_3dpmats.HasAuthoredInterpolation())
        self.assertTrue(_3dpmats.HasAuthoredElementSize())
        with self.assertRaises(Tf.ErrorException):
            _3dpmats.SetElementSize(0)
        # Failure to set shouldn't change the state...
        self.assertTrue(_3dpmats.HasAuthoredElementSize())
        self.assertTrue(_3dpmats.SetElementSize(nPasses))
        self.assertTrue(_3dpmats.HasAuthoredElementSize())

        # Make sure value Get/Set work
        self.assertEqual(u1.Get(), None)

        self.assertFalse(u1.IsIndexed())
        self.assertFalse(u1.GetIndicesAttr())
        self.assertEqual(u1.ComputeFlattened(), None)

        uVal = Vt.FloatArray([1.1, 2.1, 3.1])
        self.assertTrue(u1.Set(uVal))
        self.assertEqual(u1.Get(), uVal)

        # Make sure indexed primvars work
        self.assertFalse(u1.IsIndexed())
        indices = Vt.IntArray([0, 1, 2, 2, 1, 0])
        self.assertTrue(u1.SetIndices(indices))
        self.assertTrue(u1.IsIndexed())
        self.assertTrue(u1.GetIndicesAttr())

        self.assertEqual(u1.GetIndices(), indices)
        for a, b in zip(u1.ComputeFlattened(), [1.1, 2.1, 3.1, 3.1, 2.1, 1.1]):
            self.assertTrue(Gf.IsClose(a, b, 1e-5))
        self.assertNotEqual(u1.ComputeFlattened(), u1.Get())

        indicesWithInvalid = Vt.IntArray([0, 3, 2, 2, -1, 0])
        self.assertTrue(u1.SetIndices(indicesWithInvalid))
        self.assertTrue(u1.ComputeFlattened() is None)

        indicesWithInvalid = Vt.IntArray([4, 5, 6, 7, -1, 8])
        self.assertTrue(u1.SetIndices(indicesWithInvalid))
        self.assertTrue(u1.ComputeFlattened() is None)

        self.assertEqual(u1.GetUnauthoredValuesIndex(), -1)
        self.assertTrue(u1.SetUnauthoredValuesIndex(2))
        self.assertEqual(u1.GetUnauthoredValuesIndex(), 2)

        self.assertEqual(u1.GetTimeSamples(), [])
        self.assertFalse(u1.ValueMightBeTimeVarying())

        indicesAt1 = Vt.IntArray([1, 2, 0])
        indicesAt2 = Vt.IntArray([])

        uValAt1 = Vt.FloatArray([2.1, 3.1, 4.1])
        uValAt2 = Vt.FloatArray([3.1, 4.1, 5.1])

        self.assertTrue(u1.SetIndices(indicesAt1, 1.0))
        self.assertEqual(u1.GetIndices(1.0), indicesAt1)

        self.assertTrue(u1.Set(uValAt1, 1.0))
        self.assertEqual(u1.Get(1.0), uValAt1)

        self.assertEqual(u1.GetTimeSamples(), [1.0])
        self.assertFalse(u1.ValueMightBeTimeVarying())

        self.assertTrue(u1.SetIndices(indicesAt2, 2.0))
        self.assertEqual(u1.GetIndices(2.0), indicesAt2)

        self.assertTrue(u1.Set(uValAt2, 2.0))
        self.assertEqual(u1.Get(2.0), uValAt2)

        self.assertEqual(u1.GetTimeSamples(), [1.0, 2.0])
        self.assertEqual(u1.GetTimeSamplesInInterval(Gf.Interval(0.5, 1.5)),
                         [1.0])
        self.assertTrue(u1.ValueMightBeTimeVarying())

        # Add more time-samples to u1
        indicesAt0 = Vt.IntArray([])
        uValAt3 = Vt.FloatArray([4.1, 5.1, 6.1])

        self.assertTrue(u1.SetIndices(indicesAt0, 0.0))
        self.assertEqual(u1.GetTimeSamples(), [0.0, 1.0, 2.0])

        self.assertTrue(u1.Set(uValAt3, 3.0))
        self.assertEqual(u1.GetTimeSamples(), [0.0, 1.0, 2.0, 3.0])

        self.assertEqual(u1.GetTimeSamplesInInterval(Gf.Interval(1.5, 3.5)),
                         [2.0, 3.0])

        for a, b in zip(u1.ComputeFlattened(1.0), [3.1, 4.1, 2.1]):
            self.assertTrue(Gf.IsClose(a, b, 1e-5))

        self.assertNotEqual(u1.ComputeFlattened(1.0), u1.Get(1.0))

        self.assertTrue(len(u1.ComputeFlattened(2.0)) == 0)
        self.assertNotEqual(u1.ComputeFlattened(2.0), u1.Get(2.0))

        # Ensure that primvars with indices only authored at timeSamples
        # (i.e. no default) are recognized as such.
        u1Indices = u1.GetIndicesAttr()
        self.assertTrue(u1Indices)
        u1Indices.ClearDefault()
        self.assertTrue(u1.IsIndexed())

        # Finally, ensure the values returned by GetDeclarationInfo
        # (on new Primvar objects, to test the GprimSchema API)
        # is identical to the individual queries, and matches what we set above
        nu1 = gp_pv.GetPrimvar("u_1")
        (name, typeName, interpolation, elementSize) = nu1.GetDeclarationInfo()
        self.assertEqual(name, u1.GetBaseName())
        self.assertEqual(typeName, u1.GetTypeName())
        self.assertEqual(interpolation, u1.GetInterpolation())
        self.assertEqual(elementSize, u1.GetElementSize())

        self.assertEqual(name, "u_1")
        self.assertEqual(typeName, Sdf.ValueTypeNames.FloatArray)
        self.assertEqual(interpolation, UsdGeom.Tokens.vertex)
        self.assertEqual(elementSize, 1)

        nv1 = gp_pv.GetPrimvar("v_1")
        (name, typeName, interpolation, elementSize) = nv1.GetDeclarationInfo()
        self.assertEqual(name, v1.GetBaseName())
        self.assertEqual(typeName, v1.GetTypeName())
        self.assertEqual(interpolation, v1.GetInterpolation())
        self.assertEqual(elementSize, v1.GetElementSize())

        self.assertEqual(name, "v_1")
        self.assertEqual(typeName, Sdf.ValueTypeNames.FloatArray)
        self.assertEqual(interpolation, UsdGeom.Tokens.faceVarying)
        self.assertEqual(elementSize, 1)

        nmats = gp_pv.GetPrimvar('projMats')
        (name, typeName, interpolation,
         elementSize) = nmats.GetDeclarationInfo()
        self.assertEqual(name, _3dpmats.GetBaseName())
        self.assertEqual(typeName, _3dpmats.GetTypeName())
        self.assertEqual(interpolation, _3dpmats.GetInterpolation())
        self.assertEqual(elementSize, _3dpmats.GetElementSize())

        self.assertEqual(name, 'projMats')
        self.assertEqual(typeName, Sdf.ValueTypeNames.Matrix4dArray)
        self.assertEqual(interpolation, UsdGeom.Tokens.constant)
        self.assertEqual(elementSize, nPasses)

        # Custom builtins for gprim display primvars
        displayColor = gp.CreateDisplayColorPrimvar(UsdGeom.Tokens.vertex, 3)
        self.assertTrue(displayColor)
        declInfo = displayColor.GetDeclarationInfo()
        self.assertEqual(declInfo,
                         ('displayColor', Sdf.ValueTypeNames.Color3fArray,
                          UsdGeom.Tokens.vertex, 3))

        displayOpacity = gp.CreateDisplayOpacityPrimvar(
            UsdGeom.Tokens.constant)
        self.assertTrue(displayOpacity)
        declInfo = displayOpacity.GetDeclarationInfo()
        self.assertEqual(declInfo,
                         ('displayOpacity', Sdf.ValueTypeNames.FloatArray,
                          UsdGeom.Tokens.constant, 1))

        # Id primvar
        notId = gp_pv.CreatePrimvar('notId', Sdf.ValueTypeNames.FloatArray)
        self.assertFalse(notId.IsIdTarget())
        with self.assertRaises(Tf.ErrorException):
            notId.SetIdTarget(gp.GetPath())

        handleid = gp_pv.CreatePrimvar('handleid', Sdf.ValueTypeNames.String)

        # make sure we can still just set a string
        v = "handleid_value"
        self.assertTrue(handleid.Set(v))
        self.assertEqual(handleid.Get(), v)
        self.assertEqual(handleid.ComputeFlattened(), v)

        numPrimvars = len(gp_pv.GetPrimvars())

        # This check below ensures that the "indices" attributes belonging to
        # indexed primvars aren't considered to be primvars themselves.
        self.assertEqual(numPrimvars, 9)

        self.assertTrue(handleid.SetIdTarget(gp.GetPath()))
        # make sure we didn't increase the number of primvars (also that
        # GetPrimvars doesn't break when we have relationships)
        self.assertEqual(len(gp_pv.GetPrimvars()), numPrimvars)
        self.assertEqual(handleid.Get(), gp.GetPath())

        stringPath = '/my/string/path'
        self.assertTrue(handleid.SetIdTarget(stringPath))
        self.assertEqual(handleid.Get(), Sdf.Path(stringPath))

        p = Sdf.Path('/does/not/exist')
        self.assertTrue(handleid.SetIdTarget(p))
        self.assertEqual(handleid.Get(), p)

        handleid_array = gp_pv.CreatePrimvar('handleid_array',
                                             Sdf.ValueTypeNames.StringArray)
        self.assertTrue(handleid_array.SetIdTarget(gp.GetPath()))

        # Test BlockPrimvar API
        pv_blocking = gp_pv.CreatePrimvar('pvb', Sdf.ValueTypeNames.FloatArray)
        pvName = pv_blocking.GetName()
        pv_blocking.SetInterpolation(UsdGeom.Tokens.vertex)
        pv_val = Vt.FloatArray([1.1, 2.1, 3.1])
        pv_blocking.Set(pv_val)
        # Block a non-indexed primvar should also construct and block indices attr
        self.assertFalse(pv_blocking.IsIndexed())
        self.assertTrue(pv_blocking.HasAuthoredValue())
        self.assertTrue(pv_blocking.HasAuthoredInterpolation())
        gp_pv.BlockPrimvar(pvName)
        self.assertFalse(pv_blocking.HasAuthoredValue())
        self.assertTrue(pv_blocking.HasAuthoredInterpolation())
        self.assertFalse(pv_blocking.IsIndexed())
        self.assertTrue(
            pv_blocking.GetIndicesAttr().GetResolveInfo().ValueIsBlocked())
        # re-set pv_blocking
        pv_blocking.Set(pv_val)
        pv_indices = Vt.IntArray([0, 1, 2, 2, 1, 0])
        pv_blocking.SetIndices(pv_indices)

        self.assertTrue(pv_blocking.HasAuthoredValue())
        self.assertTrue(pv_blocking.HasAuthoredInterpolation())
        self.assertTrue(pv_blocking.IsIndexed())
        # Block primvar as well as indices Attr
        gp_pv.BlockPrimvar(pvName)
        self.assertFalse(pv_blocking.HasAuthoredValue())
        self.assertTrue(pv_blocking.HasAuthoredInterpolation())
        self.assertFalse(pv_blocking.IsIndexed())
        # re-set pv_blocking for further testing
        pv_blocking.Set(pv_val)
        pv_indices = Vt.IntArray([0, 1, 2, 2, 1, 0])
        pv_blocking.SetIndices(pv_indices)
        # test BlockPrimvar on a referenced prim
        weakLayer = Sdf.Layer.CreateAnonymous()
        stageWeak = Usd.Stage.Open(weakLayer)
        ovrMesh = stageWeak.OverridePrim('/myMesh')
        ovrMesh.GetReferences().AddReference(stage.GetRootLayer().identifier,
                                             '/myMesh')
        gp_pv_ovr = UsdGeom.PrimvarsAPI(ovrMesh)
        pv_blocking_ovr = gp_pv_ovr.GetPrimvar(pvName)
        self.assertTrue(pv_blocking_ovr.HasAuthoredValue())
        self.assertTrue(pv_blocking_ovr.HasAuthoredInterpolation())
        self.assertTrue(pv_blocking_ovr.IsIndexed())
        # should only block primvar and indices attr in the referenced prim
        gp_pv_ovr.BlockPrimvar(pvName)
        # ovr primvar will be blocked!
        self.assertFalse(pv_blocking_ovr.HasAuthoredValue())
        self.assertTrue(pv_blocking_ovr.HasAuthoredInterpolation())
        self.assertFalse(pv_blocking_ovr.IsIndexed())
        # stronger layer wont get affected and original prim should not be blocked
        self.assertTrue(pv_blocking.HasAuthoredValue())
        self.assertTrue(pv_blocking.HasAuthoredInterpolation())
        self.assertTrue(pv_blocking.IsIndexed())

        # Remove a few valid primvar names
        # without namespace
        p = gp.GetPrim()
        self.assertTrue(u1.IsIndexed())
        u1Name = u1.GetName()
        u1IndicesAttrName = u1.GetIndicesAttr().GetName()

        # can not remove a primvar across a reference arc
        weakLayer = Sdf.Layer.CreateAnonymous()
        stageWeak = Usd.Stage.Open(weakLayer)
        ovrMesh = stageWeak.OverridePrim('/myMesh')
        ovrMesh.GetReferences().AddReference(stage.GetRootLayer().identifier,
                                             '/myMesh')
        gp_pv_ovr = UsdGeom.PrimvarsAPI(ovrMesh)
        self.assertTrue(gp_pv_ovr.HasPrimvar(u1Name))
        self.assertFalse(gp_pv_ovr.RemovePrimvar(u1Name))
        self.assertTrue(gp_pv_ovr.GetPrim().HasAttribute(u1Name))
        # remove indexed primvar
        self.assertTrue(gp_pv.RemovePrimvar(u1Name))
        self.assertFalse(p.HasAttribute(u1Name))
        self.assertFalse(p.HasAttribute(u1IndicesAttrName))
        # with primvars namespace
        v1Name = v1.GetName()
        self.assertTrue(gp_pv.RemovePrimvar(v1Name))
        self.assertFalse(p.HasAttribute(v1Name))
        # primvar does not exists
        self.assertFalse(gp_pv.RemovePrimvar('does_not_exist'))
        self.assertFalse(gp_pv.RemovePrimvar('does_not_exist:does_not_exist'))
        # try to remove an invalid primvar with restricted tokens, "indices"
        with self.assertRaises(Tf.ErrorException):
            gp_pv.RemovePrimvar('indices')
        with self.assertRaises(Tf.ErrorException):
            gp_pv.RemovePrimvar('multi:aggregate:indices')

        # create Indices primvar using CreateIndexedPrimvar API
        uVal = Vt.FloatArray([1.1, 2.1, 3.1])
        indices = Vt.IntArray([0, 1, 2, 2, 1, 0])
        indexedPrimvar = gp_pv.CreateIndexedPrimvar(
            'indexedPrimvar', Sdf.ValueTypeNames.FloatArray, uVal, indices,
            UsdGeom.Tokens.vertex)
        self.assertTrue(indexedPrimvar.IsIndexed())
        self.assertTrue(indexedPrimvar.HasAuthoredValue())
        self.assertTrue(indexedPrimvar.HasAuthoredInterpolation())

        # mimic a Pixar production workflow of creating primvars
        # 1. show usage with CreatePrimvar
        # 2. show usage with CreateNonIndexedPrimvar
        # - create a primvar in base layer
        # - override this primvar in a stronger layer
        # - update primvar in base layer to use indices
        # - test if primvar has indices blocked in strong layer or not!

        # Create primvar in base layer using CreatePrimvar api and set value
        basePrimvar1 = gp_pv.CreatePrimvar('pv1',
                                           Sdf.ValueTypeNames.FloatArray)
        basePrimvar1.Set(uVal)
        # Create primvar in base layer using CreatePrimvar api and set value
        basePrimvar2 = gp_pv.CreatePrimvar('pv2',
                                           Sdf.ValueTypeNames.FloatArray)
        basePrimvar2.Set(uVal)
        # stronger layer
        strongLayer = Sdf.Layer.CreateAnonymous()
        strongStage = Usd.Stage.Open(strongLayer)
        # over Mesh prim and add reference
        oMesh = strongStage.OverridePrim('/myMesh')
        oMesh.GetReferences().AddReference(stage.GetRootLayer().identifier,
                                           '/myMesh')
        # over primvarsApi instance
        gp_pv_ovr = UsdGeom.PrimvarsAPI(oMesh)
        # override value for primvar
        oVal = Vt.FloatArray([2.2, 3.2, 4.2])
        # override pv1 using CreatePrimvar api
        oBasePrimvar1 = gp_pv_ovr.CreatePrimvar('pv1',
                                                Sdf.ValueTypeNames.FloatArray)
        oBasePrimvar1.Set(oVal)
        # override pv2 using CreateNonIndexedPrimvar api
        oBasePrimvar2 = gp_pv_ovr.CreateNonIndexedPrimvar(
            'pv2', Sdf.ValueTypeNames.FloatArray, oVal)
        # test indices attr missing on oBasePrimvar1
        self.assertFalse(oBasePrimvar1.GetIndicesAttr().IsValid())
        # test oBasePrimvar2's indices attribute has a block authored
        self.assertFalse(oBasePrimvar2.IsIndexed())
        self.assertTrue(
            oBasePrimvar2.GetIndicesAttr().GetResolveInfo().ValueIsBlocked())
        # update base (weaker) layer primvars to have an indices
        basePrimvar1.SetIndices(indices)
        basePrimvar2.SetIndices(indices)
        # ovr pv1 should now get indices
        self.assertTrue(oBasePrimvar1.IsIndexed())
        # ovr pv2 should still have the block for indices
        self.assertFalse(oBasePrimvar2.IsIndexed())
        self.assertTrue(
            oBasePrimvar2.GetIndicesAttr().GetResolveInfo().ValueIsBlocked())