The Model object represents any Softimage model node, including referenced models, and even the Scene Root. Softimage models act as a container for objects (usually hierarchies of objects) and many of their properties. Models are a type of X3DObject and as such can be positioned in space. A model can contain objects, Groups, or other models.
The Scene Root can be accessed using Application::GetActiveSceneRoot. In addition, any ProjectItem or Parameter can return a reference to the model in which it lives via the ProjectItem::GetModel and Parameter::GetModel functions.
You can also get list of all models under a given model by using X3DObject::GetModels (a Model is a specialized kind of X3DObject). Therefore, if you use GetModels on the Scene Root recursively, it returns all models in the active scene.
To create a new model, use X3DObject::AddModel, which also returns a Model object. There are also a few scripting commands which create model nodes as well: CreateModel, SICreateModel, etc.
You can also import or export models (including referenced models) with a series of commands: ImportModel, ExportModel, ImportRefModels, etc. When a referenced model is instantiated in the scene, changes to that model are tracked by the Delta system as of v6.0.
        using namespace XSI;
        Application app;
        Model root = app.GetActiveSceneRoot();
        Null myNull;
        root.AddNull( L"MyNull", myNull );
        CRefArray groupMembersRef;
        groupMembersRef.Add(myNull);
        Group myGroup;
        root.AddGroup(groupMembersRef, L"MyGroup",false, myGroup);
        app.LogMessage( CString(L"The group: ") + myGroup.GetFullName() );
#include <xsi_model.h>

| Public Member Functions | |
| Model () | |
| ~Model () | |
| Model (const CRef &in_ref) | |
| Model (const Model &in_obj) | |
| bool | IsA (siClassID in_ClassID) const | 
| siClassID | GetClassID () const | 
| Model & | operator= (const Model &in_obj) | 
| Model & | operator= (const CRef &in_ref) | 
| CRefArray | GetGroups () const | 
| CRefArray | GetSources () const | 
| CStatus | AddGroup (const CRefArray &in_members, const CString &in_name, bool in_branch, Group &io_group) | 
| Mixer | GetMixer () const | 
| bool | HasMixer () const | 
| ActionSource | AddActionSource (const CString &in_name=CString()) | 
| Mixer | AddMixer () | 
| CRefArray | GetExternalFiles () const | 
| XSI::siModelKind | GetModelKind () const | 
| Model | GetInstanceMaster () const | 
| CSIObjectRefArray | FindObjects (const XSI::siClassID &in_nClsID) const | 
| CSIObjectRefArray | FindObjects (const CString &in_sCLSID) const | 
| Model | ( | ) | 
Default constructor.
| ~Model | ( | ) | 
Default destructor.
| bool IsA | ( | siClassID | in_ClassID | ) | const [virtual] | 
Returns true if a given class type is compatible with this API class.
| in_ClassID | class type. | 
Reimplemented from X3DObject.
| siClassID GetClassID | ( | ) | const [virtual] | 
| CRefArray GetGroups | ( | ) | const | 
| CRefArray GetSources | ( | ) | const | 
Returns an array of references to all Source objects in the model. Currently, the only sources available to the model are of type ActionSource, which is a specialized kind of Source object.
Audio and Image sources (which are basically references to audio and image files) are all stored under the Scene container (see Scene::GetExternalFiles).
           Scene_Root (Model)
               |- Herb (Model)
               |    |- Mixer (animation clip on null.posx)
               |    |- null  (null.size = FCurve)
               |
               |- Jesse (Model)
               |    |- Mixer (animation clips on null.scly,null.sclz,null.rotz)
               |    |- null
               |
               |- Sally (Model)
                    |- Mixer (audio clip)
                    |- grid (image on its texture projection)
        using namespace XSI;
        // Forward declarations
        CString GetRelativePath( Parameter& in_param );
        void MakeNewFCrvSource( Null& in_null );
        CRefArray FindSourcesUnderModel( Model& in_model );
        Application app;
        // NewScene command
        CValueArray cargs; CValue oarg;
        cargs.Add( L"" ); cargs.Add( false );
        app.ExecuteCommand( L"NewScene", cargs, oarg );
        cargs.Clear(); oarg.Clear();
        // Get the SceneRoot
        Model root = app.GetActiveSceneRoot();
        // Create a new model and add a null
        Model m; root.AddModel( CRefArray(), L"MyModel", m );
        Null n; m.AddNull( L"MyNull", n );
        // Add an fcurve ActionSource based on the new null
        MakeNewFCrvSource( n );
        // Find sources under the SceneRoot
        FindSourcesUnderModel( root );
        // Look under any other models
        CRefArray mdls = root.GetModels();
        for ( LONG i=0; i<mdls.GetCount(); ++i ) {
            Model m( mdls[i] );
            FindSourcesUnderModel( m );
        }
        // Expected results:
        //INFO : No sources found on Scene_Root
        //INFO : Sources.MyModel.StoredFcvAction is a ActionSource
        CRefArray FindSourcesUnderModel( Model& in_model )
        {
            Application app;
            CRefArray foundsrcs = in_model.GetSources();
           // Loop through the collection of sources found under this model to print the
           // name and add its name to the result string
           if ( foundsrcs.GetCount() > LONG(0) ) {
               for ( LONG i=0; i<foundsrcs.GetCount(); ++i ) {
                  Source src( foundsrcs[i] );
                  app.LogMessage( src.GetFullName() + L" is a " + src.GetClassIDName() );
               }
           } else {
               app.LogMessage( L"No sources found on " + in_model.GetFullName() );
           }
           return foundsrcs;
        }
        // Function to remove the name of the model from the FullName of the specified parameter.
        // This is necessary when setting up a source that will later be used to instantiate a
        // clip when the parameter lives under a model other than the Scene_Root.
        CString GetRelativePath( Parameter& in_param )
        {
            Model mdl = in_param.GetModel();
            CString mdlname = mdl.GetFullName();
            if ( mdlname.IsEqualNoCase(L"Scene_Root") ) {
                return in_param.GetFullName();
            } else {
                CString tmp = in_param.GetFullName();
                CString lookfor = mdlname + L".";
                CString foundsofar = L"";
                CString relpath = L"";
                for ( ULONG i=0; i<tmp.Length(); ++i ) {
                    if ( foundsofar.IsEqualNoCase(lookfor) ) {
                        relpath += tmp[i];
                    } else {
                        foundsofar += tmp[i];
                    }
                }
                return relpath;
            }
        }
        // Create a simple (fcurve) actionsource based on a null's position
        void MakeNewFCrvSource( Null& in_null )
        {
            Application app;
            Model mdl = in_null.GetModel();
            CTimeArray time; time.Add( CTime(1.000) ); time.Add( CTime(50.000) ); time.Add( CTime(100.000) );
            CValueArray vals;
            // X
            Parameter posx = in_null.GetParameter( L"posx" ); CString rposx = GetRelativePath(posx);
            FCurve fcx; posx.AddFCurve( siStandardFCurve, fcx );
            vals.Add( CValue(-8.153) ); vals.Add( CValue(0.197) ); vals.Add( CValue(9.413) );
            fcx.SetKeys( time, vals ); vals.Clear();
            // Y
            Parameter posy = in_null.GetParameter( L"posy" ); CString rposy = GetRelativePath(posy);
            FCurve fcy; posy.AddFCurve( siStandardFCurve, fcy );
            vals.Add( CValue(7.015) ); vals.Add( CValue(-1.92) ); vals.Add( CValue(7.015) );
            fcy.SetKeys( time, vals ); vals.Clear();
            // Z
            Parameter posz = in_null.GetParameter( L"posz" ); CString rposz = GetRelativePath(posz);
            FCurve fcz; posz.AddFCurve( siStandardFCurve, fcz );
            vals.Add( CValue(-0.702) ); vals.Add( CValue(0.192) ); vals.Add( CValue(-0.702) );
            fcz.SetKeys( time, vals );
            // Build an action with the fcurves as source items
            ActionSource src = mdl.AddActionSource( L"StoredFcvAction" );
            src.AddSourceItem( rposx, fcx, true );
            src.AddSourceItem( rposy, fcy, true );
            src.AddSourceItem( rposz, fcz, true );
        }
