XSIforum.com

Foros 3D => Autodesk Softimage => Rigging y Scripting => Mensaje iniciado por: Dios en 13 Abril 2009, 19:29:09

Título: Scripting : perdida de la selección
Publicado 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??

Código: [Seleccionar]
'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
Título: Re: Scripting : perdida de la selección
Publicado por: Cesar Saez en 13 Abril 2009, 19:41:42
Prueba guardar la selección con Application.GetValue("SelectionList") O0
Título: Re: Scripting : perdida de la selección
Publicado por: Dios en 13 Abril 2009, 19:47:29
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
Título: Re: Scripting : perdida de la selección
Publicado por: Cesar Saez en 13 Abril 2009, 19:55:13
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.
Título: Re: Scripting : perdida de la selección
Publicado por: alanf en 13 Abril 2009, 22:53:59
Esto pasa solo con Python?

Porque juraria que he hecho en JavaScript:
var oldSelection = selection;
y luego:
SelectObj(oldSelection);

y me funciono.
Título: Re: Scripting : perdida de la selección
Publicado por: Cesar Saez en 14 Abril 2009, 00:12:37
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) ;)
Código: (JScript) [Seleccionar]
oldSelection = Application.Selection;
Application.DeselectAll();
Application.LogMessage( oldSelection.Count);
Título: Re: Scripting : perdida de la selección
Publicado por: alanf en 14 Abril 2009, 06:18:47
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.
Título: Re: Scripting : perdida de la selección
Publicado por: Cesar Saez en 14 Abril 2009, 16:23:00
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).
Título: Re: Scripting : perdida de la selección
Publicado por: Dios en 14 Abril 2009, 17:35:06
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...

Código: [Seleccionar]
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
Título: Re: Scripting : perdida de la selección
Publicado por: Dios en 14 Abril 2009, 18:14:18
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??


Código: [Seleccionar]
'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
Título: Re: Scripting : perdida de la selección
Publicado por: Cesar Saez en 14 Abril 2009, 20:20:25
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:
Código: [Seleccionar]
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 ;)
Título: Re: Scripting : perdida de la selección
Publicado por: Dios en 15 Abril 2009, 16:46:56
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

Código: [Seleccionar]
'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....
 
Título: Re: Scripting : perdida de la selección
Publicado por: Dios en 15 Abril 2009, 16:49:38

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