XSIforum.com

Consejos programación/scripting

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

siru

  • ***
  • 1761
  • Artista incomprendido
Re: Consejos programación/scripting
« Respuesta #10 en: 03 Abril 2009, 20:30:30 »
Por cierto a que os referis con object model?

Re: Consejos programación/scripting
« Respuesta #11 en: 03 Abril 2009, 22:49:57 »
Una cosita César, me da hasta vergüenza preguntarlo, pero es que no se que pasa.

Tengo este super codigo ( ;D):

Código: [Seleccionar]
>>> x = int(raw_input("Introduce un número entero: "))
>>> if x < 0:
...      x = 0
...      print 'Negativo cambiado a cero'
... elif x == 0:
...      print 'Cero'
... elif x == 1:
...      print 'Uno'
... else:
...      print 'Más'
...

pues bien, me da error en la comillas de los prints, sin embargo en todos los tutos que tengo las usan, con las dobles pasa lo mismo, no entiendo.....
Es raro, debería estar bien (acá funciona)... De todas formas te recomiendo empezar a hacer este tipo de pruebas dentro del propio XSI, así te vas familiarizando con el entorno O0

Eso mismo dentro de XSI sería asi:
Código: [Seleccionar]
#asignamos el comando LogMessage a variable log, de esa forma tipeamos menos (opcional)
log = Application.LogMessage
x = int(Application.XSIInputBox( "Ingrese entero:", "", "" )) #XSIInput es el comando de XSI para el inputBox
if x<0: x=0; log( "Negativo cambiado a cero" )
elif x==0: log( "Cero" )
elif x==1: log( "Uno" )
else: log( "Otro" )

Por cierto a que os referis con object model?
Básicamente es una serie de classes para trabajar con el SDK de XSI orientado a objetos. En la ayuda (SDK Guides) encontrarás una definición más detallada y políticamente correcta, pero básicamente es eso :)

alanf

  • *****
  • 6026
  • Pipeline Developer @ Felix & Paul Studios
Re: Consejos programación/scripting
« Respuesta #12 en: 03 Abril 2009, 23:30:55 »
Por cierto a que os referis con object model?
Hay dos formas de usar el SDK de XSI.

- Command Model
- Object Model

Command Model como su nombre indica, es ejecutar comandos y nada mas. No existe el concepto de propiedades, metodos, tipos de objetos. Se ejecuta el comando y punto. Esto es donde se suele empezar.

Pero luego, empieza a tener mas sentido el Object Model, que usa arboles de "objetos" con hijos (subobjetos), propiedades, metodos (que son como funciones relevantes al objeto), etc. Por aqui hay unos diagramas:
http://softimage.wiki.softimage.com/index.php/Object_Model_Diagrams

Es muy extenso. No hace falta conocertelo 100%, pero cuando lo entiendes mas o menos, con una mirada a la documentacion seguramente sapas como hacer lo que necesites.

Re: Consejos programación/scripting
« Respuesta #13 en: 04 Abril 2009, 06:17:24 »
Muchas gracias denuevo a ambos, asi da gusto  :D.


Sabéis decirme como llamar a un script dentro de otro? llevo rato trasteando el wiki y no lo localizo.

Tengo una condicional que cuando se cumpla, haga X cosa, pero esa cosa este en un script aparte, así que supongo que tendría que poner x = ComandoQueNose.elScript.py y luego llamar a "x" en la condicional, no?

Esto lo quiero hacer para que el script principal este mas limpio, es recomendable o no hacerlo?

Y otra cosa, que comando cierra las ventanitas emergentes? osea, si creo X objetos y les aplica material o lo que sea que no me aparezcan todas sus ventanas de propiedades...
« Última modificación: 04 Abril 2009, 07:13:01 por bLiNd »

Re: Consejos programación/scripting
« Respuesta #14 en: 04 Abril 2009, 07:44:57 »
Depende el tamaño el proyecto, si es muy grande puede ser beneficioso separarlo en módulos pero si estás empezando yo creo que usando funciones y/o classes debería ser suficiente por el momento :)

Para importar módulos mira acá ;)
http://docs.python.org/tutorial/modules.html

eduardito

  • *****
  • 3064
  • hola holita
Re: Consejos programación/scripting
« Respuesta #15 en: 04 Abril 2009, 08:56:27 »
una buena manera de empezar es meter todo el codigo a saco dentro de una misma funcion, y una vez lo entiendas lo desmontas en porciones(funciones) y asi iras poco a poco avanzando.

