Update button



  • Can someone help me? changes the value of my cycle button, but does not execute it:

    ezgif-3-3662ee02cbbe.gif



  • Seems like it executes very well, but only delayed because you are changing a combobox/dropdown instead of the slider value itself. Try modifying the sliders instead of the combobox/dropdown for less delays

    EDIT: I forgot that those sliders might be also just Numerical IDs so it may be inaccurate as well in terms of it being able to handle the data being fed on, and may change depending on the constraint build-up

    I guess you can't do anything than to deal with the delay. Try making the time slider running while you switch that button back and forth if it updates everytime something changes on the scene. Usually it's just a 1-frame delay, or whenever something is updated. In alternative, try to use c4d.EventAdd() after each if-else statement



  • Hi @pyxelrigger thanks for reaching us, the main issue is to properly update you need to send the message MSG_DESCRIPTION_COMMAND and this is what the UI, it set the parameter then call this message.

    But adding this call in the execute method of the python tag is not enough.
    This message is processed by the constraint tag and add an Undo, and as said multiple time, this is not possible to add an undo in a threaded environment(see Python Tags - Shouldn't really they can change the scene? so this fail.

    So the workaround is to not call the message during the scene execution of the scene but when the value is set in the user Data, so you react to a GUI interaction (main thread) so you are free to do what you want.

    import c4d
    #Welcome to the world of Python
    
    def message(msgId, msgData):
        # React to the change within the UI, since it came from the UI, this is executed in the Main Thread, so you can add Undo or Add Event
        if msgId == c4d.MSG_DESCRIPTION_POSTSETPARAMETER:
            # Check if its an User Data ID
            if msgData['descid'].IsPartOf(c4d.DESCID_DYNAMICSUB):
                # Checks if its the User Data ID 1 that changed
                if msgData['descid'][-1].id == 1:
                    constraintTag = op.GetObject().GetTag(1019364)
    
                    # This will update the stuff and create an Undo
                    constraintTag.Message(c4d.MSG_DESCRIPTION_COMMAND, {"id": c4d.ID_CA_CONSTRAINT_TAG_PARENT_LOCALTRANFORM_UPDATEBUTTON})
                    c4d.EventAdd()
            return True
    
    def main():
        option = op[c4d.ID_USERDATA,1]
        constraintTag = op.GetObject().GetTag(1019364)
        # Defines the new value (We could do it as well in the message method, but just to show you that Execute is called before)
        constraintTag[c4d.ID_CA_CONSTRAINT_TAG_PARENT_LOCALTRANFORM_UPDATEBUTTON] = option + 1
    

    test_scene.c4d
    Cheers,
    Maxime.



  • Thanks! seems to work well!

    the problem is that apparently it only runs on the tag, if I set the option as a UserData of my object, it doesn't work