AddUndo(c4d.UNDOTYPE_CHANGE) not working with doc.ExecutePasses()?



  • Hi,

    In this thread, it offers the solution to use the doc.ExecutePasses to "bake" the effect of the PSR when the PSR tag is deleted. My problem is when I inserted the doc.AddUndo(), it does not work (i.e. the object does not move back the original position).

    You can see an illustration of the problem here:
    https://www.dropbox.com/s/c5b3g1f5dr0el7z/c4d183_addundo_with_doc_execute_passes.mp4?dl=0

    As you can see, only the tag creation is undone but not the movement of the object.
    Is there a way around this? Thank you for looking at my problem

    You can see the working code here:

    import c4d
    from c4d import gui
    
    # Select two objects then execute
    def create_constraint():
    
        doc = c4d.documents.GetActiveDocument()
        obj_sel = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
        driven = obj_sel[-1]
        driver = obj_sel[0]
    
        doc.StartUndo()
        tag = c4d.BaseTag(1019364)
        driven.InsertTag(tag)
        doc.AddUndo(c4d.UNDOTYPE_NEW, tag)
    
        tag[c4d.ID_CA_CONSTRAINT_TAG_PSR] = True
        tag[c4d.ID_CA_CONSTRAINT_TAG_PSR_MAINTAIN] = False
    
        tag[10001] = driver
        doc.ExecutePasses(None, True, True, True, c4d.BUILDFLAGS_0)
        doc.AddUndo(c4d.UNDOTYPE_CHANGE, driven)
        
        doc.EndUndo()
        c4d.EventAdd()
    
    
    if __name__=='__main__':
        create_constraint()
    


  • Hello,

    As the document says, the UNDOTYPE_CHANGE must be called before the change.

    This seems to work as expected. Let me know.

    import c4d
    from c4d import gui
    
    # Select two objects then execute
    def create_constraint():
    
        doc = c4d.documents.GetActiveDocument()
        obj_sel = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
        driven = obj_sel[-1]
        driver = obj_sel[0]
    
        doc.StartUndo()
        doc.AddUndo(c4d.UNDOTYPE_CHANGE, driven)
        tag = c4d.BaseTag(1019364)
        driven.InsertTag(tag)
        doc.AddUndo(c4d.UNDOTYPE_NEW, tag)
    
        tag[c4d.ID_CA_CONSTRAINT_TAG_PSR] = True
        tag[c4d.ID_CA_CONSTRAINT_TAG_PSR_MAINTAIN] = False
    
        tag[10001] = driver
        doc.ExecutePasses(None, True, True, True, c4d.BUILDFLAGS_0)
        
        
        doc.EndUndo()
        c4d.EventAdd()
    
    
    if __name__=='__main__':
        create_constraint()
    

    Cheers,
    Manuel



  • @m_magalhaes

    Oh gotcha. Thanks for the reminder. Totally forgot they UNDOTYPE_CHANGE have a different placement thant UNDOTYPE_NEW

    Thanks again. Have a great day ahead!


Log in to reply