An addon to do that:
For 2.79:

It uses a BVH tree to check if meshes are overlapping. BVH trees are built from boundings at first step (presuming boundings are a box) then with bmesh (for the intersecting bounding objects).
Important though: the overlapping test will fail if meshes do not intersect. For instance a mesh which is entirely inside the active one will not be detected.
For information: using bmesh.transform to obtain object's coordinates in world is mush faster than a Python calculation.
bl_info = {
"name": "Select intersect active",
"category": "Object",
}
import bpy
from mathutils import Vector
from mathutils.bvhtree import BVHTree
import bmesh
import time
#In this context, utility/debug function to check if bounding test are ok
def BoundingsToMesh( obj, scene ):
name = obj.name + "_bounds"
meshData = bpy.data.meshes.new( name )
meshObj = bpy.data.objects.new( name, meshData )
meshObj.matrix_world = obj.matrix_world.copy()
meshObj.data.from_pydata( *BoundingsGeometry( obj ) )
scene.objects.link( meshObj )
return meshObj
#Create bounding geometry from an object
def BoundingsGeometry( obj ):
verts = [Vector(co) for co in obj.bound_box]
edges = []
faces = [ (0,1,2,3), (4,5,1,0), (7,6,5,4), (3,2,6,7), (6,2,1,5), (7,4,0,3) ]
return verts, edges, faces
#Translates bounding geometry in world coordinates
def BoundingsGeometryInWorld( obj ):
verts, edges, faces = BoundingsGeometry( obj )
return [obj.matrix_world * v for v in verts], edges, faces
#Get vertices and polygons from an object in world coordinates
def MeshGeometryInWorld( obj ):
return [obj.matrix_world * v.co for v in obj.data.vertices], [], [p.vertices for p in obj.data.polygons]
#Create a BVH tree from bounding (world co)
def BVHFromBoundings( obj ):
verts, edges, faces = BoundingsGeometryInWorld( obj )
return BVHTree.FromPolygons( verts, faces )
#Create a BVH tree from mesh (world co)
def BVHFromMesh( obj ):
verts, edges, faces = MeshGeometryInWorld( obj )
return BVHTree.FromPolygons( verts, faces )
#Create a BVH tree from bmesh (world co)
def BVHFromBMesh( obj ):
bm = bmesh.new()
bm.from_mesh( obj.data )
bm.transform( obj.matrix_world )
result = BVHTree.FromBMesh( bm )
del bm
return result
#Test if a bvh tree overlap an object
def IntersectBVHObj( bvh, obj, toBvh ):
objBvh = toBvh( obj )
result = bvh.overlap( objBvh )
del objBvh
return result
#Test if two objects overlap
def IntersectObjObj( obj, others, toBvh ):
objBvh = toBvh( obj )
result = [other for other in others if IntersectBVHObj( objBvh, other, toBvh )]
del objBvh
return result
#Test if two objects overlap using boundings method
def IntersectBoundings( obj, others ):
return IntersectObjObj( obj, others, BVHFromBoundings )
#Test if two objects overlap using mesh method
def IntersectMesh( obj, others ):
return IntersectObjObj( obj, others, BVHFromMesh )
#Test if two objects overlap using bmesh method
def IntersectBMesh( obj, others ):
return IntersectObjObj( obj, others, BVHFromBMesh )
#Select objects which overlap another one
def SelectIntersect( obj, scene, others, intersectBounding ):
result = IntersectBoundings( obj, others )
if intersectBounding == False:
#startTime = time.time()
#for i in range( 1000 ):
result = IntersectBMesh( obj, result )
#print( "elapsed", time.time() - startTime )
for o in result:
o.select = True
class SelectIntersectActive(bpy.types.Operator):
bl_idname = "object.select_intersect_active"
bl_label = "Select intersect active"
bl_options = {'REGISTER', 'UNDO'}
intersectBounding = bpy.props.BoolProperty(name="Intersect bounding", default=False)
@classmethod
def poll(cls, context):
scene = context.scene
obj = scene.objects.active
return obj and obj.type == 'MESH' and obj.mode == 'OBJECT'
def execute(self, context):
scene = context.scene
obj = scene.objects.active
#Keep only non selected objects (cumulative selection)
SelectIntersect( obj, scene, [o for o in scene.objects if o.select == False and o != obj], self.intersectBounding )
return {'FINISHED'}
def menu_func(self, context):
self.layout.operator(SelectIntersectActive.bl_idname)
def register():
bpy.utils.register_class(SelectIntersectActive)
bpy.types.VIEW3D_MT_select_object.append(menu_func)
def unregister():
bpy.utils.unregister_class(ObjectCursorArray)
bpy.types.VIEW3D_MT_select_object.remove(menu_func)
if __name__ == "__main__":
register()

