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) )