SetWorldContainer bug

On 30/07/2017 at 03:22, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   18.057 
Platform:   Windows  ;   
Language(s) :       PYTHON  ;

Method c4d.SetWorldContainer() isn't working in Cinema4D R18.057. 
The container is not updated and the data remains the same.
With C4D R17 this code works fine.
Perhaps this is somehow connected with this bug 

import c4d
PLUGINID = 1234588880
def main() :
    wbc = c4d.GetWorldContainer()
    if not wbc[PLUGINID]:
        bc = c4d.BaseContainer()
        wbc[PLUGINID] = bc
    bc = wbc.GetContainer(PLUGINID)
    print bc[1] #check stored value, on next launch the scipt it must be 1.0, but still None
    print bc[1]
if __name__=='__main__':

On 31/07/2017 at 03:20, xxxxxxxx wrote:


Yes the issue here is related to the other getting containers with [] operator.
The condition if not wbc[PLUGINID] is always entered (returns None) so the container is then always reset.
Use wbc.GetContainer(PLUGINID) instead.

On 01/08/2017 at 03:59, xxxxxxxx wrote:

ok, im trying to find solution. And now other question about BaseContainer:
this code works fine with R17 and not with R18.057.
Whats wrong with this example?

import c4d
from c4d import gui
#Welcome to the world of Python
PLUGIN_ID = 10000025
def main() :
    data = op.GetDataInstance()
    bc = data.GetContainer(PLUGIN_ID)
    color_bc = bc.GetData(1)
    if not color_bc:
        color_bc = c4d.BaseContainer()
        i = len(color_bc)
    bc = data.GetContainerInstance(PLUGIN_ID)
    color_bc = bc.GetData(1)
    for i,v in color_bc: 
        print i,v
if __name__=='__main__':

In all my plug-ins and scripts, I use this method of storing information in an object, document, or program settings containers. But now I just have no idea how this should work. After the release update 18.057 I began to receive a tons of bug reports from users!

On 01/08/2017 at 08:15, xxxxxxxx wrote:

In R18.057 GetData() has the same issue as the get [] operator. Use GetContainer() or GetContainerInstance() instead.
In your script the call to op.SetData(data) is useless because you are already working on the data instance. In the beginning of the script data = op.GetDataInstance().