XSIforum.com
Foros 3D => Autodesk Softimage => Rigging y Scripting => Mensaje iniciado por: Dios en 13 Abril 2009, 19:29:09
-
Hola.. estoy haciendo un script para pasar las nurbs a mesh, además de que haga un gator para pasarle las uvs y los materiales... y además quiero que quede la misma jerarquía que con las nurbs.. y meta esos polys en unos grupos determinados... pero bueno.. mi problema está en que cuando selecciono todas las nurbs para que vaya convirtiendolas... al hacer el gator, me queda seleccionado el nuevo objeto y en el después del next, me peta... Como podría hacer referencia a los demás objetos que aún no han sido convertidos en mesh??
'Asigna a oSelection todo lo que tengo seleccionado
set oSelection = Application.Selection
Logmessage "oSelection.Count =" & oSelection.Count
for i = 0 to oSelection.Count -1
Logmessage "i =" & i
Logmessage "oSelection(i).Name =" & oSelection(i).Name
set oName = oSelection(i)
set oName2 = oSelection (i)
Logmessage "oName ="& oName.FullName
ApplyGenOp "NurbsToMesh", , oName.FullName , 3, siPersistentOperation, siKeepGenOpInputs
SetValue "polymsh.polymsh.nurbstomesh.stepu", 7
SetValue "polymsh.polymsh.nurbstomesh.stepv", 7
SetValue "polymsh.Name", oName2.Name
Logmessage "oName ="& oName.Name
Logmessage "oName2 ="& oName2.Name
'*****GATOR******
'ApplyGenOp "Gator", , "polymsh;Model.cube", 3, siPersistentOperation, siKeepGenOpInputs
'TransferAllPropertiesAcrossGenOp "polymsh.polymsh.TransferAttributes", "polymsh", , True
'oName hace referencia a la nurbs y oName2 al polymsh. Se llaman igual pero es para diferenciar
'y poder hacer referencia a ellos indistintamente
ApplyGenOp "Gator", , " " & oName2.Name & ";" & oName.FullName & " ", 3, siPersistentOperation, siKeepGenOpInputs
TransferAllPropertiesAcrossGenOp "" & oName2.Name & ".polymsh.TransferAttributes", oName2.Name, , True
FreezeObj
Logmessage "oSelection.Count =" & oSelection.Count
Logmessage oSelection(i).Name
Logmessage oSelection(i).Type
next
A ver si alguien me puede echar una mano.. gracias
-
Prueba guardar la selección con Application.GetValue("SelectionList") O0
-
Eso es cesar, gracias... justo lo acababa de encontrar...
no sabía que el application.selection se actualizaba ... y la verdad es que no sé porqué... porque estoy dentro de un for.. y a oSelection no le estoy asignando nada nuevo...
oSelection no debería ser un array que se mantuviese "fijo" hasta que se le indique lo contrario??
de todas formas, mil gracias
-
No, lo que estás haciendo con oSelection es simplemente una referencia a la selección.
Esto pasa porque la selección es un objeto (una clase) y no tan sólo un array con items, de esta forma lo que obtienes no es un valor de retorno como en una función sino un objeto con sus métodos y propiedades (es mucho más versátil). Si quieres una copia de sus items debes hacerlo de forma explícita.
-
Esto pasa solo con Python?
Porque juraria que he hecho en JavaScript:
var oldSelection = selection;
y luego:
SelectObj(oldSelection);
y me funciono.
-
No, pasa con todos, en tu ejemplo consultas la selección y luego la modificas por ende no es un problema (no la cambias).
Prueba con esto (y algo seleccionado) ;)
oldSelection = Application.Selection;
Application.DeselectAll();
Application.LogMessage( oldSelection.Count);
-
hmm, sera que habra que seleccionar/deseleccionar para que cambie, porque me ha funcionado tras afectar la seleccion en el pasado. no se.
en fin, hoy en dia tengo la costumbre de hacerme un xsicollection con la seleccion dentro de todos modos.
-
hmm, sera que habra que seleccionar/deseleccionar para que cambie, porque me ha funcionado tras afectar la seleccion en el pasado. no se.
Es que no guarda la selección sino que hace una referencia a la misma, mientras tu selección no cambie a lo largo del script seguirá apuntando a los mismos objetos (por eso tu ejemplo funciona), cada vez que escribes oldSelection revisa lo que actualmente está seleccionado y no lo que estuvo seleccionado (no siempre es un problema como puedes ver).
-
Hola de nuevo.. no he entendido mucho esto entre vosotros, pero lanzo otra pregunta.. como puedo hacer para asignar el nombre del material de un objeto a una variable oMatGroup por ejemplo..
intento esto pero no funciona...
set oSelection = GetValue( "SelectionList" )
for each oObj in Selection
'LogMessage oObj.fullname
Logmessage oObj.Material.Parameters("name").Value
set oMatGroup = oObj.Material.Parameters("name").Value
Logmessage oMatGroup
next
-
A ver, sigo con el mismo problema... al principio hago una selección, pero a medida que avanza el script, se seleccionan otros objetos... pero necesito poder acceder a los primeros para que siga el FOR.. como guardo los objetos de una seleccion en un array que no cambie cada vez que se seleccione algo nuevo??
'Asigna a oSelection todo lo que tengo seleccionado
set oSelection = GetValue( "SelectionList" )
Logmessage "oSelection.Count =" & oSelection.Count
for i = 0 to oSelection.Count -1
Logmessage "i =" & i
Logmessage "oSelection(i).Name =" & oSelection(i).Name
set oName = oSelection(i)
Logmessage "oName.FullName ="& oName.FullName
'*******Nurbs 2 mesh*****
ApplyGenOp "NurbsToMesh", , oName.FullName , 3, siPersistentOperation, siKeepGenOpInputs
SetValue "polymsh.polymsh.nurbstomesh.stepu", 7
SetValue "polymsh.polymsh.nurbstomesh.stepv", 7
'****Asigna al nuevo objeto el nombre de oName2 que es el mismo que el objeto original más x
set oSelection2 = Application.Selection
for j = 0 to oSelection2.Count -1
set oName2 = oSelection2(j)
Logmessage oName2.Name
SetValue oName2 & ".Name", oName.Name& "x"
Logmessage oName2.Name
'*****GATOR******
'oName hace referencia a la nurbs y oName2 al polymsh. Se llaman igual pero es para diferenciar
'y poder hacer referencia a ellos indistintamente
ApplyGenOp "Gator", , "" & oName2.Name & ";" & oName.FullName & "", 3, siPersistentOperation, siKeepGenOpInputs
TransferAllPropertiesAcrossGenOp "" & oName2.Name & ".polymsh.TransferAttributes", oName2.Name, , True
FreezeObj
'******Hacer hijo del modelo padre***
'Logmessage oSelection(i).Parent
ParentObj "B:" & oSelection(i).Parent & "", "" & oName2.Name & ""
'****Hacer padre de los hijos de la nurbs
for each oChild in oSelection(i).Children
ParentObj "B:" & oName2 & "", "" & oChild &""
next
'***Con el objeto seleccionado, se coge el nombre del material de ese objeto
'***y se añade al grupo que tiene el mismo nombre que el material
set oSelection = GetValue( "SelectionList" )
for each oObj in Selection
'Logmessage oObj.Material.Parameters("name").Value
set oMatGroup = oObj.Material
'Logmessage oMatGroup.Parameters("name").Value
'Logmessage oMatGroup.Model
SIAddToGroup ""& oMatGroup.Model &"." & oMatGroup.Parameters("name").Value &""
next
next
Logmessage "oSelection.Count =" & oSelection.Count
Logmessage "oSelection(i).Name =" & oSelection(i).Name
next
Por supuesto, mil gracias
-
Hola de nuevo.. no he entendido mucho esto entre vosotros, pero lanzo otra pregunta.. como puedo hacer para asignar el nombre del material de un objeto a una variable oMatGroup por ejemplo..
intento esto pero no funciona...
Si haces un bucle/loop la variable se sobre-escribe a si misma, necesitas guardarlos en un array/lista. VBScript es un poco marciano con su sintaxis pero en python sería algo asi:
mySel = Application.GetValue("SelectionList") #obtenemos la selección
myNames = [] #creamos una lista vacía donde agregaremos los nombres
for each in mySel: myNames.append( each.Material.Name ) #agregamos los nombres la lista
A ver, sigo con el mismo problema... al principio hago una selección, pero a medida que avanza el script, se seleccionan otros objetos... pero necesito poder acceder a los primeros para que siga el FOR.. como guardo los objetos de una seleccion en un array que no cambie cada vez que se seleccione algo nuevo??
No debería modificarse, lo dices por la parte de los nombres del material? si es asi es porque estás haciendo el loop en Selection en lugar de oSelection ;)
-
Pues yo creo que lo de guardar los objetos en una coleccion con vbscript.. no era tan difícil.. yo lo he hecho así, y parece que funciona, ..... por ahora
'Asigna a oSelection todo lo que tengo seleccionado
set oSelection = GetValue( "SelectionList" )
'**Crea una colección para guardalar y usarla mas tarde
set oColl = CreateObject( "XSI.Collection" )
'Logmessage "oSelection.Count =" & oSelection.Count
'****guarda en oColl todos los objetos seleccionados para usarlos más tarde
for j = 0 to oSelection.Count -1
oColl.Add ""& oSelection(j) &""
next
for i = 0 to oColl.Count -1
a partir de aquí sigue un código normal....
-
No debería modificarse, lo dices por la parte de los nombres del material? si es asi es porque estás haciendo el loop en Selection en lugar de oSelection ;)
No, lo decía porque en el loop necesitaba la selección del principio, para que el script se pudiese ejecutar en todos los objetos que había seleccionado... pero debido al Gator, me seleccionaba el objeto nuevo y me perdía la seleccion.. creo que ya lo he conseguido...
Muchas gracias a los 2.. un detallazo