Cursos e Bibliotecas Ver Mais

Galeria 3D1 Ver Mais

new   Belo Horizonte - MG
gilson antunes   Curitiba - Brasil - PR
Jomar Machado   Rio de Janeiro - RJ
EvandroGP   Paraná - PR
rafaelboliver   Goiânia - AC

Portfólios Ver Mais

PETRAGLIA   florianópolis-sc - AC
ronyvaldo   sao luis ma - AC

Criar Campo de Texto com MAXScript

Por: Alvaro  

Em: 20/06/2014 02:03

Galera, constantemente eu preciso salvar Projetos em pastas diferentes e, pra evitar aquele tempinho chato de clicar em Save As, ir até a pasta de Projetos, criar uma nova pasta e só então salvar o arquivo, eu criei um script simples que agiliza bastante essa função.

Eu defino um nome \"Projeto_Tal\" e executo, então ele cria a pasta lá no meu \"D:\\...\\Projetos\" e salva o projeto com o mesmo nome dentro da mesma.

O problema é que eu preciso abrir o maxscript editor, mudar o nome do arquivo e executar.

Alguém sabe se existe uma maneira de, ao executar o Script, chamar um campo de texto onde eu escreva o nome do arquivo desejado? Assim eu não precisaria editar o script toda vez

Meu script é basicamente isso:

--------------------------------
RnDName = \"Projeto_Tal\" -- Gostaria de criar um campo texto para essa linha

MyDir = \"D:/Particle Skull/RnD\"

--Create a Directory
RnDDir = MyDir + \"/\" + RnDname
MakeDir RnDDir

--Save the File
RnDSave = RnDDir + \"/\" + RnDName
SaveMaxFile RnDSave
--------------------------------

Abraço
Alvaro Moreira Particle Skull PSkull.com
Primeiramente, se vc abrir lá o editor de scripts (vc abrir um script no editor), selecionar tudo (apertar CTRL+A) e arrastar pra barra superior do Max, ele vai criar um botão, e vc pode editar a aparência desse botão e tal..


No caso ali é mais uma questão de programação mesmo, eu n manjo muito disso.. Mas o q vc vai ter q fazer é criar um campo pro usuário editar, e, do resultado desse campo (ex:o que o usuario digitaria) seria gerada um \"String\", e, esse \"String\" seria usado como componente no diretório...

(ex: vc pode \'somar\' strings, por exemplo:
CABE as string + ÇA as string = CABEÇA )

Vou fazer essa programação com uma linguagem \'infantíl\'.. até pq eu levo um tempo pra passar as ideias pra programação e tal..

-Infantile mode = True

UIuserwilltypehere TEXTO1 20, 180
TEXTO1 as string
RnDName = TEXTO1 + \".max\"





(esse campo de texto tem pra por no proprio editor lá de script.. esquecí o nome mas é facil de achar lá no editor..)
A Beleza está entre a Ética e a Razão!..
Hehehehe... Foi mais ou menos isso q vc perguntou né.. Dei risada depois quando eu lí.. Eu tava meio cansado mesmo naquele momento =D..




Faz assim ó (copia isso aqui pro editor de script, salva, seleciona todo o texto e arrasta pros menus superiores q ele vai criar um botão pra vc chamar esse script):

------------------------(não copie dessa linha pra cima)-------------------------



