static void loadSetWalk( const SceneInterface *s, const InternedString &setName, PathMatcher &set, const vector<InternedString> &path ) { if( s->hasTag( setName, SceneInterface::LocalTag ) ) { set.addPath( path ); } // Figure out if we need to recurse by querying descendant tags to see if they include // anything we're interested in. if( !s->hasTag( setName, SceneInterface::DescendantTag ) ) { return; } // Recurse to the children. SceneInterface::NameList childNames; s->childNames( childNames ); vector<InternedString> childPath( path ); childPath.push_back( InternedString() ); // room for the child name for( SceneInterface::NameList::const_iterator it = childNames.begin(), eIt = childNames.end(); it != eIt; ++it ) { ConstSceneInterfacePtr child = s->child( *it ); childPath.back() = *it; loadSetWalk( child.get(), setName, set, childPath ); } }
void GafferSceneTest::testPathMatcherRawIterator() { vector<InternedString> root; vector<InternedString> a = assign::list_of( "a" ); vector<InternedString> ab = assign::list_of( "a" )( "b" ); vector<InternedString> abc = assign::list_of( "a" )( "b" )( "c" ); PathMatcher m; PathMatcher::RawIterator it = m.begin(); GAFFERTEST_ASSERT( it == m.end() ); m.addPath( abc ); it = m.begin(); GAFFERTEST_ASSERT( *it == root ); GAFFERTEST_ASSERT( it.exactMatch() == false ); GAFFERTEST_ASSERT( it != m.end() ); ++it; GAFFERTEST_ASSERT( *it == a ); GAFFERTEST_ASSERT( it.exactMatch() == false ); GAFFERTEST_ASSERT( it != m.end() ); ++it; GAFFERTEST_ASSERT( *it == ab ); GAFFERTEST_ASSERT( it.exactMatch() == false ); GAFFERTEST_ASSERT( it != m.end() ); ++it; GAFFERTEST_ASSERT( *it == abc ); GAFFERTEST_ASSERT( it.exactMatch() == true ); GAFFERTEST_ASSERT( it != m.end() ); ++it; GAFFERTEST_ASSERT( it == m.end() ); }
// we don't actually wrap the existing init, but rather reimplement it // here using clear() and addPath(), so that we can support a mixture // of strings and InternedStringVectorData. static void initWrapper( PathMatcher &m, boost::python::object paths ) { m.clear(); for( size_t i = 0, e = len( paths ); i < e; ++i ) { object path = paths[i]; extract<const char *> stringExtractor( path ); if( stringExtractor.check() ) { m.addPath( stringExtractor() ); } else { IECore::ConstInternedStringVectorDataPtr d = extract<IECore::ConstInternedStringVectorDataPtr>( path ); m.addPath( d->readable() ); } } }
IECore::PathMatcher SceneGadget::convertSelection( IECore::UIntVectorDataPtr ids ) const { CompoundDataMap parameters = { { "selection", ids } }; if( m_selectionMask ) { parameters["mask"] = m_selectionMask; } auto pathsData = static_pointer_cast<PathMatcherData>( m_renderer->command( "gl:querySelection", parameters ) ); PathMatcher result = pathsData->readable(); // Unexpanded locations are represented with // objects named __unexpandedChildren__ to allow // locations to have an object _and_ children. // We want to replace any such locations with their // parent location. const InternedString unexpandedChildren = "__unexpandedChildren__"; vector<InternedString> parent; PathMatcher toAdd; PathMatcher toRemove; for( PathMatcher::Iterator it = result.begin(), eIt = result.end(); it != eIt; ++it ) { if( it->size() && it->back() == unexpandedChildren ) { toRemove.addPath( *it ); parent.assign( it->begin(), it->end() - 1 ); toAdd.addPath( parent ); } } result.addPaths( toAdd ); result.removePaths( toRemove ); return result; }
bool SceneView::expandWalk( const GafferScene::ScenePlug::ScenePath &path, size_t depth, PathMatcher &expanded, PathMatcher &selected ) { bool result = false; ConstInternedStringVectorDataPtr childNamesData = preprocessedInPlug<ScenePlug>()->childNames( path ); const vector<InternedString> &childNames = childNamesData->readable(); if( childNames.size() ) { // expand ourselves to show our children, and make sure we're // not selected - we only want selection at the leaf levels of // our expansion. result |= expanded.addPath( path ); result |= selected.removePath( path ); ScenePlug::ScenePath childPath = path; childPath.push_back( InternedString() ); // room for the child name for( vector<InternedString>::const_iterator cIt = childNames.begin(), ceIt = childNames.end(); cIt != ceIt; cIt++ ) { childPath.back() = *cIt; if( depth == 1 ) { // at the bottom of the expansion - just select the child result |= selected.addPath( childPath ); } else { // continue the expansion result |= expandWalk( childPath, depth - 1, expanded, selected ); } } } else { // we have no children, just make sure we're selected to mark the // leaf of the expansion. result |= selected.addPath( path ); } return result; }
void GafferSceneTest::testPathMatcherIteratorPrune() { vector<InternedString> root; vector<InternedString> abc = assign::list_of( "a" )( "b" )( "c" ); // Prune an empty iterator range. PathMatcher m; PathMatcher::Iterator it = m.begin(); GAFFERTEST_ASSERT( it == m.end() ); it.prune(); GAFFERTEST_ASSERT( it == m.end() ); // Prune the root iterator itself. m.addPath( root ); it = m.begin(); GAFFERTEST_ASSERT( *it == root ); GAFFERTEST_ASSERT( it != m.end() ); it.prune(); GAFFERTEST_ASSERT( *it == root ); GAFFERTEST_ASSERT( it != m.end() ); ++it; GAFFERTEST_ASSERT( it == m.end() ); // As above, but actually with some // descendants to be pruned. m.addPath( abc ); it = m.begin(); GAFFERTEST_ASSERT( *it == root ); GAFFERTEST_ASSERT( it != m.end() ); it.prune(); GAFFERTEST_ASSERT( *it == root ); GAFFERTEST_ASSERT( it != m.end() ); ++it; GAFFERTEST_ASSERT( it == m.end() ); }
bool SceneView::expandWalk( const std::string &path, size_t depth, PathMatcher &expanded, RenderableGadget::Selection &selected ) { bool result = false; ScenePlug::ScenePath scenePath; ScenePlug::stringToPath( path, scenePath ); ConstInternedStringVectorDataPtr childNamesData = preprocessedInPlug<ScenePlug>()->childNames( scenePath ); const vector<InternedString> &childNames = childNamesData->readable(); if( childNames.size() ) { // expand ourselves to show our children, and make sure we're // not selected - we only want selection at the leaf levels of // our expansion. result |= expanded.addPath( path ); result |= selected.erase( path ); for( vector<InternedString>::const_iterator cIt = childNames.begin(), ceIt = childNames.end(); cIt != ceIt; cIt++ ) { std::string childPath( path ); if( *childPath.rbegin() != '/' ) { childPath += '/'; } childPath += cIt->string(); if( depth == 1 ) { // at the bottom of the expansion - just select the child result |= selected.insert( childPath ).second; } else { // continue the expansion result |= expandWalk( childPath, depth - 1, expanded, selected ); } } } else { // we have no children, just make sure we're selected to mark the // leaf of the expansion. result |= selected.insert( path ).second; } return result; }
static bool addPathInternedStringVectorData( PathMatcher &p, const IECore::InternedStringVectorData *d ) { return p.addPath( d->readable() ); }