Jump to content
bn-top

Un piccolo Script per bloccare e sbloccare le transformazioni


Recommended Posts

Ciao ragazzi, ci sono un paio di operazioni alle quali vorrei assegnare un tasto rapido.

 

La prima è AFFECT OBJECT ONLY, cioè quel pulsante nella tabella Hierarchy, nella colonna PIVOT, che ci permette di agire sulle transformazioni dell'oggetto senza alterare il pivot. Questa funzione sono sicuro che sta nella tabella di customizzazione ma non so il nome specifico, mentre AFFECT PIVOT ONLY porta lo stesso nome in questa tabella ed è stato facile trovarlo, la funzione AFFECT OBJECT ONLY deve avere un nome differente e non la trovo sulla enorme lista, inoltre attivando o disattivando questo pulsante nel listener non compare nulla.

 

La seconda che mi farebbe comodo, avete presente quelle spunte chiamate LOCK sempre nella tabella Heriarchy, nella colonna LINK INFO, che ci permettono di bolccare determinate transformazioni? Mi capita spesso di bloccare tutte le transformazioni e poi sbloccarle di continuo per vari motivi, e mettere 3 spunte per le 3 coordinate di MOVE, 3 per ROTATE e 3 per SCALE, sono 9 CLICK che faccio in continuazione, e diciamo se con un piccolo script posso mettere tutte le spunte con un comando e un altro me le toglie tutte sempre con un solo click, la cosa mi auterebbe molto nei tempi di lavoro.

 

Grazie a tutti in anticipo

Link to post
Share on other sites
bn-post

Per il "Locks" sugli assi di trasformazione, rotazione e scala usa:

Blocca tutto: 

setTransformLockFlags selection #all

Sblocca tutto:

setTransformLockFlags selection #none

 

Per il pivot AFFECT OBJECT ONLY usa:

Seleziona:

maxOps.pivotMode= #objectOnly

Deseleziona:

maxOps.pivotMode= #none

 

 

Sotto un veloce script completo di tasti che contempla tutte e due i modi:

try (destroydialog ::QuickClick)catch()

rollout QuickClick "Quick Click" width:232 height:64
(
	checkbutton btLocks "Locks Move/Rotate/Scale --> OFF" pos:[8,7] width:176 height:21 checked:false 
	bitmap bmap1 "" pos:[200,8] width:15 height:15 bitmap: (bitmap 15 15 color:red)

	checkbutton btPivot "Pivot Affect Object Only --> OFF" pos:[8,32] width:176 height:21 checked:false 
	bitmap bmap2 "" pos:[200,32] width:15 height:15 bitmap:(bitmap 15 15 color: red)

	on btLocks changed theState do
	(
		if theState == true then 
		(
			setTransformLockFlags selection #all
			bmap1.bitmap  = (bitmap 15 15 color:green)
			btLocks.text = "Locks Move/Rotate/Scale --> ON" 
		)
			else 
		(
			setTransformLockFlags selection #none
			bmap1.bitmap  = (bitmap 15 15 color:red)
			btLocks.text = "Locks Move/Rotate/Scale --> OFF"
		)
	)
	on btPivot changed theState do
	(
		if theState == true then 
		(
			bmap2.bitmap  = (bitmap 15 15 color:green)
			maxOps.pivotMode= #objectOnly
			btPivot.text = "Pivot Affect Object Only --> ON"
		)
			else 
		(
			bmap2.bitmap  = (bitmap 15 15 color:red)
			maxOps.pivotMode= #none
			btPivot.text = "Pivot Affect Object Only --> OFF"
		)
	)
)
createdialog QuickClick style:#(#style_titlebar, #style_sysmenu, #style_toolwindow, #style_sunkenedge)

 

Comincia con ---> F.A.Q. di Treddi.com ---> Argomenti già Trattati ---> Utilizzo corretto dei TAG e vai alla grande _:w00t: !!  My Youtube && My Treddi Album

Link to post
Share on other sites
8 minuti fa, Michele71 ha scritto:

Sotto un veloce script completo di tasti che contempla tutte e due i modi:


try (destroydialog ::QuickClick)catch()

rollout QuickClick "Quick Click" width:232 height:64
(
	checkbutton btLocks "Locks Move/Rotate/Scale --> OFF" pos:[8,7] width:176 height:21 checked:false 
	bitmap bmap1 "" pos:[200,8] width:15 height:15 bitmap: (bitmap 15 15 color:red)

	checkbutton btPivot "Pivot Affect Object Only --> OFF" pos:[8,32] width:176 height:21 checked:false 
	bitmap bmap2 "" pos:[200,32] width:15 height:15 bitmap:(bitmap 15 15 color: red)

	on btLocks changed theState do
	(
		if theState == true then 
		(
			setTransformLockFlags selection #all
			bmap1.bitmap  = (bitmap 15 15 color:green)
			btLocks.text = "Locks Move/Rotate/Scale --> ON" 
		)
			else 
		(
			setTransformLockFlags selection #none
			bmap1.bitmap  = (bitmap 15 15 color:red)
			btLocks.text = "Locks Move/Rotate/Scale --> OFF"
		)
	)
	on btPivot changed theState do
	(
		if theState == true then 
		(
			bmap2.bitmap  = (bitmap 15 15 color:green)
			maxOps.pivotMode= #objectOnly
			btPivot.text = "Pivot Affect Object Only --> ON"
		)
			else 
		(
			bmap2.bitmap  = (bitmap 15 15 color:red)
			maxOps.pivotMode= #none
			btPivot.text = "Pivot Affect Object Only --> OFF"
		)
	)
)
createdialog QuickClick style:#(#style_titlebar, #style_sysmenu, #style_toolwindow, #style_sunkenedge)

 

