On 30/07/2017 at 03:22, xxxxxxxx wrote:
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 #check stored value, on next launch the scipt it must be 1.0, but still None bc.SetFloat(1,1.0) wbc.SetContainer(PLUGINID,bc) c4d.SetWorldContainer(wbc) print bc if __name__=='__main__': 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() color_bc.SetVector(0,c4d.Vector(0,0,0)) else: i = len(color_bc) color_bc.SetVector(i,c4d.Vector(i,i,i)) bc.SetContainer(1,color_bc) data.SetContainer(PLUGIN_ID,bc) op.SetData(data) bc = data.GetContainerInstance(PLUGIN_ID) color_bc = bc.GetData(1) for i,v in color_bc: print i,v if __name__=='__main__': 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().