Sabéis decirme como llamar a un script dentro de otro? llevo rato trasteando el wiki y no lo localizo.

Tengo una condicional que cuando se cumpla, haga X cosa, pero esa cosa este en un script aparte, así que supongo que tendría que poner x = ComandoQueNose.elScript.py y luego llamar a "x" en la condicional, no?

para poder llamar a otro script deberias definir la ruta del script, por ejemplo:

script1{
lo que sea
}
script2{
var ruta=/donde/tengo/el/script1
x=ruta;
}

ok? basicamente es esto.
« Última modificación: 04 Abril 2009, 09:03:24 por eduardito »

Re: Consejos programación/scripting
« Respuesta #16 en: 04 Abril 2009, 11:17:09 »
Gracias eduardito, me lo apunto. Finalmente lo que yo tenia en 50 lineas César me lo simplificó en 2, cosas de la vida  ;D


No consigo hacer que me aplique un material a los objetos creados, da error, si le quito las lineas de aplicar el material, funciona perfectamente. Que hago mal?

Con material = error
Código: [Seleccionar]
xsi = Application

def Createcolumnas(altura, size, offset, bevel, color):
    for x in range(0,altura):
        for z in range(0,altura):
            for y in range(0,altura):
                cubo = xsi.ActiveSceneRoot.AddGeometry("Cube", "MeshSurface", "MiCubo")
                cubo.length.Value = size
                xsi.ApplyShader("", "", "", "", "siLetLocalMaterialsOverlap")
                xsi.SetValue("cubo.name.Phong.diffuse.green", 1, "")
                xsi.SetValue("cubo.name.Phong.diffuse.blue", 0, "")
                xsi.SetValue("cubo.name.Phong.diffuse.red", 0, "")
                xsi.ApplyTopoOp("BevelComponent", cubo.Name + ".edge[*]", "siUnspecified", "siPersistentOperation", "")
                xsi.SetValue(cubo.Name + ".polymsh.bevelop.ratio", bevel, "")
                cubo.Kinematics.Global.PosX.Value = (size + offset) * x
                cubo.Kinematics.Global.PosZ.Value = (size + offset) * z
                cubo.Kinematics.Global.PosY.Value = (size + offset) * y
columnas = int(xsi.XSIInputBox("Cantidad de Columnas:"))
Createcolumnas(columnas, 1, 1, 0.5, 1)

Sin material = OK
Código: [Seleccionar]
xsi = Application

def Createcolumnas(altura, size, offset, bevel, color):
    for x in range(0,altura):
        for z in range(0,altura):
            for y in range(0,altura):
                cubo = xsi.ActiveSceneRoot.AddGeometry("Cube", "MeshSurface", "MiCubo")
                cubo.length.Value = size
                xsi.ApplyTopoOp("BevelComponent", cubo.Name + ".edge[*]", "siUnspecified", "siPersistentOperation", "")
                xsi.SetValue(cubo.Name + ".polymsh.bevelop.ratio", bevel, "")
                cubo.Kinematics.Global.PosX.Value = (size + offset) * x
                cubo.Kinematics.Global.PosZ.Value = (size + offset) * z
                cubo.Kinematics.Global.PosY.Value = (size + offset) * y
columnas = int(xsi.XSIInputBox("Cantidad de Columnas:"))
Createcolumnas(columnas, 1, 1, 0.5, 1)



Luego otra cosa, la definición empieza con
Código: [Seleccionar]
def Createcolumnas(altura, size, offset, bevel, color)
y termina
Código: [Seleccionar]
Createcolumnas(columnas, 1, 1, 0.5, 1)
Puse un valor 1 para el color, pero realmente no se que tendría que poner.  :-\


« Última modificación: 04 Abril 2009, 11:24:10 por bLiNd »

Re: Consejos programación/scripting
« Respuesta #17 en: 04 Abril 2009, 11:48:56 »
Bueno, he conseguido aplicar un material a cada cubo diferente ( que no es lo que quiero) pero el color no lo ajusta....
Código: [Seleccionar]
xsi = Application

