Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
On 27/01/2017 at 15:34, xxxxxxxx wrote:
I am trying to set up a User Data preset. So far, I have some radio buttons. The user chooses a preset. He then makes some changes. I want him to be able to click on a button and the data is transferred to a User Preset. Here is what I have:
import c4d import collections
Type = collections.namedtuple('Type', 'name value_id presets') Preset = collections.namedtuple('Preset', 'name group_id')
Container = [ Type('Spritz! v2', 13, { 0: Preset('Classic Beer', 21), 1: Preset('Cool Pop', 216), 2: Preset('Dew', 244), 3: Preset('Fridge', 272), 4: Preset('Summer', 440), 5: Preset('Mountain', 1), 6: Preset('Cooler', 300), 7: Preset('Picnic', 328), 8: Preset('Heat Wave', 356), 9: Preset('Drive-in', 384), 10: Preset('User Preset 1', 480), 11: Preset('User Preset 2', 541), 12: Preset('User Preset 3', 574), 13: Preset('User Preset 4', 607), }), ]
Ids = { 'on_off_switch': 184, 'bake_button': 432, }
def get_selected_type(rig) : return Container[0]
def update_parameters(rig) :
obj = doc.SearchObject('Spritz!')
g = { 'dcount': None,
# Automatically computed from the Container data. Contains # the IDs of the groups that are hidden except if they're selected # by their preset value. 'group_ids': None, }
Container
def update_visibility(rig) : build_caches()
selected_type = get_selected_type(rig) preset_value = rig[c4d.ID_USERDATA, selected_type.value_id] selected_preset = selected_type.presets[preset_value] print (preset_value)
for desc_id, desc_bc in rig.GetUserDataContainer() : elem_id = desc_id[1].id if elem_id not in g['group_ids']: continue
# Update the parameter to its new hidden status if it doesn't correspend. hidden = (elem_id != selected_preset.group_id) if bool(desc_bc[c4d.DESC_HIDE]) ^ hidden: desc_bc[c4d.DESC_HIDE] = hidden rig.SetUserDataContainer(desc_id, desc_bc)
def build_caches() : #Updates caches in g if they're not already built.
g
if g['group_ids'] is None: g['group_ids'] = group_ids = set() for type_ in Container: for preset in type_.presets.itervalues() : group_ids.add(preset.group_id)
def main() : rig = op.GetObject() # Check if the data on the rig has changed. If it hasn't, we can # stop here already. dcount = rig.GetDirty(c4d.DIRTYFLAGS_DATA) if dcount == g.get('dcount') : return g['dcount'] = dcount
update_parameters(rig) update_visibility(rig) def user_presets() : Set_UP1 = 537 Set_UP2 = 536 Set_UP3 = 539 Set_UP4 = 540 #Classic Beer Classic_Beer_MASTER_Coalesce = rig[c4d.ID_USERDATA, 196] Classic_Beer_Coalesce_Amount = rig[c4d.ID_USERDATA, 197] Classic_Beer_BIG_and_SMALL_Random_Scale = rig[c4d.ID_USERDATA, 198] Classic_Beer_Mesh_Density = rig[c4d.ID_USERDATA, 199] Classic_Beer_BIG_Drops = rig[c4d.ID_USERDATA, 201] Classic_Beer_BIG_Count = rig[c4d.ID_USERDATA, 202] Classic_Beer_BIG_Size = rig[c4d.ID_USERDATA, 203] Classic_Beer_Random_Seed_BIG = rig[c4d.ID_USERDATA, 204] Classic_Beer_SMALL_Drops = rig[c4d.ID_USERDATA, 206] Classic_Beer_SMALL_Count = rig[c4d.ID_USERDATA, 207] Classic_Beer_SMALL_Size = rig[c4d.ID_USERDATA, 208] Classic_Beer_Random_Seed_SMALL = rig[c4d.ID_USERDATA, 209] Classic_Beer_MICRO_Drops = rig[c4d.ID_USERDATA, 211] Classic_Beer_MICRO_Coalesce_Amount = rig[c4d.ID_USERDATA, 214] Classic_Beer_MICRO_Count = rig[c4d.ID_USERDATA, 212] Classic_Beer_MICRO_Size = rig[c4d.ID_USERDATA, 213] Classic_Beer_Random_Seed_MICRO = rig[c4d.ID_USERDATA, 215] Classic_Beer_MIST = rig[c4d.ID_USERDATA, 190] Classic_Beer_MIST_Amount = rig[c4d.ID_USERDATA, 191] Classic_Beer_MIST_Droplet_Size = rig[c4d.ID_USERDATA, 192] Classic_Beer_Random_Seed_MIST = rig[c4d.ID_USERDATA, 193] Classic_Beer_Random_Scale_MIST = rig[c4d.ID_USERDATA, 194] #User Preset 1 UP1_MASTER_Coalesce = rig[c4d.ID_USERDATA, 507] UP1_Coalesce_Amount = rig[c4d.ID_USERDATA, 508] UP1_BIG_and_SMALL_Random_Scale = rig[c4d.ID_USERDATA, 509] UP1r_Mesh_Density = rig[c4d.ID_USERDATA, 510] UP1_BIG_Drops = rig[c4d.ID_USERDATA, 512] UP1_BIG_Count = rig[c4d.ID_USERDATA, 513] UP1_BIG_Size = rig[c4d.ID_USERDATA, 514] UP1_Random_Seed_BIG = rig[c4d.ID_USERDATA, 515] UP1_SMALL_Drops = rig[c4d.ID_USERDATA, 517] UP1_SMALL_Count = rig[c4d.ID_USERDATA, 518] UP1_SMALL_Size = rig[c4d.ID_USERDATA, 519] UP1_Random_Seed_SMALL = rig[c4d.ID_USERDATA, 520] UP1_MICRO_Drops = rig[c4d.ID_USERDATA, 523] UP1_MICRO_Coalesce_Amount = rig[c4d.ID_USERDATA, 5214] UP1_MICRO_Count = rig[c4d.ID_USERDATA, 525] UP1_MICRO_Size = rig[c4d.ID_USERDATA, 526] UP1_Random_Seed_MICRO = rig[c4d.ID_USERDATA, 527] UP1_MIST = rig[c4d.ID_USERDATA, 531] UP1_MIST_Amount = rig[c4d.ID_USERDATA, 532] UP1_MIST_Droplet_Size = rig[c4d.ID_USERDATA, 533] UP1_Random_Seed_MIST = rig[c4d.ID_USERDATA, 534] UP1_Random_Scale_MIST = rig[c4d.ID_USERDATA, 535] if rig[c4d.ID_USERDATA, Set_UP1] == 1: #resets User Preset 1 button if preset_value == 0: UP1_MASTER_Coalesce = Classic_Beer_MASTER_Coalesce UP1_Coalesce_Amount = Classic_Beer_Coalesce_Amount UP1_BIG_and_SMALL_Random_Scale = Classic_Beer_BIG_and_SMALL_Random_Scale UP1_Mesh_Density = Classic_Beer_Mesh_Density UP1_BIG_Drops = Classic_Beer_BIG_Drops UP1_BIG_Count = Classic_Beer_BIG_Count UP1_BIG_Size = Classic_Beer_BIG_Size UP1_Random_Seed_BIG = Classic_Beer_Random_Seed_BIG UP1_SMALL_Drops = Classic_Beer_SMALL_Drops UP1_SMALL_Count = Classic_Beer_SMALL_Count UP1_SMALL_Size = Classic_Beer_SMALL_Size UP1_Random_Seed_SMALL = Classic_Beer_Random_Seed_SMALL UP1_MICRO_Drops = Classic_Beer_MICRO_Drops UP1_MICRO_Coalesce_Amount = Classic_Beer_MICRO_Coalesce_Amount UP1_MICRO_Count = Classic_Beer_MICRO_Count UP1_MICRO_Size = Classic_Beer_MICRO_Size UP1_Random_Seed_MICRO = Classic_Beer_Random_Seed_MICRO UP1_MIST = Classic_Beer_MIST UP1_MIST_Amount = Classic_Beer_MIST_Amount UP1_MIST_Droplet_Size = Classic_Beer_MIST_Droplet_Size UP1_Random_Seed_MIST = Classic_Beer_Random_Seed_MIST UP1_Random_Scale_MIST = Classic_Beer_Random_Scale_MIST rig[c4d.ID_USERDATA, Set_UP1] = 0
The radio button selector shows and hides the controls for its specific preset nicely (probably because Niklas wrote the code But then, it all goes to hell. Can anyone help? Thanks.
On 29/01/2017 at 04:23, xxxxxxxx wrote:
Simplifying the problem:
def main() : rig = op.GetObject() Set_UP1 = 537 preset_value = rig[c4d.ID_USERDATA, 13] #Classic Beer Classic_Beer_MASTER_Coalesce = rig[c4d.ID_USERDATA, 196] Classic_Beer_Coalesce_Amount = rig[c4d.ID_USERDATA, 197]
#User Preset 1 UP1_MASTER_Coalesce = rig[c4d.ID_USERDATA, 507] UP1_Coalesce_Amount = rig[c4d.ID_USERDATA, 508]
if rig[c4d.ID_USERDATA, Set_UP1]: rig[c4d.ID_USERDATA, Set_UP1] = 0 #resets User Preset 1 button if preset_value == 0: print (preset_value) UP1_MASTER_Coalesce = Classic_Beer_MASTER_Coalesce UP1_Coalesce_Amount = 3
The Set_UP1 switch resets itself but I can't get the UP1 values to change. Any help? Thanks.
On 29/01/2017 at 09:25, xxxxxxxx wrote:
If your other code is correct. One, or possibly both, of these should fix the updating problem. Try the SendCoreMessage() first.
op.SetUserDataContainer(descId, container)
c4d.SendCoreMessage(c4d.COREMSG_CINEMA, c4d.BaseContainer(c4d.COREMSG_CINEMA_FORCE_AM_UPDATE))
-ScottA
On 30/01/2017 at 05:18, xxxxxxxx wrote:
Neither of these work. Do you have any other ideas? I get no errors when I compile and nothing untoward is showing up in the console.
On 30/01/2017 at 05:39, xxxxxxxx wrote:
It looks like there is a problem defining user data as a variable.
Classic_Beer_Coalesce_Amount = rig[c4d.ID_USERDATA, 197] UP1_Coalesce_Amount = rig[c4d.ID_USERDATA, 508]
C4D doesn't like this for some reason.
UP1_Coalesce_Amount = Classic_Beer_Coalesce_Amount doesn't work but rig[c4d.ID_USERDATA, 508] = rig[c4d.ID_USERDATA, 197] does work. Any ideas?
On 30/01/2017 at 06:02, xxxxxxxx wrote:
It's just how python work.
For exemple
Classic_Beer_Coalesce_Amount = rig[c4d.ID_USERDATA, 197]
the variable class_beer_coalesce_amount is egal to the value of rig[user_id]. so we can simpify as class_beer_coalesce_amount = 10 (I take 10 just as an exemple)
So by doing
UP1_Coalesce_Amount = Classic_Beer_Coalesce_Amount
You tell my first variable who store a value of 10 for exemple is now egal to my second variable who is egal to 20. But that only change variable value not the user id.
In you second exemple
rig[c4d.ID_USERDATA, 508] = rig[c4d.ID_USERDATA, 197]
For a better understanding is similar to
bc = rig.GetDataInstance() bc.SetData(508, bc.GetData(197))
A good read https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/
Hope it's help you
Btw in future please use [ code] and [ /code] for posting code in the forum
On 30/01/2017 at 06:13, xxxxxxxx wrote:
Thanks! [ code]! So that's how you get it to look like that in the posts!
On 30/01/2017 at 06:24, xxxxxxxx wrote:
[ code]
bc = rig.GetDataInstance() bc.SetData(508, bc.GetData(197)) [ /code] doesn't work. Do you have another suggestion?
On 30/01/2017 at 06:42, xxxxxxxx wrote:
If you want a switch here is an exemple with container and another one which is more efficient (since we dont have to iterate the list)
import c4d def switch_user_data(obj, first, second) : #Set first value to the second value list_ud = obj.GetUserDataContainer() buffer_first = None buffer_second = None for descId, bc in list_ud: buffer_id = descId[1].id if buffer_id == first: buffer_first = obj[c4d.ID_USERDATA, buffer_id] #store the value elif buffer_id == second: buffer_second = obj[c4d.ID_USERDATA, buffer_id] #store the value #Check if we find our user data if buffer_first is not None and buffer_second is not None: obj[c4d.ID_USERDATA, first] = buffer_second obj[c4d.ID_USERDATA, second] = buffer_first c4d.EventAdd() def efficient_switch(obj, first, second) : try: buffer_first = obj[c4d.ID_USERDATA, first] obj[c4d.ID_USERDATA, first] = obj[c4d.ID_USERDATA, second] obj[c4d.ID_USERDATA, second] = buffer_first c4d.EventAdd() except: print "error can't switch" def main() : obj = doc.GetFirstObject() efficient_switch(obj, 1, 5) switch_user_data(obj, 1, 2) if __name__=='__main__': main()
On 30/01/2017 at 06:49, xxxxxxxx wrote:
Thanks!