Getting User Data (DescID issue) [resolved]
-
On 02/05/2014 at 00:38, xxxxxxxx wrote:
Hey all
Here's my first post here. Seems there's a great community here!
I'm currently working on an OSC plugin for C4D which allows you to use c4d as a timelining tool for creative coding purposes. So far it works great, but i'm a little slow at picking up the Python API so far....
Intention:
Enumerate all User Data parameters for a c4d.BaseObject, and for each get the name and the current value.Trial:
I have test parameters:
* brightness (real)
* resolution (long)
* name with spaces (%)
* subgroup (group)
* testSubGroupMember (%)And if I do:
obj.GetUserDataContainer()
i get:
[((2, 19, 0), <c4d.BaseContainer object at 0x118e17bc8>), ((1, 15, 0), <c4d.BaseContainer object at 0x118e0eae8>), ((4, 19, 0), <c4d.BaseContainer object at 0x118f4e340>), ((5, 1, 0), <c4d.BaseContainer object at 0x118f4e308>), ((6, 19, 0), <c4d.BaseContainer object at 0x118f4e030>)]
so i'm able to get the name of each parameter by doing like:
userData = obj.GetUserDataContainer()
userData[0][1].__getitem__(1)
[returns] : brightnessthen i get the name of the 0th parameter, great! so now all I need is the value...
To get each value, I can use
print obj[c4d.ID_USERDATA, index ]
and i can see the correct index from
userData[0][0]
[returns] ( 2 , 19, 0)which is a DescID, and is useful, because it means I can do
print obj[c4d.ID_USERDATA, 2 ]
[returns] : 0.083Which is the correct value.
So far, wonderful!
So now I have to get that index of 2 out of the DescID, so I would do something like:
obj[c4d.ID_USERDATA, userData[0][0][0]
[returns] <c4d.DescLevel object at 0x117c241f8>ok, so that wasn't what I wanted, we get a DescLevel instead of a DescId,
so let's see if we can get the 2 out of that DescLevel....print obj[c4d.ID_USERDATA, userData[0][0][0].id
[returns] 700ok so how do I get the 2 out? I can't see any other accessors which are useful here
currently the only option i can see isidString = obj[c4d.ID_USERDATA, userData[0][0][0].__str__()
and then performing string operations to get the 2 out of "(2, 19, 0)"
but that seems crazy. which is where the question come in :).how to get the 2 out of the DescID?
To note, I'm doing this within the context for an plugins.ObjectData and looking at the child objects
Thank you
-
On 02/05/2014 at 05:05, xxxxxxxx wrote:
Hi elliotwoods,
welcome to the Forum.
Just use the DescID.
> desc_id = user_data[0][0]
> print obj[desc_id]If you still need the actual user-data index, it is stored at the second position. The first is c4d.ID_USERDATA (700)
> index = desc_id[1].id
(the text representation of the DescID is not really helpful.)
Btw, use str() instead of .__str__().
-Niklas
-
On 03/05/2014 at 21:04, xxxxxxxx wrote:
thanks Niklas!
that totally makes sense. not sure why i couldn't see that before
is there a page anywhere with all the c4d constants btw?
i'm often finding constants that i can't identify within many different rangesso i presume str(obj) is more standard than obj.__str__()
i'm still new in pythonI managed to get the exact result that I wanted using:
def GetFirstArg(descID) :
text = descID.__str__()
return int(text.lstrip("(").rstrip(")").split(",")[0])but this seems much more sensible now.
cheers!