Skip to content

Commit 5f3c42a

Browse files
Add prim flag HasAbstractSpecifier to filter prim with class specifier
1 parent 60a8d58 commit 5f3c42a

File tree

9 files changed

+98
-1
lines changed

9 files changed

+98
-1
lines changed

pxr/usd/usd/prim.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,12 @@ class UsdPrim : public UsdObject
289289
return _Prim()->HasDefiningSpecifier();
290290
}
291291

292+
/// Return true if this prim has a specifier of type SdfSpecifierClass.
293+
/// \sa SdfIsAbstractSpecifier
294+
bool HasAbstractSpecifier() const {
295+
return _Prim()->HasAbstractSpecifier();
296+
}
297+
292298
/// Return a vector containing the names of API schemas which have
293299
/// been applied to this prim.
294300
///

pxr/usd/usd/primData.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ Usd_PrimData::_ComposeAndCacheFlags(Usd_PrimDataConstPtr parent,
114114
_flags[Usd_PrimComponentFlag] = false;
115115
_flags[Usd_PrimDefinedFlag] = true;
116116
_flags[Usd_PrimHasDefiningSpecifierFlag] = true;
117+
_flags[Usd_PrimHasAbstractSpecifierFlag] = false;
117118
_flags[Usd_PrimPrototypeFlag] = isPrototypePrim;
118119
_flags[Usd_PrimPseudoRootFlag] = !parent;
119120
}
@@ -154,14 +155,18 @@ Usd_PrimData::_ComposeAndCacheFlags(Usd_PrimDataConstPtr parent,
154155
// Get specifier.
155156
const SdfSpecifier specifier = GetSpecifier();
156157

158+
bool isClassSpecifier = specifier == SdfSpecifierClass;
157159
// This prim is abstract if its parent is or if it's a class.
158160
_flags[Usd_PrimAbstractFlag] =
159-
parent->IsAbstract() || specifier == SdfSpecifierClass;
161+
parent->IsAbstract() || isClassSpecifier;
160162

161163
// Cache whether or not this prim has an authored defining specifier.
162164
const bool isDefiningSpec = SdfIsDefiningSpecifier(specifier);
163165
_flags[Usd_PrimHasDefiningSpecifierFlag] = isDefiningSpec;
164166

167+
// Cache whether or not this prim has an authored abstract specifier.
168+
_flags[Usd_PrimHasAbstractSpecifierFlag] = isClassSpecifier;
169+
165170
// This prim is defined if its parent is and its specifier is defining.
166171
_flags[Usd_PrimDefinedFlag] = isDefiningSpec && parent->IsDefined();
167172

pxr/usd/usd/primData.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ class Usd_PrimData
125125
return _flags[Usd_PrimHasDefiningSpecifierFlag];
126126
}
127127

128+
/// Return true if this prim has a specifier of type SdfSpecifierClass.
129+
/// \sa SdfIsAbstractSpecifier
130+
bool HasAbstractSpecifier() const {
131+
return _flags[Usd_PrimHasAbstractSpecifierFlag];
132+
}
133+
128134
/// Return true if this prim has one or more payload composition arcs.
129135
bool HasPayload() const { return _flags[Usd_PrimHasPayloadFlag]; }
130136

pxr/usd/usd/primFlags.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ enum Usd_PrimFlags {
7979
Usd_PrimDefinedFlag,
8080
Usd_PrimHasDefiningSpecifierFlag,
8181
Usd_PrimInstanceFlag,
82+
Usd_PrimHasAbstractSpecifierFlag,
8283

8384
// Flags for internal use.
8485
Usd_PrimHasPayloadFlag,
@@ -489,6 +490,8 @@ extern unspecified UsdPrimIsDefined;
489490
extern unspecified UsdPrimIsInstance;
490491
/// Tests UsdPrim::HasDefiningSpecifier()
491492
extern unspecified UsdPrimHasDefiningSpecifier;
493+
/// Tests UsdPrim::HasAbstractSpecifier()
494+
extern unspecified UsdPrimHasAbstractSpecifier;
492495

493496
/// The default predicate used for prim traversals in methods like
494497
/// UsdPrim::GetChildren, UsdStage::Traverse, and by UsdPrimRange.
@@ -520,6 +523,8 @@ static const Usd_PrimFlags UsdPrimIsDefined = Usd_PrimDefinedFlag;
520523
static const Usd_PrimFlags UsdPrimIsInstance = Usd_PrimInstanceFlag;
521524
static const Usd_PrimFlags UsdPrimHasDefiningSpecifier
522525
= Usd_PrimHasDefiningSpecifierFlag;
526+
static const Usd_PrimFlags UsdPrimHasAbstractSpecifier
527+
= Usd_PrimHasAbstractSpecifierFlag;
523528

524529
USD_API extern const Usd_PrimFlagsConjunction UsdPrimDefaultPredicate;
525530
USD_API extern const Usd_PrimFlagsPredicate UsdPrimAllPrimsPredicate;

pxr/usd/usd/testenv/testUsdPrimRange.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,35 @@ def test_PrimHasDefiningSpecifier(self):
7272
['/c1', '/c1/c2', '/c1/c2/c3']]
7373
self.assertEqual(actual, expected)
7474

