Tasto destro script

Forum per: Modellazione, Texturing, Animazione, Composting e tutto quello che riguarda il normale utilizzo di Cinema4D.

Moderators: visualtricks, cappellaiomatto, natas, Arkimed

Post Reply
  • Advertising
IoAro
Posts: 44
Joined: Fri Jul 30, 2010 1:06 pm

Tasto destro script

Post by IoAro » Fri May 31, 2019 8:05 pm

Salve a tutte/i,
sono riuscito a impostare uno script che, se cliccato, apre un popup menu che consente di richiamare altri script. Si tratta semplicemente di applicare un'estrusione ad una o più spline; estrusione che si posiziona direttamente sulla spline selezionata e diventa automaticamente genitore. Tutto ciò con valori standard che utilizzo frequentemente (estrusione sulla Y a 10, 20, 30, 100, 270, sulla X a 10, 20, ecc...).
Quello che mi farebbe molto comodo, a questo punto, è riuscire a richiamare il menu non col clic sinistro ma col tasto destro sul pulsante dello script, cosicché potrei impostare sul clic sinistro un'estrusione generica a 0-0-0.
In realtà questa cosa di richiamare un popup menu col tasto destro, poi, la vorrei usare anche per altri script quindi mi sarebbe utilissimo sapere come abbinare in Python le azioni per il tasto sinistro e tasto destro sul pulsante dello script!

Di seguito uno screenshot del menu (che ora viene richiamato col clic sinistro) e lo script col menu: ovviamente è "incompleto" perché richiama altri script, ma magari aiuta a capire meglio la questione.

Grazie e buona serata a tutte/i!

import c4d
from c4d import gui

# Declare menu items ID

IDM_MENU1 = c4d.FIRST_POPUP_ID
IDM_MENU2 = c4d.FIRST_POPUP_ID+1
IDM_MENU3 = c4d.FIRST_POPUP_ID+2

IDM_SUBMENU1 = c4d.FIRST_POPUP_ID+10
IDM_SUBMENU2 = c4d.FIRST_POPUP_ID+11
IDM_SUBMENU3 = c4d.FIRST_POPUP_ID+12
IDM_SUBMENU4 = c4d.FIRST_POPUP_ID+13
IDM_SUBMENU5 = c4d.FIRST_POPUP_ID+14
IDM_SUBMENU6 = c4d.FIRST_POPUP_ID+15
IDM_SUBMENU7 = c4d.FIRST_POPUP_ID+16

IDM_SUBMENU8 = c4d.FIRST_POPUP_ID+17
IDM_SUBMENU9 = c4d.FIRST_POPUP_ID+18
IDM_SUBMENU10 = c4d.FIRST_POPUP_ID+19
IDM_SUBMENU11 = c4d.FIRST_POPUP_ID+20
IDM_SUBMENU12 = c4d.FIRST_POPUP_ID+21
IDM_SUBMENU13 = c4d.FIRST_POPUP_ID+22
IDM_SUBMENU14 = c4d.FIRST_POPUP_ID+23
IDM_SUBMENU15 = c4d.FIRST_POPUP_ID+24
IDM_SUBMENU16 = c4d.FIRST_POPUP_ID+25

IDM_SUBMENU17 = c4d.FIRST_POPUP_ID+26
IDM_SUBMENU18 = c4d.FIRST_POPUP_ID+27
IDM_SUBMENU19 = c4d.FIRST_POPUP_ID+28
IDM_SUBMENU20 = c4d.FIRST_POPUP_ID+29
IDM_SUBMENU21 = c4d.FIRST_POPUP_ID+30
IDM_SUBMENU22 = c4d.FIRST_POPUP_ID+31
IDM_SUBMENU23 = c4d.FIRST_POPUP_ID+32

# Main menu

menu = c4d.BaseContainer()

# Menu X