| CStatus AddGroup | ( | const CRefArray & | in_members, | 
| const CString & | in_name, | ||
| bool | in_branch, | ||
| Group & | io_group | ||
| ) | 
Creates a group in the model and adds objects to the group.
| in_members | array of reference to members to add to the group. | 
| in_name | name of the group. | 
| in_branch | Add new members as branch members | 
| io_group | Group that was added. | 
| Mixer GetMixer | ( | ) | const | 
Returns the active Mixer if there is one. If not, this method returns an invalid Mixer object. You can check its validity by using the CBase::IsValid method.
| bool HasMixer | ( | ) | const | 
| ActionSource AddActionSource | ( | const CString & | in_name = CString() | ) | 
Adds an empty action source. In order to fill the ActionSource you must use ActionSource::AddSourceItem.
| in_name | Name of the new action source | 
| Mixer AddMixer | ( | ) | 
| CRefArray GetExternalFiles | ( | ) | const | 
| XSI::siModelKind GetModelKind | ( | ) | const | 
Returns the type of model. The type can be one of regular, referenced, or instance.
| Model GetInstanceMaster | ( | ) | const | 
Returns the master model of this model, if this model is an instance. To check whether this model is an instance model, use Model::GetModelKind to query for the type.
| CSIObjectRefArray FindObjects | ( | const XSI::siClassID & | in_nClsID | ) | const | 
Returns all objects found in this model that match a class identifier. These identifiers are documented but can also be discovered by inspecting Softimage objects with the SDK Explorer. The supported class identifierss are the following:
| in_nClassID | An object class id as defined in XSI::siClassID. | 
        using namespace XSI;
        Application app;
        // Returns all 3d objects in the scene as X3DObjects objects
        Application app;
        CSIObjectRefArray objArray = app.GetActiveSceneRoot().FindObjects( siX3DObjectID );
        for ( LONG i=0; i<objArray.GetCount(); i++ )
        {
            app.LogMessage( "X3DObject: " + objArray[i].GetFullName() );
        }
        // Returns all lights found in model 'A' as Light 3D objects.
        Model modelA = app.GetActiveSceneRoot().GetModels().GetItem( "A" );
        objArray = modelA.FindObjects( siLightID );
        for ( LONG i=0; i<objArray.GetCount(); i++ )
        {
            app.LogMessage( "Lights: " + objArray[i].GetFullName() );
        }
| CSIObjectRefArray FindObjects | ( | const CString & | in_sCLSID | ) | const | 
Returns all objects found in this model that match a Softimage
object CLSID. Object CLSID are not documented but can
be discovered with XSIUtils.DataRepository or by inspecting
Softimage objects with the SDK Explorer.
| in_sCLSID | An object CLSID. | 
        using namespace XSI;
        Application app;
        
        // Find all lights in model 'A'
        Model modelA = app.GetActiveSceneRoot().GetModels().GetItem( "A" );
        CSIObjectRefArray lights = modelA.FindObjects( "{F3705C30-5204-11D0-8298-00A0243E366B}" );
        for ( LONG i=0; i< lights.GetCount(); i++ )
        {
            app.LogMessage( "Light: " + lights[i].GetFullName() );
        }