Setting `coordinate system` using `MCOMMAND_MIRROR`



  • Hi there, I'm trying to mirror object via SendModelingCommand(c4d.MCOMMAND_MIRROR, ..)
    But I cann't understand how to change a coordinate system.
    According to the documentation this options is called MDATA_MIRROR_SYSTEM and it's int type.
    Its description says Coordinate system. (See dialog.)
    I believe it is the dialog:
    0_1551264099400_mirror.PNG

    It seems like 0 means Object, 1 - World, 2 - Screen.
    I tried different values from 0 to 30, but it didn't take any effect.

    The code I'm using:

    settings = c4d.BaseContainer()
    settings[c4d.MDATA_MIRROR_SYSTEM] = 0
    
    res = utils.SendModelingCommand(c4d.MCOMMAND_MIRROR,
                              [obj],
                              c4d.MODELINGCOMMANDMODE_ALL,
                              settings,
                              doc)
    

    I cannot change MDATA_MIRROR_PLANE either.
    There is no additional information in the documentation.
    Drag'n'drop for these fields doesn't work. It's strange, because it works perfectly for other tools.

    I found this post (from 2011) https://plugincafe.maxon.net/topic/5497/5516_mirror-tool-bug
    It seems that bug is still alive :(

    Version: R20
    Platform: Windows

    Cheers



  • Hi @kisaf,

    MCOMMAND_MIRROR is indeed a bit special because when you click on the Apply button from the GUI, it does send a message to some c4d elements, then these elements read MDATA_MIRROR_VALUE, MDATA_MIRROR_SYSTEM and MDATA_MIRROR_PLANE calculates values for MDATA_MIRROR_POINT and MDATA_MIRROR_VECTOR and then call the SendModelingCommand. Unfortunately, there is no way for you to send this message, and the best way to do it is to recalculate the stuff as bellow.

    import c4d
    
    
    def main():
        # Checks if selected object is valid
        if op is None:
            raise ValueError("op is none, please select one object.")
    
        # Defines some general settings, take care MDATA_MIRROR_VALUE, MDATA_MIRROR_SYSTEM and MDATA_MIRROR_PLANE
        settings = c4d.BaseContainer()
        settings[c4d.MDATA_MIRROR_DUPLICATE] = True
        settings[c4d.MDATA_MIRROR_SELECTIONS] = True
        settings[c4d.MDATA_MIRROR_ONPLANE] = True
        settings[c4d.MDATA_MIRROR_WELD] = True
        settings[c4d.MDATA_MIRROR_TOLERANCE] = 0.01
    
        # Corresponds to MDATA_MIRROR_VALUE, MDATA_MIRROR_SYSTEM and MDATA_MIRROR_PLANE
        value = 1000.0
        system = 0 # 0 = Object, 1 = World
        plane = 1 # 0 = XY, 1 = ZY, 2 = XZ
    
        if not 0 <= system < 2:
            raise ValueError("System can only be 0 or 1")
    
        # Buffer position vector
        pos = c4d.Vector()
    
        # Calculates Local (Object) coordinates
        if system == 0:
            globalMatrix = op.GetMg()
            if plane == 0:
                pos = globalMatrix.v3
            elif plane == 1:
                pos = globalMatrix.v1
            elif plane == 2:
                pos = globalMatrix.v2
    
            settings[c4d.MDATA_MIRROR_POINT] = globalMatrix.off + pos * value
            settings[c4d.MDATA_MIRROR_VECTOR] = pos
    
        # Calculates World coordinates
        elif system == 1:
            if plane == 0:
                pos = c4d.Vector(0.0, 0.0, 1.0)
            elif plane == 1:
                pos = c4d.Vector(1.0, 0.0, 0.0)
            elif plane == 2:
                pos = c4d.Vector(0.0, 1.0, 0.0)
    
            settings[c4d.MDATA_MIRROR_POINT] = pos * value
            settings[c4d.MDATA_MIRROR_VECTOR] = pos
    
        # Send the Modeling Operation
        res = c4d.utils.SendModelingCommand(c4d.MCOMMAND_MIRROR,
                                            [op],
                                            c4d.MODELINGCOMMANDMODE_ALL,
                                            settings,
                                            doc)
    
        c4d.EventAdd()
    
    
    if __name__ == "__main__":
        main()
    
    

    Hope it solves your issue, if you have any question, please let me know.
    Cheers,
    Maxime.



  • Hi @m_adam
    Thank you for your reply. It works perfectly!


Log in to reply