The following example shows how to enumerate the properties.
oDefaultLight = Application.ActiveSceneRoot.Children( "light" )
for oProp in oDefaultLight.Properties:
Application.LogMessage( oProp.Name )
The following example shows how to enumerate the edges.
oObj = Application.ActiveSceneRoot.AddGeometry("Cone","MeshSurface")
oEdges = oObj.ActivePrimitive.Geometry.Edges
for oEdge in oEdges:
index = oEdge.Index
Application.LogMessage( "Found edge %d" % index )The following example shows how to use the math library.
v3 = XSIMath.CreateVector3() #Vector can be set using its properties v3.X = 10.0 #Or using this method v3.Set( 10.0, 20.0, 30.0) #Vector3 has many convenient methods v3.ScaleInPlace(2) #Read the vector values x=0 y=0 z=0 x, y, z = v3.Get(x,y,z) valstr = '%(x).2f %(y).2f %(z).2f' % vars() Application.LogMessage( valstr ) ;
The following example shows how the arrays are represented as tuples.
oObject = Application.ActiveSceneRoot.AddGeometry( "Grid","MeshSurface","PolyMeshGetTest" ) Application.SetValue(str(oObject) + ".polymsh.geom.subdivu", 1, "") Application.SetValue(str(oObject) + ".polymsh.geom.subdivv", 1, "") oGeometry = oObject.ActivePrimitive.Geometry aReturnArray = oGeometry.Get2() ; Application.LogMessage( repr(aReturnArray) ) ; aVertices = aReturnArray[0] # 2D array of x,y,z aPolydata = aReturnArray[1] Application.LogMessage( repr(aVertices) ) ; Application.LogMessage( repr(aPolydata) ) ;
If you want to modify array data that has more than one dimension such as, XYZ, UVW, or RGBA, you need to know how to convert from the immutable tuple returned by Softimage to a flattened mutable list. The following example shows how to convert the tuple.
import win32com.client
from win32com.client import constants
import sys
xsi = Application
true=1
false=0
def main():
Test1()
# test1: turn a tuple into a list
def Test1():
# immutable tuple i.e. read-only
print "1 dimensional tuple example"
w_tuple = ('W1','W2','W3','W4','W5')
print repr(w_tuple)
w_list = [w for w in w_tuple]
print repr(w_list)
w_tuple = (0.25,0.26,0.27,0.28,0.29)
print repr(w_tuple)
w_list = [1.0-w for w in w_tuple]
print repr(w_list)
print "2 dimensional tuple example (such as XYZ)"
w_tuple = (('X1','X2','X3','X4'),('Y1','Y2','Y3','Y4'),('Z1','Z2','Z3','Z4'))
print repr(w_tuple)
w_list = [w_tuple[j][i] for i in range(len(w_tuple[0])) for j in range(len(w_tuple)) ]
print repr(w_list)
# test2: turn a weightmap tuple into a list, invert and set back
def Test2():
obj = xsi.ActiveSceneRoot.AddGeometry( "Sphere", "MeshSurface", "TupleTest2" )
wmap = xsi.CreateWeightMap("WeightMap", obj , "Weight Map", "Weight Map Property", false)(0)
# get weightmap as tuple
w_tuple = wmap.Elements.Array
print "wmap as tuple: " + repr(w_tuple)
# convert to list and invert
w_list = [ 1-w for w in w_tuple[0] ]
print "wmap as inverted list: " + repr(w_list)
# set weightmap as list
wmap.Elements.Array = w_list
# test3: turn a uvw tuple into a list, invert and set back
def Test3():
obj = xsi.ActiveSceneRoot.AddGeometry( "Cube", "MeshSurface", "TupleTest3" )
xsi.GenerateUniqueUVs(obj, "Texture_Projection", "", "", "", "", "", "", "")
mesh = obj.ActivePrimitive.Geometry
cluster= mesh.Clusters.Filter( "sample" )(0)
uvw = cluster.Properties.Filter("uvspace")(0)
uvw_tuple = uvw.Elements.Array
print "uvw tuple: " + repr(uvw_tuple)
uvw_list = [1-uvw_tuple[j][i] for i in range(len(uvw_tuple[0])) for j in range(len(uvw_tuple)) ]
print "uvw list: " + repr(uvw_list)
uvw.Elements.Array = uvw_list
def XSITuple_toList(_tuple):
return [_tuple[j][i] for i in range(len(_tuple[0])) for j in range(len(_tuple)) ]
if __name__=='__ax_main__':
class WritableObject:
def __init__(self):
self.content = ""
def write(self, string):
if (string=='\n'):
Application.Logmessage(self.content,32)
self.content=""
else:
self.content+=string
# example with redirection of sys.stdout
sys.stdout = WritableObject()
main()
The following example shows how to create a clip containing the static values of the local position of an object.
oRoot = Application.ActiveSceneRoot
oCube = oRoot.AddGeometry( "Cube", "MeshSurface" )
# Creating the first animation source
sParams = "cube.kine.local.posx,cube.kine.local.posy,cube.kine.local.posz"
oSource = Application.StoreAction( oRoot, sParams, 1, "StoredStaticPose", 1, 1, 5, 0, 0)
# Creating the first clip
oClip = Application.AddClip( oRoot, oSource )
Application.LogMessage( "First created clip " + oClip.FullName )
# Creating the second animation source
oCube.Parameters("posx").Value = 3.0
oSource2 = Application.StoreAction( oRoot, sParams, 1, "StoredStaticPose", 1, 7, 9, 0, 0 )
# Creating the second clip
oClip2 = Application.AddClip(oRoot, oSource2)
Application.LogMessage("Second created clip " + oClip2.FullName)The following example shows how to get the position of a point at a specific time frame.
# Import the constants
from win32com.client import constants as c
import sys, types
Application.NewScene("", 0)
oGrid = Application.ActiveSceneRoot.AddGeometry( "Grid", "MeshSurface" )
Application.SetValue (oGrid.Name + ".polymsh.geom.subdivu", 1)
Application.SetValue (oGrid.Name + ".polymsh.geom.subdivv", 1)
Application.Scale( oGrid, 0.25, 0.25, 0.25, c.siAbsolute, c.siParent, c.siObj, c.siXYZ)
startTimeInSeconds = 5 / 29.97
duration = startTimeInSeconds * 2
# Start at frame 5 & last 100 frames
oClip = oGrid.ActivePrimitive.Geometry.SaveShapeKey(
startTimeInSeconds,
duration,
c.siShapeAbsoluteReferenceMode,
c.siShapeInstanceOnlyMode,
"Clip", ( 0,1,2,3),
( -4,0,-4,
-4,0, 4,
4,0, 0,
4,0, 4 ))
# Frame 3 must be the original grid
oPoints = oGrid.ActivePrimitive.GetGeometry2(3,c.siConstructionModeSecondaryShape).Points
oPos = oPoints[2].Position
Application.LogMessage( "%f,%f,%f" % ( oPos.X,oPos.Y,oPos.Z ) )
# Frame 10 must be the modified grid in the clip
oPoints = oGrid.ActivePrimitive.GetGeometry2(10).Points
oPos = oPoints[2].position
Application.LogMessage( "%f,%f,%f" % ( oPos.X,oPos.Y,oPos.Z ) )
This example demonstrates how to set an fcurve on the posx parameter and how to access the keys through the FCurveKey object.
Application.NewScene( "", 0 )
oRoot = Application.ActiveProject.ActiveScene.Root
oNull = oRoot.AddNull()
oPosX = oNull.posx
# Create and connect an fcurve to the position x
oFCurve = oPosX.AddFCurve2( [1, 10, 50, 0, 100, 10] )
# Set the zero slopes on the key tangents
oFCurve.SetKeyTangents( [
-10.5, 0, 10.5, 0,
-10.5, 0, 10.5, 0,
-10.5, 0, 10.5, 0
])
# Get the keys on the fcurve
for oFCKey in oFCurve.Keys :
Application.LogMessage( "oFCKey[" + str(oFCKey.Index) + "] at frame " + str(oFCKey.Time) + " = " + str(oFCKey.Value) )
Except where otherwise noted, this work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License