access userdata inside userdata group [SOLVED]

On 08/07/2015 at 08:45, xxxxxxxx wrote:

Hi, I am trying to create a script that will reset all the userdata under a userdata group back to their defaults. I am a Python beginner. Any suggestions as to how I would go about this? Any help would be greatly appreciated. Thanks.

On 08/07/2015 at 09:23, xxxxxxxx wrote:

So far I have this:

import c4d
for id, bc in op.GetUserDataContainer() :
    try:
        op[id] = bc[c4d.DESC_DEFAULT]
    except TypeError:
         #No or invalid default value.
        pass

c4d.EventAdd()

But this resets all the userdata and I want to reset only the userdata within a specific userdata group.

On 09/07/2015 at 02:10, xxxxxxxx wrote:

Any help on this would be really appreciated. Thanks.

On 09/07/2015 at 02:17, xxxxxxxx wrote:

Hello,

if you just want to reset the userdata of a specific userdata group you have to check if a given userdata parameter is part of that group. You can access DESC_PARENTGROUP to get the ID of the parent group. So your code could look something like this:

  
  for id, bc in op.GetUserDataContainer() :  
  
      if bc[c4d.DESC_PARENTGROUP][-1].id == 2:  
          op[id] = bc[c4d.DESC_DEFAULT]  

Best wishes,
Sebastian

On 09/07/2015 at 03:33, xxxxxxxx wrote:

I get an error message:

Traceback (most recent call last) :
File "scriptmanager", line 11 in ,module.
TypeError:_setitem_expected int or bool, not None

On 09/07/2015 at 06:00, xxxxxxxx wrote:

Originally posted by xxxxxxxx

I get an error message:

Traceback (most recent call last) :
File "scriptmanager", line 11 in ,module.
TypeError:_setitem_expected int or bool, not None

Hi
I test code and simple print to dive in to level

    for id, bc in op.GetUserDataContainer() :  
      print bc[c4d.DESC_PARENTGROUP][-1].id  
      if bc[c4d.DESC_PARENTGROUP][-1].id == 700:  
          op[id] = bc[c4d.DESC_DEFAULT]

i have id in level = 700.

Try such, code works for me

On 09/07/2015 at 06:18, xxxxxxxx wrote:

I tried your code and still get the same error message.

On 09/07/2015 at 06:22, xxxxxxxx wrote:

If I try this code from the Script Manager, it works and only userdata from group 255 is reset but when it is on a Python tag, it doesn't. Any suggestions?

import c4d

for id, bc in op.GetUserDataContainer() :
    
    if bc[c4d.DESC_PARENTGROUP][-1].id == 255:
        try:
            op[id] = bc[c4d.DESC_DEFAULT]
        except TypeError:
             #No or invalid default value.
            pass

c4d.EventAdd()

On 09/07/2015 at 08:02, xxxxxxxx wrote:

For a Python Tag, "op" is the Tag, not the Object. Use the variable "obj" in all places instead of "op" and add "obj = op.GetObject()" beforehand.

On 09/07/2015 at 10:57, xxxxxxxx wrote:

Thanks, Niklas, that totally worked! The last thing I need and can't get to work is the switch. Here is what I have:

import c4d

obj = op.GetObject()
ID_RESET_Iceland = 39
        
def main() :
    
    for id, bc in obj.GetUserDataContainer() :
        
        if bc[c4d.DESC_PARENTGROUP][-1].id == 255:
            
            if obj[c4d.ID_USERDATA, ID_RESET_Iceland]:
                obj[c4d.ID_USERDATA, ID_RESET_Iceland] = False
                
                try:
                    obj[id] = bc[c4d.DESC_DEFAULT]
                except TypeError:
                     #No or invalid default value.
                    pass
    
    c4d.EventAdd()

if __name__=='__main__':
    main()

On 09/07/2015 at 11:44, xxxxxxxx wrote:

I now have this but it still doesn't work.

import c4d

obj = op.GetObject()
ID_RESET_Iceland = 39
        
def main() :
    
    for id, bc in obj.GetUserDataContainer() :
        
        if (bc[c4d.DESC_PARENTGROUP][-1].id == 255 and 
        obj[c4d.ID_USERDATA, ID_RESET_Iceland] == False) :
           
                try:
                    obj[id] = bc[c4d.DESC_DEFAULT]
                except TypeError:
                     #No or invalid default value.
                    pass
    
    c4d.EventAdd()

if __name__=='__main__':
    main()

On 09/07/2015 at 17:10, xxxxxxxx wrote:

Try this instead

import c4d
ID_RESET_Iceland = 39
        
def main() :
    obj = op.GetObject()
    if not obj[c4d.ID_USERDATA, ID_RESET_Iceland]:
        return
    obj[c4d.ID_USERDATA, ID_RESET_Iceland] = False
  
    for id, bc in obj.GetUserDataContainer() :    
        if bc[c4d.DESC_PARENTGROUP][-1].id == 255:
            try:
                obj[id] = bc[c4d.DESC_DEFAULT]
            except TypeError:
                pass
    c4d.EventAdd()

Don't use that __name__ == "__main__" part in a Python Tag

On 09/07/2015 at 19:59, xxxxxxxx wrote:

It works! You are a genius! Thanks very much for this Niklas. :slightly_smiling_face:

On 09/07/2015 at 20:19, xxxxxxxx wrote:

One problem, the script keeps looping after I activate the reset button. Is there a way to stop it?

On 09/07/2015 at 20:23, xxxxxxxx wrote:

Figured that out. Moved c4d.EventAdd() out of the for loop. But now it resets regardless of whether or not the reset switch is activated.

import c4d
ID_RESET_Iceland = 39
        
def main() :
    obj = op.GetObject()
    if not obj[c4d.ID_USERDATA, ID_RESET_Iceland]:
        return
    obj[c4d.ID_USERDATA, ID_RESET_Iceland] = False

for id, bc in obj.GetUserDataContainer() :    
        if bc[c4d.DESC_PARENTGROUP][-1].id == 255:
            try:
                obj[id] = bc[c4d.DESC_DEFAULT]
            except TypeError:
                pass
   
                
c4d.EventAdd()

On 10/07/2015 at 15:48, xxxxxxxx wrote:

Got it working! I had the wrong userdata id number.

import c4d

def main() :
    
    ID_RESET_Iceland = 121
    obj = doc.SearchObject("DEEP FREEZE")
    #obj = op.GetObject()
    
    if obj[c4d.ID_USERDATA, ID_RESET_Iceland]:
        obj[c4d.ID_USERDATA, ID_RESET_Iceland] = False

for id, bc in obj.GetUserDataContainer() :    
            if bc[c4d.DESC_PARENTGROUP][-1].id == 255:
                try:
                    obj[id] = bc[c4d.DESC_DEFAULT]
                except TypeError:
                    pass
                    
        for id, bc in obj.GetUserDataContainer() :    
            if bc[c4d.DESC_PARENTGROUP][-1].id == 277:
                try:
                    obj[id] = bc[c4d.DESC_DEFAULT]
                except TypeError:
                    pass
                    
        for id, bc in obj.GetUserDataContainer() :    
            if bc[c4d.DESC_PARENTGROUP][-1].id == 515:
                try:
                    obj[id] = bc[c4d.DESC_DEFAULT]
                except TypeError:
                    pass
                    
        for id, bc in obj.GetUserDataContainer() :    
            if bc[c4d.DESC_PARENTGROUP][-1].id == 516:
                try:
                    obj[id] = bc[c4d.DESC_DEFAULT]
                except TypeError:
                    pass
    
   
                
c4d.EventAdd()