Vai al contenuto

Recommended Posts

Inviata (modificato)

Salve a tutti,

la funzione Random è semplice da capire e implementare in MaxScript. Praticamente si definiscono 2 valori entro i quale la funzione "pesca" a caso un numero e fin qui tutto bene.

Ma se dovessimo avere l'esigenza di modificare questo range (magari tramite due spinner) come si potrebbe fare?

Cioè come si fa a unire la funzione spinner per definire interattivamente un range e la funzione Random che pesca un numero a caso da questo range?


Modificato da neutrino

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Invece che mettere direttamente un valore come min/max nel tuo rand, salvi il risultato dello spinner in una variabile che poi passerai come estremo alla tua funzione.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Invece che mettere direttamente un valore come min/max nel tuo rand, salvi il risultato dello spinner in una variabile che poi passerai come estremo alla tua funzione.

sì, concettualmente avevo pensato qualcosa del genere ma essendo digiuno di programmazione non so poi come mettere in stringa queste cose.... :crying:

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ma questa funzione random che prende i parametri dallo spinner per cosa la devi usare?

In uno script?

Il tuo spinner è dentro un rollout, giusto?

quindi:

random (nomeRollout.nomeSpinner1.value) (nomeRollout.nomeSpinner2.value)

oppure come ha detto kage salvi in una variabile il valore dello spinner e poi scrivi

random var1 var2

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
ma questa funzione random che prende i parametri dallo spinner per cosa la devi usare?

In uno script?

Il tuo spinner è dentro un rollout, giusto?

quindi:

random (nomeRollout.nomeSpinner1.value) (nomeRollout.nomeSpinner2.value)

oppure come ha detto kage salvi in una variabile il valore dello spinner e poi scrivi

random var1 var2

accccc...... anchio stavo cercando informazioni per risolvere lo spinner, questo è parte del codice che a fatica ho generato.

la tua parte di codice mi servirebbe molto ma inserendola, e validandola mi da "spinner undefinied"

rollout myRollout "menu" width:328 height:312


   altro codice.......... altro codice..... altro codice............


	   spinner range4a "" pos:[200,184] width:40 height:16 range:[1,100,1] type:#integer scale:1 \\primo spinner

	   spinner range4b "" pos:[272,184] width:40 height:16 range:[2,100,2] type:#integer scale:1 \\secondo spinner


   altro codice.......... altro codice..... altro codice............


   (

	   subobjectLevel = 4

	   aa = for i = 1 to ($.Edit_poly.getnumfaces()) by random 1 2 collect i \\qui ho inserito (menu.spinner range4a.value) (menu.spinner range4b.value) ho provato varie combinazioni togliendo spinner o cambiando il nome 

			   $.Edit_poly.select #Face (aa as bitarray)

   )

ma validando mi rida "spinner undefinied", dove sbaglio?

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

se il valore dello spinner lo devi andare a prendere quando sei all'interno del rollout(cioè la parte di codice che stai scrivendo è all'interno delle parentesi tonde del rollout) allora ti basta scrivere :

nomeSpinner.value

nel tuo caso specifico:

range4a.value

range4b.value
se sei fuori dal rollout allora devi per forza riferirti prima al rollout con la formula: nomeRollout.nomeSpinner2.value che nel tuo caso diventa:
myRollout.range4a.value

myRollout.range4b.value
il nome del tuo rollout non è "menu" quella è il titolo, ciò che l'utente vede a video, ma a livello di codice per riferirti al tuo rollout lo devi fare tramite il suo nome(anche se in realtà è un puntatore al rollout, ma qui andiamo su altre questioni) che nel tuo caso è myRollout. tieni presente che se ti devi riferire ad uno spinner del tuo rollout e sei al di fuori di esso e 'sopra' nel codice otterrai un errore, a meno che tu non definisca in cima al tuo script che:
myRollout=undefined

in questo modo non avrai problemi.

ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

come sempre gentilissimo... grazie mille della spiegazione, ora smanetto con altri spinner ma gia sembra funzionare benissimo

