How to store data (with a plugin or a script)?



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 04/10/2012 at 11:57, xxxxxxxx wrote:

    Hey guys, this is probably a silly question but I can't figure it out:
    How can I store data? For example let's say I wanna make a plugin, that switches off all hypernurbs but stores which HN-objects were active before I ran the plugin. Where can I store this kind of information/object-link? And is it only possible with plugins or also with scripts?
    I know there are workarounds like adding something like "_#active" to the hypernurbs-name or adding UserData. But that's not what I want, I want the real deal 😉.
    I couldn't find anything with the forum search option which makes me think: it's so easy everybody knows it. So please help me out here.
    Thanx
    Phil



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 04/10/2012 at 14:27, xxxxxxxx wrote:

    Well, I don't know if this is the correct way but what I do is to create a new container with a unique ID (if it is a plug-in, I create a new container with an ID equal to the plugin ID).
    Inside this container, I place all the data that I need.
    And then, I add this container to the container of every object that I need to store the state.

    Rui Batista



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 05/10/2012 at 00:14, xxxxxxxx wrote:

    Hi Rui.
    Thanks for the answer, I kinda was expecting the basecontainer, but honestly I have no idea where to start. So I create a basecontainer like this:

    bc = c4d.BaseContainer()  
    bc.SetString(1, "test")  
    bc.SetId(1234)  
    print bc.GetId()  
    print bc[1]
    

    Easy enough and works without a problem, but how do I store this specific container in the document/file? The SDK says follwoing:

    It is recommended that you use the available containers to store your own values as well. That way they will be automatically saved. However, if you want to store values in the top level of for example an object container, you'll have to use a unique id.

    But I have absolutely no idea how to get an "available container" that will be automatically saved, or how to add to an objects container. Or is adding to an objects container as simple as the follwoing code (given you have an object selected) :

    op[1234] = "test" 
    

    I stumbled yesterday upon this, but it seems way to easy to be the right way. Even if I store a new basecontainer within the document/file, how do I access it. Logical would be doc.GetBasecontainer(id) but there isn't a function like this.
    Thanks in advance.
    Phil



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 05/10/2012 at 01:38, xxxxxxxx wrote:

    Hi Phil,

    You can simply store a new BaseContainer in a document:

    doc[123456789] = bc
    

    And in an object:

    op[123456789] = bc
    

    This container can be accessed at any time and is automatically saved.
    Don't forget that BaseDocument and BaseObject are child of BaseList2D, BaseList2D child of GeListNode and GeListNode child of C4DAtom.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 05/10/2012 at 02:08, xxxxxxxx wrote:

    So it is that easy?
    Thank you very much, I will give it a try. One last question: is it possible to delete these containers or reset the allocation?

    doc[123456789] = None
    

    gives me an error: TypeError expected c4d.BaseContainer, not None.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 05/10/2012 at 02:55, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    One last question: is it possible to delete these containers or reset the allocation?

    doc[123456789] = None
    

    gives me an error: TypeError expected c4d.BaseContainer, not None.

    It seems calling

    del doc[123456789]
    

    deletes the assigned container.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 05/10/2012 at 03:16, xxxxxxxx wrote:

    Thank you very much.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 12/10/2012 at 04:48, xxxxxxxx wrote:

    Interesting stuff! Don't know why I didn't think of this myself.
    Is there also a way to store arbitrary data (like custom python classes) in a basecontainer? Whenever I try, only a -1.0 float value is stored. In the documentation of the basecontainer object we have a method called GetCustomDataType() but no corresponding set method.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/10/2012 at 03:48, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    Is there also a way to store arbitrary data (like custom python classes) in a basecontainer? Whenever I try, only a -1.0 float value is stored. In the documentation of the basecontainer object we have a method called GetCustomDataType() but no corresponding set method.

    It isn't possible to store Python classes in a container. Custom data types are for example FontData, SplineData, InExcludeData etc. These are special data types that CINEMA recognizes.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/10/2012 at 04:01, xxxxxxxx wrote:

    Thats what I thought! Luckily I've found a workaround by now, that makes it possible to store classes in a basecontainer nevertheless.

    Python has a standard module called pickle. It serializes Python objects into ASCII or binary strings. Because Strings are accepted data types for containers I can store whatever object I want using this technique.
    If your code relies on speed you should use cPickle, which is written in native C and therefore lightning fast.

    Hope that helps somebody out there who was struggling with the same problem.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/10/2012 at 06:23, xxxxxxxx wrote:

    Make sure you use an ID registered at the plugincafe for assigning the container to. 😉



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 16/10/2012 at 06:11, xxxxxxxx wrote:

    Yeah, I actually used an ID of 1 when trying this out, but using the plugins (registered) ID is probably the way to go. :)


Log in to reply