Update for 2.8:
bl_info = {
"name": "Select intersect active",
"category": "Object",
}
import bpy
from mathutils import Vector
from mathutils.bvhtree import BVHTree
import bmesh
import time
#In this context, utility/debug function to check if bounding test are ok
def BoundingsToMesh( obj, scene ):
name = obj.name + "_bounds"
meshData = bpy.data.meshes.new( name )
meshObj = bpy.data.objects.new( name, meshData )
meshObj.matrix_world = obj.matrix_world.copy()
meshObj.data.from_pydata( *BoundingsGeometry( obj ) )
scene.objects.link( meshObj )
return meshObj
#Create bounding geometry from an object
def BoundingsGeometry( obj ):
verts = [Vector(co) for co in obj.bound_box]
edges = []
faces = [ (0,1,2,3), (4,5,1,0), (7,6,5,4), (3,2,6,7), (6,2,1,5), (7,4,0,3) ]
return verts, edges, faces
#Translates bounding geometry in world coordinates
def BoundingsGeometryInWorld( obj ):
verts, edges, faces = BoundingsGeometry( obj )
return [obj.matrix_world @ v for v in verts], edges, faces
#Get vertices and polygons from an object in world coordinates
def MeshGeometryInWorld( obj ):
return [obj.matrix_world @ v.co for v in obj.data.vertices], [], [p.vertices for p in obj.data.polygons]
#Create a BVH tree from bounding (world co)
def BVHFromBoundings( obj ):
verts, edges, faces = BoundingsGeometryInWorld( obj )
return BVHTree.FromPolygons( verts, faces )
#Create a BVH tree from mesh (world co)
def BVHFromMesh( obj ):
verts, edges, faces = MeshGeometryInWorld( obj )
return BVHTree.FromPolygons( verts, faces )
#Create a BVH tree from bmesh (world co)
def BVHFromBMesh( obj ):
bm = bmesh.new()
bm.from_mesh( obj.data )
bm.transform( obj.matrix_world )
result = BVHTree.FromBMesh( bm )
del bm
return result
#Test if a bvh tree overlap an object
def IntersectBVHObj( bvh, obj, toBvh ):
objBvh = toBvh( obj )
result = bvh.overlap( objBvh )
del objBvh
return result
#Test if two objects overlap
def IntersectObjObj( obj, others, toBvh ):
objBvh = toBvh( obj )
result = [other for other in others if IntersectBVHObj( objBvh, other, toBvh )]
del objBvh
return result
#Test if two objects overlap using boundings method
def IntersectBoundings( obj, others ):
return IntersectObjObj( obj, others, BVHFromBoundings )
#Test if two objects overlap using mesh method
def IntersectMesh( obj, others ):
return IntersectObjObj( obj, others, BVHFromMesh )
#Test if two objects overlap using bmesh method
def IntersectBMesh( obj, others ):
return IntersectObjObj( obj, others, BVHFromBMesh )
#Select objects which overlap another one
def SelectIntersect( obj, scene, others, intersectBounding ):
result = IntersectBoundings( obj, others )
if intersectBounding == False:
#startTime = time.time()
#for i in range( 1000 ):
result = IntersectBMesh( obj, result )
#print( "elapsed", time.time() - startTime )
for o in result:
o.select_set( True )
class SelectIntersectActive(bpy.types.Operator):
bl_idname = "object.select_intersect_active"
bl_label = "Select intersect active"
bl_options = {'REGISTER', 'UNDO'}
intersectBounding = bpy.props.BoolProperty(name="Intersect bounding", default=False)
@classmethod
def poll(cls, context):
scene = context.scene
obj = context.active_object
return obj and obj.type == 'MESH' and obj.mode == 'OBJECT'
def execute(self, context):
scene = context.scene
obj = context.active_object
#Keep only non selected objects (cumulative selection)
SelectIntersect( obj, scene, [o for o in scene.objects if o.select_get() == False and o != obj], self.intersectBounding )
return {'FINISHED'}
def menu_func(self, context):
self.layout.operator(SelectIntersectActive.bl_idname)
def register():
bpy.utils.register_class(SelectIntersectActive)
bpy.types.VIEW3D_MT_select_object.append(menu_func)
def unregister():
bpy.utils.unregister_class(ObjectCursorArray)
bpy.types.VIEW3D_MT_select_object.remove(menu_func)
if __name__ == "__main__":
register()