Vai al contenuto

Recommended Posts

Salve a tutti , lo so che puo sembrare una domanda ovvia, ma come si potrebbe fare uno script che dati determinti punti in coordinate (x,y,z) mi costruisca una linea passante per questi punti anche senza curvature, graize!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

è per quello che ho chiesto da dove se li ricava, ad esempio se fossero da derivare dalla posizione di oggetti selezionati allora basterebbe selezionarli nell'ordine giusto.

Altrimenti si potrebbe definire un criterio di ordinamento lungo un asse(che però funzionerebbe solo se i punti non tornano su se stessi)

se i punti non sono le posizioni di oggetti selezionati ma invece tabellari e tornano su se stessi bisogna fare in modo che l'utente possa darne l'ordine: prima con uno script si potrebbero creare una serie di point Helper(uno per punto), poi tramite il paint selection tool l'utente potrebbe selezionarli facilmente nel giusto ordine e poi procedere con la creazione della spline.

Queste sono le cose che avevo in mente, però prima bisogna aspettare che spieghi da dove arrivano i punti.

ciao!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Grazie per la rapidità :) non pensavo ad una risposta così veloce. In verità questi punti vengano dati direttamente, tipo avrò una casella x una y e una z ... infatti la mia prossima domanduccia era ma se ad esempio avessi un elenco di punti su un file excel...è possibile farglielo "importare" allo script e fargli leggere queste tre coordinate direttamente senza scrivergliele una ad una CIAO grazie a tutti

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

si, è possibile accedere a file di excel direttamente da maxscript, ma non credo funzioni se non si ha excel installato(ed io non ce l'ho installato)

devo fare una prova, comunque al limite selezioni tutte le tre colonne con i punti(senza la riga delle intestazioni, quindi solo i dati) e li copi in un file di testo, da lì si leggono senza problemi.

Quindi l'ordinamento dei punti è dato dalla sequenza delle righe, giusto?(1° riga-> 1° punto, 2° riga->2° punto, ecc)

ciao!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

A ok allora da un file di testo si possono ricavare anche da semplice file testo ok, si l'ordine è dato dalle righe messe su excell o una sotto l'altra nel file di testo :)

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Cioè..in pratica..io mi faccio un file xml con 3 colonne e Tot righe, ci scrivo dentro le mie coordinate di Tot punti, e a questo punto come faccio a dirlgi che la riga diciamo 1A corrisponda al valore da inserire dentro lo "spinner1" ad esempio....ovviamente il primo valore corrisponderà al primo punto, il secondo al secondo punto etc.. etc.. Lo script in automatico (o con un semplice bottone) dovrebbe poi costruirmi una linea che passa attraverso questi punti nell'ordine che ho immesso.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

non ne sono sicuro ma credo che kage maru si riferisse all'ultima versione di excel, dove hanno modificato il formato che in pratica è un xml mascherato(stessa cosa con i *.docx che sono i nuovi *.doc)

Comunque prova questo:

(

	fn creaSplineDaSequenzaPunti vetPunti=(


		new_spline=undefined

		new_spline=SplineShape()

		numSpline=0

		addNewSpline new_spline

		numSpline=numSpline+1


		--per ogni punto in input aggiungo un nodo alla spline

		for punto in vetPunti do 

		(

			addKnot new_spline numSpline #smooth #curve  punto --myInVec myOutVec

		)


--		se ci sono almeno due nodi allora dò un nome alla spline ed eseguo l'update, altrimenti la cancello		

		if((numKnots new_spline)<=1)then delete new_spline

		else

		(

			updateShape new_spline

			new_spline.name=uniquename "Spline da punti"


		)		

	)--fn creaSplineDaSequenzaPunti vetPunti=(




	fileDati=undefined

--	scelta del file da cui prelevare i dati

	fileDatiNome=getOpenFileName caption:"Open A Test File:" types:"text(*.txt)|*.txt|*.*(all files)|*.*"

--	controllo che ne sia stato scelto uno e poi provo ad aprirlo

	if fileDatiNome!=undefined then fileDati=openFile fileDatiNome mode:"r"


--	se l'apertura è andata a buon fine procedo con l'elaborazione	

	if fileDati!=undefined then

	(

--		vettore dove metto i punti letti dal file

		vetPunti=#()

		do(

--			leggo una linea dal file di testo(quindi un punto)			

			linea=readLine fileDati

--			se ci sono delle virgole le converto in punti			

			linea=substituteString linea "," "."

--			separo le tre coordinate del punto			

			numeriInStringhe=filterString linea "\t"

--			aggiungo a vetPunti il point3 con le tre coordinate convertite in float			

			append vetPunti [numeriInStringhe[1] as float,numeriInStringhe[2] as float,numeriInStringhe[3] as float]

		)while (eof fileDati==false)--eseguo per tutto il file


--		chiamo la funzione che crea la spline		

		creaSplineDaSequenzaPunti vetPunti


	)--if fileDati!=undefined then


)

Prima crea il txt selezionando i dati da excel, copiali e incollali in un file *.txt

Lo script è grezzo e quindi funziona solo se nel file ci sono solo le tre colonne di dati e nessun altra riga.

copia lo script nell'editor e poi eseguilo(evaluate all), seleziona il file di testo dove hai copiato le tue coordinate e dovrebbe crearti la spline.

Lo script non è testato, non mi assumo alcuna responsabilità per eventuali problemi che può causare.

Salva prima di eseguirlo!!

Se hai domande e problemi son qua

ciao!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Cioè... mi inchino davanti alla potenza... :Clap03: bravo e grazie!

Però emm..forse son io duro... :) quando vado a dargli il file .txt non accade nulla e nel Maxscript lister mi appare

Welcome to MAXScript.

-- Error occurred in anonymous codeblock

-- Frame:

-- fileDatiNome: "C:\Documents and Settings\pippolo\Desktop\Prova.txt"

-- creaSplineDaSequenzaPunti: creaSplineDaSequenzaPunti()

-- numeriInStringhe: undefined

-- vetPunti: #()

-- substituteString: undefined

-- fileDati: <File:C:\Documents and Settings\pippolo\Desktop\Prova.txt>

-- linea: "23 12 31"

-- Type error: Call needs function or class, got: undefined

OK

quei numeri che appaioano (23 12 31) sono la prima riga del file txt...

il file txt è fatto così

23 12 31

3 13 21

41 31 31

:) comuqnue bravo io conosco alcuni comandini del maxscript ed una cosa del genere non ci sarei davvero mai arrivato

a scriverla.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

è perchè il file di testo che avevo fatto io copiando ed incollando da openoffice mi era venuto con i tab al posto degli spazi, quindi avevo settato il riconoscimento dei vari numeri tramite il tab.

cambia questa riga:

 numeriInStringhe=filterString linea "\t"
in
 numeriInStringhe=filterString linea "\t "

so che apparentemente sono uguali, ma se guardi nella seconda c'è uno spazio in più nella stringa, in pratica quella stringa definisce i punti in cui "tagliare" la stringa(che nel nostro caso si chiama 'linea')

\t sta per il tab, aggiungendo uno spazio sia che ci sia il tab o uno spazio la 'linea' viene "tagliata".

ciao


Modificato da coren

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ciao Coren :) son sempre io. emmmm Credo sia il solito errore:

Welcome to MAXScript.

-- Error occurred in anonymous codeblock

-- Frame:

-- vetPunti: #()

-- numeriInStringhe: undefined

-- fileDatiNome: "C:\Documents and Settings\pippolo\Desktop\Prova.txt"

-- fileDati: <File:C:\Documents and Settings\pippolo\Desktop\Prova.txt>

-- substituteString: undefined

-- creaSplineDaSequenzaPunti: creaSplineDaSequenzaPunti()

-- linea: "23 12 31"

-- Type error: Call needs function or class, got: undefined

OK

Però nel file di testo tra un nemero e l'altro c'è il tab come dici te...però non funziona ne con

"\t" ne con "\t ".

... praticamente devo scrivere 3 cifre per ogni riga con tab o spazio nel mezzo giusto? grazieee

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ciao Coren... emm lo script è quello che hai fatto te...emmm io non ho fatto nulla :)

Ho solo messo 3 Punti con coordinate casuali..un semplice file testo di prova

23 12 31

3 13 21

41 31 31

