Adding/Removing UserData from PlugingTag

On 09/02/2013 at 17:59, xxxxxxxx wrote:

Hi all,

Ive got a Plugin-tag and Id like to add or remove userdatas. Adding works, but removing is a problem. I have already tried out various things, but nothing has worked. Here are some naked lines. Which command do I need to update the userdatacontainer immediately?

import os  
import math  
import sys  
import c4d  
from c4d import plugins, utils, bitmaps, gui  
# be sure to use a unique ID obtained from  
PLUGIN_ID = 145268788 #TestID  
class TagPlugin(plugins.TagData) :  
  def Init(self, node) :  
      return True  
  def Message(self, node, type, data) :  
      if type==c4d.MSG_DESCRIPTION_COMMAND:   
          if data["id"][0].id == 10001: self.AddUD(node)  
          elif data["id"][0].id == 10002: self.RemoveUD(node)  
      return True  
  def Execute(self, tag, doc, op, bt, priority, flags) :#  
      return c4d.EXECUTIONRESULT_OK  
  def AddUD(self, node) :  
      data = c4d.GetCustomDatatypeDefault(c4d.DTYPE_BOOL)  
      data[c4d.DESC_NAME] = "Enable"  
      node[node.AddUserData(data)] = False  
  def RemoveUD(self,node) :  
if __name__ == "__main__":  
  dir, file = os.path.split(__file__)  
  bmp = bitmaps.BaseBitmap()  
  bmp.InitWith(os.path.join(dir, "res", "icon.tif"))  

Another problem Ive got are separators. For example:

def AddUD(self, node) :  
      data = c4d.GetCustomDatatypeDefault(c4d.DTYPE_BOOL)  
      data[c4d.DESC_NAME] = "Enable"  
      node[node.AddUserData(data)] = False  
      data = c4d.GetCustomDatatypeDefault(c4d.DTYPE_SEPARATOR)  
      data[c4d.DESC_SEPARATORLINE] = True  
      data = c4d.GetCustomDatatypeDefault(c4d.DTYPE_BOOL)  
      data[c4d.DESC_NAME] = "Enable2"  
      node[node.AddUserData(data)] = False 

The separators are listed in the UserDataManager but hidden in the interface. I wasn´t able to get a solution. What is wrong?

Thanks in anticipation

On 09/02/2013 at 18:47, xxxxxxxx wrote:

I ran into this same annoying problem trying to remove UD using C++.
Apparently the whole tag has to be updated when removing UD. But not when adding them.

Try this:

def RemoveUD(self,node) :  
  c4d.SendCoreMessage(c4d.COREMSG_CINEMA, c4d.BaseContainer(c4d.COREMSG_CINEMA_FORCE_AM_UPDATE))

This is currently not documented in any of the SDK's. But it should be.


On 10/02/2013 at 04:08, xxxxxxxx wrote:

Hello Scott,

the command seems to be brutal, but works perfectly. Thank you very much.
One last little question: Do you happen to know the separator-problem, too?


On 10/02/2013 at 07:53, xxxxxxxx wrote:

Sorry. I can't help with the separator problem.
That's a strange one.


On 10/02/2013 at 15:53, xxxxxxxx wrote:

With some persistence I managed to figure it out.

def addSeparator(obj) :  
  if obj is None: return  
  bc = c4d.GetCustomDatatypeDefault(c4d.DTYPE_SEPARATOR) #Create default container  
  bc[c4d.DESC_NAME] = "My Separator"                     #Rename the entry  
  bc.SetBool(c4d.DESC_SEPARATORLINE, False)  
  obj.AddUserData(bc)                                    #Add the userdata container  
  c4d.EventAdd()                                         #Update C4D

Things like this really should be documented better.


On 11/02/2013 at 02:39, xxxxxxxx wrote:

Wow, thank you very much. I'm very excited. Will try tonight.