ti chiedevo un'altra cosa, lo stesso principio vale con list box o checkbox o altro? cioe mettiamo che invece di uno spinner e un range di vari numeri es da 1 a 100, volessi far scegliere tra 2 attraverso un chekbox

es: vistato=3 non vistato=4 la sintassi sarebbe questa?

checkbox chk2 "Checkbox" pos:[176,48] width:16 height:16

checkbox chk3 "Checkbox" pos:[176,80] width:16 height:16


(

	subobjectLevel = 4

	aa = for i = 1 to ($.Edit_poly.getnumfaces()) by random (myRollout.chk2.value) (myRollout.chk3.value) collect i

			$.Edit_poly.select #Face (aa as bitarray)

)

o forse è meglio che definisca un ciclo?

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

non ho ben capito.

hai bisogno di scegliere tra due valori booleani o due valori interi?

comunque puoi fare un 'random 0 1' e se il valore è 0 allora restituisci il primo dei due valori e se è 1 allora il secondo.

tipo

--se voglio delle booleane a caso

aa=if (random 0 1)==0 then true else false

--se voglio 5 e 10 a caso

aa=if (random 0 1)==0 then 5 else 10

era quello che volevi?

il tuo esempio comunque non va bene, perchè non puoi fare un random direttamente con dei booleani.

ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

