Module sverchok.utils.fillet

Expand source code
import numpy as np
from math import tan, sin, pi

from mathutils import Vector, Matrix

from sverchok.utils.curve.primitives import SvCircle, SvLine
from sverchok.utils.curve.bezier import SvBezierCurve

class ArcFilletData(object):
    def __init__(self, center, matrix, normal, radius, p1, p2, v2, angle):
        self.center = center
        self.normal = normal
        self.radius = radius
        self.p1 = p1
        self.p2 = p2
        self.vertex = np.array(v2)
        self.angle = angle
        self.matrix = matrix

    def get_circular_arc(self):
        center = np.array(self.center)
        normal = np.array(self.normal)
        p1 = np.array(self.p1)

        circle = SvCircle(center = center,
                    normal = -normal,
                    vectorx = p1 - center)
        circle.u_bounds = (0.0, self.angle)
        #circle.u_bounds = (-self.angle, 0.0)
        return circle

    def get_bezier_arc(self):
        cpts = np.array([self.p1, self.vertex, self.p2])
        return SvBezierCurve(cpts)

    def get_bevel(self):
        return SvLine.from_two_points(self.p1, self.p2)

def calc_fillet(v1, v2, v3, radius):
    if not isinstance(v1, Vector):
        v1 = Vector(v1)
    if not isinstance(v2, Vector):
        v2 = Vector(v2)
    if not isinstance(v3, Vector):
        v3 = Vector(v3)

    dv1 = v1 - v2
    dv2 = v3 - v2
    dv1n, dv2n = dv1.normalized(), dv2.normalized()
    angle = dv1.angle(dv2)
    if abs(angle) < 1e-6 or abs(angle-pi) < 1e-6:
        # The two edges are parallel
        return None

    angle2 = angle / 2.0
    big_angle = pi - angle

    edge_len = radius / tan(angle2)
    p1 = v2 + edge_len * dv1n
    p2 = v2 + edge_len * dv2n

    center_len = radius / sin(angle2)
    center = v2 + center_len * (dv1n + dv2n).normalized()

    normal = dv1.cross(dv2).normalized()
    to_p1 = (p1 - center).normalized()
    binormal = normal.cross(to_p1).normalized()

    matrix = Matrix([to_p1, -binormal, normal]).to_4x4().inverted()
    matrix.translation = center

    return ArcFilletData(center, matrix, normal, radius, p1, p2, v2, big_angle)

Functions

def calc_fillet(v1, v2, v3, radius)
Expand source code
def calc_fillet(v1, v2, v3, radius):
    if not isinstance(v1, Vector):
        v1 = Vector(v1)
    if not isinstance(v2, Vector):
        v2 = Vector(v2)
    if not isinstance(v3, Vector):
        v3 = Vector(v3)

    dv1 = v1 - v2
    dv2 = v3 - v2
    dv1n, dv2n = dv1.normalized(), dv2.normalized()
    angle = dv1.angle(dv2)
    if abs(angle) < 1e-6 or abs(angle-pi) < 1e-6:
        # The two edges are parallel
        return None

    angle2 = angle / 2.0
    big_angle = pi - angle

    edge_len = radius / tan(angle2)
    p1 = v2 + edge_len * dv1n
    p2 = v2 + edge_len * dv2n

    center_len = radius / sin(angle2)
    center = v2 + center_len * (dv1n + dv2n).normalized()

    normal = dv1.cross(dv2).normalized()
    to_p1 = (p1 - center).normalized()
    binormal = normal.cross(to_p1).normalized()

    matrix = Matrix([to_p1, -binormal, normal]).to_4x4().inverted()
    matrix.translation = center

    return ArcFilletData(center, matrix, normal, radius, p1, p2, v2, big_angle)

Classes

class ArcFilletData (center, matrix, normal, radius, p1, p2, v2, angle)
Expand source code
class ArcFilletData(object):
    def __init__(self, center, matrix, normal, radius, p1, p2, v2, angle):
        self.center = center
        self.normal = normal
        self.radius = radius
        self.p1 = p1
        self.p2 = p2
        self.vertex = np.array(v2)
        self.angle = angle
        self.matrix = matrix

    def get_circular_arc(self):
        center = np.array(self.center)
        normal = np.array(self.normal)
        p1 = np.array(self.p1)

        circle = SvCircle(center = center,
                    normal = -normal,
                    vectorx = p1 - center)
        circle.u_bounds = (0.0, self.angle)
        #circle.u_bounds = (-self.angle, 0.0)
        return circle

    def get_bezier_arc(self):
        cpts = np.array([self.p1, self.vertex, self.p2])
        return SvBezierCurve(cpts)

    def get_bevel(self):
        return SvLine.from_two_points(self.p1, self.p2)

Methods

def get_bevel(self)
Expand source code
def get_bevel(self):
    return SvLine.from_two_points(self.p1, self.p2)
def get_bezier_arc(self)
Expand source code
def get_bezier_arc(self):
    cpts = np.array([self.p1, self.vertex, self.p2])
    return SvBezierCurve(cpts)
def get_circular_arc(self)
Expand source code
def get_circular_arc(self):
    center = np.array(self.center)
    normal = np.array(self.normal)
    p1 = np.array(self.p1)

    circle = SvCircle(center = center,
                normal = -normal,
                vectorx = p1 - center)
    circle.u_bounds = (0.0, self.angle)
    #circle.u_bounds = (-self.angle, 0.0)
    return circle