Getting the texture support created by CreateProjection


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:
texture_support_sdk_explorer

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 )