You could use the SDK Explorer
On Mon, Oct 7, 2013 at 9:34 AM, Sergio Mucino <sergio.muc...@modusfx.com>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:* softimage-boun...@listproc.autodesk.com [ > mailto:softimage-boun...@listproc.autodesk.com<softimage-boun...@listproc.autodesk.com>] > *On Behalf Of *Sergio Mucino > *Sent:* Friday, October 04, 2013 2:41 PM > *To:* softimage@listproc.autodesk.com > *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 <sergio.muc...@modusfx.com> > 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 softimage-requ...@listproc.autodesk.com with subject > "unsubscribe" and reply to the confirmation email.**** > > > -------------------------- > To unsubscribe: mail softimage-requ...@listproc.autodesk.com with subject > "unsubscribe" and reply to the confirmation email.**** > > ** ** > > > > > **** > > --------------------------**** > > To unsubscribe: mail softimage-requ...@listproc.autodesk.com with subject > "unsubscribe" and reply to the confirmation email.**** > > > > -------------------------- > To unsubscribe: mail softimage-requ...@listproc.autodesk.com with subject > "unsubscribe" and reply to the confirmation email. > > > -------------------------- > To unsubscribe: mail softimage-requ...@listproc.autodesk.com with subject > "unsubscribe" and reply to the confirmation email. >
-------------------------- To unsubscribe: mail softimage-requ...@listproc.autodesk.com with subject "unsubscribe" and reply to the confirmation email.