Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
neutrino

Effettuare Copie Tramite Interfaccia

Recommended Posts

Scusate, qualcuno sa dirmi come faccio con maxscript a prendere il valore che indico in uno spinner (1,2,3,4,.....) e, cliccando su un pulsante, effettuare tante copie corrispondenti di un oggetto?

Praticamente devo selezionare l'oggetto il cui nome dovrà apparire in un "pickbutton", poi settare in numero di copie e cliccare su un pulsante "copia" per farlo.

L'interfaccia è definita, ma queste cose per me sono davvero toste..... :wallbash:

grazie

Share this post


Link to post
Share on other sites

ma devi solo creare le tue copie senza posizionarle o farci qualcos'altro? perchè se è così si può fare anche a mano senza scomodare maxscript.

Comunque scrivi

numTotale=10

objSource=$Box01

for i=1 to numTotale do instance objSource

a num totale dai la quantità di copie, in objSource metti l'oggetto da copiare.

In questo modo crei tante istanze, se vuoi invece delle copie metti 'copy' al posto di 'instance'.

ciao

P.S. ti serve per creare le sentinelle?

Share this post


Link to post
Share on other sites

@Coren

grazie, 6 sempre disponibile! :D

Sì, so che quello che cerco di fare col maxscript è banale fatto con gli strumenti di max ma è un pretesto per imparare. In particolare sto proponendo una tesi basata sulle ottimizzaizoni da utilizzare in un processo produttivo e tra l'altro c'è anche il maxscript e la scena delle sentinelle.

