SOLVED Parameters for commandData Plugin

Hi!

Is it possible to add a commandData plugin multiple times to a menu, but label it differently and pass a parameter to Execute()? Or is the only way to do that via GetSubContainer()?

I'm thinking of something like

menu.InsData(c4d.MENURESOURCE_COMMAND, "PLUGIN_CMD_12345, menuLabel1, menuParam1)
menu.InsData(c4d.MENURESOURCE_COMMAND, "PLUGIN_CMD_12345, menuLabel2, menuParam2)

to then do something like this in Execute

def Execute(self, doc, param):
    if param == x:
        doX()
    elif param == y:
        doY()

Thanks!

Hello,

you cannot add a new argument to the Execute() function.

Instead, you could write a more generic CommandData plugin that stores an internal value. You could register different versions of that command using different plugin IDs and then call these different versions. Something like this:

class DynamicCommand(plugins.CommandData):

    # internal value
    _setting = 0

    def __init__(self, setting):
        # set internal value on creation
        self._setting = setting

    def Execute(self, doc):
        # use internal value on execution
        print(self._setting)

        return True

Which can be registered using constructors with different arguments:

plugins.RegisterCommandPlugin(id_a, "Command A", c4d.PLUGINFLAG_HIDEPLUGINMENU, bitmaps.BaseBitmap(), "", DynamicCommand(123))
plugins.RegisterCommandPlugin(id_b, "Command B", c4d.PLUGINFLAG_HIDEPLUGINMENU, bitmaps.BaseBitmap(), "", DynamicCommand(456))

Best wishes,
Sebastian

Hi Sebastian!

Thanks for your answer. I was looking for something a little more flexible than registering multiple plugins, but I guess GetSubContainer will have to do 🙂