submenu = c4d.BaseContainer()
submenu.InsData(1, 'X') # Set submenu title
submenu.InsData(IDM_SUBMENU1, '10')
submenu.InsData(IDM_SUBMENU2, '20')
submenu.InsData(IDM_SUBMENU3, '30')
submenu.InsData(IDM_SUBMENU4, '50')
submenu.InsData(IDM_SUBMENU5, '100')
submenu.InsData(IDM_SUBMENU6, '200')
submenu.InsData(IDM_SUBMENU7, '300')

menu.SetContainer(IDM_MENU1, submenu) # Set submenu as subcontainer

# Menu Y

submenu = c4d.BaseContainer()
submenu.InsData(1, 'Y') # Set submenu title
submenu.InsData(IDM_SUBMENU8, '10')
submenu.InsData(IDM_SUBMENU9, '20')
submenu.InsData(IDM_SUBMENU10, '30')
submenu.InsData(IDM_SUBMENU11, '50')
submenu.InsData(IDM_SUBMENU12, '100')
submenu.InsData(IDM_SUBMENU13, '200')
submenu.InsData(IDM_SUBMENU14, '250')
submenu.InsData(IDM_SUBMENU15, '270')
submenu.InsData(IDM_SUBMENU16, '300')

menu.SetContainer(IDM_MENU2, submenu) # Set submenu as subcontainer

# Menu Z

submenu = c4d.BaseContainer()
submenu.InsData(1, 'Z') # Set submenu title
submenu.InsData(IDM_SUBMENU17, '10')
submenu.InsData(IDM_SUBMENU18, '20')
submenu.InsData(IDM_SUBMENU19, '30')
submenu.InsData(IDM_SUBMENU20, '50')
submenu.InsData(IDM_SUBMENU21, '100')
submenu.InsData(IDM_SUBMENU22, '200')
submenu.InsData(IDM_SUBMENU23, '300')

menu.SetContainer(IDM_MENU3, submenu) # Set submenu as subcontainer

# Finally show popup dialog

result = gui.ShowPopupDialog(cd=None, bc=menu, x=c4d.MOUSEPOS, y=c4d.MOUSEPOS)

if result == IDM_SUBMENU1:
c4d.CallCommand(600000037)
if result == IDM_SUBMENU2:
c4d.CallCommand(600000039)
if result == IDM_SUBMENU3:
c4d.CallCommand(600000041)
if result == IDM_SUBMENU4:
c4d.CallCommand(600000043)
if result == IDM_SUBMENU5:
c4d.CallCommand(600000038)
if result == IDM_SUBMENU6:
c4d.CallCommand(600000040)
if result == IDM_SUBMENU7:
c4d.CallCommand(600000042)

if result == IDM_SUBMENU8:
c4d.CallCommand(600000044)
if result == IDM_SUBMENU9:
c4d.CallCommand(600000046)
if result == IDM_SUBMENU10:
c4d.CallCommand(600000050)
if result == IDM_SUBMENU11:
c4d.CallCommand(600000052)
if result == IDM_SUBMENU12:
c4d.CallCommand(600000045)
if result == IDM_SUBMENU13:
c4d.CallCommand(600000047)
if result == IDM_SUBMENU14:
c4d.CallCommand(600000048)
if result == IDM_SUBMENU15:
c4d.CallCommand(600000049)
if result == IDM_SUBMENU16:
c4d.CallCommand(600000051)

if result == IDM_SUBMENU17:
c4d.CallCommand(600000053)
if result == IDM_SUBMENU18:
c4d.CallCommand(600000055)
if result == IDM_SUBMENU19:
c4d.CallCommand(600000057)
if result == IDM_SUBMENU20:
c4d.CallCommand(600000059)
if result == IDM_SUBMENU21:
c4d.CallCommand(600000054)
if result == IDM_SUBMENU22:
c4d.CallCommand(600000056)
if result == IDM_SUBMENU23:
c4d.CallCommand(600000058)
Screenshot (58).png
Screenshot (58).png (143.59 KiB) Viewed 506 times

User avatar
Caleidos4D
Posts: 60
Joined: Tue Sep 27, 2011 4:48 pm

Re: Tasto destro script

Post by Caleidos4D » Sat Jun 01, 2019 9:15 pm

