XSIforum.com

conexion python

0 Usuarios y 1 Visitante están viendo este tema.

conexion python
« en: 10 Julio 2010, 15:41:20 »
Hola a todos

Estoy usando softi 2010 x64 SP1, y python

Lo he instalado siguiendo este tutorial:

cuando intento introduccir el siguiente script, me da error, bueno, me dice que no tengo ningun componente seleccionado, aún cuando SI tengo uno seleccionado.

Código: [Seleccionar]
#imports
import win32com.client
from win32com.client import constants
 
#globals
xsi = win32com.client.Dispatch( "XSI.Application" ).Application
xsiPrint = xsi.LogMessage
 
def setupDorrito():
if xsi.Selection < 1:
xsiPrint("Select an component!",constants.siError)
return False
 
root = xsi.ActiveSceneRoot
 
#create cluster constrained null, setup its look
clsCnsNull = root.AddNull("clsCnsNull")
clsCnsNull.primary_icon.value = 0
clsCnsNull.size.value = 0.1
clsCnsNull.shadow_icon.value = 7
clsCnsNull.shadow_colour_custom.value = 1
clsCnsNull.B.value = 1
clsCnsNull.G.value = 0.5
 
#make cluster from selection
subComponent = xsi.Selection(0).subComponent
cnsCls = subComponent.CreateCluster("cnsCls")
 
#constrain object to cluster
cns = clsCnsNull.Kinematics.AddConstraint("ObjectToCluster",cnsCls)
cns.tangent.value = 1
cns.dirx.value = 0
cns.diry.value = -1
cns.upvct_active.value = 1
cns.upx.value = 1
cns.upy.value = 0
 
#make dorrito
dorrito = root.AddNull("dorrito")
dorrito.primary_icon.value = 0
dorrito.size.value = 0.2
dorrito.shadow_icon.value = 8
dorrito.shadow_colour_custom.value = 1
dorrito.G.value = 1
dorrito.shadow_offsetX.value = 0.1
dorrito.shadow_scaleX.value = 0
 
clsCnsNull.AddChild(dorrito)
dorrito.kinematics.local.transform = XSIMath.CreateTransform()
 
setupDorrito()

Citar
Fuente: http://www.softimageblog.com/archives/209

creo que el error es la conexión que hace el script con phyton y softimage, o me equivoco?
porque obtengo el error?

Muchas gracias de antemano
« Última modificación: 10 Julio 2010, 16:04:00 por gerardoxsi »

Re: conexion python
« Respuesta #1 en: 10 Julio 2010, 15:54:53 »
mnn quizas la conexión no es el problema
ya que si hago un

xsiPrint (xsi)


obtengo:

# INFO : C:\Softimage\Softimage_2010_SP1_x64\Application\bin\XSI.exe

pero si selecciono unos vertices, y hago

xsiPrint (xsi.Selection)

obtengo:

# INFO : <COMObject <unknown>>


alanf

  • *****
  • 6029
  • Pipeline Developer @ Felix & Paul Studios
Re: conexion python
« Respuesta #2 en: 10 Julio 2010, 17:38:46 »
<COMObject <unknown>> es correcto, porque es un objeto. No es como MEL que todo es un string.


Este codigo si funciona:

Código: [Seleccionar]
from win32com.client import constants
xsi    = Application
xsiPrint = xsi.LogMessage

def setupDorrito():
    if xsi.Selection.Count < 1:
        xsiPrint("Select an component!",constants.siError)
        return False
   
    root = xsi.ActiveSceneRoot
   
    #create cluster constrained null, setup its look
    clsCnsNull = root.AddNull("clsCnsNull")
    clsCnsNull.primary_icon.value = 0
    clsCnsNull.size.value = 0.1
    clsCnsNull.shadow_icon.value = 7
    clsCnsNull.shadow_colour_custom.value = 1
    clsCnsNull.B.value = 1
    clsCnsNull.G.value = 0.5
   
    #make cluster from selection
    subComponent = xsi.Selection(0).SubComponent
    cnsCls = subComponent.CreateCluster("cnsCls")
   
    #constrain object to cluster
    cns = clsCnsNull.Kinematics.AddConstraint("ObjectToCluster",cnsCls)
    cns.Parameters("tangent").Value = True
    cns.Parameters("dirx").Value = 0
    cns.Parameters("diry").Value = -1
    cns.Parameters("upvct_active").Value = True
    cns.Parameters("upx").Value = 1
    cns.Parameters("upy").Value = 0
   
    #make dorrito
    dorrito = root.AddNull("dorrito")
    dorrito.primary_icon.value = 0
    dorrito.size.value = 0.2
    dorrito.shadow_icon.value = 8
    dorrito.shadow_colour_custom.value = 1
    dorrito.G.value = 1
    dorrito.shadow_offsetX.value = 0.1
    dorrito.shadow_scaleX.value = 0
   
    clsCnsNull.AddChild(dorrito)
    dorrito.kinematics.local.transform = XSIMath.CreateTransform()

setupDorrito()

y

