void readEmptyCompoundProperties(const std::string &archiveName) { // Open an existing archive for reading. Indicate that we want // Alembic to throw exceptions on errors. AbcF::IFactory factory; factory.setPolicy( ErrorHandler::kThrowPolicy ); AbcF::IFactory::CoreType coreType; IArchive archive = factory.getArchive(archiveName, coreType); IObject archiveTop = archive.getTop(); // Determine the number of (top level) children the archive has const int numChildren = archiveTop.getNumChildren(); ABCA_ASSERT( numChildren == 2, "Wrong number of children (expected 2)"); std::cout << "The archive has " << numChildren << " children:" << std::endl; // Iterate through them, print out their names for (int ii=0; ii<numChildren; ii++) { IObject child( archiveTop, archiveTop.getChildHeader(ii).getName() ); std::cout << " " << child.getName(); std::cout << " has " << child.getNumChildren() << " children" << std::endl; // Properties ICompoundProperty props = child.getProperties(); int numProperties = props.getNumProperties(); std::cout << " ..and " << numProperties << " properties" << std::endl; std::vector<std::string> propNames; for (int pp=0; pp<numProperties; pp++) propNames.push_back( props.getPropertyHeader(pp).getName() ); for (int jj=0; jj<numProperties; jj++) { std::cout << " ..named " << propNames[jj] << std::endl; std::cout << " ..with type: "; PropertyType pType = props.getPropertyHeader(jj).getPropertyType(); if (pType == kCompoundProperty) { std::cout << "compound" << std::endl; } else if (pType == kScalarProperty) { std::cout << "scalar" << std::endl; } else if (pType == kArrayProperty) { std::cout << "array" << std::endl; } } } // Done - the archive closes itself }
//-***************************************************************************** void visitProperties( ICompoundProperty iParent, std::string &ioIndent ) { std::string oldIndent = ioIndent; for ( size_t i = 0 ; i < iParent.getNumProperties() ; i++ ) { PropertyHeader header = iParent.getPropertyHeader( i ); if ( header.isCompound() ) { visitCompoundProperty( ICompoundProperty( iParent, header.getName() ), ioIndent ); } else if ( header.isScalar() ) { visitSimpleProperty( IScalarProperty( iParent, header.getName() ), ioIndent ); } else { assert( header.isArray() ); visitSimpleProperty( IArrayProperty( iParent, header.getName() ), ioIndent ); } } ioIndent = oldIndent; }
void readSimpleProperties(const std::string &archiveName) { // Open an existing archive for reading. Indicate that we want // Alembic to throw exceptions on errors. AbcF::IFactory factory; factory.setPolicy( ErrorHandler::kThrowPolicy ); AbcF::IFactory::CoreType coreType; IArchive archive = factory.getArchive(archiveName, coreType); IObject archiveTop = archive.getTop(); // Determine the number of (top level) children the archive has const int numChildren = archiveTop.getNumChildren(); TESTING_ASSERT( numChildren == 4 ); std::cout << "The archive has " << numChildren << " children:" << std::endl; // Iterate through them, print out their names for (int ii=0; ii<numChildren; ii++) { IObject child( archiveTop, archiveTop.getChildHeader( ii ).getName() ); std::cout << " " << child.getName(); std::cout << " has " << child.getNumChildren() << " children" << std::endl; // Properties ICompoundProperty props = child.getProperties(); int numProperties = props.getNumProperties(); std::cout << " ..and " << numProperties << " simple properties" << std::endl; std::vector<std::string> propNames; for (int pp=0; pp<numProperties; pp++) propNames.push_back( props.getPropertyHeader(pp).getName() ); for (int jj=0; jj<numProperties; jj++) { std::cout << " ..named " << propNames[jj] << std::endl; std::cout << " ..with type: "; PropertyType pType = props.getPropertyHeader(jj).getPropertyType(); if (pType == kCompoundProperty) { std::cout << "compound" << std::endl; } else if (pType == kScalarProperty) { std::cout << "scalar" << std::endl; } else if (pType == kArrayProperty) { std::cout << "array" << std::endl; } DataType dType = props.getPropertyHeader(jj).getDataType(); std::cout << " ..with POD-type: "; switch (dType.getPod()) { case kBooleanPOD: std::cout << "boolean" << std::endl; break; // Char/UChar case kUint8POD: std::cout << "unsigned char" << std::endl; break; case kInt8POD: std::cout << "char" << std::endl; break; // Short/UShort case kUint16POD: std::cout << "short unsigned int" << std::endl; break; case kInt16POD: std::cout << "short int" << std::endl; break; // Int/UInt case kUint32POD: std::cout << "unsigned int" << std::endl; break; case kInt32POD: std::cout << "int" << std::endl; break; // Long/ULong case kUint64POD: std::cout << "unsigned long int" << std::endl; break; case kInt64POD: std::cout << "long int" << std::endl; break; // Half/Float/Double case kFloat16POD: std::cout << "half" << std::endl; break; case kFloat32POD: std::cout << "float" << std::endl; break; case kFloat64POD: std::cout << "double" << std::endl; break; case kStringPOD: std::cout << "string" << std::endl; break; case kUnknownPOD: default: std::cout << " Unknown! (this is bad)" << std::endl; }; TimeSamplingPtr ts = GetCompoundPropertyReaderPtr(props)-> getScalarProperty( propNames[jj] )->getTimeSampling(); int numSamples = ts->getNumStoredTimes(); std::cout << " ..and " << ts->getTimeSamplingType() << std::endl << " ..and " << numSamples << " samples at times: "; if (numSamples > 0) { std::cout << " ( "; for (int ss=0; ss<numSamples; ss++) std::cout << ts->getSampleTime(ss) << " "; std::cout << ")"; } std::cout << std::endl; std::cout << " ..and values: "; if (numSamples > 0) { for (int ss=0; ss<numSamples; ss++) { ISampleSelector iss( (index_t) ss); switch (dType.getPod()) { // Boolean case kBooleanPOD: { IBoolProperty prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } // Char/UChar case kUint8POD: { IUcharProperty prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } case kInt8POD: { ICharProperty prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } // Short/UShort case kUint16POD: { IUInt16Property prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } case kInt16POD: { IInt16Property prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } // Int/UInt case kUint32POD: { IUInt32Property prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } case kInt32POD: { IInt32Property prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } // Long/ULong case kUint64POD: { IUInt64Property prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } case kInt64POD: { IInt64Property prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } // Half/Float/Double case kFloat16POD: // iostream doesn't understand float_16's //printSampleValue( IHalfProperty( props, propNames[jj] ), // iss ); break; case kFloat32POD: { IFloatProperty prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } case kFloat64POD: { IDoubleProperty prop( props, propNames[jj] ); printSampleValue( prop, iss ); break; } case kUnknownPOD: default: std::cout << " Unknown! (this is bad)" << std::endl; }; } } std::cout << std::endl; std::cout << std::endl; // done parsing property } } // Done - the archive closes itself }
void AddArbitraryGeomParams( ICompoundProperty &parent, ISampleSelector &sampleSelector, AtNode * primNode, const std::set<std::string> * excludeNames ) { if ( primNode == NULL || !parent.valid() ) { return; } for ( size_t i = 0; i < parent.getNumProperties(); ++i ) { const PropertyHeader &propHeader = parent.getPropertyHeader( i ); const std::string &propName = propHeader.getName(); if (propName.empty() || ( excludeNames && excludeNames->find( propName ) != excludeNames->end() ) ) { continue; } if ( IFloatGeomParam::matches( propHeader ) ) { AddArbitraryGeomParam<IFloatGeomParam>( parent, propHeader, sampleSelector, primNode, AI_TYPE_FLOAT); } else if ( IInt32GeomParam::matches( propHeader ) ) { AddArbitraryGeomParam<IInt32GeomParam>( parent, propHeader, sampleSelector, primNode, AI_TYPE_INT); } else if ( IStringGeomParam::matches( propHeader ) ) { AddArbitraryStringGeomParam( parent, propHeader, sampleSelector, primNode); } else if ( IV2fGeomParam::matches( propHeader ) ) { AddArbitraryGeomParam<IV2fGeomParam>( parent, propHeader, sampleSelector, primNode, AI_TYPE_VECTOR2); } else if ( IV3fGeomParam::matches( propHeader ) ) { AddArbitraryGeomParam<IV3fGeomParam>( parent, propHeader, sampleSelector, primNode, AI_TYPE_VECTOR); } else if ( IP3fGeomParam::matches( propHeader ) ) { AddArbitraryGeomParam<IP3fGeomParam>( parent, propHeader, sampleSelector, primNode, AI_TYPE_VECTOR); } else if ( IN3fGeomParam::matches( propHeader ) ) { AddArbitraryGeomParam<IN3fGeomParam>( parent, propHeader, sampleSelector, primNode, AI_TYPE_VECTOR); } else if ( IC3fGeomParam::matches( propHeader ) ) { AddArbitraryGeomParam<IC3fGeomParam>( parent, propHeader, sampleSelector, primNode, AI_TYPE_RGB); } else if ( IC4fGeomParam::matches( propHeader ) ) { AddArbitraryGeomParam<IC4fGeomParam>( parent, propHeader, sampleSelector, primNode, AI_TYPE_RGBA); } if ( IM44fGeomParam::matches( propHeader ) ) { AddArbitraryGeomParam<IM44fGeomParam>( parent, propHeader, sampleSelector, primNode, AI_TYPE_MATRIX); } } }
void readProperty(const std::string &archiveName) { // Open an existing archive for reading. Indicate that we want // Alembic to throw exceptions on errors. std::cout << "Reading " << archiveName << std::endl; IArchive archive( Alembic::AbcCoreHDF5::ReadArchive(), archiveName, ErrorHandler::kThrowPolicy ); IObject archiveTop = archive.getTop(); // Determine the number of (top level) children the archive has const unsigned int numChildren = archiveTop.getNumChildren(); ABCA_ASSERT( numChildren == 1, "Wrong number of children (expected 3)"); std::cout << "The archive has " << numChildren << " children:" << std::endl; // Iterate through them, print out their names IObject child( archiveTop, archiveTop.getChildHeader(0).getName() ); std::cout << " " << child.getName(); // Properties ICompoundProperty props = child.getProperties(); size_t numProperties = props.getNumProperties(); // only top-level props ABCA_ASSERT( numProperties == 1, "Expected 1 property, found " << numProperties); std::cout << " has a simple property"; std::vector<std::string> propNames(1); propNames[0] = props.getPropertyHeader(0).getName(); std::cout << " named " << propNames[0] << std::endl; PropertyType pType = props.getPropertyHeader(0).getPropertyType(); ABCA_ASSERT( pType == kScalarProperty, "Expected a scalar property, but didn't find one" ); DataType dType = props.getPropertyHeader(0).getDataType(); ABCA_ASSERT( dType.getPod() == kFloat64POD, "Expected a double (kFloat64POD) property, but didn't" " find one" ); // We know this is a scalar property (I'm eliding the if/else // statements required to recognize this) IDoubleProperty mass( props, propNames[0] ); size_t numSamples = mass.getNumSamples(); std::cout << ".. it has " << numSamples << " samples" << std::endl; ABCA_ASSERT( numSamples == 5, "Expected 5 samples, found " << numSamples ); std::cout << "..with values: "; for (int ss=0; ss<numSamples; ss++) { ISampleSelector iss( (index_t) ss); printSampleValue( mass, iss ); double massDiff = mass.getValue( iss ) - (33.0 + 0.1*ss); ABCA_ASSERT( fabs(massDiff) < 1e-12, "Incorrect sample value read" ); } std::cout << std::endl; // Done - the archive closes itself }
void readUInt32ArrayProperty(const std::string &archiveName) { // Open an existing archive for reading. Indicate that we want // Alembic to throw exceptions on errors. std::cout << "Reading " << archiveName << std::endl; IArchive archive( Alembic::AbcCoreHDF5::ReadArchive(), archiveName, ErrorHandler::kThrowPolicy ); IObject archiveTop = archive.getTop(); // Determine the number of (top level) children the archive has const unsigned int numChildren = archiveTop.getNumChildren(); ABCA_ASSERT( numChildren == 1, "Wrong number of children (expected 1)"); std::cout << "The archive has " << numChildren << " children:" << std::endl; // Iterate through them, print out their names IObject child( archiveTop, archiveTop.getChildHeader(0).getName() ); std::cout << " named '" << child.getName() << "'"; // Properties ICompoundProperty props = child.getProperties(); size_t numProperties = props.getNumProperties(); // only top-level props ABCA_ASSERT( numProperties == 1, "Expected 1 property, found " << numProperties); std::cout << " with one property"; std::vector<std::string> propNames(1); propNames[0] = props.getPropertyHeader(0).getName(); std::cout << " named '" << propNames[0] << "'" << std::endl; PropertyType pType = props.getPropertyHeader(0).getPropertyType(); ABCA_ASSERT( pType == kArrayProperty, "Expected an array property, but didn't find one" ); std::cout << " which is an array property"; DataType dType = props.getPropertyHeader(0).getDataType(); ABCA_ASSERT( dType.getPod() == kUint32POD, "Expected an unsigned int (kUint32POD) property, but didn't" " find one" ); // We know this is an array property (I'm eliding the if/else // statements required to recognize and handle this properly) IUInt32ArrayProperty primes( props, propNames[0] ); size_t numSamples = primes.getNumSamples(); std::cout << ".. it has " << numSamples << " samples" << std::endl; ABCA_ASSERT( numSamples == 5, "Expected 5 samples, found " << numSamples ); const TimeSampling ts = primes.getTimeSampling(); std::cout << "..with time/value pairs: " << std::endl;; for (int ss=0; ss<numSamples; ss++) { std::cout << " "; ISampleSelector iss( (index_t) ss); std::cout << ts.getSampleTime( (index_t) ss ) << " / "; UInt32ArraySamplePtr samplePtr; primes.get( samplePtr, iss ); std::cout << "[ "; size_t numPoints = samplePtr->size(); for ( size_t jj=0 ; jj<numPoints ; jj++ ) std::cout << (*samplePtr)[jj] << " "; std::cout << "]" << std::endl; // ASSERT that we are reading the correct values for ( size_t jj=0 ; jj<numPoints ; jj++ ) ABCA_ASSERT( (*samplePtr)[jj] == g_primes[jj], "Incorrect value read from archive." ); } std::cout << std::endl; // Done - the archive closes itself }
void readProperty(const std::string &archiveName, bool useOgawa) { // Open an existing archive for reading. Indicate that we want // Alembic to throw exceptions on errors. std::cout << "Reading " << archiveName << std::endl; AbcF::IFactory factory; factory.setPolicy( ErrorHandler::kThrowPolicy ); AbcF::IFactory::CoreType coreType; IArchive archive = factory.getArchive(archiveName, coreType); ABCA_ASSERT( (useOgawa && coreType == AbcF::IFactory::kOgawa) || (!useOgawa && coreType == AbcF::IFactory::kHDF5), "File did not open as the expected type." ); IObject archiveTop = archive.getTop(); // Determine the number of (top level) children the archive has const unsigned int numChildren = archiveTop.getNumChildren(); ABCA_ASSERT( numChildren == 1, "Wrong number of children (expected 1)"); std::cout << "The archive has " << numChildren << " children:" << std::endl; // Iterate through them, print out their names IObject child( archiveTop, archiveTop.getChildHeader( 0 ).getName() ); std::cout << " " << child.getName(); // Properties ICompoundProperty props = child.getProperties(); size_t numProperties = props.getNumProperties(); // only top-level props ABCA_ASSERT( numProperties == 1, "Expected 1 property, found " << numProperties); std::cout << " with one property"; std::vector<std::string> propNames(1); propNames[0] = props.getPropertyHeader(0).getName(); std::cout << " named " << propNames[0] << std::endl; PropertyType pType = props.getPropertyHeader(0).getPropertyType(); ABCA_ASSERT( pType == kScalarProperty, "Expected a scalar property, but didn't find one" ); std::cout << " which is a scalar property"; DataType dType = props.getPropertyHeader(0).getDataType(); ABCA_ASSERT( dType.getPod() == kFloat64POD, "Expected a double (kFloat64POD) property, but didn't" " find one" ); // We know this is a scalar property (I'm eliding the if/else // statements required to recognize this) IDoubleProperty mass( props, propNames[0] ); size_t numSamples = mass.getNumSamples(); std::cout << ".. it has " << numSamples << " samples" << std::endl; //ABCA_ASSERT( numSamples == 5, "Expected 5 samples, found " << numSamples ); TimeSamplingPtr ts = mass.getTimeSampling(); std::cout << "..with time/value pairs: "; for (unsigned int ss=0; ss<numSamples; ss++) { ISampleSelector iss( (index_t) ss); std::cout << ts->getSampleTime( (index_t) ss ) << "/"; printSampleValue( mass, iss ); std::cout << " "; double timeDiff = ts->getSampleTime( (index_t) ss ) - (g_startTime + (ss*(g_dt/3.0))); ABCA_ASSERT( fabs(timeDiff) < 1e-12, "Incorrect sample time read" ); double massDiff = mass.getValue( iss ) - (1.0 + 0.1*ss); ABCA_ASSERT( fabs(massDiff) < 1e-12, "Incorrect sample value read" ); } ABCA_ASSERT( archive.getMaxNumSamplesForTimeSamplingIndex(1) == (index_t) numSamples, "Incorrect number of max samples for Time Sampling ID 1."); std::cout << std::endl; // Done - the archive closes itself }
void readV3fArrayProperty(const std::string &archiveName, bool useOgawa) { // Open an existing archive for reading. Indicate that we want // Alembic to throw exceptions on errors. std::cout << "Reading " << archiveName << std::endl; AbcF::IFactory factory; factory.setPolicy( ErrorHandler::kThrowPolicy ); AbcF::IFactory::CoreType coreType; IArchive archive = factory.getArchive(archiveName, coreType); TESTING_ASSERT( (useOgawa && coreType == AbcF::IFactory::kOgawa) || (!useOgawa && coreType == AbcF::IFactory::kHDF5) ); IObject archiveTop = archive.getTop(); // Determine the number of (top level) children the archive has const unsigned int numChildren = archiveTop.getNumChildren(); ABCA_ASSERT( numChildren == 1, "Wrong number of children (expected 1)"); std::cout << "The archive has " << numChildren << " children:" << std::endl; // Iterate through them, print out their names IObject child( archiveTop, archiveTop.getChildHeader(0).getName() ); std::cout << " named '" << child.getName() << "'"; // Properties ICompoundProperty props = child.getProperties(); size_t numProperties = props.getNumProperties(); // only top-level props ABCA_ASSERT( numProperties == 1, "Expected 1 property, found " << numProperties); std::cout << " with one property"; std::vector<std::string> propNames(1); propNames[0] = props.getPropertyHeader(0).getName(); std::cout << " named '" << propNames[0] << "'" << std::endl; PropertyType pType = props.getPropertyHeader(0).getPropertyType(); ABCA_ASSERT( pType == kArrayProperty, "Expected an array property, but didn't find one" ); std::cout << " which is an array property"; DataType dType = props.getPropertyHeader(0).getDataType(); ABCA_ASSERT( dType.getPod() == kFloat32POD, "Expected an v3f property, but didn't find one" ); // We know this is an array property (I'm eliding the if/else // statements required to recognize and handle this properly) IV3fArrayProperty positions( props, propNames[0] ); size_t numSamples = positions.getNumSamples(); std::cout << ".. it has " << numSamples << " samples" << std::endl; ABCA_ASSERT( numSamples == 5, "Expected 5 samples, found " << numSamples ); TimeSamplingPtr ts = positions.getTimeSampling(); std::cout << "..with time/value pairs: " << std::endl;; for (unsigned int ss=0; ss<numSamples; ss++) { std::cout << " "; ISampleSelector iss( (index_t) ss); std::cout << ts->getSampleTime( (index_t) ss ) << " / "; V3fArraySamplePtr samplePtr; positions.get( samplePtr, iss ); std::cout << "[ "; size_t numPoints = samplePtr->size(); for ( size_t jj=0 ; jj<numPoints ; jj++ ) std::cout << (*samplePtr)[jj] << " "; std::cout << "]" << std::endl; if (ss == 2) // no entries in sample #2 { ABCA_ASSERT( numPoints == 0, "Expected an empty sample, but found " << numPoints << " entries." ); } else { for ( size_t jj=0 ; jj<numPoints ; jj++ ) ABCA_ASSERT( (*samplePtr)[jj] == g_vectors[jj], "Incorrect value read from archive." ); } } ABCA_ASSERT( archive.getMaxNumSamplesForTimeSamplingIndex(1) == (index_t) numSamples, "Incorrect number of max samples in readV3fArrayProperty." ); std::cout << std::endl; // Done - the archive closes itself double start, end; GetArchiveStartAndEndTime( archive, start, end ); TESTING_ASSERT( almostEqual(start, 123.0) ); TESTING_ASSERT( almostEqual(end, 123.0 + 4.0 / 24.0) ); }
//-***************************************************************************** void AddArbitraryProperties( ICompoundProperty &parent, ISampleSelector &sampleSelector, ParamListBuilder &ParamListBuilder, const std::set<std::string> * excludeNames ) { for ( size_t i = 0; i < parent.getNumProperties(); ++i ) { const PropertyHeader &propHeader = parent.getPropertyHeader( i ); const std::string &propName = propHeader.getName(); if (propName.empty() || propName[0] == '.' || ( excludeNames && excludeNames->find( propName ) != excludeNames->end() ) || propHeader.getMetaData().get( "geoScope" ).empty() || propHeader.isCompound() // skip compounds for now || propHeader.isScalar() // also skip scalars ) { continue; } if ( IN3fArrayProperty::matches( propHeader ) ) { AddArbitraryPropertyToParamListBuilder<IN3fArrayProperty>( parent, propHeader, sampleSelector, "normal", ParamListBuilder ); } else if ( IV2fArrayProperty::matches( propHeader ) ) { AddArbitraryPropertyToParamListBuilder<IV2fArrayProperty>( parent, propHeader, sampleSelector, "float[2]", ParamListBuilder ); } else if ( IV3fArrayProperty::matches( propHeader ) ) { AddArbitraryPropertyToParamListBuilder<IV3fArrayProperty>( parent, propHeader, sampleSelector, "point", ParamListBuilder ); } else if ( IM44fArrayProperty::matches( propHeader ) ) { AddArbitraryPropertyToParamListBuilder<IM44fArrayProperty>( parent, propHeader, sampleSelector, "matrix", ParamListBuilder ); } else if ( IFloatArrayProperty::matches( propHeader ) ) { AddArbitraryPropertyToParamListBuilder<IFloatArrayProperty>( parent, propHeader, sampleSelector, "float", ParamListBuilder ); } else if ( IInt32ArrayProperty::matches( propHeader ) ) { AddArbitraryPropertyToParamListBuilder<IInt32ArrayProperty>( parent, propHeader, sampleSelector, "int", ParamListBuilder ); } else if ( IStringArrayProperty::matches( propHeader ) ) { AddArbitraryStringPropertyToParamListBuilder( parent, propHeader, sampleSelector, ParamListBuilder ); } } }
void readNestedCommpoundWithVis(const std::string &archiveName) { // Open an existing archive for reading. Indicate that we want // Alembic to throw exceptions on errors. IArchive archive( Alembic::AbcCoreOgawa::ReadArchive(), archiveName, ErrorHandler::kThrowPolicy ); IObject archiveTop = archive.getTop(); TESTING_ASSERT_THROW( GetIArchiveBounds( archive ), Alembic::Util::Exception ); IBox3dProperty boxProp = GetIArchiveBounds( archive, ErrorHandler::kQuietNoopPolicy ); TESTING_ASSERT( !boxProp.valid() ); ICharProperty topVisibility = GetVisibilityProperty (archiveTop); std::cout << "Does this object have VisibilityProperty? " << (bool) (true == topVisibility) << std::endl; ABCA_ASSERT( topVisibility == false, "top object should not have a visibility property"); // Determine the number of (top level) children the archive has const size_t numChildren = archiveTop.getNumChildren(); ABCA_ASSERT( numChildren == 2, "Wrong number of children (expected 2)"); std::cout << "The archive has " << numChildren << " children:" << std::endl; IObject child1; IObject otherChild; // Iterate through them, print out their names for ( size_t ii=0; ii <numChildren; ii++) { IObject child( archiveTop, archiveTop.getChildHeader(ii).getName() ); std::cout << " " << child.getName(); std::cout << " has " << child.getNumChildren() << " children" << std::endl; // Properties ICompoundProperty props = child.getProperties(); size_t numProperties = props.getNumProperties(); std::cout << " ..and " << numProperties << " properties" << std::endl; std::vector<std::string> propNames; for ( size_t pp=0 ; pp < numProperties ; ++pp ) { propNames.push_back( props.getPropertyHeader(pp).getName() ); } for ( size_t jj=0; jj<numProperties; ++jj) { std::cout << " ..named " << propNames[jj] << std::endl; std::cout << " ..with type: "; PropertyType pType = props.getPropertyHeader(jj).getPropertyType(); if (pType == kCompoundProperty) { std::cout << "compound" << std::endl; ICompoundProperty prop( props, propNames[jj] ); std::cout << " Accessing this nested prop for its obj -" << prop.getObject ().getName () << std::endl; } else if (pType == kScalarProperty) { std::cout << "scalar" << std::endl; } else if (pType == kArrayProperty) { std::cout << "array" << std::endl; } } ICharProperty childVisibility; childVisibility = GetVisibilityProperty (child); if (ii == 1) { child1 = child; // This is child_1. It should have visibility property // and it should be set to hidden ABCA_ASSERT( childVisibility == true, "child_1 should have a visibility property"); ABCA_ASSERT( childVisibility.getValue () == kVisibilityHidden, "child_1 visibility should be hidden"); ABCA_ASSERT( childVisibility.getValue () == GetVisibility (child), "child_1 visibility should match call value from GetVisibility ()"); std::cout << " child_1 visibility correctly set to hidden" << std::endl; } else { otherChild = child; ABCA_ASSERT( childVisibility == false, "child object should not have a visibility property"); } } // Test that IsAncestorInvisible () works // // child of child1 (which is hidden) means that this child should be // hidden too IObject child1SubObject( child1, "nested_object"); ABCA_ASSERT( IsAncestorInvisible (archiveTop) == false, "top root should be visible"); ABCA_ASSERT( IsAncestorInvisible (child1SubObject) == true, "object under child1 should eval to being not visible"); ABCA_ASSERT( IsAncestorInvisible (child1) == true, "child1 should eval to being not visible"); ABCA_ASSERT( IsAncestorInvisible (otherChild) == false, "other object should eval to being visible"); // Done - the archive closes itself }