Avviare uno script con il tasto destro non credo sia possibile, poichè vengono richiamati i vari menù contestuali di Cinema.
Tuttavia puoi risolvere in altri modi, modificando il codice dello script, facendo ad esempio, attivare la parte che ti apre i vari menù con Ctrl+Click Sinistro

IoAro
Posts: 44
Joined: Fri Jul 30, 2010 1:06 pm

Re: Tasto destro script

Post by IoAro » Sun Jun 02, 2019 12:19 pm

Giustissimo Caleidos,
non avevo pensato alla funzione generale del tasto destro, ma effettivamente abbinare il Ctrl risolve perfettamente il problema!
Ora... mettendo insieme lo script che mi hai fornito nell'altro post e il menu richiamato dal Ctrl+click, ho tirato fuori questo:

Code: Select all

"""Name-IT: Estrusione
Description-IT: Click - Estrusione | CTRL + Click - Menu 
"""

import c4d
from c4d import gui

# Voci del Menu

IDM_MENU1 = c4d.FIRST_POPUP_ID
IDM_MENU2 = c4d.FIRST_POPUP_ID+1
IDM_MENU3 = c4d.FIRST_POPUP_ID+2
IDM_MENU4 = c4d.FIRST_POPUP_ID+3

IDM_SUBMENU1 = c4d.FIRST_POPUP_ID+10
IDM_SUBMENU2 = c4d.FIRST_POPUP_ID+11
IDM_SUBMENU3 = c4d.FIRST_POPUP_ID+12
IDM_SUBMENU4 = c4d.FIRST_POPUP_ID+13
IDM_SUBMENU5 = c4d.FIRST_POPUP_ID+14
IDM_SUBMENU6 = c4d.FIRST_POPUP_ID+15
IDM_SUBMENU7 = c4d.FIRST_POPUP_ID+16

IDM_SUBMENU8 = c4d.FIRST_POPUP_ID+17
IDM_SUBMENU9 = c4d.FIRST_POPUP_ID+18
IDM_SUBMENU10 = c4d.FIRST_POPUP_ID+19
IDM_SUBMENU11 = c4d.FIRST_POPUP_ID+20
IDM_SUBMENU12 = c4d.FIRST_POPUP_ID+21
IDM_SUBMENU13 = c4d.FIRST_POPUP_ID+22
IDM_SUBMENU14 = c4d.FIRST_POPUP_ID+23
IDM_SUBMENU15 = c4d.FIRST_POPUP_ID+24
IDM_SUBMENU16 = c4d.FIRST_POPUP_ID+25

IDM_SUBMENU17 = c4d.FIRST_POPUP_ID+26
IDM_SUBMENU18 = c4d.FIRST_POPUP_ID+27
IDM_SUBMENU19 = c4d.FIRST_POPUP_ID+28
IDM_SUBMENU20 = c4d.FIRST_POPUP_ID+29
IDM_SUBMENU21 = c4d.FIRST_POPUP_ID+30
IDM_SUBMENU22 = c4d.FIRST_POPUP_ID+31
IDM_SUBMENU23 = c4d.FIRST_POPUP_ID+32

menu = c4d.BaseContainer()

# Menu X

submenu = c4d.BaseContainer()
submenu.InsData(1, 'X')			# Titolo del sottomenu
submenu.InsData(IDM_SUBMENU1, '10')
submenu.InsData(IDM_SUBMENU2, '20')
submenu.InsData(IDM_SUBMENU3, '30')
submenu.InsData(IDM_SUBMENU4, '50')
submenu.InsData(IDM_SUBMENU5, '100')
submenu.InsData(IDM_SUBMENU6, '200')
submenu.InsData(IDM_SUBMENU7, '300')

menu.SetContainer(IDM_MENU2, submenu)	# Impostare il sottomenu come contenitore

# Menu Y

