A list is a 1-dimensional array.  A combo box is a list of label/value pairs 
using a 1-dimensional array to mimic a 2-dimensional array.  the 
_DefineLayout() callback is defined as such:

def ComboTest_DefineLayout( in_ctxt ):

    oLayout = in_ctxt.Source
    oLayout.Clear()
    oLayout.AddEnumControl("List", ("chocolate", 0, "vanilla", 1, "strawberry", 
2), "Flavor", constants.siControlCombo )
    oLayout.AddButton("Update")
    
    return true


If we make some simple visual adjustments to how we write our code, it can give 
us some basic insight how it works:

    list aComboBoxItems = (
        "chocolate",  0,
        "vanilla",    1,
        "strawberry", 2
    );
    oLayout.AddEnumControl( "List", aComboBoxItems, "Flavor", 
constants.siControlCombo );

By putting each label/value pair on it’s own line, I visually make the intended 
associations.  when the list populates the combo box in the PPG, the PPG shows 
the label in the menu, but when you change the parameter or request the 
parameter’s value, you’ll receive the associated numeric value.  for example, 
if you choose “vanilla” in the PPG, querying the parameter will return the 
value of 1.  conversely, if you want a script to update the PPG and display 
“strawberry” in the menu, you must assign the value of 2 to the parameter (eg; 
CustomProperty.Parameters( “List” ).value = 2).

If we strip away the cosmetics and look at the underlying structure, the list 
is a set of indices:

    # rewriting the list replacing the label/value pairs with their respective 
indices:
    list aComboBoxItems = [
        0, 1,
        2, 3,
        4, 5
    ];

When the PPG is displayed, the menu only shows the even numbered indices in the 
combo box.  When you request the value or modify the value of the parameter, 
you only have access to the odd numbered indices.  To answer your own question, 
if you want the label portion of the current combo box item, you must extract 
the list and pull the even numbered index associated with the value.

example:

    CustomProperty = PPG.Inspected.Item(0);
    oParameter     = oCustomProperty.Parameters( "List" );

    oPPGLayout     = CustomProperty.PPGLayout;
    oPPGItem       = oPPGLayout.Item( "List" );
    aComboBoxItems = oPPGItem.UIItems;

        # assumes ‘value’ in the label/value pair is numbered in ascending 
order from 0.
        LabelIndex = ( oParameter.Value * 2 ) – 1;
    Label      = aComboBoxItems[ LabelIndex ];

    LogMessage( "Label: " + Label, constants.siComment );


Alternately, if you have no use for the value being a number, you can make it a 
string with whatever you’d prefer to pass on to your render script.  for 
example:

    list aComboBoxItems = (
        "chocolate",  "Chocolate",
        "vanilla",    "Vanilla",
        "strawberry", "Strawberry"
    );
    oLayout.AddEnumControl( "List", aComboBoxItems, "Flavor", 
constants.siControlCombo );


This, of course, precludes you from using the simple algorithm in the previous 
example to extract the label portion of the combo box item.  In which case, 
you’ll need to traverse the odd numbered items in the list until you find your 
desired value, then backup one index to get the associated label.

I’ve always found it good form to make your code visually tidy and neat as it 
serves a few practical purposes:

    - easier to read
    - can make code easier to understand
    - makes inconsistencies easy to spot (ie; bugs and syntax errors)


Matt








Date: Thu, 4 Dec 2014 12:52:28 +0000
From: Daniel Sweeney <dan...@northforge.co.uk>
Subject: Pulling a PPG combo box name into a Render token path - Help
please.
To: softimage@listproc.autodesk.com
Message-ID:
<CAH98=h4NXxEy479DTtWRUL=YxC8czgMgpdAW3Xr15=6kige...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

Hi List,

First off I am no way a scripter. been trying to get this to work but
cannot.

So I have some code to make a PPG with a combo box from stephen blair.
http://xsisupport.com/2011/01/10/updating-a-combo-box-from-an-onclicked-callback/

now all I want to do is pull the Lable of the combo box into the render
path via
[Value] token

when I pull in the combo box with [Value ComboTest.list] all it pulls in is
the array value.

is there anyone that can help with this?

Cheers.

Daniel

Reply via email to