Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    Getting User Data (DescID issue) [resolved]

    Scheduled Pinned Locked Moved PYTHON Development
    3 Posts 0 Posters 330 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      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 (%)

      screenshot of User Data

      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] : brightness

      then 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.083

      Which 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] 700

      ok 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 is

      idString = 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

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        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

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          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 ranges

          so i presume str(obj) is more standard than obj.__str__()
          i'm still new in python

          I 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!

          1 Reply Last reply Reply Quote 0
          • First post
            Last post