submenu = c4d.BaseContainer()
submenu.InsData(1, 'Y')			# Titolo del sottomenu
submenu.InsData(IDM_SUBMENU8, '10')
submenu.InsData(IDM_SUBMENU9, '20')
submenu.InsData(IDM_SUBMENU10, '30')
submenu.InsData(IDM_SUBMENU11, '50')
submenu.InsData(IDM_SUBMENU12, '100')
submenu.InsData(IDM_SUBMENU13, '200')
submenu.InsData(IDM_SUBMENU14, '250')
submenu.InsData(IDM_SUBMENU15, '270')
submenu.InsData(IDM_SUBMENU16, '300')

menu.SetContainer(IDM_MENU3, submenu)	# Impostare il sottomenu come contenitore

# Menu Z

submenu = c4d.BaseContainer()
submenu.InsData(1, 'Z')			# Titolo del sottomenu
submenu.InsData(IDM_SUBMENU17, '10')
submenu.InsData(IDM_SUBMENU18, '20')
submenu.InsData(IDM_SUBMENU19, '30')
submenu.InsData(IDM_SUBMENU20, '50')
submenu.InsData(IDM_SUBMENU21, '100')
submenu.InsData(IDM_SUBMENU22, '200')
submenu.InsData(IDM_SUBMENU23, '300')

menu.SetContainer(IDM_MENU4, submenu)	# Impostare il sottomenu come contenitore


def main():
    c4d.StopAllThreads()
    doc.StartUndo()
    objs = doc.GetActiveObjects(0)
    # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
    if not objs:
        extrude = c4d.BaseObject(c4d.Oextrude)
        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,0)
        doc.InsertObject(extrude)
        doc.AddUndo(c4d.UNDO_NEW, extrude)
        
    # Altrimenti
    else:
        for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
            obj_m = obj.GetMg()
            obj_n = obj.GetName()
            extrude = c4d.BaseObject(c4d.Oextrude)
            extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
            extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,0)
            extrude.SetName(obj_n)
            extrude.InsertBefore(obj)
            doc.AddUndo(c4d.UNDO_NEW, extrude)
            extrude.SetMg(obj_m)
            
            #Rendo la Spline figlio dell'Estrusore
            doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
            obj.InsertUnder(extrude)
            obj.SetMg(obj_m)

    doc.EndUndo()
    c4d.EventAdd()

# Menu

    bc = c4d.BaseContainer()
    if c4d.gui.GetInputState(c4d.BFM_INPUT_KEYBOARD,c4d.BFM_INPUT_CHANNEL,bc):
        if bc[c4d.BFM_INPUT_QUALIFIER] & c4d.QCTRL:

            result = gui.ShowPopupDialog(cd=None, bc=menu, x=c4d.MOUSEPOS, y=c4d.MOUSEPOS)

            if result == IDM_SUBMENU1:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(10,0,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(10,0,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU2:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(20,0,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(20,0,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU3:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(30,0,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(30,0,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU4:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(50,0,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(50,0,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU5:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(100,0,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(100,0,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU6:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(200,0,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(200,0,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU7:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(300,0,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(300,0,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            
            if result == IDM_SUBMENU8:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,10,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,10,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU9:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,20,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,20,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU10:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,30,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,30,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU11:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,50,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,50,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU12:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,100,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,100,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU13:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,200,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,200,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU14:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,250,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,250,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU15:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,270,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,270,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU16:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,300,0)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,300,0)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            
            if result == IDM_SUBMENU17:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,10)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,10)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU18:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,20)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,20)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU19:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,30)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,30)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU20:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,50)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,50)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU21:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,100)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,100)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU22:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,200)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,200)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()

            if result == IDM_SUBMENU23:
                c4d.StopAllThreads()
                doc.StartUndo()
                objs = doc.GetActiveObjects(0)
                # Se non ho Oggetti Selezionati: Creo solo l'Estrusione
                if not objs:
                    extrude = c4d.BaseObject(c4d.Oextrude)
                    extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                    extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,300)
                    doc.InsertObject(extrude)
                    doc.AddUndo(c4d.UNDO_NEW, extrude)
                 # Altrimenti
                else:
                    for obj in objs: #Per Ogni Oggetto Selezionato, creo un estrusore
                        obj_m = obj.GetMg()
                        obj_n = obj.GetName()
                        extrude = c4d.BaseObject(c4d.Oextrude)
                        extrude[c4d.EXTRUDEOBJECT_HIERARCHIC] = True
                        extrude[c4d.EXTRUDEOBJECT_MOVE] = c4d.Vector(0,0,300)
                        extrude.SetName(obj_n)
                        extrude.InsertBefore(obj)
                        doc.AddUndo(c4d.UNDO_NEW, extrude)
                        extrude.SetMg(obj_m)
                        #Rendo la Spline figlio dell'Estrusore
                        doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
                        obj.InsertUnder(extrude)
                        obj.SetMg(obj_m)            
                doc.EndUndo()
                c4d.EventAdd()
                
