oDefaultLight = Application.ActiveSceneRoot.Children( "light" )
for oProp in oDefaultLight.Properties:
Application.LogMessage( oProp.Name )
oObj = Application.ActiveSceneRoot.AddGeometry("Cone","MeshSurface")
oEdges = oObj.ActivePrimitive.Geometry.Edges
for oEdge in oEdges:
index = oEdge.Index
Application.LogMessage( "Found edge %d" % index )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 ) ;
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) ) ;
XYZ、UVW、または RGBA などの複数の次元のある配列データを変更する場合、Softimage によって返されたイミュータブルなタプルを単調化したミュータブルなリストに変換する方法を把握する必要があります。次の例では、タプルを変換する方法を示します。
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()
次の例では、オブジェクトのローカル位置の固定値を含むクリップを作成する方法を示します。
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)次の例では、特定のタイム フレームでのポイントの位置を取得する方法を示します。
# 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 ) )
この例では、posx パラメータに Fカーブを設定する方法と、FCurveKey オブジェクトを使用してキーにアクセスする方法を示しています。
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) )