User data Preset [SOLVED]
-
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 collectionsType = 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!')
=============================================================================
Internals start here
=============================================================================
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,
}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 ing
if they're not already built.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'] = dcountupdate_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] = 0The 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:
import c4d
import collectionsdef 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 = 3The 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!