(obj, param, **kwargs)
return ret_val
Splits the curve at the input parametric coordinate.

    This method splits the curve into two pieces at the given parametric coordinate, generates two different
    curve objects and returns them. It does not modify the input curve.

    Keyword Arguments:
        * ``find_span_func``: FindSpan implementation. *Default:* :func:`.helpers.find_span_linear`
        * ``insert_knot_func``: knot insertion algorithm implementation. *Default:* :func:`.operations.insert_knot`

    :param obj: Curve to be split
    :type obj: abstract.Curve
    :param param: parameter
    :type param: float
    :return: a list of curve segments
    :rtype: list
Splits the curve at the input parametric coordinate.
Splits the curve at the input parametric coordinate .
def split_curve(obj, param, **kwargs):
    """ Splits the curve at the input parametric coordinate.

    This method splits the curve into two pieces at the given parametric coordinate, generates two different
    curve objects and returns them. It does not modify the input curve.

    Keyword Arguments:
        * ``find_span_func``: FindSpan implementation. *Default:* :func:`.helpers.find_span_linear`
        * ``insert_knot_func``: knot insertion algorithm implementation. *Default:* :func:`.operations.insert_knot`

    :param obj: Curve to be split
    :type obj: abstract.Curve
    :param param: parameter
    :type param: float
    :return: a list of curve segments
    :rtype: list
    """
    # Validate input
    if not isinstance(obj, abstract.Curve):
        raise GeomdlException("Input shape must be an instance of abstract.Curve class")

    if param == obj.domain[0] or param == obj.domain[1]:
        raise GeomdlException("Cannot split from the domain edge")

    # Keyword arguments
    span_func = kwargs.get('find_span_func', helpers.find_span_linear)  # FindSpan implementation
    insert_knot_func = kwargs.get('insert_knot_func', insert_knot)  # Knot insertion algorithm

    # Find multiplicity of the knot and define how many times we need to add the knot
    ks = span_func(obj.degree, obj.knotvector, len(obj.ctrlpts), param) - obj.degree + 1
    s = helpers.find_multiplicity(param, obj.knotvector)
    r = obj.degree - s

    # Create backups of the original curve
    temp_obj = copy.deepcopy(obj)

    # Insert knot
    insert_knot_func(temp_obj, [param], num=[r], check_num=False)

    # Knot vectors
    knot_span = span_func(temp_obj.degree, temp_obj.knotvector, len(temp_obj.ctrlpts), param) + 1
    curve1_kv = list(temp_obj.knotvector[0:knot_span])
    curve1_kv.append(param)
    curve2_kv = list(temp_obj.knotvector[knot_span:])
    for _ in range(0, temp_obj.degree + 1):
        curve2_kv.insert(0, param)

    # Control points (use Pw if rational)
    cpts = temp_obj.ctrlptsw if obj.rational else temp_obj.ctrlpts
    curve1_ctrlpts = cpts[0:ks + r]
    curve2_ctrlpts = cpts[ks + r - 1:]

    # Create a new curve for the first half
    curve1 = temp_obj.__class__()
    curve1.degree = temp_obj.degree
    curve1.set_ctrlpts(curve1_ctrlpts)
    curve1.knotvector = curve1_kv

    # Create another curve fot the second half
    curve2 = temp_obj.__class__()
    curve2.degree = temp_obj.degree
    curve2.set_ctrlpts(curve2_ctrlpts)
    curve2.knotvector = curve2_kv

    # Return the split curves
    ret_val = [curve1, curve2]
    return ret_val
def split_curve ( obj , param , * * kwargs ) : # Validate input if not isinstance ( obj , abstract . Curve ) : raise GeomdlException ( "Input shape must be an instance of abstract.Curve class" ) if param == obj . domain [ 0 ] or param == obj . domain [ 1 ] : raise GeomdlException ( "Cannot split from the domain edge" ) # Keyword arguments span_func = kwargs . get ( 'find_span_func' , helpers . find_span_linear ) # FindSpan implementation insert_knot_func = kwargs . get ( 'insert_knot_func' , insert_knot ) # Knot insertion algorithm # Find multiplicity of the knot and define how many times we need to add the knot ks = span_func ( obj . degree , obj . knotvector , len ( obj . ctrlpts ) , param ) - obj . degree + 1 s = helpers . find_multiplicity ( param , obj . knotvector ) r = obj . degree - s # Create backups of the original curve temp_obj = copy . deepcopy ( obj ) # Insert knot insert_knot_func ( temp_obj , [ param ] , num = [ r ] , check_num = False ) # Knot vectors knot_span = span_func ( temp_obj . degree , temp_obj . knotvector , len ( temp_obj . ctrlpts ) , param ) + 1 curve1_kv = list ( temp_obj . knotvector [ 0 : knot_span ] ) curve1_kv . append ( param ) curve2_kv = list ( temp_obj . knotvector [ knot_span : ] ) for _ in range ( 0 , temp_obj . degree + 1 ) : curve2_kv . insert ( 0 , param ) # Control points (use Pw if rational) cpts = temp_obj . ctrlptsw if obj . rational else temp_obj . ctrlpts curve1_ctrlpts = cpts [ 0 : ks + r ] curve2_ctrlpts = cpts [ ks + r - 1 : ] # Create a new curve for the first half curve1 = temp_obj . __class__ ( ) curve1 . degree = temp_obj . degree curve1 . set_ctrlpts ( curve1_ctrlpts ) curve1 . knotvector = curve1_kv # Create another curve fot the second half curve2 = temp_obj . __class__ ( ) curve2 . degree = temp_obj . degree curve2 . set_ctrlpts ( curve2_ctrlpts ) curve2 . knotvector = curve2_kv # Return the split curves ret_val = [ curve1 , curve2 ] return ret_val