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 <[email protected]>
Subject: Pulling a PPG combo box name into a Render token path - Help
please.
To: [email protected]
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