Vai al contenuto
R11

Problema Script Selezionando Più Oggetti

Recommended Posts

Salve,

avrei la necessità di assegnare a molti oggetti gli stessi modificatori.

Visto la ripetività dell'operazione, volevo prepararmi uno script che assegni in sequenza un editpoly, selezioni tutti i vertici e faccia il weld, optimize e che infine collassi il tutto in un poly.

Per fare ciò ho attivato macroscript è ho fatto un semplice copia/incolla per ottenere il mio scriptino riportato qui sotto.

modPanel.addModToSelection (Edit_Poly ()) ui:on

subobjectLevel = 1

actionMan.executeAction 0 "40021"

max select all

$.modifiers[#Edit_Poly].SetSelection #Vertex #{1..1984}

$.modifiers[#Edit_Poly].SetOperation #WeldVertex

$.modifiers[#Edit_Poly].Commit ()

subobjectLevel = 0

modPanel.setCurrentObject $.modifiers[#Edit_Poly]

modPanel.addModToSelection (optimize ()) ui:on

$.modifiers[#Optimize].facethreshold1 = 0

$.modifiers[#Optimize].edgethreshold1 = 0

$.modifiers[#Optimize].bias1 = 0

$.modifiers[#Optimize].autoEdge = on

$.modifiers[#Optimize].facethreshold1 = 0.1

macros.run "Modifier Stack" "Convert_to_Poly"

Il mio problema è che funziona se lo assegno a un solo oggetto.

Ho cercato in giro ma non sono riuscito a risolvere nulla.

Consigli?

Grazie mille!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Non sono un esperto di script di Max... comunque prova a racchiudere il tuo script per il singolo oggetto in una roba tipo

for obj in selection do(


...qua ci piazzi il tuo script...


)


Modificato da Macphisto

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Dimenticavo... devi sostituire tutti i $ con obj, quindi viene una roba così

for obj in selection do(

		modPanel.addModtoselection (Edit_Poly ()) ui:on

	subobjectLevel = 1

	actionMan.executeAction 0 "40021"

	max select all

	obj.modifiers[#Edit_Poly].SetSelection #Vertex #{1..1984}

	obj.modifiers[#Edit_Poly].SetOperation #WeldVertex

	obj.modifiers[#Edit_Poly].Commit ()

	subobjectLevel = 0

	--modPanel.setCurrentObject obj.modifiers[#Edit_Poly]

	modPanel.addmodtoselection (optimize ()) ui:on

	obj.modifiers[#Optimize].facethreshold1 = 0

	obj.modifiers[#Optimize].edgethreshold1 = 0

	obj.modifiers[#Optimize].bias1 = 0

	obj.modifiers[#Optimize].autoEdge = on

	obj.modifiers[#Optimize].facethreshold1 = 0.1

	)

Anche se poi applica l'optimize più volte :(


Modificato da Macphisto

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Chi la dura la vince...

modpanel.addModtoselection (Edit_Poly ()) ui:on

subobjectLevel = 1

for obj in selection do(

	obj.modifiers[#Edit_Poly].SetSelection #Vertex #{1..1984}

	obj.modifiers[#Edit_Poly].SetOperation #WeldVertex

	obj.modifiers[#Edit_Poly].Commit ()

	subobjectLevel = 0

)

modPanel.addmodtoselection (optimize ()) ui:on

for obj in selection do(

	obj.modifiers[#Optimize].facethreshold1 = 0

	obj.modifiers[#Optimize].edgethreshold1 = 0

	obj.modifiers[#Optimize].bias1 = 0

	obj.modifiers[#Optimize].autoEdge = on

	obj.modifiers[#Optimize].facethreshold1 = 0.1

)

modpanel.addModtoselection (Edit_Poly ()) ui:on

macros.run "Modifier Stack" "Convert_to_Poly"

credo sia quello che volevi tu :)

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Grazie mille Macphisto!!!!!!!! :Clap03:

Se fossi una donna ti bacerei e non solo!!! :P

Praticamente il dollaro riguarda il singolo oggetto e obj invece è più generico?

Le parentesi?

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

In maniera semplice ho riadattato uno script base dello zio philix :D

Funziona così

modpanel.addModtoselection (Edit_Poly ()) ui:on

subobjectLevel = 1
Aggiunge il modificatore agli oggetti selezionati
for obj in selection do(

	obj.modifiers[#Edit_Poly].SetSelection #Vertex #{1..1984}

	obj.modifiers[#Edit_Poly].SetOperation #WeldVertex

	obj.modifiers[#Edit_Poly].Commit ()

	subobjectLevel = 0

)
C'è un ciclo for, cioè per ogni oggetto (obj) nella selezione esegue (do) le operazioni che stanno tra le parentesi
modPanel.addmodtoselection (optimize ()) ui:on
Applica l'altro modificatore, nota che non è tra le parentesi, altrimenti lo avrebbe applicato tante volte quanti sono gli oggetti selezionati ;)
for obj in selection do(

	obj.modifiers[#Optimize].facethreshold1 = 0

	obj.modifiers[#Optimize].edgethreshold1 = 0

	obj.modifiers[#Optimize].bias1 = 0

	obj.modifiers[#Optimize].autoEdge = on

	obj.modifiers[#Optimize].facethreshold1 = 0.1

)
Idem come il ciclo precedente
modpanel.addModtoselection (Edit_Poly ()) ui:on

macros.run "Modifier Stack" "Convert_to_Poly"

Applica un ultimo modificatore e poi converte in poly... a dire il vero può darsi che l'ultimo modificatore non serva, non ho provato senza :)

Questo da 'gnurante... magari uno più preparato su MaxScript mi corregge qualche cavolata che ho scritto :D

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

giustissimo tutto quello che hai detto!!! :Clap03:

il $ serve per richiamare un oggetto tramite il suo nome, quando tu scrivi $<nome dell'oggetto che vuoi richiamare> in pratica maxscript interpreta quella dicitura come l'oggetto con quel nome e sempre e solo quello.

Macphisto ha usato 'obj' ma poteva scrivere anche 'oggetto','ciao','prova','macphisto' o qualsiasi altro nome, è solo un nome di riferimento che si riferisce(nel caso del ciclo for che ha usato) all'oggetto preso in esame.

Più propriamente si chiama variabile.

Una variabile la puoi chiamare come vuoi(se però il nome è attinente a quello che serve è più comodo leggere lo script) e può contenere qualsiasi tipo di informazioni.

se io nella scena ho un oggetto che si chiama 'Box01' e scrivo:

$Box01.pos=[0,0,0]
il mio oggetto verrà posizionato all'origine. Se scrivo
obj=$Box01

obj.pos=[0,0,0]
l'oggetto si sposterà sempre all'origine, perchè in 'obj' ho salvato un riferimento al mio oggetto e quindi quando scrivo 'obj' è come se avessi scritto '$Box01'. Se però nella scena ho: '$Box01','$Box02','$Box03','$Box04' ; su tutti voglio fare la stessa operazione se uso il primo caso dovrei scrivere:
$Box01.pos=[0,0,0]

$Box02.pos=[0,0,0]

$Box03.pos=[0,0,0]

$Box04.pos=[0,0,0]
e se ne avessi 1000? Non sarebbe molto comodo. e se ne rinominassi uno? dovrei andare a cambiare ogni volta lo script. Quindi si scrive:
for obj in selection do

(

   obj.pos=[0,0,0]

)

e l'unica cosa che ti resta da fare è selezionare gli oggetti che vuoi ed eseguire lo script, tutti saranno spostati all'origine.

Il for funziona esattamente come ha detto mac.

comunque se maxscript ti interessa ti consiglio di scaricarti i videotutorial introduttivi al maxscript di philix che sono veramente meravigliosi.

ciao!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ecco... mi chiedevo proprio se obj fosse una definizione di MaxScript per individuare un oggetto o se fosse una assegnazione fittizia (dello zio Phil :D) tipo pippo, macphisto, ecc...

Mi stranisce il fatto che non sia definita prima come tipo di variabile ma che venga presa per buona da Maxscript così su due piedi :)

Saranno i residui di tutti i vari Pascal, Fortran, C++ che ti costringono a dichiarare ogni tipo di variabile che metti :D

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Chi la dura la vince...

modpanel.addModtoselection (Edit_Poly ()) ui:on

subobjectLevel = 1

for obj in selection do(

	obj.modifiers[#Edit_Poly].SetSelection #Vertex #{1..1984}

	obj.modifiers[#Edit_Poly].SetOperation #WeldVertex

	obj.modifiers[#Edit_Poly].Commit ()

	subobjectLevel = 0

)

modPanel.addmodtoselection (optimize ()) ui:on

for obj in selection do(

	obj.modifiers[#Optimize].facethreshold1 = 0

	obj.modifiers[#Optimize].edgethreshold1 = 0

	obj.modifiers[#Optimize].bias1 = 0

	obj.modifiers[#Optimize].autoEdge = on

	obj.modifiers[#Optimize].facethreshold1 = 0.1

)

modpanel.addModtoselection (Edit_Poly ()) ui:on

macros.run "Modifier Stack" "Convert_to_Poly"

credo sia quello che volevi tu :)

Ho un problema, all'inizio prima di fare il weld non fa la selezione dei vertici e quindi mi ritrovo con i vertici non saldati, provato ad aggiungere un "obj.modifiers[#Edit_Poly].select all Vertex" ma nulla.

Ho perso il pomeriggio ma non ho ricavato nulla.

Grazie coren per la spiegazione e consigli.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Mi stranisce il fatto che non sia definita prima come tipo di variabile ma che venga presa per buona da Maxscript così su due piedi smile.gif

Saranno i residui di tutti i vari Pascal, Fortran, C++ che ti costringono a dichiarare ogni tipo di variabile che metti biggrin.gif

in effetti in quei linguaggi di programmazione è necessario dichiarare le variabili in precedenza, in maxscript no(è così anche in java e C# e in molti altri più recenti)

Quando scrivi un nome che non esiste semplicemente ti alloca una nuova variabile con quel nome(settata come undefined) inoltre non è necessario definirne il tipo

se scrivi

num=10

num=10.0 

num=$Box01

num="ciao"
maxscript non dà errore, perchè ad ogni assegnazione cambia il tipo della variabile in quello dell'assegnazione(in realtà ogni variabile è un puntatore) Ma non è necessario allocarle e deallocarle ogni volta, fa tutto maxscript. nel caso del ciclo for non è necessario inizializzarla prima perchè ad ogni ciclo la inizializza lui in base a quello che si è preso in esame, se però scrivi
num=10

while i<=num do

(

  format"ciao!\n"

  i=i+1

)
ti dà errore, perchè quando cerca di fare 'i<=num' 'i' è undefined e non riesce a fare la comparazione(stessa cosa nel 'i=i+1'), quindi bisogna scrivere:
i=1

num=10

while i<=num do

(

  format"ciao!\n"

  i=i+1

)
@R11 prova questo:
modpanel.addModtoselection (Edit_Poly ()) 


for obj in selection do(

	 subobjectLevel = 1 

	 actionMan.executeAction 0 "40021" 

	 obj.modifiers[#Edit_Poly].SetOperation #WeldVertex

	obj.modifiers[#Edit_Poly].Commit ()

	subobjectLevel = 0

)

modPanel.addmodtoselection (optimize ()) ui:on

for obj in selection do(

	obj.modifiers[#Optimize].facethreshold1 = 0

	obj.modifiers[#Optimize].edgethreshold1 = 0

	obj.modifiers[#Optimize].bias1 = 0

	obj.modifiers[#Optimize].autoEdge = on

	obj.modifiers[#Optimize].facethreshold1 = 0.1

)

modpanel.addModtoselection (Edit_Poly ()) ui:on

macros.run "Modifier Stack" "Convert_to_Poly"

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
ma quanti sono i tuoi oggetti?

non saprei darti un numero preciso, direi qualche migliaio per ogni scena.

Ovviamente li seleziono a gruppi onde evitare che max mi faccia il gesto dell'ombrello.

Che casino :wacko:

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
@R11

prova questo:

modpanel.addModtoselection (Edit_Poly ()) 


for obj in selection do(

	 subobjectLevel = 1 

	 actionMan.executeAction 0 "40021" 

	 obj.modifiers[#Edit_Poly].SetOperation #WeldVertex

	obj.modifiers[#Edit_Poly].Commit ()

	subobjectLevel = 0

)

modPanel.addmodtoselection (optimize ()) ui:on

for obj in selection do(

	obj.modifiers[#Optimize].facethreshold1 = 0

	obj.modifiers[#Optimize].edgethreshold1 = 0

	obj.modifiers[#Optimize].bias1 = 0

	obj.modifiers[#Optimize].autoEdge = on

	obj.modifiers[#Optimize].facethreshold1 = 0.1

)

modpanel.addModtoselection (Edit_Poly ()) ui:on

macros.run "Modifier Stack" "Convert_to_Poly"

Purtroppo mi da errore :(

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Sto facendo delle prove per selezionare tutti i vertici degli ogg ehm selezionati

modpanel.addModtoselection (Edit_Poly ()) ui:on

for obj in selection do(

subobjectLevel = 1

max select all

obj.modifiers[#Edit_Poly].Select #Vertex #{} node:obj

obj.modifiers[#Edit_Poly].SetSelection #Vertex #{} node:obj

)

cosa strana e che lo applico per esempio a dieci sfere i vertici di nove vengono tutti selezionati quelli della decima no <_<

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ti succede così perchè hai quelle ultime due righe di codice del ciclo che svuotano ogni volta la selezione dell'ultimo oggetto preso in esame.

comunque si vede che prima ho sbagliato a fare copia e incolla ed ho preso quello sbagliato, comunque ora ho rimodificato il tuo ed ora dovrebbe andare, inoltre dovrebbe essere anche più veloce.

Una volta che hai appurato che funziona puoi anche eseguirlo su tutti gli oggetti in blocco.

disableSceneRedraw() 


modpanel.addModtoselection (Edit_Poly ()) ui:on

for obj in selection do(

	subobjectLevel = 1

	max select all

	obj.modifiers[#Edit_Poly].SetOperation #WeldVertex

	obj.modifiers[#Edit_Poly].Commit ()	

	subobjectLevel = 0

)

modPanel.addmodtoselection (optimize ()) ui:on

for obj in selection do(

	obj.modifiers[#Optimize].facethreshold1 = 0

	obj.modifiers[#Optimize].edgethreshold1 = 0

	obj.modifiers[#Optimize].bias1 = 0

	obj.modifiers[#Optimize].autoEdge = on

	obj.modifiers[#Optimize].facethreshold1 = 0.1

)

modpanel.addModtoselection (Edit_Poly ()) ui:on

macros.run "Modifier Stack" "Convert_to_Poly"



enableSceneRedraw() 

redrawViews()

fammi sapere, ciao!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
ti succede così perchè hai quelle ultime due righe di codice del ciclo che svuotano ogni volta la selezione dell'ultimo oggetto preso in esame.

comunque si vede che prima ho sbagliato a fare copia e incolla ed ho preso quello sbagliato, comunque ora ho rimodificato il tuo ed ora dovrebbe andare, inoltre dovrebbe essere anche più veloce.

Una volta che hai appurato che funziona puoi anche eseguirlo su tutti gli oggetti in blocco.

disableSceneRedraw() 


modpanel.addModtoselection (Edit_Poly ()) ui:on

for obj in selection do(

	subobjectLevel = 1

	max select all

	obj.modifiers[#Edit_Poly].SetOperation #WeldVertex

	obj.modifiers[#Edit_Poly].Commit ()	

	subobjectLevel = 0

)

modPanel.addmodtoselection (optimize ()) ui:on

for obj in selection do(

	obj.modifiers[#Optimize].facethreshold1 = 0

	obj.modifiers[#Optimize].edgethreshold1 = 0

	obj.modifiers[#Optimize].bias1 = 0

	obj.modifiers[#Optimize].autoEdge = on

	obj.modifiers[#Optimize].facethreshold1 = 0.1

)

modpanel.addModtoselection (Edit_Poly ()) ui:on

macros.run "Modifier Stack" "Convert_to_Poly"

enableSceneRedraw() 

redrawViews()

fammi sapere, ciao!

Grande funziona! :Clap03:

Scusa se ti rompo le scatole ma è possibile dirgli di fare il weld dei vertici a 0,01?

Ho provato ad aggiungere un = 0.01 alla fine del

obj.modifiers[#Edit_Poly].SetOperation #WeldVertex

ma max si incavola

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

prima di assegnare il comando del weld aggiungi questa riga

obj.modifiers[#Edit_Poly].weldVertexThreshold=<numero che vuoi>

e gli metti il numero che vuoi.

L'errore te lo dà perchè setOperation non è una variabile all'interno della poly con dei sottocampi, ma una funzione e quindi il massimo che puoi fare è passargli dei parametri se ne sono previsti.

@mac

io mi sono innamorato dello scriptaggio :wub:

Non posso più farne a meno!

ciao!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

In effetti ci sono operazioni in Max che se non scripti ti suicidi (non so se è un bene o un male <_<)

L'altra settimana mi sono dovuto sbattere per fargli generare N materiali simili ma con N mappe diverse, idem per orientare nel modo giusto dei piani mappati con il LookAt (assurdo che puoi assegnarlo a N oggetti ma non puoi orientare gli assi :wacko:).

Tu stai già spulciando i 2008?? Mi pare che si diceva che i vambiamenti, specialmente dal punto di vista interfaccia e help fossero considerevoli...

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
prima di assegnare il comando del weld aggiungi questa riga

obj.modifiers[#Edit_Poly].weldVertexThreshold=<numero che vuoi>

e gli metti il numero che vuoi.

L'errore te lo dà perchè setOperation non è una variabile all'interno della poly con dei sottocampi, ma una funzione e quindi il massimo che puoi fare è passargli dei parametri se ne sono previsti.

Mitico funziona perfettamente adesso!!! :Clap03:

Grazie mille!!!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

@macphisto

si, l'ho provato e non c'è paragone: l'help l'anno sistemato interamente, migliorandolo drasticamente; l'editor è fantastico, è molto personalizzabile e ha tantissimi tool che aiutano moltissimo nella creazione e gestione del codice.

tra le varie cose: auto complete delle parole, commentare e de-commentare blocchi di codice con un click, la possibilità di gestire un repository(per team di scriptatori), le tab, l'highlight delle keyword migliorato notevolmente(e personalizzabile), hanno finalmente tolto il bug che "mangiava" una riga ogni volta che editavi col visual editor un rollout.

Poi tante altre cose....

Sono contento per max 2008 solo per la parte di maxscript.

@R11

Di nulla

ciao!


Modificato da coren

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Join the conversation

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

Ospite
Rispondi

×   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.


  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×
×
  • Crea nuovo...