Update User Data during loop



  • On 01/10/2013 at 02:38, xxxxxxxx wrote:

    Hello everybody. Below I have a very simplified version of what I'm trying to create.

    The simplified code:
    Runs a loop to get all of the user data and prints it to the console
    Creates a new user data object (just lifted that straight from the documentation)
    Runs the same loop again and print to the console again.

    The results in the console are identical and I have to run the script again to be able to access the new userdata.

    Import c4d

    def main() :
      obj = doc.SearchObject("Null")

    ud = obj.GetUserDataContainer()
     
      for id, bc in ud:
          print id, bc[1]   # The readout on console shows Test data 1 and Test data 2
         
      bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_LONG) # Create default container
      bc[c4d.DESC_NAME] = "Test data 3"                        # Rename the entry

    element = obj.AddUserData(bc)     # Add userdata container
      obj[element] = 0                # Assign a value
      c4d.EventAdd()                    # Update

    for id, bc in ud:
          print id, bc[1] #The readout on console shows Test data 1 and Test data 2 but no sign of Test data 3
         
    if __name__=='__main__':
      main()

    I know I can set all of the parameters before I create the userdata, however what I intend to do is create a group and then clone some userdata and nest it in the group without having to run the script twice.

    My question is: Can I access newly created/cloned userdata within a single execution of a script?

    Any help is much appreciated.

    Thanks

    Adam



  • On 01/10/2013 at 08:09, xxxxxxxx wrote:

    scripts are single threaded / executed from the c4d main thread. the general approach you would
    take on this would be a python tag. the python tag code single threaded too, but it allows you to
    use some fallthrough construct to split your task into two passes.

    if data not in userdata:
    UpdateMe()
    elif condition is met:
    DoSomething()
     
    edit: lol, I just realized that I have hit the posting count sweet spot for my nick ;)



  • On 01/10/2013 at 08:25, xxxxxxxx wrote:

    UserData works the same way as other objects.
    If you change it in some manner. You have to grab it again after the changes were made to get it's current values.

    import c4d  
    def main() :  
      obj = doc.SearchObject("Null")  
        
      #The master UD container  
      ud = obj.GetUserDataContainer()  
        
      #Print the current UD entries in the master container    
      for id, bc in ud:  
          print id, bc[1]  
           
      bc = c4d.GetCustomDataTypeDefault(c4d.DTYPE_LONG)  
      bc[c4d.DESC_NAME] = "Test data 2"  
      
      element = obj.AddUserData(bc)     #Add this new userdata to the master UD container  
      obj[element] = 10                 #Assign a value to it  
      c4d.EventAdd()  
      
      #We've changed the master UD container above  
      #So we have to grab it again to get the current stuff in it  
      ud = obj.GetUserDataContainer()  
      for id, bc in ud:  
          print id, bc[1]  
           
    if __name__=='__main__':  
      main()
    

    -ScottA



  • On 01/10/2013 at 08:36, xxxxxxxx wrote:

    @littledevil Ha, Demonic post! - I'm privileged. I'm actually using a Python Node for this bit and created a sloppy workaround which involved an Iterator Node to trigger the Python twice.

    @ScottA That's what I was looking for! Thank you. I feel like bashing my head off the desk for missing that. Solved!


Log in to reply