if __name__=='__main__':
    main()
Magari, anche qui, ci potrebbe essere un modo più pulito per compilarlo, ma insomma... sono a postissimo così! 8-)

Oddio, essendo un tantinello ossessivo compulsivo (ma questo l'avrai già ampiamente capito) ho scoperto una minuscola imperfezione in tutto ciò: se clicco col ctrl per far comparire il menu e poi, una volta comparso il menu, non seleziono nessuna voce ma clicco in un punto qualsiasi fuori dal menu, parte la generazione dell'estrusione a 0,0,0.
Sono convinto che sia perché ho gestito male qualcosa nella prima parte dello script, ma come dicevo prima... va benissimo così e ti ringrazio veramente tanto perché sei stato gentilissimo e precisissimo!
Come, d'altra parte, lo sono stati tutti quelli con cui ho avuto a che fare in questo forum: siete indubbiamente delle belle persone ;)

Lo script oltre ad averlo incorporato nel post* lo allego anche qui, dovesse tornare utile a qualcuna/o

Estrusione.rar
(1.57 KiB) Downloaded 10 times

* Ho notato che incorporando uno script nel codice, quest'ultimo perde la spaziatura della gerarchia e se poi si fa copia e incolla bisogna riallineare a mano le varie stringhe: sto sbagliando qualcosa nel modo in cui lo inserisco?

User avatar
Caleidos4D
Posts: 60
Joined: Tue Sep 27, 2011 4:48 pm

Re: Tasto destro script

Post by Caleidos4D » Sun Jun 02, 2019 3:45 pm

Si, in effetti delle soluzioni per snellirlo ci sarebbero, una potrebbe essere la creazione di una funzione che evitasse il dover ripetere gli stessi blocchi di codice nei vari sottomenù (ci sarebbe da investire del tempo, ma ti permetterebbe di velocizzare tutte le eventuali implementazioni future).

Ho dato una veloce e piccola correzione allo script, nello specifico, la posizione del blocco che si attiva al solo click sinistro.
Come vedrai adesso, l'ho messo alla fine, come else del bc[c4d.BFM_INPUT_QUALIFIER] & c4d.QCTRL in questo modo, Cinema eseguirà il blocco if o else, in base al Ctrl. Prima, purtroppo, non esistendo questa distinzione, dava i problemi di creazione involontaria dell'oggetto estrusore.

Trovi qui lo script corretto:
B_Estrusione.rar
(1.46 KiB) Downloaded 8 times
Ps: il tag codice stravolge gli spazi anche a me, credo sia un problema della board, meglio caricare gli script come allegati, per adesso :)

IoAro
Posts: 44
Joined: Fri Jul 30, 2010 1:06 pm

Re: Tasto destro script

Post by IoAro » Sun Jun 02, 2019 4:24 pm

Esatto, vedi... la mia totale inesperienza in Python non m'aveva fatto pensare ad una soluzione tanto semplice quanto esatta come l'impostare il blocco relativo al tasto sinistro sotto un'istruzione else.
La verità è che dovrei mettermi giù ad imparare seriamente il linguaggio, ma finora, fra lavoro e studio di altre tematiche di Cinema, non sono mai riuscito a mettermici con la giusta dedizione.
Che poi, invece, è una di quelle cose che andrebbe proprio approfondita perché ti consente di fare (quasi) praticamente tutto e il tempo impiegato nello studiarlo lo recuperi abbondantemente poi nella velocità di utilizzo. Nella fattispecie quando parli di investire del tempo per la creazione di una funziona che, giustamente, eliminerebbe tutte le inutili ripetizioni che ci sono in questo script, penso che ne varrebbe proprio la pena, altroché!

