Jump to content
frenk83

Script Assegna Materiale

Recommended Posts

Ciao a tutti,

sto cercando di creare una script per 3ds Max che praticamente mi prenda un materiale da una libreria e lo attacchi ad un layer

Es: materiale alluminio attaccato a tutti gli oggetti nel layer alluminio.

Per ora sono riuscito a creare solo questo, non riesco a selezionare il materiale da una libreria come posso fare?

----------------------------------------------------------------------------------------

meditMaterials[1] = Standardmaterial ()

meditMaterials[1].ambient = color 151 241 198

meditMaterials[1].Diffuse = color 151 241 198

meditMaterials[1].name = "Alluminio"

clearSelection()

----------------------------------------------------------------------------------------

a = "Alluminio"

aa = layermanager.getlayerfromname a

aa.nodes &entdaselez

for obj in entdaselez do selectmore obj

a = undefined

aa = undefined

entdaselez = undefined

modPanel.addModToSelection (Uvwmap ()) ui:on

----------------------------------------------------------------------------------------

$'Layer: Alluminio'.modifiers[#UVW_Mapping].maptype = 4

$'Layer: Alluminio'.modifiers[#UVW_Mapping].length = 100

$'Layer: Alluminio'.modifiers[#UVW_Mapping].width = 100

$'Layer: Alluminio'.modifiers[#UVW_Mapping].height = 100

$.material = meditMaterials[1]

clearselection()

------------------------------------------

Share this post


Link to post
Share on other sites

per il discorso della libreria devi usare la collezione riservata del maxscript: materialLibrary

Puoi anche salvarla su file e viceversa caricarla da file.

se nella guida del mascript ricerchi la parola 'materialLibrary' il primo risultato è quello che cerchi.

un consiglio:

Non usare variabili globali che si chiamano 'a' o 'aa', potrebbero creare problemi ti interazione con altri script\plugin.

Non usare il selectmore in quel modo, ti rallenta tantissimo l'esecuzione dello script; c'è un topic proprio a riguardo nella sezione "how to make it faster" nella guida, cito:

There is no reason to do selectmore() if you are selecting all scene objects anyway, and you can operate on the live collection of scene objects without converting it to array. Note that select() will make sure the previous selection is removed, while selectMore() will obviously add to the existing one.

SOME BENCHMARK RESULTS

The time is measured on the same reference computer around the select() method and does NOT include the time it takes the viewport(s) to actually redraw, just the time to set the selected flags of the nodes.

EXPRESSION 1 - SELECT ALL

select objects

With 100 objects (box instances), the above expression took 31 ms.

With 1,000 objects, it took 78 ms.

With 10,000 objects, it took 328 ms.

With 100,000 objects, it took 15,468 ms.

EXPRESSION 2 - DO, APPEND AND SELECT

a=#()

for o in objects do append a o

select a

With 100, 1000 and 10,000 objects, the above expression performed similarly to the first one, proving that the memory overhead of the array management is not measurable with relatively low numbers of iterations.

The code is longer and less elegant though.

With 100,000 objects, the expression took 17,547 ms., or about two seconds more than the first expression.

EXPRESSION 3 - TEST, COLLECT AND SELECT

select (for o in objects where not o.isHiddenInVpt collect o)

The above expression took around 430 ms with 1000 objects.

Performing a condition test on 1000 objects does not make a significant difference, but increases the flexibility of the expression to select specific objects by their properties.

EXPRESSION 4 - DO AND SELECT MORE

for o in objects do selectMore o

The above expression took only 171 ms if all 1000 objects were already selected because it had nothing to do, but 674172 ms (over 11 minutes!!!) if none of the 1000 objects were selected!

STAY AWAY FROM IT!

difatti se nell'help cerchi 'selectmore' il primo risultato è proprio quel topic, al suo posto prova ad usare:


--in questo modo selezioni solo il contenuto di questo vettore

select entdaselez 



--in questo modo fai la stessa cosa che facevi col selectMore, ma molto più veloce

join entdaselez (selection as array)

select entdaselez 

quello che fai col join è aggiungere al primo vettore(in questo caso entdaselez che contiene tutti gli oggetti del layer) gli elementi del secondo(la selezione corrente convertita in un array di oggetti)

per domande son qua

ciao

edit: mi è venuto in mente uno script che fa già questa cosa, è theOnion un layer manager veramente comodo che permette di gestire i materiali da layer e inoltre permette di averli impostati come materiali alternativi, ovvero che una volta che non li si vuole più si possono disabilitare e ritornano i materiali originari degli oggetti, lo puoi scaricare da scriptspot


Edited by coren

Share this post


Link to post
Share on other sites

per il discorso della libreria devi usare la collezione riservata del maxscript: materialLibrary

Puoi anche salvarla su file e viceversa caricarla da file.

se nella guida del mascript ricerchi la parola 'materialLibrary' il primo risultato è quello che cerchi.

un consiglio:

Non usare variabili globali che si chiamano 'a' o 'aa', potrebbero creare problemi ti interazione con altri script\plugin.

Non usare il selectmore in quel modo, ti rallenta tantissimo l'esecuzione dello script; c'è un topic proprio a riguardo nella sezione "how to make it faster" nella guida, cito:

difatti se nell'help cerchi 'selectmore' il primo risultato è proprio quel topic, al suo posto prova ad usare:


--in questo modo selezioni solo il contenuto di questo vettore

select entdaselez 



--in questo modo fai la stessa cosa che facevi col selectMore, ma molto più veloce

join entdaselez (selection as array)

select entdaselez 

quello che fai col join è aggiungere al primo vettore(in questo caso entdaselez che contiene tutti gli oggetti del layer) gli elementi del secondo(la selezione corrente convertita in un array di oggetti)

per domande son qua

ciao

edit: mi è venuto in mente uno script che fa già questa cosa, è theOnion un layer manager veramente comodo che permette di gestire i materiali da layer e inoltre permette di averli impostati come materiali alternativi, ovvero che una volta che non li si vuole più si possono disabilitare e ritornano i materiali originari degli oggetti, lo puoi scaricare da scriptspot

Ti ringrazio per la risposta dettagliata ma non riesco a seguirti, anche perchè non sono un esporto di script questo sono riuscito a crearlo copiando righe da altri script già esistenti, (scusa la sfacciataggine) ma potresti farmi un esempio scrivendomi proprio il codice poi ci penserei io a ricollegare il tutto col mio.

Share this post


Link to post
Share on other sites

ecco il codice che carica la libreria

nomeLibreria="qui mettici il nome del tuo file con anche l'estensione .mat"

myLibrary = loadTempMaterialLibrary nomeLibreria
alla fine in myLibrary avrai la tua libreria dei materiali caricata, per richiamarli ti basta scrivere:
myLibrary[1]
Con questo codice richiami il primo materiale della libreria
myLibrary[2]
Con questo codice richiami il secondo, e così per qualsiasi altro. se ad esempio a nomeLibreria gli assegni:
nomeLibreria="mrArch_DesignTemplates.mat"
In myLibrary otterrai i vari materiali preset dell'arch&design per il select more devi sostituire questa riga:
for obj in entdaselez do selectmore obj
con
join entdaselez (selection as array)

select entdaselez 

ciao

Share this post


Link to post
Share on other sites

ecco il codice che carica la libreria

nomeLibreria="qui mettici il nome del tuo file con anche l'estensione .mat"

myLibrary = loadTempMaterialLibrary nomeLibreria
alla fine in myLibrary avrai la tua libreria dei materiali caricata, per richiamarli ti basta scrivere:
myLibrary[1]
Con questo codice richiami il primo materiale della libreria
myLibrary[2]
Con questo codice richiami il secondo, e così per qualsiasi altro. se ad esempio a nomeLibreria gli assegni:
nomeLibreria="mrArch_DesignTemplates.mat"
In myLibrary otterrai i vari materiali preset dell'arch&design per il select more devi sostituire questa riga:
for obj in entdaselez do selectmore obj
con
join entdaselez (selection as array)

select entdaselez 

ciao

sei stato veramente gentilissimo.

seguendo i tuoi consigli ho fatto cosi:

nomeLibreria = "Prova.mat"

myLibrary = loadTempMaterialLibrary nomeLibreria

myLibrary[1]

nomelayer = "Alluminio"

funzione = layermanager.getlayerfromname nomelayer

funzione.nodes &entdaselez

join entdaselez (selection as array)

select entdaselez

nomelayer = undefined

funzione = undefined

entdaselez = undefined

modPanel.addModToSelection (Uvwmap ()) ui:on

$.modifiers[#UVW_Mapping].maptype = 4

$.modifiers[#UVW_Mapping].length = 100

$.modifiers[#UVW_Mapping].width = 100

$.modifiers[#UVW_Mapping].height = 100

$.material = meditMaterials[1]

clearselection()

ma dato che non funziona ho sbagliato qualche passagio!

potresti essere cosi gentile da spiegarmi dove sbaglio?

Share this post


Link to post
Share on other sites

prova a mettere prima di questa parte:

a = undefined

aa = undefined

entdaselez = undefined
questa riga
select entdaselez 

Non va!

O meglio seleziona gli oggetti del layer, ma non gli applica il materiale e la uvw map box 100*100*100

Share this post


Link to post
Share on other sites

cambia questa parte

modPanel.addModToSelection (Uvwmap ()) ui:on

$.modifiers[#UVW_Mapping].maptype = 4

$.modifiers[#UVW_Mapping].length = 100

$.modifiers[#UVW_Mapping].width = 100

$.modifiers[#UVW_Mapping].height = 100

$.material = meditMaterials[1]
in questa
modPanel.addModToSelection (Uvwmap ()) ui:on

selection[1].modifiers[#UVW_Mapping].maptype = 4

selection[1].modifiers[#UVW_Mapping].length = 100

selection[1].modifiers[#UVW_Mapping].width = 100

selection[1].modifiers[#UVW_Mapping].height = 100

selection.material = myLibrary[1]

fammi sapere

ciao

Share this post


Link to post
Share on other sites

cambia questa parte

modPanel.addModToSelection (Uvwmap ()) ui:on

$.modifiers[#UVW_Mapping].maptype = 4

$.modifiers[#UVW_Mapping].length = 100

$.modifiers[#UVW_Mapping].width = 100

$.modifiers[#UVW_Mapping].height = 100

$.material = meditMaterials[1]
in questa
modPanel.addModToSelection (Uvwmap ()) ui:on

selection[1].modifiers[#UVW_Mapping].maptype = 4

selection[1].modifiers[#UVW_Mapping].length = 100

selection[1].modifiers[#UVW_Mapping].width = 100

selection[1].modifiers[#UVW_Mapping].height = 100

selection.material = myLibrary[1]

fammi sapere

ciao

Cosi va alla grande!!!!!

Ho solo un'ultima richiesta, se fattibile!

Si può mettere il nome del materiale anzi che il numero della riga?

Sarebbe più comodo, perchè i materiali sono in ordine alfabetico, quando ne creo dei nuovi l'ordine cambia e il numero di riga uguale.

Per il resto ti ringrazio tantissimo per la gentilezza e la velocità con cui mi hai aiutato.

Share this post


Link to post
Share on other sites

si, si può:

selection.material = myLibrary["qui metti il nome esatto del materiale che ti interessa"]

Piccolo suggerimento per migliorare lo script: crea un'interfaccia in modo da non dover cambiare il codice dello script ogni volta che lo usi, anche un'interfaccia molto semplice può migliorare di parecchio l'utilizzabilità dello script.

ciao

Share this post


Link to post
Share on other sites

Coren, ti meriti tanti "+" per ogni tua risposta...sei un grande! io ti metto un punto reputazione e spero lo faccia anche Frenk per il grande aiuto che gli hai dato! :)

@Frenk: una volta che hai completato il lavoro, perchè non inserisci il tuo script nella sezione download? Sarebbe fantastico!

:hello:


Edited by Michele71

Share this post


Link to post
Share on other sites

si, si può:

selection.material = myLibrary["qui metti il nome esatto del materiale che ti interessa"]

Piccolo suggerimento per migliorare lo script: crea un'interfaccia in modo da non dover cambiare il codice dello script ogni volta che lo usi, anche un'interfaccia molto semplice può migliorare di parecchio l'utilizzabilità dello script.

ciao

Ci pensavo solo che non ho la più pallida idea di come farla, tu avresti voglia di aiutarmi?

Se si, l'ideale sarebbe un tasto che tu premi e lui in base ai nomi dei layer ti apra una griglia con tutti i nomi dei layer dove selezioni quelli che devono essere utilizzati.

Ora come ora faccio uno script lungo con tutti i materiali possibili e poi lo lancio!

Funziona bene ma non è tanto professionale!

Share this post


Link to post
Share on other sites

Si può fare un pulsante da dove carichi la libreria dei materiali, poi sotto per ogni riga ci si mette il nome di un layer a cui poi devi abbinare uno dei materiali della libreria.

per il weekend dovrei farcela

ciao

Share this post


Link to post
Share on other sites

mi potresti spiegare un pò le varie parti?

Mi sembra un pò incasinata...

Magari prova a spiegare le varie parti così magari capisco meglio.

ciao

il mio era un esempio di come poteva venire la selezione

Share this post


Link to post
Share on other sites

Coren, ti meriti tanti "+" per ogni tua risposta...sei un grande! io ti metto un punto reputazione e spero lo faccia anche Frenk per il grande aiuto che gli hai dato! :)

@Frenk: una volta che hai completato il lavoro, perchè non inserisci il tuo script nella sezione download? Sarebbe fantastico!

:hello:

ok

Share this post


Link to post
Share on other sites

Si può fare un pulsante da dove carichi la libreria dei materiali, poi sotto per ogni riga ci si mette il nome di un layer a cui poi devi abbinare uno dei materiali della libreria.

per il weekend dovrei farcela

ciao

Ciao,

come procede con lo script?

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