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

    Storing Lists in BaseContainer [SOLVED]

    Scheduled Pinned Locked Moved PYTHON Development
    5 Posts 0 Posters 494 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 16/11/2014 at 05:47, xxxxxxxx wrote:

      Basecontainers do not seem to be able to store Value, other than the supported Set*Type* Value.
      For instance trying to add a list:

        
      bc = c4d.BaseContainer()  
      liste = []  
      bc.SetData(1000, liste)  
      

      results in: TypeError: could not convert 'list'

      So how can this be done?
      And if not, how do you store a list or dictonary within an object or document?
      Sure, you could add all the list items one by one to a BaseContainer, but that does not seem like an appropriate way to do this?

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

        On 16/11/2014 at 07:07, xxxxxxxx wrote:

        You can store it as an attribute of your Object/Tag/ShaderData class
        then write/read the data from/to file in Read() and Write(), and copy the
        data to another instance of your class in CopyTo().

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

          On 16/11/2014 at 07:43, xxxxxxxx wrote:

          Ok, I think this is not what Im after, don´t want to use any external files, it should really get stored within the document.

          An example:

          I create a workflow command plugin, which needs to store and read lists of, for example, point IDs.
          This point index list I want to store within the doc´s bc.

          With a Sub Basecontainer in doc´s bc I could convert the list to a bc:

              bc = c4d.BaseContainer()  
            p_list = [11, 22, 33, 44]  
            for i, p in enumerate(p_list) :  
                bc.SetData(i, p)
          

          But really, this does seem like a very stupid  way, with lots of unnecessary computing and storing to convert list back and forth. Especially as lists get bigger.

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

            On 17/11/2014 at 02:31, xxxxxxxx wrote:

            Hello,

            the functions Niklas was talking about are member functions of any NodeData based plugin[URL-REMOVED]. These functions allow you to handle member data when objects are saved with or loaded with the BaseDocument, so no other files than the scene file are involved.

            So the most elaborate way would be to create a NodeData based plugin that stores the data and handles the Read/Write/Copy process. What kind of plugin you would use depends on your workflow.

            A more simple idea would be to write all your data into a string, store that string and later use split() to rebuild the array.

            Best wishes,
            Sebastian


            [URL-REMOVED] @maxon: This section contained a non-resolving link which has been removed.

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

              On 17/11/2014 at 06:02, xxxxxxxx wrote:

              Ah, have to do some research about that I guess.
              For now storing a number list as a string will do the job. Thanks, you two 🙂

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