Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python 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

    Scripts that need to be executed twice?

    Scheduled Pinned Locked Moved SDK Help
    3 Posts 0 Posters 401 Views
    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 Offline
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 20/02/2012 at 09:37, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   12 
      Platform:   Windows  ;   
      Language(s) :   C.O.F.F.E.E  ;  C++  ;   PYTHON  ;

      ---------
      Every once in a while I run across a strange scripting behavior where a piece of the code gets skipped over. And requires me to execute the script a second time.
      It typically most often happens when moving objects in the hierarchy. Then trying to do something on that object.
      It's almost as if C4D has a hard coded time limit to execute lines of code. And if anything takes more than a couple of cycles(like editing the OM). C4D can sometimes skip over the lines of code following that task!

      I can usually hack around these kinds of problems.
      But here's an example where the problem is really, really bad:

      import c4d  
        
      def main() :  
        for i in range(2) : #Cheats the script to work...this script dos not work in one click!!  
        op = doc.GetActiveObject()  
        points = op.GetAllPoints()  
        mtx = op.GetMg()  
        inv = mtx.__invert__()  
        
        gpoints = []              #Used to hold the points original global positions  
        for i, point in enumerate(points) :  
            lpoints = points _    #The local position of each point  
            gpnt = inv*point      #The global position of each point  
            gpoints.append(gpnt)  #Add each global point position to the list  
        
        doc.StartUndo()  
        doc.AddUndo(c4d.UNDOTYPE_CHANGE, op)  
        doc.EndUndo()  
        
        op.SetAbsPos(c4d.Vector(150,300,300)) #Move the object's axis  
        op.Message(c4d.MSG_UPDATE)            #Tell C4d the object moved  
        op.SetAllPoints(gpoints)   #Move the points back to their original positions  
        op.Message(c4d.MSG_UPDATE)  
        c4d.EventAdd()  
        
      if __name__=='__main__':  
        main()
      

      This example is in python. But it also happens in Coffee(and I assume C++) too.
      All I want to do is make my script do this:
      - Save an object's global point positions in an array
      - Move the object someplace else in the scene
      - Restore the points back to their original positions

      It's acting like the object is still at 0,0,0 and never gets updated that the object has been moved.
      And it's also doing that annoying thing where I have to execute it twice. Because once it reaches SetAbsPos(). It completely ignores the SetAllPoints() code that comes after it!

      Why does this happen?
      Is there a work around, or different approach I should use for this kind of situation that the script manager can handle better?

      -ScottA
      _

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

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 20/02/2012 at 11:08, xxxxxxxx wrote:

        To me it looks as if you miss the new matrix after movement
        to use as new base and your script reads the new base on the second
        pass. (And the doc.EndUndo should be last after all your changes)

        Cheers
        Lennart

          
        import c4d   
          
        def main() :   
            if op is None: return False   
            oldm   = op.GetMg()   
            points = op.GetAllPoints()   
            pcount = op.GetPointCount()   
          
            doc.StartUndo()   
            doc.AddUndo(c4d.UNDOTYPE_CHANGE, op)   
            op.SetAbsPos(c4d.Vector(150,300,300))   
            op.Message(c4d.MSG_UPDATE)   
          
            newm    = op.GetMg()   
          
            for p in xrange(pcount) :   
                op.SetPoint(p,~newm*oldm*points[p])   
          
            op.Message(c4d.MSG_UPDATE)   
            c4d.EventAdd()   
            doc.EndUndo()   
          
        if __name__=='__main__':   
            main()   
        
        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

          On 20/02/2012 at 12:24, xxxxxxxx wrote:

          Thanks Lennart.🍺

          I didn't realize that I needed to grab the matrix twice like that. But I think I can see why it's necessary.

          -ScottA

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