def testExportStrokeNode(self): """ Tests that a Maya stroke node created using Paint Effects exports correctly as a UsdGeomBasisCurves schema prim. """ strokePrim = self._stage.GetPrimAtPath('/%s/Geom/StrokeCrystals' % self._testName) basisCurves = UsdGeom.BasisCurves(strokePrim) self.assertTrue(basisCurves) # As authored in Maya, there are expected to be 503 total curves, # composed of 3318 vertices. expectedNumCurves = 503 expectedNumVertices = 3318 curveVertexCounts = basisCurves.GetCurveVertexCountsAttr().Get() self.assertEqual(len(curveVertexCounts), expectedNumCurves) points = basisCurves.GetPointsAttr().Get() self.assertEqual(len(points), expectedNumVertices) widths = basisCurves.GetWidthsAttr().Get() self.assertEqual(len(widths), expectedNumVertices) displayColors = basisCurves.GetDisplayColorPrimvar().ComputeFlattened() self.assertEqual(len(displayColors), expectedNumVertices) displayOpacities = basisCurves.GetDisplayOpacityPrimvar( ).ComputeFlattened() self.assertEqual(len(displayOpacities), expectedNumVertices)
def test_ComputeCurveCount(self): stage = Usd.Stage.Open('basisCurves.usda') unset = UsdGeom.BasisCurves.Get(stage, '/UnsetVertexCounts') blocked = UsdGeom.BasisCurves.Get(stage, '/BlockedVertexCounts') empty = UsdGeom.BasisCurves.Get(stage, '/EmptyVertexCounts') timeSampled = UsdGeom.BasisCurves.Get(stage, '/TimeSampledVertexCounts') timeSampledAndDefault = UsdGeom.BasisCurves.Get( stage, '/TimeSampledAndDefaultVertexCounts') testTimeSamples = [(unset, Usd.TimeCode.EarliestTime(), 0), (blocked, Usd.TimeCode.EarliestTime(), 0), (empty, Usd.TimeCode.EarliestTime(), 0), (timeSampled, Usd.TimeCode.EarliestTime(), 3), (timeSampledAndDefault, Usd.TimeCode.EarliestTime(), 5)] testDefaults = [(unset, 0), (blocked, 0), (empty, 0), (timeSampled, 0), (timeSampledAndDefault, 4)] for (schema, timeCode, expected) in testTimeSamples: self.assertTrue(schema) self.assertEqual(schema.GetCurveCount(timeCode), expected) for (schema, expected) in testDefaults: self.assertTrue(schema) self.assertEqual(schema.GetCurveCount(), expected) invalid = UsdGeom.BasisCurves(Usd.Prim()) self.assertFalse(invalid) with self.assertRaises(RuntimeError): self.assertEqual(invalid.ComputeCurveCount(), 0) with self.assertRaises(RuntimeError): self.assertEqual( invalid.ComputeCurveCount(Usd.TimeCode.EarliestTime()), 0)
def test_RoundTripCubic(self): time = Usd.TimeCode.EarliestTime() prim = self.stage.GetPrimAtPath('/Cubic/Ribbons/VertexWidth') schema = UsdGeom.BasisCurves(prim) # These attributes are uniformly time sampled curveType = schema.GetTypeAttr().Get() basis = schema.GetBasisAttr().Get() wrap = schema.GetWrapAttr().Get() self.assertEqual(curveType, UsdGeom.Tokens.cubic) self.assertEqual(basis, UsdGeom.Tokens.bezier) self.assertEqual(wrap, UsdGeom.Tokens.nonperiodic) # Interpolation metadata normalsInterpolation = schema.GetNormalsInterpolation() widthsInterpolation = schema.GetWidthsInterpolation() self.assertEqual(normalsInterpolation, UsdGeom.Tokens.varying) self.assertEqual(widthsInterpolation, UsdGeom.Tokens.vertex) # These attributes may be varying time sampled curveVertexCounts = schema.GetCurveVertexCountsAttr().Get(time) points = schema.GetPointsAttr().Get(time) widths = schema.GetWidthsAttr().Get(time) normals = schema.GetNormalsAttr().Get(time) self._assertElementsAlmostEqual(points, [(0, 0, 0), (1, 1, 0), (1, 2, 0), (0, 3, 0), (-1, 4, 0), (-1, 5, 0), (0, 6, 0)]) self._assertElementsAlmostEqual(widths, [0, .5, .5, .8, .5, .5, 0]) self._assertElementsAlmostEqual(normals, [(1, 0, 0), (.98, 0, .44), (.707, 0, .707)]) self.assertEqual(list(curveVertexCounts), [7])
def emit_pointcloud(app, options, pointloud_name, usd_tfm, visibility, usd_prim, is_strands, xsi_parent, is_simple=False): '''if is_simple is True, then we should ignore in-object ransform ''' if DEBUG_MODE: imp.reload(materials) imp.reload(utils) usd_object = UsdGeom.BasisCurves( usd_prim) if is_strands else UsdGeom.Points(usd_prim) xsi_points = app.GetPrim("PointCloud", pointloud_name, xsi_parent) if options.get("is_materials", False): usd_material = UsdShade.MaterialBindingAPI( usd_prim).GetDirectBinding().GetMaterial() xsi_material = materials.import_material( app, usd_material, library_name=options["file_name"]) if xsi_material is not None: app.AssignMaterial(xsi_material.FullName + "," + xsi_points.FullName) utils.set_xsi_transform(app, xsi_points, usd_tfm, up_key=options["up_axis"]) utils.set_xsi_visibility(xsi_points, visibility) if "project_path" in options: is_constant = write_ice_cache(usd_object, is_strands, xsi_points, options["project_path"], options["file_name"], options["up_axis"], is_simple) # build ice-tree with caching node build_ice_tree(app, xsi_points, is_constant, options["file_name"]) return xsi_points