Global DirCol = getDirectories (\"C:\\3d-Business\\Models\\\\*.*\")

rollout sfsaver \"Version Saver\" width:170 height:78
(
edittext edt1 \"\" pos:[-2,28] width:170 height:20
button sfsave \"Save my Project\" pos:[2,54] width:167 height:21
DropDownList DirSel \"\" pos:[1,1] width:169 height:40 items:DirCol
on sfsave pressed do
(
MakeDir (DirCol[DirSel.selection] as string+edt1.text)
SaveMaxFile (DirCol[DirSel.selection] as string+edt1.text+\"/\"+edt1.text)
)
)
CreateDialog sfsaver



------------------------(não copie dessa linha pra baixo)-------------------------









A Beleza está entre a Ética e a Razão!..
Fox, valeuzão cara :D

Vou dar uma olhada nisso agora ;)
Alvaro Moreira Particle Skull PSkull.com
É então, mas tem um erro aí no video e tal.. Eu falo que o arquivo foi \'salvado\'.. Na verdade, ele foi \'salvo\'.. acho que o verbo \"salvadar\" não existe então não dá pra praticar isso com um arquivo =D... heuuheuheu.. (eita esses códigos estão pregando em mim q nem o oleo-negro do arquivo x mwahaheuhe XD.. então não dá pra praticar Undefined, ou então, não é possivel converter Undefined para ação.. XDD)... (isso foi uma piada hehe.. o script funciona bem e tal.. xd)



Aí vc escolhe o diretório mais conveniênte pra vc e edita lá na primeira linha.. O forum \'comeu\' umas \'barras\' (\"/\") então vê no video lá ou qualquer outra referencia de outro script, pra vc corrigir a sintaxe nessa questão, caso precise..


Perceba q ele vai salvar por cima caso vc use o mesmo nome.. Dá pra criar um tipo \'pop-up\' (mensagem de \'alerta\') pra avisar sobre isso tbm e tal.. Aí c ia usar uns \'If\'..

Levando isso um pouco a mais, daria também pra fazer a coleção dos arquivos usados na cena, copiar todos pro mesmo diretório (ou até criar subdiretorios bonitinhos e tal), e reestruturar as referencias às texturas nos materiais praqueles ditetórios criados.. Aliás né daria pra fazer bastante coisa a partir disso, etc, etc.. :)







@edit: Inclusive, parabens aí pela ideia, que é bem interessante :)
A Beleza está entre a Ética e a Razão!..
Beleza, até ia te perguntar por que você não colocou as barras hehe

Criei um novo script do zero baseado no seu.
Para manter as coisas simples eu criei primeiro sem a DropDownList e funcionou perfeitamente. Criou o diretório com o nome desejado e salvou a cena. Em seguida tentei incluir o DropDownList, sem sucesso.

O Dropdownlist em sí é criado, aparece bonitão no Dialog, mas ele não encontra os diretórios dentro da pasta especificada. Da uma olhada:

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

