Hi Bigroy, thanks for reaching out us.
Sorry for the answer taking longer than expected by holiday season didn't helped 
- Say I wanted to add five menu items, each triggering its own tool. How would I do so? I believe I have to register a command and then add it to the menu item. But a quick search didn't bring me to a concrete example on how to do so. I found this topic but it still was unclear how to proceed and make a simple menu item with some custom commands.
The process is pretty straightforward and your initial finding in our documentation is actually the entry point.
Saving the code below in a .pyp
file located in the folder where Cinema 4D looks for plugins should do the trick and show the following entry in the Cinema 4D top-menu bar.

import c4d
from c4d import gui
PLUGIN1_ID = 999121031
PLUGIN2_ID = 999121032
PLUGIN3_ID = 999121033
PLUGIN4_ID = 999121034
PLUGIN5_ID = 999121035
class PC_12103_1(c4d.plugins.CommandData):
def Execute(self, doc):
print "Execute the 1st command"
return True
class PC_12103_2(c4d.plugins.CommandData):
def Execute(self, doc):
print "Execute the 2nd command"
return True
class PC_12103_3(c4d.plugins.CommandData):
def Execute(self, doc):
print "Execute the 3rd command"
return True
class PC_12103_4(c4d.plugins.CommandData):
def Execute(self, doc):
print "Execute the 4th command"
return True
class PC_12103_5(c4d.plugins.CommandData):
def Execute(self, doc):
print "Execute the 5th command"
return True
def EnhanceMainMenu():
mainMenu = gui.GetMenuResource("M_EDITOR") # Get main menu resource
pluginsMenu = gui.SearchPluginMenuResource() # Get 'Plugins' main menu resource
menu = c4d.BaseContainer() # Create a container to hold a new menu information
menu.InsData(c4d.MENURESOURCE_SUBTITLE, "Your Menu") # Set the name of the menu
menu.InsData(c4d.MENURESOURCE_COMMAND, "PLUGIN_CMD_999121031")# Add registered command identified by ID 999121031
menu.InsData(c4d.MENURESOURCE_COMMAND, "PLUGIN_CMD_999121032")# Add registered command identified by ID 999121032
menu.InsData(c4d.MENURESOURCE_COMMAND, "PLUGIN_CMD_999121033")# Add registered command identified by ID 999121033
menu.InsData(c4d.MENURESOURCE_COMMAND, "PLUGIN_CMD_999121034")# Add registered command identified by ID 999121034
menu.InsData(c4d.MENURESOURCE_COMMAND, "PLUGIN_CMD_999121035")# Add registered command identified by ID 999121035
menu.InsData(c4d.MENURESOURCE_SEPERATOR, True); # Add a separator
menu.InsData(c4d.MENURESOURCE_COMMAND, "PLUGIN_CMD_5159") # Add command 'Cube' with ID 5159 to the menu
submenu = c4d.BaseContainer() # Create a new submenu container
submenu.InsData(c4d.MENURESOURCE_SUBTITLE, "Submenu") # This is a submenu
submenu.InsData(c4d.MENURESOURCE_COMMAND, "IDM_NEU") # Add registered default command 'New Scene' to the menu
submenu.InsData(c4d.MENURESOURCE_COMMAND, "IDM_SPEICHERN") # Add registered default command 'Save' to the menu
menu.InsData(c4d.MENURESOURCE_SUBMENU, submenu) # Add the submenu
if pluginsMenu:
# Insert menu after 'Plugins' menu
mainMenu.InsDataAfter(c4d.MENURESOURCE_STRING, menu, pluginsMenu)
else:
# Insert menu after the last existing menu ('Plugins' menu was not found)
mainMenu.InsData(c4d.MENURESOURCE_STRING, menu)
def PluginMessage(id, data):
if id==c4d.C4DPL_BUILDMENU:
EnhanceMainMenu()
if __name__ == "__main__":
c4d.plugins.RegisterCommandPlugin(PLUGIN1_ID, "1st Cmd", 0, None, "", PC_12103_1())
c4d.plugins.RegisterCommandPlugin(PLUGIN2_ID, "2nd Cmd", 0, None, "", PC_12103_2())
c4d.plugins.RegisterCommandPlugin(PLUGIN3_ID, "3rd Cmd", 0, None, "", PC_12103_3())
c4d.plugins.RegisterCommandPlugin(PLUGIN4_ID, "4th Cmd", 0, None, "", PC_12103_4())
c4d.plugins.RegisterCommandPlugin(PLUGIN5_ID, "5th Cmd", 0, None, "", PC_12103_5())
- Would I need a unique plug-in ID for each single command I'll register? Or can this be done differently?
Yes, that's the way Cinema 4D registers commands. You can generate your unique plugin IDs on this link.
Looking forward Avalon to be brought on Cinema, give best.
Riccardo