Like nodes, action classes must be initialized before any instances can be constructed. Also note that before you can add a method to the method list, you must initialize both the action class and the node class involved.
The example below reads in a scene graph from the file volume.iv and applies the GetVolumeAction action to it, printing the resulting volume.
Example : PrintVolume.c++
#include <Inventor/SoDB.h>
#include <Inventor/SoInput.h>
#include <Inventor/SoInteraction.h>
#include <Inventor/nodes/SoSeparator.h>
// Header file for new action class
#include "GetVolumeAction.h"
main()
{
// Initialize Inventor
SoInteraction::init();
// Initialize the new action class
GetVolumeAction::initClass();
// Open the file and read the scene
SoInput myInput;
SoSeparator* root;
if ( !myInput.openFile( "volume.iv" ) )
{
fprintf( stderr, "Can't open \"volume.iv\" for reading\n" );
return 1;
}
root = SoDB::readAll( &myInput );
if ( root == NULL )
{
printf( "Couldn't read scene from \"volume.iv\"\n" );
return 2;
}
root->ref();
// Compute the volume: apply a GetVolumeAction to the root
GetVolumeAction va;
va.apply( root );
root->unref();
// Print the result
printf( "Total volume = %g\n", va.getVolume() );
GetVolumeAction::exitClass();
SoInteraction::finish();
return 0;
}