Global MyDir = getDirectories (\"D:\\Particle Skull\\RnD\\*.*\")

rollout RnDSaver \"Salvar R&D\" width: 233 height: 144
(
DropDownList DirSel \"\" pos:[18,8] width: 195 heigth: 24 itens: MyDir
editText editT \"\" pos:[16,40] width: 195 height: 24
button saveP \"Salvar Projeto\" pos:[18,75] width: 195 height: 55
on saveP pressed do
(
MakeDir (MyDir as string+\"/\"+editT.text)
SaveMaxFile (MyDir as string+\"/\"+editT.text+\"/\"+editT.text)

)
)

CreateDialog RnDSaver

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

Obs.: Ainda não incluí a seleção do DropDownList no MakeDir e no SaveMaxFile
Alvaro Moreira Particle Skull PSkull.com
que burro, escrevi itens com n! hehe
agora deu certo :)
Alvaro Moreira Particle Skull PSkull.com
Então.

Consegui fazer ele encontrar os diretórios mas não consigo salvar. Executando o seu script ele funciona perfeitamente. No meu não.

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

Global GetMyDir = getDirectories (\"D:\\Particle Skull\\RnD\\*.*\")
MyDir = getDirectories \"D:\\Particle Skull\\RnD\"

rollout RnDSaver \"Salvar R&D\" width: 233 height: 144
(
editText editT \"\" pos:[16,40] width: 195 height: 24
button saveP \"Salvar Projeto\" pos:[18,75] width: 195 height: 55
DropDownList DirSel \"\" pos:[18,8] width: 195 heigth: 24 items: GetMyDir
on saveP pressed do
(
MakeDir (MyDir[DirSel.Selection] as string+\"/\"+editT.text)
SaveMaxFile (MyDir[DirSel.Selection] as string+\"/\"+editT.text+\"/\"+editT.text)
)
)

CreateDialog RnDSaver

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

Perceba a segunda linha --MyDir
Se eu altero a linha do DropDownList para \"items: MyDir\" ele salva perfeitamente.
Se eu deixo como está, \"items: GetMyDir\" o Dialog abre normal mas qdo tento salvar da 2 erros:

Scene File Save Warning:
Unable to create temporary scene file
undefined\\teste\\teste.max.sv$
OK

e em seguida:

Path undefined\\teste\\ is missing
OK

Tem ideia do que possa ser?
Alvaro Moreira Particle Skull PSkull.com
Então, achei diferente essas duas linhas no seu MakeDir e SaveMaxFile.. Vê se tá funcionando certo mesmo..



É q é assim, o seu MyDir é um array, um array é um conjunto de coisas, no caso, é um conjunto de subdiretórios lá do diretório q vc pôs, por exemplo se no diretório lá tem 6 subdiretórios (com as letras do alfabeto, pra exemplicar), o MyDir seria algo como #(D:/A, D:/B, D:/C, D:/D, D:/E, D:/F), que é um array, por exemplo pra eu falar assim \'qual é o enésimo componente desse array\', por exemplo, se eu quero saber o terceiro componente nesse array q eu escrevi acima, seria MyDir[3], se vc escrevesse no listener \"Print MyDir[3]\" ele iria retornar \"D:/C\", e se vc escrevesse no listener \"Print MyDir\", ele iria retornar \"#(D:/A, D:/B, D:/C, D:/D, D:/E, D:/F)\" que é o array inteiro..


Aí no caso, por exemplo lá, no DropDownList, tem uma ordem, que é a mesma ordem do array q compõe os itens dela.. Se o cara clica no terceiro diretório da lista, o DirSel.Selection vai ser igual a \'3\' (o \".Selection\" é uma qualidade do DropDownList)..

Lembra q eu tinha falado como ver lá o enésimo componente do array (Array[N] retorna o enésimo componente do array)? Então, tem o seu MyDir (que é o meu DirCol, eu chamei de \'DirCol\' por ser uma \'coleção de diretórios\' hehe..), se eu quisesse saber o terceiro componente do array MyDir, eu iria dizer MyDir[3].. Da mesma maneira, como o \'Selection\' do DropDownList é um numero, eu poderia (fiz) por ao invés de um número, a seleção da dropdownlist.. Que seria escrita como Mydir[DirSel.Selection]..

Então, se eu quisesse saber o componente selecionado na dropdownlist, cuja lista é o array MyDir, eu falaria MyDir[DirSel.Selection].. Ou seja, MyDir[DirSel.Selection] é o subdiretório escolhido..


Só que MyDir, como é um array, se vc passar ele pra string, vai ficar como se fosse uma frase (no caso do exemplinho alfabetico lá, seria uma \'frase\' como \"D:/A, D:/B, D:/C, D:/D, D:/E, D:/F\".Então as vezes vc pode até estar salvando sempre no mesmo diretório sem perceber.. dá uma olhada aí e tal.. Ou eu q n entendí como vc fez..


Olha como eu tinha feito:
MakeDir (DirCol[DirSel.selection] as string+edt1.text)

(Por exemplo, se eu escolhí o terceiro na lista do dropdownlist, equivaleria a ter escrito DirCol[3] (que é o terceiro diretório na lista), se eu tivesse escolhido o segundo na lista do dropdownlist, equivaleria a ter escrito DirCol[2](que é o segundo diretório na lista), etc.. Então o nome do diretório vai ser \"O diretório escolhido, na DropDownList\", como string (pra poder somar as letras e tal), \'somado\' ao nome digitado na caixa de texto..)


SaveMaxFile (DirCol[DirSel.selection] as string+edt1.text+\"/\"+edt1.text)

(Aí então, como eu acabei de criar esse diretório, já referencio ele nessa linha, somo a barra, e somo o nome digitado na caixa de texto..)








A Beleza está entre a Ética e a Razão!..
@edit: No caso do indefinido ali, foi pq vc não declarou o MyDir como global, aí no caso vc teria q deixar essa variavel dentro do parentese onde ela está sendo referenciada..

@edit: Se vc põe (referencía) um array como os itens do DropDownList, vc não precisa dizer quantos tem, ele puxa do numero do array mesmo..


Vê esse help aqui sobre arrays no MAXScript.. Esse help do MAXScript é terrivel de achar as coisas, mas dá pra ver varias coisinhas legais também e tal, principalmente quanto às sintaxes, etc..

http://docs.autodesk.com/3DSMAX/15/ENU/MAXScript-Help/index.html?url=files/GUID-63E016F3-250E-4C93-B213-2C1AB51710F7.htm,topicNumber=d30e632812

Aí pra testar os arrays deixa esse dado como Global (senão esse dado não seria usado fora do contexto do script.. uma coisa assim..), e vai no listener e (depois de ter usado o script, por exemplo, usa o meu lá) e digita:

Print DirCol - Ele vai listar os diretórios, esse é o array.. (poderia ser um array de literalmente qualquer coisa e tal..

Se vc digitar por exemplo:

Print DirCol[3] - Ele vai dizer o terceiro diretório do array DirCol..
Print DirCol.Count - Ele vai dizer quantos componentes tem no array DirCol (no caso, efetivamente quantos diretórios teriam no lugar lá..)


Essa sintaxe é meio irritante as vezes mesmo XD..





@edit: Ah e o seu GetMyDir e o seu MyDir são a mesma coisa, tira um e referencia só o outro, deixando ele como Global no começo mesmo (como já tá)..



@edit: Eu tinha falado q talvez tivesse um (+\"/\"+editT.text) a mais mas confundi.. xd.. :z




@edit: Talvez eu tenha complicado um pouco pra você com a questão do array com dropdownlist.. Mas também dessa maneira tem uma funcionalidade um pouco mais flexivel (vc vai poder por exemplo salvar projetos de uma coisa ou outra, etc..) e também deixa o script bem menor com o uso de arrays.. É um pouco complicado inicialmente de ver as conexões dessas coisas mas é bom ter complicado um pouco mais pra vc até pra vc pegar um pouco mais da pratica disso aí.. Q imagino q no futuro vc venha a usar essa questão (arrays)..



@edit: Olha esse outro aqui, ele cria um material no material editor pra cada objeto, aplica esse material a cada objeto, cada material vai ter uma cor randomica, e cada material vai ser chamado de \"Objeto -: Nome do objeto\".. O limite de objetos dele é o limite de materiais no material editor (geralmente é 24), no caso, é pra ajudar na modelagem pra diferenciar elementos, mas por ter esse limite, talvez seja mais util pra personagens apenas :z..

(note que ele pega tudo que é \'geometria\' (os objetos 3d) e faz um array deles, poderia ser \'selection\' ao invés de \'geometry\' e então ele pegaria só o selecionado, etc..).. Se tiver mais q 24 objetos (de geometria) na cena ele vai dar erro, apesar de fazer os 24 primeiros.. (esse script é pra ser usado quando ainda não tiver materiais em cena, é mais pra ajudar em modelagem mesmo.. etc..)


---------------------------------(SF-Rand-O-Mat)----------------------------------------


rollout sfrand \"SF.Rand\" width:112 height:27
(
button sfrand1 \"Randomize\" pos:[1,2] width:107 height:21
on sfrand1 pressed do
(
objeto = #(1)
objetos = (geometry as array)
numobjs = objetos.count
while objeto.count < (objetos.count+1) do
(
meditMaterials[objeto.count].name = (\"Objeto -:\"+(objetos[objeto.count].name as string))
select objetos[objeto.count]
meditMaterials[objeto.count].DirectX_Manager.enabled = off
Cor = random 1 254
meditMaterials[objeto.count].Diffuse = color (random 1 254) (random 1 254) (random 1 254)
meditMaterials[objeto.count].ambient = color (random 1 254) (random 1 254) (random 1 254)
$.material = meditmaterials[objeto.count]
append objeto 1
)
)
)
createDialog sfrand



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




A Beleza está entre a Ética e a Razão!..

Faça o login para poder comentar

Usuários conectados

Total de mensagens publicadas pelos membros da comunidade: 710604.

Total de membros registrados: 138068

Últimos membros registrados: cavalcantesuetam, oxyscrema, ennecopro, bodybloom, NutrimRezensionDE, Suvasha026, wrinkless, waltereastmood.

Usuário(s) on-line na última hora: 736, sendo 20 membro(s) e 716 visitante(s).

Membro(s) on-line na última hora: rafaelgmarotta, Gabriel.C, geotaltal, JMDesign, Danielreis, Eduardo Ramos, Luis Antonio, Pierrejr78, Deems, Vladis, pjcbs_19, Esdras, David Rodney, Baldo, billypaul, João Von Rondow, Nuno, magster, Gibran Farfud, dallest91.

Legenda: Administrador, Especial, Moderador, Parceiro .

3D1 © Três D1 © 1999-2024. Todos direitos reservados.