Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    CommandData ExecuteOptionID()

    Cinema 4D SDK
    python
    4
    9
    1.1k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • ?
      A Former User
      last edited by Manuel

      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.

      1 Reply Last reply Reply Quote 0
      • ferdinandF
        ferdinand
        last edited by ferdinand

        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

        MAXON SDK Specialist
        developers.maxon.net

        1 Reply Last reply Reply Quote 1
        • ?
          A Former User
          last edited by

          @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.

          ferdinandF 1 Reply Last reply Reply Quote 0
          • ferdinandF
            ferdinand @A Former User
            last edited by ferdinand

            @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

            MAXON SDK Specialist
            developers.maxon.net

            1 Reply Last reply Reply Quote 0
            • ?
              A Former User
              last edited by

              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!

              1 Reply Last reply Reply Quote 0
              • ManuelM
                Manuel
                last edited by

                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

                MAXON SDK Specialist

                MAXON Registered Developer

                ? 1 Reply Last reply Reply Quote 0
                • ?
                  A Former User @Manuel
                  last edited by

                  @m_magalhaes Excellent, thank you very much!

                  1 Reply Last reply Reply Quote 0
                  • ManuelM
                    Manuel
                    last edited by

                    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

                    MAXON SDK Specialist

                    MAXON Registered Developer

                    1 Reply Last reply Reply Quote 0
                    • fwilleke80F
                      fwilleke80
                      last edited by

                      @m_magalhaes Just chiming in here... any news on those C++ examples? πŸ˜‰

                      Cheers,
                      Frank

                      www.frankwilleke.de
                      Only asking personal code questions here.

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post