intendevo questo, scusa non ti ho quotato prima

Link to post
Share on other sites
2 minuti fa, Ax station ha scritto:

lo script lungo che hai scritto serve per attivare e disattivare AFFECT OBJECT ONLY con lo stesso tasto giusto? come un toogle?

Si e anche il Lock

Comincia con ---> F.A.Q. di Treddi.com ---> Argomenti già Trattati ---> Utilizzo corretto dei TAG e vai alla grande _:w00t: !!  My Youtube && My Treddi Album

Link to post
Share on other sites

Logicamente è un rollout a sestante. Se vuoi puoi selezionare tutto lo script e trascinarlo sulla toolsbar per creare una short

 

click.jpg.5b87ee576b8d7fac44b80a189e8c83ac.jpg

Edited by Michele71

Comincia con ---> F.A.Q. di Treddi.com ---> Argomenti già Trattati ---> Utilizzo corretto dei TAG e vai alla grande _:w00t: !!  My Youtube && My Treddi Album

Link to post
Share on other sites
28 minuti fa, Michele71 ha scritto:

Logicamente è un rollout a sestante. Se vuoi puoi selezionare tutto lo script e trascinarlo sulla toolsbar per creare una short

 

click.jpg.5b87ee576b8d7fac44b80a189e8c83ac.jpg

posso chiederti un'ultima cosa, vorrei farlo da solo per non disturbarti ma cancellerei la parte sbagliata. Per il Lock e unlock sono perfette le prime due righe che mi hai mandato, gli ho assegnato le icone e le ho messe sulla toolbar che mi servono cosi come pulsanti.

 

Per quanto riguarda invece AFFECT OBJECT ONLY, vorrei semplicemente assegnare una shortcut, cioè un tasto che attiva e disattiva questa situazione. Qual'è la parte dello script che mi hai scritto che devo prendere in considerazione? cosi da non inserire righe che non utilizzo come il rollout a sestante.

 

Grazie ancora, non hai idea di quanto mi aiutano queste scorciatoie

Link to post
Share on other sites
17 ore fa, Michele71 ha scritto:

Le singole stringhe te le ho scritte sopra lo script totale...

Ho provato a riassumere le tue stringhe per avere una situazione in cui AFFECT OBJECT ONLY si accende e si spegne con o stesso pulsante (Nel mio caso un tasto rapido). tale funzione mi si spegne ma se ripremo la Short cut non si riaccende, ho provato ad invertire alcune righe e ottengo il contrario, cioè premendo questo comando si attiva ma poi se lo ripremo non si disattiva. So che ci sono vicino, ora ti copio di seguito quello che ho scritto, sicuramente tu leggerai una bestemmia, ma per uno che non capisce una mazza di programmazione credo di esserci andato vicino, almeno per metà funziona 🤣. Potresti dirmi, anche per imparare qualcosa in più, cosa ho sbagliato?

 

macroScript Affect_Object_Only
category:"Ax Keys"
buttonText:"Affect_Object_Only"
toolTip:"Affect_Object_Only"
(
    if theState == true then 
        (
            maxOps.pivotMode= #none
        )
            else 
        (
            maxOps.pivotMode= #objectOnly
        )
    if theState == false then 
        (
            maxOps.pivotMode= #objectOnly
        )
            else 
        (
            maxOps.pivotMode= #none
        )
)
 

 

Link to post
Share on other sites

C'è di errato che tu ripeti DUE bool (vero o falso) in un DUE IF (se..) nello stesso istante che premi il pulsante!

 

In sostanza la riga sotto: 

if theState == true then

Qui indichiamo: se il pulsante è premuto (vero) allora (cosa succede?)

di seguito:

(maxOps.pivotMode= #none)

Qui tu ha i scritto che quello che succede è che il pivotMode NON SI ATTIVA ( =#none)

di seguito:

else (maxOps.pivotMode= #objectOnly)

Se succede il contrario (else) ovvero falso attivi la modalità pivotMode.

 

Continuando hai riscritto il tutto al contrario! _:ph34r:

 

Quindi in primis va utilizzato un solo IF else:  Se premo il pulsante attivo il pivotmode, altrimenti no

if theState == true then 
        (
            maxOps.pivotMode= #objectOnly
        )
            else 
        (
            maxOps.pivotMode= #none
        )

 

In secondo luogo (ed è il problema principale) che tu utilizzi un pulsante che non contempla il suo stato di Vero o Falso ma solamente se è stato premuto. In maxscript esiste il "checkButton" che funge da bool, la quale esige il verificare se il pulsante è premuto o no (vero - falso).

Con un semplice pulsante ([...]se il pulsante è premuto fai questo[...]) devi verificare ogni volta lo stato dei check (spunte) o meglio, delle variabili se sono vere o false; in termini comuni sarebbe:

 

"Se premo il pulsante:  tutti i bool sono veri cambiali in falsi"

"Se premo il pulsante: tutti i bool sono falsi cambiali in veri"

 

Ma qui francamente è un'altra storia...

 

Ti suggerisco, nel frattempo che stai studiando maxscript, di crearti DUE pulsanti nella toolsbar di acceso e spento e sfruttarne la velocità...

Comincia con ---> F.A.Q. di Treddi.com ---> Argomenti già Trattati ---> Utilizzo corretto dei TAG e vai alla grande _:w00t: !!  My Youtube && My Treddi Album

Link to post
Share on other sites

Ok, dopo anni di non maxscript sono riuscito a scrivere i due macro. Trascina sulla toolsbar per operare con gli script. Un solo pulsante per le due operazioni

 

Sblocca o blocca il Move/Rotation/Scale di un oggetto:

 

macroScript Locks
	category:"Ax Keys"
	toolTip:"Lock or Unlock Move - Rotate - Scale of an object"
(
		(
			Global obj = $
			
			if obj  != undefined then
			(	
				r = getTransformLockFlags $
			
				if r.isEmpty == false  then
				(
					setTransformLockFlags $  #none
				)
				else 
				(
					setTransformLockFlags $  #all

				)
			 )
			 else  messagebox "Please select an object" beep:false
			 
		)
)

 

Spiegazione:

determiniamo una variabile "obj"  con obj = $  ($ è un wildcard e rappresenta l'oggetto in scena). All'inizio dello script valutiamo se l'oggetto è selezionato o meno con un IF: Quindi se l'oggetto NON (!=) è indefinito (ovvero selezionato) allora  (then):

if obj  != undefined then 

 

creiamo una variabile r che determina se l'oggetto ha o meno selezionato i lock sul move/rotate/scale dell'oggetto con il metodo di sola lettura  "getTransformLockFlags $" 

r = getTransformLockFlags $

 

Qui ho dovuto aggirare un po' di problemi e prendere una scorciatoia. 

Dato che i flag sono sostanzialmente immagazzinati in un bitArray, ho determinato di restituire vero se nessun bit è impostato e falso se uno o più bit sono impostati con il metodo isEmpty.

 

Quindi, se (if) r (i flag) sono sono falsi e quindi SONO PRESENTI dati nel bitArray (isEmpty == false ) allora (then) tutti i flag vengono spenti con il metodo di solo scrittura  setTransformLockFlags $ #none

if r.isEmpty == false  then
				(
					setTransformLockFlags $  #none
				)

 

... altrimenti (if) se NON ci sono dati nel bitArray, tutti i flag vengono spuntati o accesi con setTransformLockFlags $ #all

				else 
				(
					setTransformLockFlags $  #all
				)

 

alla fine abbiamo un messaggio che si attiva se l'oggetto non è selezionato avvertendoci di selezionarlo! 😄 

else  messagebox "Please select an object" beep:false

 

 

 

Cambia o annulla il pivot in "Affect Object Only"

 

macroScript Affect_Object_Only
category:"Ax Keys"
buttonText:"Affect_Object_Only"
toolTip:"Affect_Object_Only"
(
	(
			Global obj = $
			
			if obj  != undefined then
			(	
			
				if maxOps.pivotMode == #none  then
				(
					
					maxOps.pivotMode= #objectOnly
				)
				else 
				(
					maxOps.pivotMode= #none
				)
			 )
			 else  messagebox "Please select an object" beep:false
			 
		)
)

 

Spiegazione; Diciamo che questa macro è molto più semplice.

 

In sostanza se (if) il pivotMode è deselezionato (== #none), allora (then) lo selezioniamo (#objectOnly)

if maxOps.pivotMode == #none  then
				(
					
					maxOps.pivotMode= #objectOnly
				)

 

altrimenti (else) lo deselezioniamo (#none):

else 
				(
					maxOps.pivotMode= #none
				)

 

 

Dopo sta fatica, buon divertimento! 😄 

Edited by Michele71

Comincia con ---> F.A.Q. di Treddi.com ---> Argomenti già Trattati ---> Utilizzo corretto dei TAG e vai alla grande _:w00t: !!  My Youtube && My Treddi Album

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Per garantire la migliore esperienza di navigazione possibile questo sito utilizza cookie tecnici, statistici e di terze parti. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all'uso dei cookie. Privacy Policy - Cookie Policy