http://stackoverflow.com/questions/1911281/how-do-you-get-list-of-methods-in-a-python-class
But if you simply want to inspect the methods just for your own information and not with the objective to do some sort of dynamic object manipulations in your code, then the SDK doc should be your best friend for this - it even lists the inherited methods and properties without you having to manually check the doc for each parent class. And new methods are highlighted in yellow: http://download.autodesk.com/global/docs/softimage2014/en_us/sdkguide/si_om/X3DObject.html On 7 October 2013 15:34, Sergio Mucino <[email protected]> wrote: > Thanks a lot for the awesomely clear explanation Matt. I'll start getting > into the Object Model documentation and see what I can start using. > Just to cut it a bit shorter, what are the standard inspection methods > available in Softimage (using Python)? I would like to be able to inspect > the classes and properties for any given object (from an OO perspective, > not necessarily scene objects) if possible. > Thanks again! > > > *Sergio Mucino* > Lead Rigger > Modus FX > > On 04/10/2013 6:52 PM, Matt Lind wrote: > > SetValue() and the accompanying GetValue() are commands. Commands > essentially work from scratch every time they are invoked.**** > > ** ** > > When using SetValue() to set the name of the cluster in your example, > SetValue() needs to parse the string of the cluster name and the ‘.Name’ > parameter, then search the entire scene graph to see if that parameter > exists. If so, set the value as specified in your arguments (test). > Actions performed by commands are logged in the script editor and often > invoke events or other validations of the application before the task(s) > are allowed to be performed or completed. While functional and flexible, > you can imagine this loop of having to re-parse the entire scene graph to > set a value can be rather inefficient. Enter the Scripting object model.* > *** > > ** ** > > The scripting object model is similar to working with a DOM in a web > browser or other application where the graph is exposed for direct > manipulation. The methodology of working in the object model is to get a > reference to an object (node) in the graph, then use the object’s available > methods and properties to do work. Because you have a reference to an > existing object, you don’t have to explicitly get names of things you want > to manipulate. You can work in more generic and abstracted terms to make > your code more universal and bulletproof. Although you’ll often have to > write more code to do the same work in the scripting object model compared > to commands, your code will be significantly more efficient as it doesn’t > have re-parse the scene graph for every operation you want to carry out, > nor will it trigger many of the validations and events. Actions performed > using the object model are also not logged, so that overhead is eliminated > as well.**** > > ** ** > > Rewriting your code using the scripting object model would look something > like the example below (Jscript). I added ‘a lot’ of verbosity and error > checking for learning purposes, so don’t let the size of the code scare you > away. The name of the game is to get a reference to an object in the scene > graph (provided by the selection in this case), then traverse that graph > using the obtained object’s properties and methods until you get what you > want. Notice I didn’t use any commands in the entire code snippet. If you > remove the LogMessage() statements and run this on a large polygon > selection you’ll find it runs much faster than anything using SetValue().* > *** > > ** ** > > ** ** > > for ( var i = 0; i < Selection.Count; i++ ) {**** > > ** ** > > var oItem = Selection(i);**** > > **** > > if ( oItem.IsClassOf( siCollectionItemID ) ) {**** > > **** > > // selected item is a collection item (eg; > a subset of something)**** > > **** > > var oSubComponent = oItem.SubComponent;*** > * > > var oObject = > oSubComponent.Parent3DObject;**** > > **** > > // debug**** > > LogMessage(**** > > " Object: " + > oObject.FullName +**** > > "\n Object Type: " + > oObject.Type +**** > > "\n Object Class: " + > Application.ClassName( oObject ) +**** > > "\n SubComponent Type: " + > oSubComponent.Type +**** > > "\nSubComponent Class: " + > Application.ClassName( oSubComponent ),**** > > siComment**** > > );**** > > **** > > if ( oSubComponent.Type == > "polySubComponent" ) {**** > > **** > > // subcomponent type is > polygon**** > > **** > > var oPolygons = > oSubComponent.ComponentCollection;**** > > var oGeometry = > oObject.ActivePrimitive.Geometry;**** > > **** > > // debug**** > > LogMessage( " > NbPolygons: " + oPolygons.Count, siComment );**** > > ** ** > > for ( var j = 0; j < > oPolygons.Count; j++ ) {**** > > **** > > var > oPolygon = oPolygons(j);**** > > **** > > // debug** > ** > > > LogMessage( "------------------", siComment );**** > > > LogMessage( "Polygon Index: " + oPolygon.Index, siComment );**** > > **** > > var > oCluster = oGeometry.AddCluster( siPolygonCluster, "Test", oPolygon.Index ); > **** > > **** > > if ( > oCluster ) {**** > > > // debug**** > > > LogMessage( " Cluster: " + oCluster.FullName, siComment );**** > > > **** > > > // create a null to constrain to the polygon cluster, then name it.**** > > > var oNull = > ActiveSceneRoot.AddNull(); > **** > > > oNull.Name = "N_" + oObject.Name + "_" + oPolygon.Index;**** > > ** ** > > > // Apply the ‘object to cluster’ constraint**** > > > var oConstraintOperator = oNull.Kinematics.AddConstraint( > "ObjectToCluster", oCluster );**** > > > **** > > > if ( oConstraintOperator ) {**** > > > LogMessage( "Constraint Operator: " + oConstraintOperator.FullName, > siComment );**** > > > LogMessage( "Constrained " + oConstraintOperator.Constrained.FullName + " > --> " + oConstraintOperator.Constraining.GetAsText(), siComment );**** > > > }**** > > }**** > > }**** > > }**** > > }**** > > }**** > > ** ** > > ** ** > > ** ** > > Matt**** > > ** ** > > ** ** > > ** ** > > ** ** > > ** ** > > *From:* [email protected] [ > mailto:[email protected]<[email protected]>] > *On Behalf Of *Sergio Mucino > *Sent:* Friday, October 04, 2013 2:41 PM > *To:* [email protected] > *Subject:* Re: SetValue question...**** > > ** ** > > Okay. I didn't know that existed. I will look into it (although it looks > pretty straightforward, and very similar to MAXScript). Thanks Alan! > (BTW, is the object model just more accessible, or are particular reasons > why we should avoid using SetValue?)**** > > *Sergio Mucino* > Lead Rigger > Modus FX**** > > > On 04/10/2013 4:22 PM, Alan Fregtman wrote: **** > > Avoid SetValue() when possible. Use the object model instead: **** > > ** ** > > c.Name = "Test" **** > > ** ** > > ** ** > > On Fri, Oct 4, 2013 at 3:43 PM, Sergio Mucino <[email protected]> > wrote:**** > > Never mind... found it. I found that SetValue expects strings for its > arguments, so changing cName to: > cName = str(c)+".Name" > did the trick. > Cheers! **** > > ** ** > > *Sergio Mucino* > Lead Rigger > Modus FX**** > > ** ** > > On 04/10/2013 3:40 PM, Sergio Mucino wrote: **** > > Okay. I'm trying to write my first SI script (using Python)... and I > actually got kinda lucky, because I found what I need already scripted (ah, > the joys of Googleland). I need to create a cluster per each selected > polygon on an object, and then constraint Nulls to these clusters. This > script works perfectly... > > > http://xsisupport.com/2012/03/17/python-example-constraining-nulls-to-components/ > > I'm now trying to extend the script snippet to be a little more friendly > to my needs. The first thing I'd like to do is specify the name for the > clusters created. So, I modified the loop to read like this... > > for i in si.Selection(0).SubElements: > c = o.ActivePrimitive.Geometry.AddCluster( clusterType, "", [i] ) > cName = c.Name > si.SetValue(cName, "Test", "") > n = si.ActiveSceneRoot.AddNull() > n.Kinematics.AddConstraint( "ObjectToCluster", c ) > > ... but SI is barfing on the SetValue line. It claims that "the parameter > is incorrect". I know the problem is in the cName reference I'm using, but > I can't figure out how I need to feed it properly. I know that cName's type > is 'instance', so I'm not sure how to reference it correctly. If anyone has > any pointers into how to get this working right, I'll be quite grateful. > The noob thanks you in advance.**** > > -- > *Sergio Mucino* > Lead Rigger > Modus FX**** > > > > **** > > --------------------------**** > > To unsubscribe: mail [email protected] with subject > "unsubscribe" and reply to the confirmation email.**** > > > -------------------------- > To unsubscribe: mail [email protected] with subject > "unsubscribe" and reply to the confirmation email.**** > > ** ** > > > > > **** > > --------------------------**** > > To unsubscribe: mail [email protected] with subject > "unsubscribe" and reply to the confirmation email.**** > > > > -------------------------- > To unsubscribe: mail [email protected] with subject > "unsubscribe" and reply to the confirmation email. > > > -------------------------- > To unsubscribe: mail [email protected] with subject > "unsubscribe" and reply to the confirmation email. >
-------------------------- To unsubscribe: mail [email protected] with subject "unsubscribe" and reply to the confirmation email.

