<script >Python and the PPG global variable? 2005-04-25 - By Nick
Back Cheers Jerry and Aloys! Thanks for clearing that up. I started going the self installable plugin route, as I did like the fact that you can integrate it in the explorer's context menu as well as not having to declare the logic code... :) And as you said Aloys, it beats the hell out of maintaining 2 scripts when you need to change the PPG: the building script and the script to refresh/rebuild the PPG...
Thanks again! Nick. (slowly starting to get my thick head around Python...)
Can't wait to be in Adelaide! :)
On 4/26/05, Aloys Baillet <aloys.baillet@(protected)> wrote: > Hi Nick, > > Actually, if you declare a self-installable custom property, you wont need > to pass the logic code to the layout. > If you lok at the jscript exemple in thuis file: > C:\Softimage\XSI_4.2\XSISDK\examples\properties\PSetUIDemo\jscript \PSetUIDemoJScript.js > you wont see any toString() function to pass the logic code. > In this case, the logic is symply defined in the body of the file and is > automagically found by XSI. > In python it will be the same. > IMHO, this kind of custom property is better than the one you are trying to > build because if you change your logic code after some time, the old PPG > will follow the new rules defined in your plugin. In your current setup, the > PPG logic code is "freezed" inside the scene. I hope I am clear enough;) > Good luck in Adelaide! > > Aloys > > > On 4/23/05, Nick <nick.petit@(protected)> wrote: > > > > Cheers Bernard but I think I must have not explained myself properly... > > > > I already have the whole ppg thing going (as you have it in your > > example) in the main ppg declaration. I'm trying to get the PPG object > > in the logic section of the ppg. For example, in jscript: > > > > opset = ActiveSceneRoot.AddProperty( "CustomProperty", false, > > "EasyCaptureSettings" ); > > var olayout = opset.PPGLayout; > > > > opset.AddParameter3 ( "MachineName", siString, "Nick" ); > > ... etc > > > > olayout.Language = "Jscript" ; > > olayout.Logic = OnInit.toString() + > > oIO_OnChanged.toString() + > > iIn_OnChanged.toString() + > > iOut_OnChanged.toString() + > > Bypass_OnChanged.toString() + > > Multi_OnChanged.toString() + > > Flip_OnClicked.toString() + > > FlipAll_OnClicked.toString() + > > OpFol_OnClicked.toString() + > > ZoomCam.toString() + > > foldername.toString() + > > SceneChecks.toString() + > > Cln_OnClicked.toString(); > > > > Then in the functions themselves you can get the ppg by simply calling > > it using the PPG global variable... > > > > function OnInit() > > { > > var olayout = PPG.PPGLayout; > > etc... > > } > > > > I haven't declared this variable anywhere, it's an object that is > > available by simply calling its global variable... from the docs: > > > > PPG > > > > Represents an instance of a Property Page. This object can be > > manipulated within the event handling script code associated with a > > PPGLayout. (This event handling code is often called "SPDL logic" > > because in previous versions it could only be specified by putting > > script code directly in a spdl file.) This object is available to > > logic code as a global variable called "PPG". (For the purposes of > > backward compatibility it is also available via the global variable > > "PSet". It is also for reasons of backward compatibility that this > > object does not derive from Context and is available as a global > > variable rather than being passed as an argument to the callback > > routines). > > > > At the moment, I can create the ppg and the layout in python by hacking > it: > > > > opset = xsi.ActiveSceneRoot.AddProperty( "CustomProperty", False, > > "ConstraintChanger" ) > > olayout = opset.PPGLayout > > > > ## Parameters > > opset.AddParameter3 ( "Cons", c.siString , oCns.FullName ) > > opset.AddParameter3 ( "Details", c.siString, "" ) > > > > olayout.AddRow() > > ## Constraint DropDown > > oItem = olayout.AddEnumControl( "Cons", list(), "Which constraint?", > > c.siControlCombo ) > > olayout.EndRow() > > > > olayout.AddRow() > > ## Details > > oItem = olayout.AddString( "Details", "Details", True, 100 ) > > olayout.EndRow() > > > > olayout.Language = "PythonScript" > > olayout.Logic = str(OnInit(opset)) + \ > > str(Cons_OnChanged(opset)) > > > > """ Now, passing the ppg object this way is dodgy as opset doesn't > > exist anymore once the ppg has been created. At the moment it simply > > allows me to create the ppg. """ > > > > def OnInit(opset): > > olayout = opset.PPGLayout > > # down here I populate the combo... > > > > def Cons_OnChanged(opset): > > oCns = Application.Dictionary.GetObject ( > str(opset.Cons.Value) ) > > # I use the ppg's combo value to get to an object and retrieve > > the info I want and then print that info in a multi-line text box... > > > > """ this is where is all fails... str( opset.Cons.Value). It works when > > I first create the ppg, but since opset is no longer available after > > the ppg has been created, this throws an error. > > You normally would do this by simply using the "PPG" global variable > > that self references the ppg object, however I can't seem to get to > > it... I could do it with a Dictionary.GetObject > > and then using the name of the ppg but that is unreliable... > > > > I must be missing something but I have no idea what... > > > > Cheers! > > Nick. > > > > On 4/23/05, Bernard Lebel <3dbernard@(protected)> wrote: > > > Hi Nick, > > > > > > Here is an example of a ppg item in Python: > > > > > > # Create custom pset > > > oProp = xsi.activesceneroot.addproperty( 'CustomProperty', False, > > > 'ColorPicker' ) > > > > > > # Create color parameters > > > oProp.addparameter3( 'red', c.siDouble ) > > > oProp.addparameter3( 'green', c.siDouble ) > > > oProp.addparameter3( 'blue', c.siDouble ) > > > oProp.addparameter3( 'alpha', c.siDouble ) > > > > > > # Provide layout to pset > > > oLayout = oProp.ppglayout > > > > > > # Add widget > > > oColor = oLayout.addcolor( 'red', 'red', True ) > > > oColor.setattribute( 'NoLabel', True ) > > > > > > Hope this helps > > > Bernard > > > > > > > > > Bernard Lebel wrote: > > > > > > >Is PPG indeed defined somewhere? If so, where? > > > > > > > >Perhaps you are running into a scope problem, wich is critical in > > > >Python. Keep in mind that a name assigned on the wrong scope will > > > >prevent it from being usable in other scopes. > > > >For instance, if you run a command that assigns a name a the top level > > > >(a global for the entire script), this global will not be accessible > > > >outside this file unless you import the file as a module and then > > > >fetch the variable by name qualification (ie: myvariable = > > > >modulename.variablename). > > > > > > > >Normally functions inside a module can access all global names from > > > >that same module, but not from other functions, unless all these > > > >functions are nested into another function and the name is assigned in > > > >that one. The only way to make a name global from a function is to > > > >declare it first as global with the global statement), then assign it > > > >to a value. > > > > > > > > > > > >Cheers > > > >Bernard > > > > > > > > > > > >On 4/22/05, Nick < nick.petit@(protected)> wrote: > > > > > > > > > > > >>I haven't seen any docs or examples of creating dynamic ppgs done in > > > >>Python but I'm sure it must be feasable... so far I can't seem to get > > > >>the PPG global variable to work with the OnChange callback... I'm > > > >>probably doing this entirely wrong as I'm still fumbling around in the > > > >>dark, but this works in jscript and in vbs but I can't seem to make it > > > >>work in python... > > > >> > > > >>olayout.Logic = str(OnInit()) + \ > > > >> str(Cons_OnChanged()) > > > >> > > > >># then I define my functions > > > >> > > > >>def OnInit(opset): > > > >> olayout = PPG.PPGLayout > > > >> > > > >>This keeps on returning this error: > > > >> > > > >>#ERROR : Traceback (most recent call last): > > > >># File "<Script Block >", line 100, in ? > > > >># PPGCreator() > > > >># File "<Script Block >", line 38, in PPGCreator > > > >># olayout.Logic = str(OnInit(opset)) + str(Cons_OnChanged(opset)) > > > >># File "<Script Block >", line 41, in OnInit > > > >># olayout = PPG.PPGLayout > > > >>#NameError: global name 'PPG' is not defined > > > >># - [line 41] > > > >> > > > >>I can hack it in a very fugly way so it will work on init by passing > > > >>the functions the actual custom prop object as a variable, but after > > > >>it's been created this variable no longer exists in the logic section > > > >>and I'd rather not get it using a Dictionary.GetObject as it's just > > > >>not reliable enough. If someone could shed some light on where I've > > > >>gone wrong that would be really appreciated... :) > > > >> > > > >>Cheers! > > > >>Nick. > > > >> > > > >>--- > > > >>Unsubscribe? Mail Majordomo@(protected) with the following text in > body: > > > >>unsubscribe xsi > > > >> > > > >> > > > >> > > > > > > > > > > > > > > > > > > --- > > > Unsubscribe? Mail Majordomo@(protected) with the following text in > body: > > > unsubscribe xsi > > > > > > > --- > > Unsubscribe? Mail Majordomo@(protected) with the following text in body: > > unsubscribe xsi > > > > > > -- > Aloys Baillet - Character TD @ Animal Logic
--- Unsubscribe? Mail Majordomo@(protected) with the following text in body: unsubscribe xsi
|
|