Here’s the question: How do you get the texture support created by CreateProjection?
You’re supposed to be able to get the support name from an output argument, but that doesn’t work.
from sipyutils import si # win32com.client.Dispatch('XSI.Application') from sipyutils import log # LogMessage from sipyutils import C # win32com.client.constants si = si() x = si.CreateProjection("sphere", C.siTxtSpherical, "", "SupportName", "Texture_Projection", "", "", "") log( x.Value("SupportName") == None ) log( x.Count ); log( x(0) == "" ); log( x(1) );
So instead, I get the PropertyName and from CreateProjection and work my way over to the texture support, via the TextureOp.
import win32com.client from sipyutils import si # win32com.client.Dispatch('XSI.Application') from sipyutils import log # LogMessage from sipyutils import C # win32com.client.constants si = si() def dispFix( badDispatch ): import win32com.client.dynamic # Re-Wraps a bad dispatch into a working one: return win32com.client.dynamic.Dispatch(badDispatch) o = si.Selection(0) x = si.CreateProjection(o, C.siTxtSpherical, "", "Texture_Support", "Texture_Projection", "", "", "") #CreateProjection( [InputObjs], [Type], [UVDefaultType], [SupportName], [PropertyName], [Parenting], [Fitting], [Camera] ); y = win32com.client.Dispatch( "XSI.Collection" ) y.Items = "%s.polymsh.cls.*.%s" % (o.FullName, x.Value("PropertyName") ) log( y.Items ) txtprop = si.Dictionary.GetObject( y(0).FullName ) op = txtprop.NestedObjects( "TextureOp" ) # re-dispatch it to avoid "object has no attribute 'InputPorts'" error op = dispFix(op) txtsupp = op.InputPorts(2).Target2.Parent3DObject log( si.ClassName(txtsupp) ) si.SelectObj( txtsupp )
The SDK Explorer is good for finding these kinds of port connections:
PS: Here’s a JScript version.
x = CreateProjection("cylinder", siTxtPlanarXY, siTxtDefaultSpherical, "Texture_Support", "Texture_Projection", null, siRelDefault, null); var y = new ActiveXObject( "XSI.Collection" ); y.Items = "cylinder.polymsh.cls.*." + x.Value("PropertyName") txtprop = Dictionary.GetObject( y(0).FullName ); op = txtprop.NestedObjects( "TextureOp" ); txtsupp = op.InputPorts(2).Target2.Parent3DObject LogMessage( ClassName(txtsupp) ); SelectObj( txtsupp )