CommandData ExecuteOptionID()



  • Hello,
    Could someone please help me with a working example of CommandData.ExecuteOptionID()? I was unable to find one online and I find the documentation confusing. I would like to transfer the data from a GeDialog storing Options to my CommandData plugin. What would this look like?

    Documentation Confusion
    ExectuteOptionID() accepts subid as an argument, which is described as such:

    subid (int) – Only available for plugins that have sub-IDs (which normally are called using ExecuteSubID().
    

    Is this saying that I should call ExecuteSubID() as well or does ExecuteOptionID() replace this method?

    In ExecuteSubID(), it then says:

    Override - Execute the command plugin with the subid that was given by GetSubContainer().
    

    Is this saying that I need to also call GetSubContainer()? How does this work?


    What I Have So Far

    Options Dialog...

    class Options_Dlg(c4d.gui.GeDialog):
        # options data, CreateLayout, etc.
    

    From CommandData...

        def ExecuteOptionID(self, doc, plugid, subid):
            dlg = Options_Dlg()
            dlg.Open(c4d.DLG_TYPE_MODAL, defaultw=300, defaulth=150)
            return True
    

    Registering the Command Plugin...

        c4d.plugins.RegisterCommandPlugin(id=CMD_PLUGIN_ID,
                                    str="Plugin Name",
                                    info=c4d.PLUGINFLAG_COMMAND_OPTION_DIALOG | c4d.PLUGINFLAG_COMMAND_HOTKEY |c4d.PLUGINFLAG_HIDEPLUGINMENU,
                                    help="Help text.",
                                    dat=MyCommandData(),
                                    icon=None)
    

    Thank you.



  • Hi,

    it is a bit unclear to me what your actual question is. CommandData.ExecuteSubID is called when you did override CommandData.GetSubConatiner. This will define sub IDs and menu entries to split your command into. Probably not what you are currently after.

    If you want to transfer data from your dialog, well, just do it ;).

    def ExecuteOptionID(self, doc, plugid, subid):
            dlg = Options_Dlg()
            dlg.Open(c4d.DLG_TYPE_MODAL, *data)
            # Your dialog is modal, i.e. blocking, so this point will only
            # be reached once the dialog has been closed.
    
            # Reading out a gui value.
            self._some_int = dlg.GetInt32(ID_SOME_INT)
            # Or just reading out an attribute attached to the python object
            # of the dialog.
            self._some_data = dlg._the_answer_to_everything
            # You could of course also just make the options dialog itself
            # an attribute of your CommandData plugin.
            self._options = dlg
            # Although it would be probably better to do this on the 
            # initialisation of the plugin, i.e. something like this:
            """
            class MyPlugin (c4d.plugins.CommandData):
                '''
                '''
                def __init__(self):
                    ''' Attach an instance of the options dialog to the instance
                    of the CommandData plugin.
                    '''
                    self._options_dlg = OptionsDialog()
                
                def ExecuteOptionID(self, doc, plugid, subid):
                    ''' Just open the options dialog.
                    '''
                    self._options_dlg.Open(c4d.DLG_TYPE_MODAL, *data)
                    return True
                
                def some_function(*args, **kwargs):
                    ''' Access some values in the dialog.
                    '''
                    some_int = self._options_dlg.GetInt32(ID_SOME_INT)
                    return some_int ** 2
            """
            return True
    

    Cheers,
    zipit



  • @zipit Thank you for the reply.

    I had several questions because I was confused. First was a request of an example of an Options dialog setup in a CommandData plugin as recommended by Maxon because I could not find one.

    The rest of my questions just illustrate my confusion by the documentation: I don't understand if/how to use subid, ExecuteSubId, or GetSubContainer. I did not see any of those used in the example code you provided.

    You said 'when you did override CommandData.GetSubContainer'...I don't think I did unless I am unaware.



  • @blastframe said in CommandData ExecuteOptionID():

    The rest of my questions just illustrate my confusion by the documentation: I don't understand if/how to use subid, ExecuteSubId, or GetSubContainer. I did not see any of those used in the example code you provided.
    You said 'when you did override CommandData.GetSubContainer'...I don't think I did unless I am unaware.

    Hi,

    sure, you did not. That was kind of my point. Sub IDs are only meaningful when you have split your command plugin into several sub commands, which you do 'initiate' by overriding CommandData.GetSubContainer. So the parameter subid is only available, as the docs put it, when you did so, and reflects the sub command that is being executed by the user. If you did not define any sub commands, probably some value that indicates that unavailability, like -1, 0 or None, is being passed instead.

    Cheers,
    zipit



  • I'm not much clearer on the usage of GetSubContainer and subid. I still would greatly appreciate a code example of these if any of the SDK team would be so kind. Thanks!



  • hi,

    I'm on it, sorry for the delay. But i need to check if it's my being idiot or if it's not working as expected.
    Having c++ examples will not hurt anybody.

    cheers,
    Manuel



  • @m_magalhaes Excellent, thank you very much!



  • hi,
    i just saw that my answer wasn't clear on that thread and i didn't provided any feedback from my search..(really sorry for that)
    It's a bug in the python API. (it's working as expected on c++)

    Cheers,
    Manuel