Buona domenica Caleidos e grazie per questa ulteriore modifica che ha contribuito a placare decisamente il mio istinto ossessivo compulsivo! ;)

IoAro
Posts: 44
Joined: Fri Jul 30, 2010 1:06 pm

Re: Tasto destro script

Post by IoAro » Sun Jun 02, 2019 5:54 pm

Come volevasi dimostrare.
Ho voluto aggiungere una variante al tutto: prima di estrudere, vorrei resettare la rotazione degli assi per far sì che la Y sia sempre il valore dell'altezza, la Z la profondità, ecc...
Penso che terrò entrambe le versioni perché ci sta che magari alcune volte conviene estrudere secondo gli "assi assoluti" ed altre secondo gli assi dell'oggetto: magari imposto che il menu con le estrusioni con gli assi assoluti vengano richiamate da Alt + click mentre il menu che non ruota gli assi lo lascio abbinato alla combinazione Ctrl + click.
Un veloce esempio del primo scenario potrebbe essere una cosa del genere:
1.JPG
1.JPG (40.46 KiB) Viewed 441 times
Mentre in un caso come il seguente potrebbe convenire lasciare gli assi invariati:
2.JPG
2.JPG (44.23 KiB) Viewed 441 times
Bene.
Per fare questo ho trovato questo script:

import c4d
zero = c4d.Vector(0,0,0)
normScale = c4d.Vector(1,1,1)

def main():
objList=doc.GetActiveObjects(True)# get the selected objects
for obj in objList:
oldm = obj.GetMg()
points = obj.GetAllPoints()
pcount = obj.GetPointCount()
doc.StartUndo()
doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
obj.SetAbsPos(zero)
obj.SetAbsRot(zero)
obj.SetAbsScale(normScale)
newm = obj.GetMg()
for p in xrange(pcount):
obj.SetPoint(p,~newm*oldm*points[p])

obj.Message(c4d.MSG_UPDATE) #Update the changes made to the object
c4d.EventAdd()
doc.EndUndo()

if __name__=='__main__':
main()

Eliminando le righe riguardanti l'azzeramento della posizione e la scala, l'istruzione zero = c4d.Vector(0,0,0) l'ho messa in cima allo script e il resto, per provare, l'ho aggiunto alla modalità con il semplice click eseguito con le spline selezionate.
Pare funzionare compreso l'Undo, ma proprio come dicevi prima... adesso dovrei inserire quest'istruzione su tutte le voci! :lol:

Alla fine non ci metterò tantissimo, ma te l'ho voluto riportare perché è successa proprio l'ipotesi che avevi avanzato :)

Questa è la bozza di cui ti parlavo con l'azzeramento della rotazione impostata solo sul click con le spline selezionate:
Estrusione.rar
(1.67 KiB) Downloaded 10 times
P.s. Ultimissima cosa solo se non è una questione lunga o complicata o se non ti porta ad odiarmi definitivamente! Al momento l'operazione di estrusione termina con le spline selezionate, ci sarebbe il modo di terminare le operazioni di estrusione avendo selezionate le estrusioni stesse?

IoAro
Posts: 44
Joined: Fri Jul 30, 2010 1:06 pm

Re: Tasto destro script

Post by IoAro » Mon Jun 03, 2019 12:57 pm

Ciao Caleidos,
non so se c'è di meglio, ma per selezionare le estrusioni anziché le spline ho risolto aggiungendo questo alla fine di ogni pulsante:

parent = obj.GetUp()
children = obj
parent.SetBit(c4d.BIT_ACTIVE)
children.DelBit(c4d.BIT_ACTIVE)

