Exemplo n.º 1
0
def insert_node_at(path, at):
    index = int(at)
    t = at - index
    newpath = CreatePath()
    copy_path(newpath, path, 0, index)
    type, control, node, cont = path.Segment(index + 1)
    if type == Line:
        newpath.AppendLine((1 - t) * path.Node(index) + t * node)
        newpath.select_segment(-1)
        newpath.AppendLine(node)
    else:
        if newpath.Continuity(-1) == ContSymmetrical:
            newpath.SetContinuity(-1, ContSmooth)
        p1, p2 = control
        p1, p2, q, p3, p4 = subdivide(newpath.Node(-1), p1, p2, node, t)
        newpath.AppendBezier(p1, p2, q, ContSmooth)
        newpath.select_segment(-1)
        if cont == ContSymmetrical:
            cont = ContSmooth
        newpath.AppendBezier(p3, p4, node, cont)
    copy_path(newpath, path, index + 2)
    if path.closed:
        newpath.ClosePath()
        newpath.SetContinuity(-1, path.Continuity(-1))
    return newpath
Exemplo n.º 2
0
def split_path_at(path, at):
    index = int(at)
    t = at - index
    if path.closed:
        path1 = path2 = CreatePath()
        result = [path1]
    else:
        path1 = CreatePath()
        path2 = CreatePath()
        result = [path1, path2]
        copy_path(path1, path, 0, 0, copy_selection = 0)

    type, control, node, cont = path.Segment(index + 1)
    if type == Line:
        q = (1 - t) * path.Node(index) + t * node
        path2.AppendLine(q)
        path2.AppendLine(node)
        path2.select_segment(0)
        function = path1.AppendLine
        args = (q,)
    else:
        p1, p2 = control
        p1, p2, q, p3, p4 = subdivide(path.Node(index), p1, p2, node, t)
        path2.AppendLine(q)
        path2.AppendBezier(p3, p4, node, cont)
        path2.select_segment(0)
        function = path1.AppendBezier
        args = (p1, p2, q, ContSymmetrical)
    copy_path(path2, path, index + 2, copy_selection = 0)
    copy_path(path1, path, 1, index, copy_selection = 0)
    apply(function, args)
    return result
Exemplo n.º 3
0
def insert_segments(path):
    newpath = CreatePath()
    newpath.AppendLine(path.Node(0), path.Continuity(0))
    newpath.select_segment(0, path.SegmentSelected(0))

    for i in range(1, path.len):
	type, p12, p, cont = path.Segment(i)
	if path.SegmentSelected(i) and path.SegmentSelected(i - 1):
	    if type == Line:
		node = 0.5 * path.Node(i - 1) + 0.5 * path.Node(i)
		newpath.AppendLine(node)
		newpath.select_segment(-1)
		newpath.AppendLine(path.Node(i))
		newpath.select_segment(-1)
	    else:
                if newpath.Continuity(-1) == ContSymmetrical:
                    newpath.SetContinuity(-1, ContSmooth)
                p1, p2 = p12
		p1, p2, node, p3, p4 = subdivide(path.Node(i - 1), p1, p2, p)
		newpath.AppendBezier(p1, p2, node, ContSymmetrical)
		newpath.select_segment(-1)
                if cont == ContSymmetrical:
                    cont = ContSmooth
		newpath.AppendBezier(p3, p4, p, cont)
		newpath.select_segment(-1)
	else:
	    newpath.AppendSegment(type, p12, p, cont)
	    newpath.select_segment(-1, path.SegmentSelected(i))
    if path.closed:
	newpath.ClosePath()
	newpath.SetContinuity(-1, path.Continuity(-1))
    return newpath