Difference between revisions of "Scene Query.cpp"

From The Foundry MODO SDK wiki
Jump to: navigation, search
Line 10: Line 10:
  
 
===Definitions===
 
===Definitions===
 +
 +
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.
  
 
  #define ARGi_FILEPATH  0         
 
  #define ARGi_FILEPATH  0         
Line 15: Line 17:
 
  const int MAXFILELENGTH = 1000;
 
  const int MAXFILELENGTH = 1000;
 
  char FILEPATH[MAXFILELENGTH];  
 
  char FILEPATH[MAXFILELENGTH];  
 
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===
 
===Select_Scene class declaration===
 +
 +
Here, Select_Scene is declared as a [[Command:_Server_basics#Helper_Classes|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.
  
 
  class Select_Scene : public CLxBasicCommand    //Select_Scene will open a file dialog and load the chosen scene
 
  class Select_Scene : public CLxBasicCommand    //Select_Scene will open a file dialog and load the chosen scene
Line 34: Line 35:
 
  };
 
  };
  
Here, Select_Scene is declared as a [[Command:_Server_basics#Helper_Classes|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.
+
===[[Initialize_(index)|Initialize]]===
  
 
+
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.
===[[Initialize_(index)|Initialize]]===
+
  
 
  void initialize()
 
  void initialize()
Line 56: Line 56:
 
  }  
 
  }  
  
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===
  
 
+
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.
===Select_Scene constructor===
+
  
 
  Select_Scene::Select_Scene()
 
  Select_Scene::Select_Scene()
Line 68: Line 67:
 
  }
 
  }
  
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===
  
===CmdFlags function===
+
Next, we set the [[Command_(lx-command.hpp)#.287.29_SDK:_ILxCommand_interface|MODEL]] flag.
  
 
  int
 
  int
Line 77: Line 76:
 
     return LXfCMD_MODEL;    //We'll be altering the internal state of modo, so we set the MODEL flag
 
     return LXfCMD_MODEL;    //We'll be altering the internal state of modo, so we set the MODEL flag
 
  }
 
  }
 
Next, we set the [[Command_(lx-command.hpp)#.287.29_SDK:_ILxCommand_interface|MODEL]] flag.
 
  
 
===basic_Enable function===
 
===basic_Enable function===
 +
 +
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
  
 
  bool
 
  bool
Line 91: Line 90:
 
         return false;
 
         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
 
  
 
===[[Command_(lx-command.hpp)#.2819.29_SDK:_ILxCommand_interface|Interact Function]]===
 
===[[Command_(lx-command.hpp)#.2819.29_SDK:_ILxCommand_interface|Interact Function]]===
 +
 +
Here, we set certain dialog values using the [[Command_(lx-command.hpp)#.28102.29_SDK:_ILxCommandService_interface|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.
  
 
  void
 
  void
Line 123: Line 122:
 
  }
 
  }
  
 +
===[[Command_(lx-command.hpp)#.2828.29_SDK:_ILxCommand_interface|Execute function]]===
  
Here, we set certain dialog values using the [[Command_(lx-command.hpp)#.28102.29_SDK:_ILxCommandService_interface|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.
+
Finally, we use the [[Command_(lx-command.hpp)#.28102.29_SDK:_ILxCommandService_interface|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.
 
+
===[[Command_(lx-command.hpp)#.2828.29_SDK:_ILxCommand_interface|Execute function]]===
+
  
 
     void
 
     void
Line 141: Line 139:
 
     cmd_srv.ExecuteArgString(execFlagsA, LXiCTAG_NULL, command.c_str());
 
     cmd_srv.ExecuteArgString(execFlagsA, LXiCTAG_NULL, command.c_str());
 
  }
 
  }
 
Finally, we use the [[Command_(lx-command.hpp)#.28102.29_SDK:_ILxCommandService_interface|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.
 
  
 
===Load_Action===
 
===Load_Action===
  
 
This class is Select_Scene without a file dialog; the code is otherwise the same.
 
This class is Select_Scene without a file dialog; the code is otherwise the same.

Revision as of 21:08, 10 September 2013

ATTENTION: THIS PAGE REFERS TO AN INTERNAL LUXOLOGY FILE THAT HAS NOT YET BEEN RELEASED TO THE SDK. THIS PAGE WILL PROBABLY BE HELPFUL IN UNDERSTANDING THE SDK 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

Definitions

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.

#define ARGi_FILEPATH   0         
using namespace std;
const int MAXFILELENGTH = 1000;
char FILEPATH[MAXFILELENGTH]; 

Select_Scene class declaration

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.

class Select_Scene : public CLxBasicCommand     //Select_Scene will open a file dialog and load the chosen scene
{
    public:
        Select_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);
};

Initialize

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.

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);
} 

Select_Scene constructor

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.

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

CmdFlags function

Next, we set the MODEL flag.

int
Select_Scene::basic_CmdFlags()
{
    return LXfCMD_MODEL;    //We'll be altering the internal state of modo, so we set the MODEL flag
}

basic_Enable function

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

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

Interact Function

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.

void
    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,"dialog.open");
   
    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)
             return;
   
     std::string		 filename;
   
     va.String (0, filename);
     attr_SetString (0, filename.c_str ());
}

Execute function

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.

    void
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 = "scene.open ";
    command = command+FILEPATH;
    cmd_srv.ExecuteArgString(execFlagsA, LXiCTAG_NULL, command.c_str());
}

Load_Action

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