Mentre ora, giunto praticamente alla fine, mi trovo un ultimo quesito: visto che vorrei richiamare un menu col ctrl+click ed un altro con alt+click dovrei identificare in maniera univoca i due menu... come posso attribuirgli un nome, un ID o qualcosa che li renda distinguibili?

Grazie e buona giornata! :)

User avatar
Caleidos4D
Posts: 60
Joined: Tue Sep 27, 2011 4:48 pm

Re: Tasto destro script

Post by Caleidos4D » Mon Jun 03, 2019 1:45 pm

IoAro wrote:
Mon Jun 03, 2019 12:57 pm
Ciao Caleidos,
non so se c'è di meglio, ma per selezionare le estrusioni anziché le spline ho risolto aggiungendo questo alla fine di ogni pulsante:

parent = obj.GetUp()
children = obj
parent.SetBit(c4d.BIT_ACTIVE)
children.DelBit(c4d.BIT_ACTIVE)
Si, può essere anche questa una probabile soluzione.
IoAro wrote:
Mon Jun 03, 2019 12:57 pm
Mentre ora, giunto praticamente alla fine, mi trovo un ultimo quesito: visto che vorrei richiamare un menu col ctrl+click ed un altro con alt+click dovrei identificare in maniera univoca i due menu... come posso attribuirgli un nome, un ID o qualcosa che li renda distinguibili?

Grazie e buona giornata! :)
Per avere un secondo menù all'interno dello stesso script, richiamabile con alt+click, devi creare un nuovo blocco (puoi copiare quello di ctrl+click e successivamente modificarlo) dove al posto di:
bc[c4d.BFM_INPUT_QUALIFIER] & c4d.QCTRL inserire bc[c4d.BFM_INPUT_QUALIFIER] & c4d.QALT
(ci sarebbe anche c4d.QSHIFT, se ti può interessare)

Buona Giornata anche a te :)

IoAro
Posts: 44
Joined: Fri Jul 30, 2010 1:06 pm

Re: Tasto destro script

Post by IoAro » Tue Jun 04, 2019 1:43 pm

Grazie Caleidos,
penso di avercela fatta, alla fine! :)
Ho avuto un problema col posizionamento del blocco duplicato per la versione con l'Alt+click: una delle due modalità (ora sinceramente non ricordo se quella col Ctrl o quella con l'Alt) mi generava le giuste estrusioni ma aggiungeva un'ulteriore estrusione a zero... è come se partisse anche l'istruzione dell'estrusione col semplice click (che è infatti la sola impostata a zero). Tirandoci assolutamente il cappello, ho aggiunto due return alla fine dei due blocchi (nello script alle righe 963 e 2092) per provare a "chiudere" e quindi bloccare l'estrusione a zero e ecco... sembra che funzioni anche se sospetto fortemente che compilando il tutto in maniera corretta non ci sarebbe bisogno di quello che vedo come un rattoppo molto poco professionale, per usare un eufemismo.
Immagino che tu stia rimanendo abbastanza impressionato dalle secchiate di tecnicismo che sto utilizzando nel descriverti tutto ciò, ma sai noi esperti di Python affrontiamo la vita un po' così, una stringa di codice alla volta.

Bene, concluse le amenità di rito, ti saluto e ti ringrazio ancora una volta: per quanto possa non essere uno script rivoluzionario nel mondo di Cinema, aiuta e aiuterà non poco il mio flusso di lavoro e potrò essere sicuramente più veloce e fluido in alcune operazioni. Senza contare il fatto che le nozioni "apprese" per questo tema mi torneranno molto utili per altri strumenti che ho in mente.
Anche se ora mi vorrei dedicare ad un'area un po' diversa... vorrei capire se fosse possibile creare uno script che mi possa permettere, una volta richiamato, di generare tot duplicatori (ovviamente con lo stesso nome dell'oggetto sorgente + numero progressivo) attraverso una finestra di dialogo dove posso, appunto, inserire il numero di duplicatori desiderati.

Di seguito allego la versione attuale dello script. Buona giornata e grazie di tutto! ;)
Estrusione.rar
(2.04 KiB) Downloaded 10 times

  • Advertising
Post Reply