Código: [Seleccionar]
from win32com.client import constants
xsi    = Application
xsiPrint = xsi.LogMessage

# You add the dorito as a deformer, then select the parent and then the dorito null, then run:
def setupStaticState():
    defList = []
    clsList = []
    for i in xrange(0,len(xsi.Selection),2):
        clsList.append(xsi.Selection(i))
        defList.append(xsi.Selection(i+1))
   
    for a,b in zip(defList,clsList):
        defKineState = a.Properties("Static_KineState")
        clsKine = b.Properties("Kinematics")
       
        defKineState.Parameters("orix").AddExpression(clsKine.FullName + ".global.rotx")
        defKineState.Parameters("oriy").AddExpression(clsKine.FullName + ".global.roty")
        defKineState.Parameters("oriz").AddExpression(clsKine.FullName + ".global.rotz")
        defKineState.Parameters("posx").AddExpression(clsKine.FullName + ".global.posx")
        defKineState.Parameters("posy").AddExpression(clsKine.FullName + ".global.posy")
        defKineState.Parameters("posz").AddExpression(clsKine.FullName + ".global.posz")
        # Steven forgot to do scaling. (It's important!)
        defKineState.Parameters("sclx").AddExpression(clsKine.FullName + ".global.sclx")
        defKineState.Parameters("scly").AddExpression(clsKine.FullName + ".global.scly")
        defKineState.Parameters("sclz").AddExpression(clsKine.FullName + ".global.sclz")

setupStaticState()

Re: conexion python
« Respuesta #3 en: 10 Julio 2010, 19:11:46 »
muchas gracias alan!!!  ahora he avanzado un paso!   O0

la parte donde no me aclaro mucho es esta:

Citar
"I now need to paint the cloned mesh’s envelope. The way I do this is add another deformer to the deformer list, set all the points to 100 % of this new deformer, and then choose the Dorrito and paint it’s influence. Once I am happy with the deformation I just remove the extra deformer from the envelope and I get zero weights except for where I painted the Dorrito’s influence. This deformer moves with the cluster constrained null, but it causes this nasty double transform when I rotate the head!"

ya le he implementado el "dorito" a mi mesh original.

se supone que el "cloned" ya tiene un pesado heredado del original, no?
he de añadir el dorito como envelope... cuando lo añado, es el único deformador que me sale!

aqui es donde no me aclaro mucho con los envelopes

el tutorial dice "set all the points to 100 % of this new deformer"... pero es que ya los tengo al 100% según el weight editor, aunque me siguen influenciando los deformadores que le aplique al mesh original.

"and then choose the Dorrito and paint it’s influence."... ahora que?... he de restar influencia (ya que la tengo al 100%) donde no quiero que deforme el dorito?

Re: conexion python
« Respuesta #4 en: 10 Julio 2010, 19:24:44 »
Agrega un deformador temporal y asigna un 100% en todos los puntos para ese deformador, pesa el dorito localmente como te apetezca y luego borra el deformador temporal ;)

Re: conexion python
« Respuesta #5 en: 10 Julio 2010, 19:45:06 »
haaa... creo un null, le hago un envelope a mi cloned con ese null, y luego añado el dorito a ese envelope!

otro paso más resuelto

ahora bien, selecciono el cluster "cnsCls" (en mi mesh original) y luego el Dorito.
paso el segundo script obtengo un error:

# ERROR : Traceback (most recent call last):
#   File "<Script Block >", line 28, in <module>
#     setupStaticState()
#   File "<Script Block >", line 17, in setupStaticState
#     defKineState.Parameters("orix").AddExpression(clsKine.FullName   ".global.rotx")
# AttributeError: 'NoneType' object has no attribute 'FullName'
#  - [line 17]


falta poco!

Re: conexion python
« Respuesta #6 en: 10 Julio 2010, 19:55:52 »
oppsss... que tonto!

seleccionaba el cluster en vez del null!!!


ya ya me funciona.... gracias a ambos!

da un gusto estar entre tanto talento en este foro!

Re: conexion python
« Respuesta #7 en: 10 Julio 2010, 19:57:40 »
Falta concatenar los strings con un signo + en la linea 17

Debería ser:
defKineState.Parameters("orix").AddExpression(clsKine.FullName  + ".global.rotx")

o bien:
defKineState.Parameters("orix").AddExpression("%s.global.rotx" % clsKine.FullName)

Re: conexion python
« Respuesta #8 en: 10 Julio 2010, 20:18:16 »
el siguiente paso sería poder controlar los shapes con el dorito.

cuando intento hacer la conección de parametros del dorito con el shape, me sale un mensaje de advertencia sobre ciclos.

¿es normal?... o me la he vuelto a liar?

Re: conexion python
« Respuesta #9 en: 10 Julio 2010, 20:22:23 »
Te has vuelto a liar, toda la movida es para evitar los ciclos :P

Relee el texto en xsi-blog y reproducelo con algo simple (¿una esfera con 2 shapes?), no es tan dificil como parece, para entenderlo incluso te diría que pases de los scripts, así sabrás exactamente que estás haciendo y porque funciona como funciona :)