user: How do I use SubsurfModifier(Modifier) in Blender? Include parameters, examples, warnings and best practices.

assistant: # SubsurfModifier(Modifier)

base classes — [`bpy_struct`](bpy.types.bpy_struct.html#bpy.types.bpy_struct "bpy.types.bpy_struct"), [`Modifier`](bpy.types.Modifier.html#bpy.types.Modifier "bpy.types.Modifier")

*class* bpy.types.SubsurfModifier(*Modifier*)
:   Subdivision surface modifier

    adaptive_object_edge_length
    :   Target object space edge length for adaptive subdivision

        Type:
        :   float in [0.0001, 1000], default 0.01

    adaptive_pixel_size
    :   Target polygon pixel size for adaptive subdivision

        Type:
        :   float in [0.1, 1000], default 1.0

    adaptive_space
    :   How to adaptively subdivide the mesh

        - `PIXEL`
          Pixel – Subdivide polygons to reach a specified pixel size on screen.
        - `OBJECT`
          Object – Subdivide to reach a specified edge length in object space. This is required to use adaptive subdivision for instanced meshes.

        Type:
        :   enum in [`'PIXEL'`, `'OBJECT'`], default `'PIXEL'`

    boundary_smooth
    :   Controls how open boundaries are smoothed

        Type:
        :   enum in [Subdivision Boundary Smooth Items](bpy_types_enum_items/subdivision_boundary_smooth_items.html#rna-enum-subdivision-boundary-smooth-items), default `'ALL'`

    levels
    :   Number of subdivisions to perform in the 3D viewport

        Type:
        :   int in [0, 11], default 1

    open_adaptive_subdivision_panel
    :   Type:
        :   boolean, default False

    open_advanced_panel
    :   Type:
        :   boolean, default False

    quality
    :   Accuracy of vertex positions, lower value is faster but less precise

        Type:
        :   int in [1, 10], default 3

    render_levels
    :   Number of subdivisions to perform when rendering

        Type:
        :   int in [0, 11], default 2

    show_only_control_edges
    :   Skip displaying interior subdivided edges

        Type:
        :   boolean, default True

    subdivision_type
    :   Select type of subdivision algorithm

        - `CATMULL_CLARK`
          Catmull-Clark – Create a smooth curved surface using the Catmull-Clark subdivision scheme.
        - `SIMPLE`
          Simple – Subdivide faces without changing shape.

        Type:
        :   enum in [`'CATMULL_CLARK'`, `'SIMPLE'`], default `'CATMULL_CLARK'`

    use_adaptive_subdivision
    :   Adaptively subdivide mesh based on camera distance

        Type:
        :   boolean, default False

    use_creases
    :   Use mesh crease information to sharpen edges or corners

        Type:
        :   boolean, default True

    use_custom_normals
    :   Interpolates existing custom normals to resulting mesh

        Type:
        :   boolean, default False

    use_limit_surface
    :   Place vertices at the surface that would be produced with infinite levels of subdivision (smoothest possible shape)

        Type:
        :   boolean, default True

    uv_smooth
    :   Controls how smoothing is applied to UVs

        Type:
        :   enum in [Subdivision Uv Smooth Items](bpy_types_enum_items/subdivision_uv_smooth_items.html#rna-enum-subdivision-uv-smooth-items), default `'PRESERVE_BOUNDARIES'`

    *classmethod* bl_rna_get_subclass(*id*, *default=None*, */*)
    :   Parameters:
        :   **id** (*str*) – The RNA type identifier.

        Returns:
        :   The RNA type or default when not found.

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

    *classmethod* bl_rna_get_subclass_py(*id*, *default=None*, */*)
    :   Parameters:
        :   **id** (*str*) – The RNA type identifier.

        Returns:
        :   The class or default when not found.

        Return type:
        :   type