questo è il tool che sto cercando di compilare (probabbilmente non ti ricordi, ma gia mi avevi aiutato in un'altra discussione per creare una selezione alternate) ora i primi tre pulsanti dovrebbero fare una selezione alternata in base al range impostato nello spinner, ma la selezione parte sempre da un oggetto per esempio: da un poligono con id pari, invece vorrei aggiungere check box per cambiare da pari a dispari in modo da far partire la selezione da un oggetto dispari. questo lo imposterei spuntando "invert"

questo nel caso specifico, ma il mio intento è capire come interfaccio lo script con pulsanti o altri elementi. per es questo script funziona solo se l'oggetto è provvisto di un modificatore edit poly, e vorrei mettere un checkbox accanto a ogni pulsante che si occupi di fare questo: ce lo barro e premo il pulsante di selezione alternata poligono, parte una parte di script che verifichi se in cima all'elenco dei modificatori di quest'oggetti vi sia un edit poly, se non cè ne ponga uno e continui lo script. se invece non è barrato che continui senza mettere l'edit poly (questo per avere liberta di scegliere se mettere un edit su oggetti che ne sono gia provvisti.

questo è il codice per intero

rollout myRollout "menu" width:328 height:312

(

	groupBox grp1 "Altern Select" pos:[8,24] width:312 height:120 enabled:true

	button botton1 "Select Altern Point" pos:[16,48] width:112 height:16

	button botton2 "Select Altern Edge" pos:[16,80] width:112 height:16

	button botton3 "Select Altern Face" pos:[16,112] width:112 height:16

	groupBox grp2 "Random Select" pos:[8,160] width:312 height:56

	button botton4 "Select Edge Random" pos:[16,184] width:112 height:16

	groupBox grp3 "Change Face ID " pos:[8,232] width:312 height:56

	button botton5 "Change All Face ID" pos:[16,256] width:112 height:16

	spinner range4a "" pos:[200,184] width:40 height:16 range:[1,100,1] type:#integer scale:1

	spinner range4b "" pos:[272,184] width:40 height:16 range:[2,100,2] type:#integer scale:1

	label label4a "min" pos:[176,184] width:24 height:16

	label label4b "max" pos:[248,184] width:24 height:16

	spinner range5 "" pos:[272,256] width:40 height:16 range:[1,32,1] type:#integer scale:1

	label label5 "Face n° ID" pos:[208,256] width:56 height:16

	label label1 "range value" pos:[208,48] width:56 height:16

	label label2 "range value" pos:[208,80] width:56 height:16

	label label3 "range value" pos:[208,112] width:56 height:16

	spinner range1 "" pos:[272,48] width:40 height:16 range:[2,10,1] type:#integer scale:1

	spinner range2 "" pos:[272,80] width:40 height:16 range:[2,10,1] type:#integer scale:1

	spinner range3 "" pos:[272,112] width:40 height:16 range:[2,10,1] type:#integer scale:1

	checkbox chk2 "Checkbox" pos:[176,48] width:16 height:16

	checkbox chk3 "Checkbox" pos:[176,80] width:16 height:16

	checkbox chk4 "Checkbox" pos:[176,112] width:16 height:16

	label lbl7 "invert" pos:[144,48] width:32 height:16

	label lbl8 "invert" pos:[144,80] width:32 height:16

	label lbl9 "invert" pos:[144,112] width:32 height:16

	on botton1 pressed  do

(

	subobjectLevel = 1

	aa = for i = 1 to ($.Edit_poly.GetNumVertices()) by (myRollout.range1.value) collect i

			$.Edit_poly.select #vertex (aa as bitarray)

)


	on botton2 pressed  do

(

	subobjectLevel = 2

	aa = for i = 1 to ($.Edit_poly.getnumedges()) by  (myRollout.range2.value) collect i

		$.Edit_poly.select #edge (aa as bitarray)

	)

	on botton3 pressed  do

(

	subobjectLevel = 4

	aa = for i = 1 to ($.Edit_poly.getnumfaces()) by (myRollout.range3.value) collect i

			$.Edit_poly.select #Face (aa as bitarray)

)

	on botton4 pressed  do

(

	subobjectLevel = 4

	aa = for i = 1 to ($.Edit_poly.getnumfaces()) by random (myRollout.range4a.value) (myRollout.range4b.value) collect i

			$.Edit_poly.select #Face (aa as bitarray)

)

	on botton5 pressed  do

(

		toolMode.coordsys #parent

		subobjectLevel = 4

		aa = for i = 1 to ($.Edit_poly.getnumfaces()) by 1 collect i

			$.Edit_poly.select #Face (aa as bitarray)

		$.modifiers[#Edit_Poly].SetOperation #SetMaterial

		$.modifiers[#Edit_Poly].materialIDToSet = (myRollout.range5.value)

		$.modifiers[#Edit_Poly].Commit ()

)

)

myFloater = newrolloutfloater "Select Tools" 350 500

addrollout myRollout myFloater

post-7970-1243599055_thumb.jpg

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

inanzitutto vorrei darti due consigli:

- nomina i vari elementi dell'interfaccia con dei nomi che ricordano quello che fanno tiipo:

'botton1' io lo inominerei 'bottonSelAltPoint'

- nel tuo codice ci sono molte ripetizioni, se devi modificare qualcosa poi devi ricordarti di modificare tutte le altre ripetizioni. Ad esempio queste parti sono molto ripetitive:

   on botton1 pressed  do

(

	subobjectLevel = 1

	aa = for i = 1 to ($.Edit_poly.GetNumVertices()) by (myRollout.range1.value) collect i

			$.Edit_poly.select #vertex (aa as bitarray)

)


	on botton2 pressed  do

(

	subobjectLevel = 2

	aa = for i = 1 to ($.Edit_poly.getnumedges()) by  (myRollout.range2.value) collect i

		$.Edit_poly.select #edge (aa as bitarray)

	)

	on botton3 pressed  do

(

	subobjectLevel = 4

	aa = for i = 1 to ($.Edit_poly.getnumfaces()) by (myRollout.range3.value) collect i

			$.Edit_poly.select #Face (aa as bitarray)

)

secondo me vale la pena di creare una funzione che esegue quelle operazioni e richiamarla ogni volta passandogli i giusti parametri.

Per quanto riguarda la storia dei pari e dispari tieni presente che ha senso solo se lo spinner del range è di valore pari e se è diverso da 2 fare l'inverso della selezione pari non ti dà la dispari e viceversa.

comunque come dice la guida per calcolare l'inverso di un bitarray basta scrivere: -<bitarray>

per farlo a livello di codice, una volta calcolato 'aa'(che io rinominerei con un nome più significativo' ti basta metterci un IF che verifica lo stato del ceckbutton e se è true allora inverte il bitarray.

se hai bisogno son qua

ciao

p.s.Nei prossimi giorni sarò spesso via e quindi non so se riuscirò a riponderti in tempi brevi.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×