ConstObjectPtr LiveScene::readAttribute( const Name &name, double time ) const { if ( !m_isRoot && m_dagPath.length() == 0 ) { throw Exception( "IECoreMaya::LiveScene::readAttribute: Dag path no longer exists!" ); } tbb::mutex::scoped_lock l( s_mutex ); if ( !m_isRoot ) { if( name == SceneInterface::visibilityName ) { bool visible = true; MStatus st; MFnDagNode dagFn( m_dagPath ); MPlug visibilityPlug = dagFn.findPlug( MPxTransform::visibility, &st ); if( st ) { visible = visibilityPlug.asBool(); } if( visible ) { MDagPath childDag; // find an object that's either a SceneShape, or has a cortex converter and check its visibility: unsigned int childCount = 0; m_dagPath.numberOfShapesDirectlyBelow(childCount); for ( unsigned int c = 0; c < childCount; c++ ) { MDagPath d = m_dagPath; if( d.extendToShapeDirectlyBelow( c ) ) { MFnDagNode fnChildDag(d); if( fnChildDag.typeId() == SceneShape::id ) { childDag = d; break; } if ( fnChildDag.isIntermediateObject() ) { continue; } FromMayaShapeConverterPtr shapeConverter = FromMayaShapeConverter::create( d ); if( shapeConverter ) { childDag = d; break; } FromMayaDagNodeConverterPtr dagConverter = FromMayaDagNodeConverter::create( d ); if( dagConverter ) { childDag = d; break; } } } if( childDag.isValid() ) { MFnDagNode dagFn( childDag ); MPlug visibilityPlug = dagFn.findPlug( MPxSurfaceShape::visibility, &st ); if( st ) { visible = visibilityPlug.asBool(); } } } return new BoolData( visible ); } } else if( name == SceneInterface::visibilityName ) { return new BoolData( true ); } std::vector< CustomAttributeReader > &attributeReaders = customAttributeReaders(); for ( std::vector< CustomAttributeReader >::const_reverse_iterator it = attributeReaders.rbegin(); it != attributeReaders.rend(); ++it ) { ConstObjectPtr attr = it->m_read( m_dagPath, name ); if( !attr ) { continue; } return attr; } if( strstr( name.c_str(), "user:"******"ieAttr_" + name.string().substr(5) ).c_str(), false, &st ); if( st ) { FromMayaConverterPtr plugConverter = FromMayaPlugConverter::create( attrPlug ); if( !plugConverter ) { return IECore::NullObject::defaultNullObject(); } return plugConverter->convert(); } } return IECore::NullObject::defaultNullObject(); }
bool HoudiniScene::hasTag( const Name &name, bool includeChildren ) const { const OP_Node *node = retrieveNode(); if ( !node ) { return false; } // check for user supplied tags if we're not inside a SOP if ( !m_contentIndex && node->hasParm( pTags.getToken() ) ) { UT_String parmTags; node->evalString( parmTags, pTags.getToken(), 0, 0 ); if ( UT_String( name.c_str() ).multiMatch( parmTags ) ) { return true; } } // check with the registered tag readers std::vector<CustomTagReader> &tagReaders = customTagReaders(); for ( std::vector<CustomTagReader>::const_iterator it = tagReaders.begin(); it != tagReaders.end(); ++it ) { if ( it->m_has( node, name ) ) { return true; } } // check tags based on primitive groups OBJ_Node *contentNode = retrieveNode( true )->castToOBJNode(); if ( contentNode && contentNode->getObjectType() == OBJ_GEOMETRY && m_splitter ) { GU_DetailHandle newHandle = m_splitter->split( contentPathValue() ); if ( !newHandle.isNull() ) { GU_DetailHandleAutoReadLock readHandle( newHandle ); if ( const GU_Detail *geo = readHandle.getGdp() ) { GA_Range prims = geo->getPrimitiveRange(); for ( GA_GroupTable::iterator<GA_ElementGroup> it=geo->primitiveGroups().beginTraverse(); !it.atEnd(); ++it ) { GA_PrimitiveGroup *group = static_cast<GA_PrimitiveGroup*>( it.group() ); if ( group->getInternal() || group->isEmpty() ) { continue; } const UT_String &groupName = group->getName(); if ( groupName.startsWith( tagGroupPrefix ) && group->containsAny( prims ) ) { UT_String tag; groupName.substr( tag, tagGroupPrefix.length() ); tag.substitute( "_", ":" ); if ( tag.equal( name.c_str() ) ) { return true; } } } } } } return false; }