Bellow is a script I am working on. The main idea is to via a button call a command that deselects everything, adds an empty at the 3D cursor, and then IMPORTANT calls a transform command so you can move the empty and snap it in object mode to geometry. once you LMB confirmed the placement the script continues. I sets the 3d cursor to them empty and then deletes the empty.

I am not able to figure out how to jump into the transform mode , let along continue after I placed the empty.


    import bpy
    
    from bpy.types import (
            Panel,
            Menu,
            Operator,
            )
    from bpy.types import Menu, Panel, UIList
    from rna_prop_ui import PropertyPanel
    from bl_ui.properties_data_modifier import DATA_PT_modifiers
    from bpy.props import *
    
    ########################
    # Operator Definitions #
    ########################
    
    # Command Snap Origin 
    
    class SnapOriginObject(bpy.types.Operator):
        bl_idname = "snap.originobject"
        bl_label = "Snap Object Origin"
        bl_options = {'REGISTER'}
            
        def execute(self, context):
    
            
            bpy.ops.object.select_all(action='DESELECT')
            
            bpy.ops.object.empty_add()
            
            bpy.ops.transform.translate()
            
            bpy.ops.view3d.snap_cursor_to_selected()
    
            bpy.ops.object.delete()
          
       
            return{'FINISHED'}
    
    ########################
    # Interface Definition #
    ########################
    
    # DATA 
    class ObjectData(bpy.types.Panel):
        bl_label = "Object + Mesh Data"
        bl_idname = "ObjectData"
        bl_space_type = 'VIEW_3D'
        bl_region_type = 'TOOLS'
        bl_category = "Modeling Toolbox"
    
        def draw(self, context):
            layout = self.layout
    
            obj = context.object
      
            row = layout.row()
            self.layout.operator("snap.originobject")
            
    
    
    # END     
    def register(): bpy.utils.register_module(__name__)
    def unregister(): bpy.utils.unregister_module(__name__)
    
     
    if __name__ == "__main__":
        register()