Here’s a JScript snippet that finds render tree nodes that are not connected to anything in the render tree.
LogMessage( isConnected( Selection(0) ) ); function isConnected( o ) { var oDR = XSIUtils.DataRepository ; var strOpInfo = oDR.GetConnectionStackInfo( o ) // LogMessage( strOpInfo ); var oTopNode = ParseXML( strOpInfo ) ; var oConnections = oTopNode.childNodes ; if ( oConnections.length == 0 ) { return false; } return true; } function ParseXML( strXML ) { var oXMLParser = new ActiveXObject("Microsoft.XMLDOM") oXMLParser.async = false oXMLParser.loadXML( strXML ) ; if (oXMLParser.parseError.errorCode != 0) { logmessage( "Invalid XML " + oXMLParser.parseError.reason , siError ) ; return null ; } // the xsi_file node // If this is NULL we must have failed to load the XML var oTopNode = oXMLParser.documentElement ; return oTopNode ; }
Most of this JScript came from the SDK Explorer code in $XSI_HOME\Addons\sdkui\Application\Plugins\SDKExplorer.js, because I noticed that disconnected shaders would have an empty connection stack, and I didn’t want to go through all the parameters individually looking for connections.
Here’s a Python version that does a little more: it follows the output connections to check whether or not the shader is ultimately connected the material.
# Python Code import xml.etree.ElementTree as etree def is_connected( o ): if not o.IsClassOf( 52 ): print "Input is not a shader" return False sXML = XSIUtils.DataRepository.GetConnectionStackInfo( o ) root = etree.fromstring( sXML ) for connection in root: if connection.find('type').text == 'out': x = Application.Dictionary.GetObject( connection.find('object').text ) return True if x.IsClassOf( 64 ) else is_connected( x ) return False print is_connected( Application.Selection(0) )
All materials for all objects in a model are selected. When I run the JScript version it doesn’t search to see if a specific shader node is (phong, Incidence etc) literally not connected to the material render tree, the script only outputs “true” or “false”.
Yeah, the JScript version just checks whether or not a shader has at least one input or output connection. So if a render node is not connected to anything, you’ll get True.
When you say, it checks whether or not a shader has at least one in-put or output connection, do you mean whether there is a shader node plugged into the material ?
Can the script search within all selected materials to find if a shader node is literally plugged into the material tree or not ?
Is it possible to do the above mentioned within the SDK ?