SOLVED Lock / unlock plugin from Plugins menu

Is it possible to lock a plugin in the Plugins menu using python. like image below:
I want to lock some of commands of my plugin depending on the selected object

Override CommandData.GetState(doc) or ToolData.GetState(doc) to return a combination of
CMD_ENABLED (enabled)
CMD_VALUE (checked)
or neither.

Thank you Cairyn,
I had arrived at the result below :

class MyCommand(c4d.plugins.CommandData):
    def __init__ (self):
        self.isActive = False

    def Execute(self, doc):
        return True

    def GetState(self, doc):
            if (self.isActive):
                return c4d.CMD_ENABLED
                return c4d.CMD_VALUE

Now I'm searching , how to swap from disabled to enabled depending on the type of the selected object in Object Manager.

I found this solution:

def GetState(self, doc):
        op = doc.GetActiveObject()
        if op is not None and op.GetType() == OBJECT_ID:
            return c4d.CMD_ENABLED
        else :
            return False

Hi @mfersaoui while True, False is supported it's better to return the correct value from the symbols (CMD_ENABLE) since in any case your bool will be converted to an Int and in the future value may change while symbols will remain the same.

Moreover in R20 GetState is also available for script in the Script Manager.


Thank you Maxime, I had used the (return False) because this give a different result visual of the icon.
Result (1) gived when use : return c4d.CMD_VALUE
Result (2) gived when use : return False

@mfersaoui You misunderstand the return value.

This is not a single true/false flag, but a set of flags. As I mentioned, CMD_ENABLED stands for the enabling of the command (greyed out if not set), and CMD_VALUE stands for the checked state (in case of icons, the background changes, as you saw in your test). These two flags are not mutually exclusive but can be used together! (use or to join).

The actual value to use if you want neither flag set is simply 0. False works in this case because the numeric equivalent of false is 0.

import c4d
from c4d import gui

def state():
    op = doc.GetActiveObject()
    if op is not None:
        if op.GetType() == c4d.Ocube :
            return c4d.CMD_ENABLED | c4d.CMD_VALUE
        elif op.GetType() == c4d.Ocylinder :
            return c4d.CMD_VALUE
        else :
            return c4d.CMD_ENABLED
    return 0

# Main function
def main():
    print "Triggered!"

# Execute main()
if __name__=='__main__':

If you watch the above script as icon in a toolbar, you will see all four state combinations depending on what primitive you select. If nothing is selected, the icon is grayed out. If you select a cylinder, the icon is still grayed out and unselectable but the background changes to make clear it's checked. A cube will show both the checked and active states, and some other object will show only the active state.

To be fair, the standard default script in R20 mentions False explicitly though.

@Cairyn Thank you for your detailed reply.