def Createcolumnas(altura, size, offset, bevel, color):
    for x in range(0,altura,color):
        for z in range(0,altura,color):
            for y in range(1,altura,color):
                cubo = xsi.ActiveSceneRoot.AddGeometry("Cube", "MeshSurface", "MiCubo")
                cubo.length.Value = size
                xsi.ApplyTopoOp("BevelComponent", cubo.Name + ".edge[*]", "siUnspecified", "siPersistentOperation", "")
                xsi.SetValue(cubo.Name + ".polymsh.bevelop.ratio", bevel, "")
                xsi.SelectAllUsingFilter("PolygonMesh", "siCheckComponentVisibility", "", "")
                xsi.ApplyShader("Phong", "", "", "", "siLetLocalMaterialsOverlap")
                xsi.SetValue("Sources.Materials.DefaultLib.Material.Phong.diffuse.blue", 0, "")
                xsi.SetValue("Sources.Materials.DefaultLib.Material.Phong.diffuse.green", 0, "")
                xsi.SetValue("Sources.Materials.DefaultLib.Material.Phong.diffuse.red", 1, "")
                cubo.Kinematics.Global.PosX.Value = (size + offset) * x
                cubo.Kinematics.Global.PosZ.Value = (size + offset) * z
                cubo.Kinematics.Global.PosY.Value = (size + offset) * y

columnas = int(xsi.XSIInputBox("Cantidad de Columnas:"))

Createcolumnas(columnas, 1, 1, 0.5, 1)


« Última modificación: 04 Abril 2009, 12:52:55 por bLiNd »

Re: Consejos programación/scripting
« Respuesta #18 en: 04 Abril 2009, 18:33:17 »
Citar
Código: [Seleccionar]
xsi.SelectAllUsingFilter("PolygonMesh", "siCheckComponentVisibility", "", "")
xsi.ApplyShader("Phong", "", "", "", "siLetLocalMaterialsOverlap")
xsi.SetValue("Sources.Materials.DefaultLib.Material.Phong.diffuse.blue", 0, "")
xsi.SetValue("Sources.Materials.DefaultLib.Material.Phong.diffuse.green", 0, "")
xsi.SetValue("Sources.Materials.DefaultLib.Material.Phong.diffuse.red", 1, "")
En esta parte del código hay varias cosa que podrías replantear.
- La primera línea selecciona todos los polyMesh en la escena y no creo que sea una buena idea ya que seleccionas (y posteriormente modificas) todos los elementos de tu escena y no tan sólo los cubos que creas con el script.
- La segunda línea crea y aplica un phong a la selección, selecciona el comando y presiona F1 para entender que hace cada atributo entre paréntesis de la función, puedes aplicarlo directamente a un objeto y no a toda la selección (de esa forma no tendrías que seleccionar en la línea anterior).
- El resto de las líneas citadas sirven para asignar el color RGB del diffuse, el problema que tienen actualmente es que apuntan a un material con un nombre específico y con un valor fijo.

Prueba con algo como esto (los cambios están comentados) O0
Código: [Seleccionar]
xsi = Application

def CreateColumnas(altura, size, offset, bevel, color):
#creamos el material para los cubos
myMaterial = xsi.ActiveSceneRoot.AddMaterial("Phong", False, "Cubos")
#ajustamos el color del diffuse
myMaterial.Surface.NestedObjects[0].diffuse.red.Value = color[0]
myMaterial.Surface.NestedObjects[0].diffuse.green.Value = color[1]
myMaterial.Surface.NestedObjects[0].diffuse.blue.Value = color[2]
#iniciamos los loops para crear los cubos
for x in range(0,altura):
for y in range(0,altura):
for z in range(0,altura):
cubo = xsi.ActiveSceneRoot.AddGeometry("Cube", "MeshSurface", "MiCubo")
cubo.length.Value = size
bevelOp = xsi.ApplyTopoOp("BevelComponent", cubo.Name+".edge[*]")
bevelOp[0].ratio.Value = bevel
cubo.Kinematics.Global.PosX.Value = (size + offset) * x
cubo.Kinematics.Global.PosZ.Value = (size + offset) * z
cubo.Kinematics.Global.PosY.Value = (size + offset) * y
#asignamos el material
cubo.SetMaterial(myMaterial)
columnas = int(xsi.XSIInputBox("Cantidad de Columnas:"))
# indicamos el color como una lista con los componentes del color [rojo, verde, azul]
CreateColumnas(columnas, 1, 1, 0.5, [1,0,0])

Re: Consejos programación/scripting
« Respuesta #19 en: 04 Abril 2009, 20:07:45 »
 :D menudo artista estas hecho César. :D

La unica duda que tengo es el significado de NestedObjects[0] y el [BranchFlag] que lo pones como False y tampoco se su significado.


Gracias por vigésimoquinta vez!  :D