Is there a way to "mirror" an empty?

Using Blender 2.8, and I'm using a number of empties to drive some animations within in a collection of objects in a parented structure.

I can mirror objects using modifiers, and I know modifiers are not available for empties, but is there a way to "mirror" axis empties in some similar automated way?

My workflow so far has been manual in a way to first dupe the empty (has the benefit of also copying the animation for it too), then manually changing the xyz loc/rot values -1 as needed to get them to be "mirrored". This was OK when there were a few empties, but as you can guess as the project has grown in scale and complexity this is becoming very time consuming, and the manual process in risky and prone to lots of errors.

Is there a trick/method to "mirror" empties for a more automated process to reduce time and risk/errors?

Constraints may suit. The copy Xform constraints have the option to invert.

Here we have 2 axis-Empties, both parented to the cube-Empty in the middle. The right Empty is constrained to the left Empty as follows:

And it's parented to the cube Empty Without Inverse.

The arrows are parented to their respective axis-Empties, for illustration:

If the Empties are all ShiftD duplicated together, Blender is smart enough to keep the relations between the duplicates, and the whole rig can be moved/rotated using the cube.

You can use Python scripting to automate things that you do in Blender. I do not know how you want to mirror the empties so I will just give you a simple example, that you can hopefully modify to what you need. If you open up the Text Editor in Blender, you will find Templates menu in it's header, that has many Python script examples. I have modified the one called Simple Operator here to make an operator that mirrors the last selected object(the active object) if it is an empty in X axis with scene's center as the pivot point:

import bpy

def main(context):
if context.object.type == "EMPTY":
bpy.ops.object.duplicate()
context.object.scale[0]*=-1
context.object.location[0]*=-1

class MirrorEmpty(bpy.types.Operator):
"""Tooltip"""
bl_idname = "object.mirror_empty"
bl_label = "Mirror Empty"
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
main(context)
return {'FINISHED'}

def register():
bpy.utils.register_class(MirrorEmpty)

def unregister():
bpy.utils.unregister_class(MirrorEmpty)

if __name__ == "__main__":
register()


If you run it, you register an operator, that you can then find with Blender's Search menu(F3 or Space 2.7 and earlier versions) byy it's label(bl_label) - in this case "Mirror Empty":

You can modify the main function to do what you want. Blender's Python API docs are here, you can see what operators are executed in the Info Editor, also Python Console has a very useful Auto Complete function that helps when learning to script with Python in Blender.

Obviously, one of the easiest ways to make what you want with Blender's Python API will be to ask about it here on BSE, but you will need to be extremely specific and tell us absolutely everything in fine detail about your situation, what you are doing and what you need, share screenshots as well as sample files and so on, because it is impossible to guess how you need it done in your specific situation with your specific scenes and setups for your specific goals.