Scene Query.cpp

From The Foundry MODO SDK wiki
Revision as of 17:03, 6 September 2013 by Adissid (Talk | contribs)

Jump to: navigation, search

ATTENTION: THIS PAGE REFERS TO AN INTERNAL LUXOLOGY FILE THAT HAS NOT YET BEEN RELEASED TO THE SDK. THIS PAGE WILL PROBABLY BE HELPFUL REGARDLESS BUT YMMV. Scene_Query.cpp is a basic example plugin. This wiki page is intended as a walkthrough of the code in order to help you better understand the SDK.


When installed, Scene_Query adds two plugins to modo:ResetScene and HardReset. ResetScene opens a file dialog from which you will choose a file; the current scene will then be closed and the chosen file loaded. HardReset will close the current scene then take the last selected file and load it. To change the file HardReset loads, run ResetScene and choose a different file.

Code Walkthrough


#define ARGi_FILEPATH   0         
using namespace std;
const int MAXFILELENGTH = 1000;

To begin, we define an argument of the form ARGi_FILEPATH to have the index value of 0. So when 0 is being passed as an argument to functions later on, it is really referring to this variable. We also define a const int that forms the upper limit for the number of characters in the file path that we will be retrieving and the character array that will hold that file path.

Select_Scene class declaration

class Select_Scene : public CLxBasicCommand     //Select_Scene will open a file dialog and load the chosen scene
        int basic_CmdFlags()         LXx_OVERRIDE;
        bool basic_Enable	(CLxUser_Message &msg) LXx_OVERRIDE;
        void cmd_Interact() LXx_OVERRIDE;
        void cmd_Execute(unsigned int flags);

Here, Select_Scene is declared as a basic command with most of the basic methods associated with it. We are inheriting from basic commands because we want this plugin to perform state changes on modo.


void initialize()
    CLxGenericPolymorph     *srv;
    srv = new CLxPolymorph<X::Select_Scene>;
    srv->AddInterface (new CLxIfc_Command     <X::Select_Scene>);
    srv->AddInterface (new CLxIfc_Attributes  <X::Select_Scene>);
    srv->AddInterface (new CLxIfc_AttributesUI<X::Select_Scene>);
    lx::AddServer ("resetscene", srv);
    srv = new CLxPolymorph<X::Load_Action>;
    srv->AddInterface (new CLxIfc_Command     <X::Load_Action>);
    srv->AddInterface (new CLxIfc_Attributes  <X::Load_Action>);
    srv->AddInterface (new CLxIfc_AttributesUI<X::Load_Action>);
    lx::AddServer ("HardReset", srv);

Here we set up the framework for the two commands. We indicate which interfaces both use, what type of server it is, and what the name will be.

Select_Scene constructor

    dyna_Add("FilePath", LXsTYPE_FILEPATH); //queries the user for a FILEPATH object at startup-not same as above string
    basic_SetFlags( 0, LXfCMDARG_QUERY);

The constructor adds an attribute to the command of type FILEPATH with the name FilePath. Next, its setFlags function set the index object in slot 0 equal to this attribute and allows the attribute to be queried. What adding an attribute ultimately does is create and argument that the user is queried for whenever the command is run.

CmdFlags function

    return LXfCMD_MODEL;    //We'll be altering the internal state of modo, so we set the MODEL flag

Next, we set the MODEL flag.

basic_Enable function

Select_Scene::basic_Enable(CLxUser_Message &msg) LXx_OVERRIDE
    if (!dyna_IsSet(ARGi_FILEPATH))
        return true;
        return false;

Here we check for if the FILEPATH type argument has been set; if not, the user likely hit cancel, so we exit. If it has, we continue as normal

Interact Function

    Select_Scene::cmd_Interact()//Interact opens a file dialog and stores the given value in FILEPATH
    CLxUser_CommandService  srv_cmd;
    srv_cmd.ExecuteArgString (-1, LXiCTAG_NULL,"dialog.setup fileOpen");    //-1 = LXiCMD_EXEC_WITH_PARENTS_FLAGS
    srv_cmd.ExecuteArgString (-1, LXiCTAG_NULL,"dialog.title {Load Scene}");
    srv_cmd.ExecuteArgString (-1, LXiCTAG_NULL,"dialog.fileType scene");
    srv_cmd.ExecuteArgString (-1, LXiCTAG_NULL,"");
    CLxUser_Command		 resCmd;
    CLxUser_ValueArray	 va;
    LXtObjectID		       obj;
    unsigned int		 n;
    srv_cmd.NewCommand (resCmd, "dialog.result");
    srv_cmd.QueryIndex (resCmd, 0, va);
    n = va.Count ();
       if (!n)
     std::string		 filename;
     va.String (0, filename);
     attr_SetString (0, filename.c_str ());

Here, we set certain dialog values using the ExecuteArgString command so that a file dialog is opened. We then perform a little housework that results in string with the value of the path to the file that was selected being put into the index 0.

Execute function

Select_Scene::cmd_Execute(unsigned int flags)//Execute takes FILEPATH and loads it
    CLxUser_CommandService  cmd_srv;
    unsigned int execFlagsA = -1;
    string command = "!scene.close";
    cmd_srv.ExecuteArgString(execFlagsA, LXiCTAG_NULL, command.c_str());
    attr_GetString(0, FILEPATH, MAXFILELENGTH);
    command = " ";
    command = command+FILEPATH;
    cmd_srv.ExecuteArgString(execFlagsA, LXiCTAG_NULL, command.c_str());

Finally, we use the ExecuteArgString command to close the scene(using the ! before the command so that it will ignore pop-ups). We then put the value of the string in index 0 into the global character array FILEPATH. We then open a scene using the value of FILEPATH.


This class is Select_Scene without a file dialog; the code is otherwise the same.