Le sentinelle le duplico col comando scatter di Crowd (in quel caso gli script si occupano solo dif ar interagire PFlow con Crowd). Nel caso che ti/vi sottopongo, sto cercando di creare una semplicissima interfaccia per gestire l'interessante script creato dal mitico Phil sulla randomizzazione e il "piantaggio" degli alberelli foliage (ma io vorrei estenderlo a qualsiasi oggetto importato in Max). Cioè vorrei che l'utente possa selezionare un oggetto cliccandoci sopra (il nome dell'oggetto apparirà sul pulsante (pickbutton)), poi si dovrebbe definire il numero di copie con uno spinner e, cliccando su un pulsante "esegui" parte la copia, la randomizzazione e il piantaggio. Per randomizzazione intendo che l'oggetto (un albero) dovrà subire delle piccole variazioni di scala e rotazione. Praticamente uno scatter in miniatura.

Avendo solo però qualche rudimento di basic sul mitico C64 nel lontano '88 sto messo proprio male e ci sto sbattendo la testa da giorni....

se ti possono essere utili posto anche gli script della semplice interfaccia e del "piantatore"


Edited by neutrino

Share this post


Link to post
Share on other sites

try(destroyDialog allControls )catch()

rollout subRollout1 "Subrollout" ( )

rollout allControls "prova scatter" (


SubRollout theSubrollout "Subrollout" height:50 




--Pickbutton to select a Box from the scene

pickbutton chooseit "Prendi Oggetto:" width:140


	--If the user picked an object, then

	on chooseit picked obj do

	( 

	--see if the user did not cancel the picking...

	if obj != undefined do (


		--if he did not, make the box's wireframe red:

		obj.wirecolor = red

		--and display the name of the object on the button:

		chooseit.text = obj.name

		)

	) --end on



spinner theSpinner "N.Copie:" type:#integer align:#center 	offset:[0,20]


button theButton "Copia!"







checkbox theCheckbox "Checkbox" across:2 offset:[0,2]


hyperlink theHyperlink "Hyperlink" url:"http://www.autodesk.com" \

color:red across:2 offset:[-10,50]


groupBox theGroupbox "Groupbox:" height:40 offset:[0,-30] width:174


bitmap theBitmap "Bitmap" width:80 height:50 offset:[0,0] \

bitmap:(bitmap 80 50 color:red) align:#left across:2


imgTag theImgTag "bitmap" width:80 height:50 offset:[0,0] \ 

bitmap:(bitmap 80 50 color:green) align:#right 







)


createDialog allControls 200 500


AddSubRollout allControls.theSubrollout subRollout1

^^^^^^^^^^

praticamente il problema maggior per ora è: come faccio a dire a max che deve prendere il numero che inserisco nello spinner N.Copie e, al premere del tasto Copia! farmi tante copie ed eseguire lo script del piantatore? Quest'ultimo non è compreso qui....questo è solo lo script dell'interfaccia.


Edited by neutrino

Share this post


Link to post
Share on other sites

devi scrivere:

on theButton pressed do

(

	oggettoDaCopiare=allControls.chooseit.object 

	for i=1 to (allControls.theSpinner.value) do

	(

		instance oggettoDaCopiare

	)

)

in pratica quando theButton viene premuto questo codice si salva in 'oggettoDaCopiare' l'oggetto preso col pickButton, poi per 'i' che va da 1 al valore nello spinner lo istanzia.

ciao

P.S. nel mio codice ci potrebbero essere errori, non ho modo di guardare max e quindi l'ho scritto a memoria.

Senza testarlo, quindi non garantisco il suo funzionamento, comunque al limite usalo come linea guida.


Edited by coren

Share this post


Link to post
Share on other sites

rollout allControls "prova scatter" (


groupBox gruppo "Parametri" pos:[8,8] width:184 height:144






--Pickbutton to select a Box from the scene

pickbutton clic_on_obj "Prendi Oggetto:" pos:[30,30]  width:140


	--If the user picked an object, then

	on clic_on_obj picked obj do

	( 

	--see if the user did not cancel the picking...

	if obj != undefined do (


		--if he did not, make the box's wireframe red:

		obj.wirecolor = red

		--and display the name of the object on the button:

		clic_on_obj.text = obj.name


		global prendi = obj


		)

	) --end on


spinner n_copie "N.Copie:" type:#integer align:#center 	offset:[0,20]



radiobuttons copy_type labels:#("copy", "instance")	



button copia "Copia!"



fn funziona_copia = (


	on copia pressed do (

			oggettoDaCopiare = allControls.clic_on_obj.object 

			for i=1 to (allControls.n_copie.value) do (

			copy oggettoDaCopiare

				)

			)

)



on copy_type changed state do funziona_copia()	






)


createdialog allControls width:200 height:200

Uao! Funziona! alla fine è + semplice di quanto immaginassi. Ora volevo creare 2 radiobutton (copia - istanza) per scegliere se fare delle copie o delle istanze. Avevo pensato di creare una funzione (la "fn funziona_copia") per copiare e una analoga per istanziare. Al cambiamento di stato di uno dei radiobutton si sarebbe dovuta attivare ("on copy_type changed state do funziona_copia()") ma ovviamente nn dà niente......

Share this post


Link to post
Share on other sites

non puoi mettere un evento come questo:

on copia pressed do (

			oggettoDaCopiare = allControls.clic_on_obj.object

			for i=1 to (allControls.n_copie.value) do (

			copy oggettoDaCopiare

				)

			)
dentro ad una funzione. Inoltre le funzioni non devi dichiararle dentro ad un rollout, ma fuori. la funzione quindi sarà
fn funziona_copia oggettoDaCopiare quanteCopie tipoDiClone = (

	for i=1 to quanteCopie do 

	(

		case tipoDiClone  of

		(

		"copy": copy oggettoDaCopiare

		"instace": instance oggettoDaCopiare

	)--end caseof

	)

)

poi nei vari eventi la richiamerai dandogli i vari parametri a seconda del caso.

io nel case mi sono basato sulle stringhe "copy" e "instance".

Ma se quando richiami la funzione se vuoi passarle solo il valore del radiobutton ti basta cambiare i controlli del case in 0 e 1(ad esempio se il primo campo del radiobutton è "copy" allora lo zero dovrai metterlo al posto del "copy" del case e se il secondo campo del radiobutton è "instance" allora all' "instance" del case corrisponde l'1)

non so se sono riuscito a spiegarmi molto bene......

ciao!

Share this post


Link to post
Share on other sites

Non vorrei approfittare davvero della tua disponibilità e competenza ma nn so + che fare...ho la tesi tra un paio di settimane e sto in alto mare con questo script. Invece di disturbarti molte volte, posso chiederti di aiutarmi in modo definitivo sistemando direttamente lo script? Come ti ho detto capisco i tuoi consigli ma nn so metterli insieme.

Se non hai tempo capisco e ti ringrazio ugualmente per il grande aiuto. Se riesco a finirlo ho in mente di aprire un tutorial qui per spiegarlo a tutti segnalando inoltre il grande contributo tuo e di Phil.

Share this post


Link to post
Share on other sites

scusa... ma se ti laurei dovresti sapere quello che ci stà nella tua tesi...sinceramente quello che devi fare è proprio la base della programmazione...

A farti fare il lavoro dagli altri non ci guadagni niente, perchè non imparerai mai niente e quando ti ritroverai a lavorare andrà peggio.

comunque guarda qui:

fn funziona_copia oggettoDaCopiare quanteCopie tipoDiClone = (

	for i=1 to quanteCopie do

	(

		case tipoDiClone  of

		(

				1: copy oggettoDaCopiare

				2: instance oggettoDaCopiare

				default:copy oggettoDaCopiare

	)--end caseof

	)

)


rollout allControls "prova scatter" (


	groupBox gruppo "Parametri" pos:[8,8] width:184 height:144


	--Pickbutton to select a Box from the scene

	pickbutton clic_on_obj "Prendi Oggetto:" pos:[30,30]  width:140


	spinner n_copie "N.Copie:" type:#integer align:#center	 offset:[0,20]


	radiobuttons copy_type labels:#("copy", "instance")	


	button copia "Copia!"


	--If the user picked an object, then

	on clic_on_obj picked obj do

	(

		--see if the user did not cancel the picking...

		if obj != undefined do (

			--if he did not, make the box's wireframe red:

			obj.wirecolor = red

			--and display the name of the object on the button:

			clic_on_obj.text = obj.name


			global prendi = obj

		)

	) --end on


	on copia pressed do funziona_copia (clic_on_obj.object) (n_copie.value) (copy_type.state )


	--on copy_type changed state do funziona_copia (clic_on_obj.object) (n_copie.value) (copy_type.state )


)


createdialog allControls width:200 height:200

alla fine se guardi non ho fatto poi chissà quali modifiche.

Ti ho indentato un pò il codice, se non lo si tiene ordinato poi si incasina che non ci si capisce più niente.

ciao

Share this post


Link to post
Share on other sites

-- funzione


fn funziona_copia oggettoDaCopiare quanteCopie tipoDiClone = (	


	-- mette qui dentro gli oggetti creati

	arr=#()


	for i=1 to quanteCopie do 

	(

		case tipoDiClone  of

		(

		1: append arr (copy oggettoDaCopiare)

		2: append arr (instance oggettoDaCopiare)

	)--end caseof

	)


	-- ritorna l'array con gli oggetti creati

	return arr

) -- fine funziona_copia


-- variabile globale 

global prendi,terreno



-- definizione rollout "prova scatter"

rollout allControls "prova scatter" (



-- oggetti

groupBox gruppo "Parametri" pos:[8,8] width:184 height:144	

pickbutton clic_on_obj "Prendi Oggetto:" pos:[30,30]  width:140

spinner n_copie "N.Copie:" type:#integer align:#center 	offset:[0,20]

radiobuttons copy_type labels:#("copy", "instance")	

pickbutton clic_terreno "Terreno:"  width:140

button copia "Sparpaglia!"


-- azioni	

	-- bottone "picca l'oggetto" premuto

	on clic_on_obj picked obj do

	( 

	--see if the user did not cancel the picking...

	if obj != undefined do (


		--if he did not, make the box's wireframe red:

		obj.wirecolor = red

		--and display the name of the object on the button:

		clic_on_obj.text = obj.name		


		-- assegna alla variabile globale prendi l'oggetto selezionato

		prendi = obj


		)

	) 


	-- bottone "picca il terreno" premuto

	on clic_terreno picked obj do

	( 

	--see if the user did not cancel the picking...

	if obj != undefined do (		


		clic_terreno.text = obj.name		


		-- assegna alla variabile globale terreno l'oggetto selezionato

		terreno = obj


		)

	) 


	-- bottone copia premuto

	on copia pressed do (

		-- richiama la funzione "funziona_copia" con

		-- prendi - oggetto da copiare

		-- (n_copie.value as integer) n di copie da fare

		-- copy_type.state - tipo di copia

		-- copie contiene gli oggetti creati

		copie=funziona_copia prendi (n_copie.value as integer) copy_type.state		


		for obj in copie do (						  -- le copie (o istanze fatte) devono essere posizionate a caso e si devono introdurre delle variazioni

																		--	casuali di rotazione e scala entro certi valori per dare casualità agli alberi

			random_pos_x = random -100.0 100.0

			random_pos_y = random -100.0 100.0

			random_rot_x = random  -7.0 7.0

			random_rot_y = random  -7.0 7.0

			random_rot_z = random  -7.0 7.0

			random_scl_x = random  -1.5 1.5

			random_scl_y = random  -1.5 1.5

			random_scl_z = random  -1.5 1.5

			obj.pos = [random_pos_x, random_pos_y,0]

			obj.rot = [angleaxis random_rot_x, random_rot_y, random_rot_z]

			obj.scale = [random_scl_x, random_scl_y,random_scl_z]


		)



		if terreno != undefined then (									--queste righe servono per piantare sul terreno (anche a seconda dell'altezza) le varie copie

																						-- il terreno deve chiamarsi terreno sennò appare il messagebox

			for obj in copie do (

				piantatore = ray [obj.pos.x,obj.pos.y,100000] [0,0,-1]

				pospiantaggio = intersectray terreno piantatore

				if pospiantaggio != undefined then (

					obj.pos = pospiantaggio.pos

				qq

				) else (

					append dacancellare obj

				)

			)


		) else (

				messagebox "la mesh si deve chiamare terreno!"

		)



	)-- fine bottone premuto


) -- fine rollout






-- creazione rollout

createdialog allControls width:200 height:200

Ciao Coren, con un mio amico abbiamo modificato il codice così e dovrebbe funzionare. Dà un errore, sicuramente banale, quando deve gestire i valori della rotazione random alla riga obj.rot = [angleaxis random_rot_x, random_rot_y, random_rot_z]. Dice "unable to convert: -il valore casuale che sceglie- to type: angleaxis". Ho provato anche con eulerangles ma dà un altro errore. Il fatto è che quando si ruota un oggetto (osservando il listener come suggerito da Philix) max pone davanti ai valori la voce angleaxis.....hai un suggerimento al volo?

Share this post


Link to post
Share on other sites

devi modificare la riga

 obj.rot = [angleaxis random_rot_x, random_rot_y, random_rot_z]
con
 obj.rotation = eulerAngles random_rot_x  random_rot_y  random_rot_z
più avanti nella parte del piantaggio dà un altro errore, in questa riga
append dacancellare obj
tu aggiungi un elemento ad un vettore che non esiste, 'daCancellare' non lo inizializzi da nessuna parte. quindi questa parte
	   if terreno != undefined then (									--queste righe servono per piantare sul terreno (anche a seconda dell'altezza) le varie copie

																						-- il terreno deve chiamarsi terreno sennò appare il messagebox

			for obj in copie do (
diventerà:
	   if terreno != undefined then (									--queste righe servono per piantare sul terreno (anche a seconda dell'altezza) le varie copie

																						-- il terreno deve chiamarsi terreno sennò appare il messagebox

			dacancellare=#()

			for obj in copie do (

Le varie randomizzazioni di rotazione, posizione e scalatura io le farei scegliere all'utente tramite interfaccia.

Poi ti faccio notare che in teoria tu dovresti distribuire i tuoi oggetti sul terreno, con questo codice li distribuisci attorno all'origine.

ciao


Edited by coren

Share this post


Link to post
Share on other sites
Poi ti faccio notare che in teoria tu dovresti distribuire i tuoi oggetti sul terreno, con questo codice li distribuisci attorno all'origine.

ciao

perfettamente ragione, ma già ho parecchie difficoltà così. Se riesco a farlo funzionare con le indicazioni che mi hai dato è già un successone. Alla fine devo fare una ricerca su quello che è maxscript, non posso pretendere di imparare a programmare in un mese....cmq l'esperienza nn è stata affatto inutile: ho intenzione infatti di acquistare un libro sulla programmazione C++ , visto che mi hanno detto che maxscript è molto simile. Tu come hai imparato?

Share this post


Link to post
Share on other sites

non dà + errore ma ha un comportamento strano: le modifiche random che applica alle copie le distorcono vistosamente. Puoi provare con la scena che ti ho mandato per mail (ops, è per 2009...ce l'hai?)

Come cappero è? eppure ho itnrodotto variazioni minime....

Share this post


Link to post
Share on other sites

nei parametri di randomizzazione dello scale hai messo che va da -1.5 a +1.5

1 è l'oggetto non scalato, se tu poi assegni 1.5 alla x vorrà dire che l'oggetto lungo l'asse x aumenterà della metà della sua estensione, e quindi ti risulterà molto deformato.

Inoltre se da 1 passi a -1.5 l'oggetto ti si restringerà di due volte e mezzo(in quanto 1-(-1.5)=2.5 )

Prova a mettere valori meno variati tipo 0.9 come minimo e 1.1 come massimo.

Per il libro non saprei, non lo conosco.

hai guardato i videotutorial di philix? io ho iniziato con quelli.

Comunque prova a leggerti gli esempi che ci sono nella guida che sono spiegati passo a passo.

Il libro di autodesk sul maxscript è un gran buon libro.

ciao

Share this post


Link to post
Share on other sites

scusa per il disturbo, in effetti stamattina c'ho sbattuto un po' la testa e avevo risolto solo nn avevo Internet per avvisarti.....

Libro di autodesk su maxscript?!....uhm...qualcosa che non conosco?!

Marco

Share this post


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.   Restore formatting

  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...
Aspetta! x

Ti piacerebbe rimanere sempre aggiornato sulle ultime novità nel campo della computer grafica?

Iscrivendoti alla Newsletter riceverai subito una mail con le indicazioni per scaricare gratuitamente:

  1. Le immagini HDRI presenti su HDRI pro
  2. Una sequenza di 300 immagini HDRI generata da Luca Deriu tramite il programma Real HDR