(tra gli spazi ora ci sono dei tab)

Questa procedura è per vedere se esiste un metodo + veloce per far "digerire" a max dei punti che vengono ricavati

da una "stazione totale" leica .. non so se conosci.. in pratica sto facendo una Tesi di Rilievo e visto che smanettavo un po con gli script , mi domandavo se esisteva un modo per trasferire dei punti dati da 3 coordinate in modo rapido in ambiente max. In più mi era molto molto comodo se alcuni di questi punti già venivano uniti in automatico su spline , visto che di solito si parla di oltre 2000 o 3000 punti da "unire a mano" in ambiente cad .

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Frequento la facoltà di architettura di Firenze, :) si si Ovviamente quando uno va con lo strumento per fare un rilievo con la stazione totale dovrebbe avere già in mente da dove partire e decidere quali punti battere, una procedura molto simile viene già effettuata anche ora, catalogando finestre-marcapiani-porte-gronde-pavimentazione con delle sigle davanti ai numeri, però sapendo che uno li potrebbe importare con uno script che unisce già delle categorie di punti sarebbe un grande aiuto, ormai io per la mia tesi ho quasi finito questo lavoro ma vedo che è una parte lunghissima...

Sto costruendo un intero paese composto da 82 edifici...218 facciate.. olè :D

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ok, che versione di max usi? perchè io uso il 2008 ed ho testato lo script con il file prova che hai postato tu e funziona...

probabilmente tu non hai il 2008, la funzione substitutestring è stata introdotta col 2008.

usa questo script che dovrebbe andare, ho ricreato la funzione substitutestring chiamandola sostituisciStringa:

(

	fn creaSplineDaSequenzaPunti vetPunti=(


		new_spline=undefined

		new_spline=SplineShape()

		numSpline=0

		addNewSpline new_spline

		numSpline=numSpline+1


		--per ogni punto in input aggiungo un nodo alla spline

		for punto in vetPunti do 

		(

			addKnot new_spline numSpline #smooth #curve  punto --myInVec myOutVec

		)


--		se ci sono almeno due nodi allora dò un nome alla spline ed eseguo l'update, altrimenti la cancello		

		if((numKnots new_spline)<=1)then delete new_spline

		else

		(

			updateShape new_spline

			new_spline.name=uniquename "Spline da punti"


		)		

	)--fn creaSplineDaSequenzaPunti vetPunti=(


	fn sostituisciStringa stringa prima dopo =

	(

		pos=findString stringa prima

		while pos!=undefined do

		(

			stringa[pos]=dopo

			pos=findString stringa prima

		)


		stringa

	)



	fileDati=undefined

--	scelta del file da cui prelevare i dati

	fileDatiNome=getOpenFileName caption:"Open A Test File:" types:"text(*.txt)|*.txt|*.*(all files)|*.*"

--	controllo che ne sia stato scelto uno e poi provo ad aprirlo

	if fileDatiNome!=undefined then fileDati=openFile fileDatiNome mode:"r"


--	se l'apertura è andata a buon fine procedo con l'elaborazione	

	if fileDati!=undefined then

	(

--		vettore dove metto i punti letti dal file

		vetPunti=#()

		do(

--			leggo una linea dal file di testo(quindi un punto)			

			linea=readLine fileDati

--			se ci sono delle virgole le converto in punti			

			linea=sostituisciStringa linea "," "."

--			separo le tre coordinate del punto			

			numeriInStringhe=filterString linea "\t "

--			aggiungo a vetPunti il point3 con le tre coordinate convertite in float			

			append vetPunti [numeriInStringhe[1] as float,numeriInStringhe[2] as float,numeriInStringhe[3] as float]

		)while (eof fileDati==false)--eseguo per tutto il file


--		chiamo la funzione che crea la spline		

		creaSplineDaSequenzaPunti vetPunti


	)--if fileDati!=undefined then


)

fammi sapere

ciao!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Cavoli sei un MITO!! funziona tutto!! giusto la versione di max io ho 3dsmax8 :wallbash: ... :D

Grandissimo funziona! :Clap03::Clap03::Clap03:

Ora non mi resta che smanettarci un po su ...e continuare la Tesi

Grazieee

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.

×