user: What is bpy_extras submodule (bpy_extras.object_utils) and how is it used in Blender Python scripting?

assistant: # bpy_extras submodule (bpy_extras.object_utils)

bpy_extras.object_utils.add_object_align_init(*context*, *operator*)
:   Return a matrix using the operator settings and view context.

    Parameters:
    :   - **context** ([`bpy.types.Context`](bpy.types.Context.html#bpy.types.Context "bpy.types.Context")) – The context to use.
        - **operator** ([`bpy.types.Operator`](bpy.types.Operator.html#bpy.types.Operator "bpy.types.Operator")) – The operator, checked for location and rotation properties.

    Returns:
    :   the matrix from the context and settings.

    Return type:
    :   [`mathutils.Matrix`](mathutils.html#mathutils.Matrix "mathutils.Matrix")

bpy_extras.object_utils.object_data_add(*context*, *obdata*, *operator=None*, *name=None*)
:   Add an object using the view context and preference to initialize the
    location, rotation and layer.

    Parameters:
    :   - **context** ([`bpy.types.Context`](bpy.types.Context.html#bpy.types.Context "bpy.types.Context")) – The context to use.
        - **obdata** ([`bpy.types.ID`](bpy.types.ID.html#bpy.types.ID "bpy.types.ID") | None) – Valid object data to used for the new object or None.
        - **operator** ([`bpy.types.Operator`](bpy.types.Operator.html#bpy.types.Operator "bpy.types.Operator")) – The operator, checked for location and rotation properties.
        - **name** (*str*) – Optional name

    Returns:
    :   the newly created object in the scene.

    Return type:
    :   [`bpy.types.Object`](bpy.types.Object.html#bpy.types.Object "bpy.types.Object")

bpy_extras.object_utils.object_add_grid_scale(*context*)
:   Return scale which should be applied on object
    data to align it to grid scale

bpy_extras.object_utils.object_add_grid_scale_apply_operator(*operator*, *context*)
:   Scale an operators distance values by the grid size.

bpy_extras.object_utils.world_to_camera_view(*scene*, *obj*, *coord*)
:   Returns the camera space coords for a 3d point.
    (also known as: normalized device coordinates - NDC).

    Where (0, 0) is the bottom left and (1, 1)
    is the top right of the camera frame.
    values outside 0-1 are also supported.
    A negative ‘z’ value means the point is behind the camera.

    Takes shift-x/y, lens angle and sensor size into account
    as well as perspective/ortho projections.

    Parameters:
    :   - **scene** ([`bpy.types.Scene`](bpy.types.Scene.html#bpy.types.Scene "bpy.types.Scene")) – Scene to use for frame size.
        - **obj** ([`bpy.types.Object`](bpy.types.Object.html#bpy.types.Object "bpy.types.Object")) – Camera object.
        - **coord** ([`mathutils.Vector`](mathutils.html#mathutils.Vector "mathutils.Vector")) – World space location.

    Returns:
    :   a vector where X and Y map to the view plane and
        Z is the depth on the view axis.

    Return type:
    :   [`mathutils.Vector`](mathutils.html#mathutils.Vector "mathutils.Vector")

bpy_extras.object_utils.object_report_if_active_shape_key_is_locked(*obj*, *operator*)
:   Checks if the active shape key of the specified object is locked, and reports an error if so.

    If the object has no shape keys, there is nothing to lock, and the function returns False.

    Parameters:
    :   - **obj** ([`bpy.types.Object`](bpy.types.Object.html#bpy.types.Object "bpy.types.Object")) – Object to check.
        - **operator** ([`bpy.types.Operator`](bpy.types.Operator.html#bpy.types.Operator "bpy.types.Operator")) – Currently running operator to report the error through. Use None to suppress emitting the message.

    Returns:
    :   True if the shape key was locked.

*class* bpy_extras.object_utils.AddObjectHelper
:   align_update_callback(*_context*)