75+
def test_PrimHasAbstractSpecifier(self):
76+
for fmt in allFormats:
77+
stageFile = 'testHasAbstractSpecifier.' + fmt
78+
stage = Usd.Stage.Open(stageFile)
79+
80+
root = stage.GetPrimAtPath('/a1')
81+
actual = []
82+
expected = [stage.GetPrimAtPath(x) for x in ['/a1/a2']]
83+
for prim in Usd.PrimRange.AllPrims(root):
84+
if prim.HasAbstractSpecifier():
85+
actual.append(prim)
86+
self.assertEqual(actual, expected)
87+
88+
root = stage.GetPrimAtPath('/b1')
89+
actual = []
90+
expected = [stage.GetPrimAtPath(x) for x in
91+
['/b1/b2', '/b1/b2/b3/b4/b5/b6']]
92+
for prim in Usd.PrimRange(root, Usd.PrimIsActive):
93+
if prim.HasAbstractSpecifier():
94+
actual.append(prim)
95+
self.assertEqual(actual, expected)
96+
97+
# Note that the over is not included in our traversal.
98+
root = stage.GetPrimAtPath('/c1')
99+
actual = list(Usd.PrimRange(root, Usd.PrimHasAbstractSpecifier))
100+
expected = [stage.GetPrimAtPath(x) for x in
101+
['/c1', '/c1/c2', '/c1/c2/c3']]
102+
self.assertEqual(actual, expected)
103+
75104
def test_PrimIsActive(self):
76105
for fmt in allFormats:
77106
s = Usd.Stage.CreateInMemory('TestPrimIsActive.'+fmt)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#usda 1.0
2+
3+
def "a1"
4+
{
5+
class "a2"
6+
{
7+
over "a3"
8+
{
9+
}
10+
}
11+
}
12+
13+
over "b1"
14+
{
15+
class "b2"
16+
{
17+
over "b3"
18+
{
19+
over "b4"
20+
{
21+
over "b5"
22+
{
23+
class "b6"
24+
{
25+
}
26+
}
27+
}
28+
}
29+
}
30+
}
31+
32+
class "c1"
33+
{
34+
class "c2"
35+
{
36+
class "c3"
37+
{
38+
over "c4"
39+
{
40+
}
41+
}
42+
}
43+
}
Binary file not shown.

pxr/usd/usd/wrapPrim.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ void wrapUsdPrim()
271271
.def("IsAbstract", &UsdPrim::IsAbstract)
272272
.def("IsDefined", &UsdPrim::IsDefined)
273273
.def("HasDefiningSpecifier", &UsdPrim::HasDefiningSpecifier)
274+
.def("HasAbstractSpecifier", &UsdPrim::HasAbstractSpecifier)
274275

275276
.def("GetPropertyNames", &_WrapGetPropertyNames,
276277
(arg("predicate")=pxr_boost::python::object()),

pxr/usd/usd/wrapPrimFlags.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ void wrapUsdPrimFlags()
127127
scope().attr("PrimIsInstance") = Usd_Term(UsdPrimIsInstance);
128128
scope().attr("PrimHasDefiningSpecifier")
129129
= Usd_Term(UsdPrimHasDefiningSpecifier);
130+
scope().attr("PrimHasAbstractSpecifier")
131+
= Usd_Term(UsdPrimHasAbstractSpecifier);
130132

131133
scope().attr("PrimDefaultPredicate") = UsdPrimDefaultPredicate;
132134
scope().attr("PrimAllPrimsPredicate") = UsdPrimAllPrimsPredicate;

0 commit comments

Comments
 (0)