PDA

View Full Version : Multilistbox Custom Attribute


JokerMartini
03-29-2012, 04:47 PM
I'm not entirely clear on how the parameters and multilistbox work with one another on custom attributes.
I want to be able to hit append on a button within the custom attribute and it add the item to the listbox.
Just create any object in the scene and run this script. Try to hit the append button. That is where it bugs out.

John


hitDataCA = attributes hitData
(
parameters main rollout:rlFXHits
(
lbHitTimes type:#stringTab ui:lbHitTimes tabSize:1 tabSizeVariable:true default:"#(1)"
)

rollout rlFXHits "Weapon Parameters"
(
button btnSliderHit "Append Slidertime" width:110 height:30
multilistbox lbHitTimes "Active Hit Times:" height:7

on btnSliderHit pressed do
(
times = #()
appendIfUnique times 10
$.modifiers[1].lbHitTimes.items = times
)
)
)

deleteClasses = #(EmptyModifier)
for obj in selection do
(
for i = obj.modifiers.count to 1 by -1 where findItem deleteClasses (classof obj.modifiers[i]) != 0 do
(
deleteModifier obj obj.modifiers[i]
)
)

attr = addmodifier $ (EmptyModifier ui:on)
$.modifiers[#Attribute_Holder].name = "FX_Hit"

custAttributes.add $.modifiers[#FX_Hit] hitDataCA

showproperties $.modifiers[1]

JokerMartini
03-29-2012, 07:34 PM
So I've got the append part working for the listbox.
I for whatever reason can't get it to save the data to the objects attribute holder. As soon as the user deselects the object and then reselects it, the list is empty?
Could use some help here.

Thanks

John


hitDataCA = attributes hitData
(
parameters main rollout:rlFXHits
(
etUserHit type:#string ui:etUserHit default:"10"
lbHitTimes type:#stringTab tabSize:1 tabSizeVariable:true ui:lbHitTimes
)

rollout rlFXHits "FX Parameters"
(
groupbox gbHitTimes "Hit Times" width:136 height:134
button btnSliderHit "Append Slidertime" width:110 height:30 pos:[26,30]
edittext etUserHit "" text:"5,0,50" width:114 pos:[22,70]
button btnUserHit "Append Times" width:110 height:30 pos:[26,97]
multilistbox lbHitTimes "Active Hit Times:" height:7 pos:[13,154]
button btnClear "Clear Active Times" width:136 height:24

on btnSliderHit pressed do
(
times = #()
appendIfUnique times 10
$.modifiers[1].lbHitTimes.items = times
)

on btnSliderHit pressed do
(
lbHitTimes.items = append lbHitTimes.items (((currentTime as integer)/TicksPerFrame) as string)
)
)
)

deleteClasses = #(EmptyModifier, Vol__Select)
for obj in selection do
(
for i = obj.modifiers.count to 1 by -1 where findItem deleteClasses (classof obj.modifiers[i]) != 0 do
(
deleteModifier obj obj.modifiers[i]
)
)

addModifier $ (Vol__Select level:2 volume:0)
attr = addmodifier $ (EmptyModifier ui:on)
$.modifiers[#Attribute_Holder].name = "FX_Hit"
$.modifiers[#Vol__Select].Gizmo.scale *= 1.1
$.modifiers[#Vol__Select].Gizmo.controller.Position.controller = position_script()

custAttributes.add $.modifiers[#FX_Hit] hitDataCA

JokerMartini
03-30-2012, 07:20 PM
Does anyone know how to get the information to store with the custom attribute.

denisT
03-30-2012, 07:45 PM
Does anyone know how to get the information to store with the custom attribute.
what information do you want to get?

JokerMartini
03-30-2012, 08:34 PM
I have a multilistview on an attribute mod which the listview itself stores an array of numbers the user adds to the list by hitting an append button.

denisT
03-30-2012, 10:30 PM
I have a multilistview on an attribute mod which the listview itself stores an array of numbers the user adds to the list by hitting an append button.
probably you are talking about a multilistbox...
however the path to some control of a CA rollout is <node>.<attributename>.<rolloutname>.<controlname>
in your case it's <node>.hitData.rlFXHits.lbHitTimes

JokerMartini
03-30-2012, 11:00 PM
I understand how to get the information but when i deselect the object and then reselect it the multilistbox is empty. Which i want it to store the numbers that the user created. For some reason it does not remember the values and resets the list to be empty every time it is deselected.

denisT
03-30-2012, 11:17 PM
I understand how to get the information but when i deselect the object and then reselect it the multilistbox is empty. Which i want it to store the numbers that the user created. For some reason it does not remember the values and resets the list to be empty every time it is deselected.
if a control is not wired to a parameter you have to fill it up yourself using the rollout's open event for example

denisT
03-30-2012, 11:20 PM
why is this pink smile face in the header of my post. i didn't set it.
edited:
i found the way to remove it. cool!

JokerMartini
03-30-2012, 11:24 PM
haha I have no idea, that is pretty funny though.

So here is what I have so far. Just select and object and run this script.
I'm not sure why it is not storing the information so when i click back on the object the values in the listbox still remain there.


hitDataCA = attributes hitData
(
parameters main rollout:rlFXHits
(
etUserHit type:#string ui:etUserHit default:"10"
lbHitTimes type:#stringTab tabSize:1 tabSizeVariable:true ui:lbHitTimes
)

rollout rlFXHits "FX Parameters"
(
groupbox gbHitTimes "Hit Times" width:136 height:134
button btnSliderHit "Append Slidertime" width:110 height:30 pos:[26,30]
edittext etUserHit "" text:"5,0,50" width:114 pos:[22,70]
button btnUserHit "Append Times" width:110 height:30 pos:[26,97]
multilistbox lbHitTimes "Active Hit Times:" height:7 pos:[13,154]
button btnClear "Clear Active Times" width:136 height:24

on btnSliderHit pressed do
(
times = #()
appendIfUnique times 10
$.modifiers[1].lbHitTimes.items = times
)

on btnSliderHit pressed do
(
lbHitTimes.items = append lbHitTimes.items (((currentTime as integer)/TicksPerFrame) as string)
)
)
)

deleteClasses = #(EmptyModifier, Vol__Select)
for obj in selection do
(
for i = obj.modifiers.count to 1 by -1 where findItem deleteClasses (classof obj.modifiers[i]) != 0 do
(
deleteModifier obj obj.modifiers[i]
)
)

addModifier $ (Vol__Select level:2 volume:0)
attr = addmodifier $ (EmptyModifier ui:on)
$.modifiers[#Attribute_Holder].name = "FX_Hit"
$.modifiers[#Vol__Select].Gizmo.scale *= 1.1
$.modifiers[#Vol__Select].Gizmo.controller.Position.controller = position_script()

custAttributes.add $.modifiers[#FX_Hit] hitDataCA

JokerMartini
04-02-2012, 06:08 PM
The information is not stored to the list with the maxfile.

Zbuffer
04-03-2012, 06:26 AM
Just do what Denis recommends:
Since you set the listbox indirectely via the buttons, you need to populate it using the "on open" handler of the rollout:

...
on rlFX open do
(
times = this.lbHitTimes as array
lbHitTimes.item = times
)

PePeTD
04-04-2012, 03:25 AM
Aight man so bellow you will find a version that works, you were declaring lbHitTimes twice, first as a stringTab parameter, then as a multiListbox they were both under the custAttribute so they are local to it therefore that variable name got declared twice.

I went ahead and changed the parameter name to HitTimes and unassigned the UI item that you had assigned to it. I do not believe you can assign a UI item to a stringTab like you can to a Float or Integer value, in the case of a slider or spinner ( I could be wrong ).

Whenever an item gets appended to the lbHitTimes, I copy it to the HitTimes parameter, I also added a on open event that checks if the stringTab is empty if it is not then it collects the stringTab items into the lbHitTimes.items now it should work like you described.

hope that helps :). commented the script a bit for ya to help !


hitDataCA = attributes hitData
(
parameters main rollout:rlFXHits
(
etUserHit type:#string ui:etUserHit default:"10"
HitTimes type:#stringTab tabSize:0 tabSizeVariable:true -- changed the parameter name also changed tabsize to 0 so it would not add an undefined item to the array
)

rollout rlFXHits "FX Parameters"
(
groupbox gbHitTimes "Hit Times" width:136 height:134
button btnSliderHit "Append Slidertime" width:110 height:30 pos:[26,30]
edittext etUserHit "" text:"5,0,50" width:114 pos:[22,70]
button btnUserHit "Append Times" width:110 height:30 pos:[26,97]
multilistbox lbHitTimes "Active Hit Times:" height:7 pos:[13,154]
button btnClear "Clear Active Times" width:136 height:24

on btnSliderHit pressed do -- BOTH BUTTON EVENTS ARE USING THE SAME HANDLER ???
(
times = #()
appendIfUnique times 10
$.modifiers[1].lbHitTimes.items = times
)

on btnSliderHit pressed do -- BOTH BUTTON EVENTS ARE USING THE SAME HANDLER ???
(
lbHitTimes.items = append lbHitTimes.items (((currentTime as integer)/TicksPerFrame) as string)
HitTimes = lbHitTimes.items-- here we copy the items onto the stringTab
)

on rlFXHits open do
(
if HitTimes.count != 0 do -- this makes sure that the stringTab is not empty
(
lbHitTimes.items = for x in HitTimes collect x -- assigning the stringTab directly gives you an error so we go through and collect everyitem
)
)
)
)

deleteClasses = #(EmptyModifier, Vol__Select)
for obj in selection do
(
for i = obj.modifiers.count to 1 by -1 where findItem deleteClasses (classof obj.modifiers[i]) != 0 do
(
deleteModifier obj obj.modifiers[i]
)
)

addModifier $ (Vol__Select level:2 volume:0)
attr = addmodifier $ (EmptyModifier ui:on)
$.modifiers[#Attribute_Holder].name = "FX_Hit"
$.modifiers[#Vol__Select].Gizmo.scale *= 1.1
$.modifiers[#Vol__Select].Gizmo.controller.Position.controller = position_script()

custAttributes.add $.modifiers[#FX_Hit] hitDataCA

JokerMartini
04-09-2012, 06:38 PM
Thanks for clearing that up. I read up on the comments and they really helped better explain things.

Thanks
John

CGTalk Moderation
04-09-2012, 06:38 PM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.