Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Messages between objects [SOLVED]

    PYTHON Development
    0
    24
    14.0k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      On 13/04/2015 at 09:09, xxxxxxxx wrote:

      Now it is solved,

      the polygonal representation from the parametric object should be taken from current state to object.
      (like Yannick suggested)
      but the dirty state needs to be read from the cache.

      Yannick, thanks!
      Could you please explain why the cache hasn´t been updated ?
      Best wishes
      Martin

        
        
      import c4d  
      from c4d import utils, gui  
        
      global dirtyCount  
      dirtyCount = 0  
        
      def GetLink(op) :  
        udOK = False  
        for udID, udBC in op.GetUserDataContainer() :  
            if udID[1].id==1 and udID[1].dtype==c4d.DTYPE_BASELISTLINK:  
                udOK = True  
                break  
        if not udOK:  
            dialog = gui.MessageDialog("No appropriate UserData available! \n"  
                                       "Please insert a linkfield \n"  
                                       "and activate the generator again.",c4d.GEMB_OK)  
            op[c4d.ID_BASEOBJECT_GENERATOR_FLAG] = False  
            return None  
          
        link = op[c4d.ID_USERDATA,1]  
        if not link:return None  
        
        if link.GetClassification()!=c4d.Obase:  
            dialog = gui.MessageDialog("Please insert a valid object in the user data link!",c4d.GEMB_OK)  
            op[c4d.ID_BASEOBJECT_GENERATOR_FLAG] = False  
            return None  
          
        return link  
          
        
      def GetGeom(op) :  
        geom = op  
        dirty = op.GetDirty(c4d.DIRTYFLAGS_DATA|c4d.DIRTYFLAGS_MATRIX)  
        if not op.IsInstanceOf(c4d.Opolygon) :  
            settings = c4d.BaseContainer()  
            settings[c4d.MDATA_CURRENTSTATETOOBJECT_NOGENERATE] = False  
            settings[c4d.MDATA_CURRENTSTATETOOBJECT_KEEPANIMATION] = True  
            settings[c4d.MDATA_CURRENTSTATETOOBJECT_INHERITANCE] = False  
              
            polylist = utils.SendModelingCommand(command= c4d.MCOMMAND_CURRENTSTATETOOBJECT, list= [op.GetClone()], mode =c4d.MODELINGCOMMANDMODE_ALL, bc = settings,  doc= doc)  
            if not polylist : return None  
            geom = polylist[0]  
             
            if op.GetCache().GetDeformCache() :          
                deform = op.GetCache().GetDeformCache()  
                dirty = dirty + deform.GetDirty(c4d.DIRTYFLAGS_DATA|c4d.DIRTYFLAGS_MATRIX)  
                print dirty, "parametric deform"  
        
              
        if op.GetDeformCache() :          
            deform = geom.GetDeformCache()  
            print dirty,"polygonal deform "     
            dirty = dirty + deform.GetDirty(c4d.DIRTYFLAGS_DATA|c4d.DIRTYFLAGS_MATRIX)  
            geom = deform  
        return geom,dirty  
        
        
      def main() :  
        global dirtyCount  
          
        if op[c4d.OPYTHON_OPTIMIZE] == True:  
            dialog=gui.MessageDialog("Please uncheck Optimize Cache! \n"  
                                     "and activate the generator again.",c4d.GEMB_OK)  
            op[c4d.ID_BASEOBJECT_GENERATOR_FLAG] = False   
            return c4d.BaseObject(c4d.Onull)  
          
        link = GetLink(op)  
        if not link: return c4d.BaseObject(c4d.Onull)  
          
        geom,dirty = GetGeom(link)  
        if not geom: return c4d.BaseObject(c4d.Onull)  
          
          
        #custom dirty test with linked object  
        
        if dirty != dirtyCount:          
            dirtyCount = dirty  
            op.SetDirty(c4d.DIRTYFLAGS_DATA|c4d.DIRTYFLAGS_MATRIX)  
              
          
        if not op.IsDirty(c4d.DIRTYFLAGS_DATA|c4d.DIRTYFLAGS_MATRIX) : return op.GetCache()  
        
        #parent virtual object  
        null = c4d.BaseObject(c4d.Onull)  
        child = geom.GetClone()  
        child.InsertUnder(null)  
          
        return null  
      
      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 13/04/2015 at 09:32, xxxxxxxx wrote:

        The initial question for this topic has been solved: messaging between the generator and its linked object, more precisely getting the dirty state from the linked object (the original title of the topic isn't event not meaningful).
        Please create a new thread for new questions.

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          On 13/04/2015 at 09:54, xxxxxxxx wrote:

          Feel free to rename this thread to suit the topic, Yannick, no problem.
          That´s all not that meaningful...enjoy your finishing time
          martin

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            On 14/04/2015 at 06:19, xxxxxxxx wrote:

            Hi Martin,

            I'd really like to help you but we need to have an organized forum.

            You can create a new topic with the current script for the Python generator, the issues with it and I'll be happy to help you 🙂.

            1 Reply Last reply Reply Quote 0
            • First post
              Last post