示例#1
0
    def build(cls,
              implementation,
              degree_u,
              degree_v,
              knotvector_u,
              knotvector_v,
              control_points,
              weights=None,
              normalize_knots=False):
        control_points = np.asarray(control_points)
        m, n, _ = control_points.shape
        if weights is None:
            weights = np.ones((m, n))
        weights = np.asarray(weights)
        if normalize_knots:
            knotvector_u = sv_knotvector.normalize(knotvector_u)
            knotvector_v = sv_knotvector.normalize(knotvector_v)

        pts = [[Base.Vector(*t) for t in row] for row in control_points]

        ms_u = sv_knotvector.to_multiplicity(knotvector_u)
        knots_u = [p[0] for p in ms_u]
        mults_u = [p[1] for p in ms_u]
        ms_v = sv_knotvector.to_multiplicity(knotvector_v)
        knots_v = [p[0] for p in ms_v]
        mults_v = [p[1] for p in ms_v]

        surface = Part.BSplineSurface()
        surface.buildFromPolesMultsKnots(pts, mults_u, mults_v, knots_u,
                                         knots_v, False, False, degree_u,
                                         degree_v, weights.tolist())
        return SvFreeCadNurbsSurface(surface)
示例#2
0
    def build(cls,
              implementation,
              degree_u,
              degree_v,
              knotvector_u,
              knotvector_v,
              control_points,
              weights=None,
              normalize_knots=False):
        kv_error = sv_knotvector.check(degree_u, knotvector_u,
                                       len(control_points))
        if kv_error is not None:
            raise Exception("U direction: " + kv_error)
        kv_error = sv_knotvector.check(degree_v, knotvector_v,
                                       len(control_points[0]))
        if kv_error is not None:
            raise Exception("V direction: " + kv_error)

        if implementation == SvNurbsSurface.GEOMDL:
            return SvGeomdlSurface.build(degree_u, degree_v, knotvector_u,
                                         knotvector_v, control_points, weights,
                                         normalize_knots)
        elif implementation == SvNurbsSurface.NATIVE:
            if normalize_knots:
                knotvector_u = sv_knotvector.normalize(knotvector_u)
                knotvector_v = sv_knotvector.normalize(knotvector_v)
            return SvNativeNurbsSurface(degree_u, degree_v, knotvector_u,
                                        knotvector_v, control_points, weights)
        else:
            raise Exception(
                f"Unsupported NURBS Surface implementation: {implementation}")
示例#3
0
 def __init__(self,
              degree_u,
              degree_v,
              knotvector_u,
              knotvector_v,
              control_points,
              weights,
              normalize_knots=False):
     self.degree_u = degree_u
     self.degree_v = degree_v
     self.knotvector_u = np.array(knotvector_u)
     self.knotvector_v = np.array(knotvector_v)
     if normalize_knots:
         self.knotvector_u = sv_knotvector.normalize(self.knotvector_u)
         self.knotvector_v = sv_knotvector.normalize(self.knotvector_v)
     self.control_points = np.array(control_points)
     c_ku, c_kv, _ = self.control_points.shape
     if weights is None:
         self.weights = weights = np.ones((c_ku, c_kv))
     else:
         self.weights = np.array(weights)
         w_ku, w_kv = self.weights.shape
         if c_ku != w_ku or c_kv != w_kv:
             raise Exception(
                 f"Shape of control_points ({c_ku}, {c_kv}) does not match to shape of weights ({w_ku}, {w_kv})"
             )
     self.basis_u = SvNurbsBasisFunctions(knotvector_u)
     self.basis_v = SvNurbsBasisFunctions(knotvector_v)
     self.u_bounds = (self.knotvector_u.min(), self.knotvector_u.max())
     self.v_bounds = (self.knotvector_v.min(), self.knotvector_v.max())
     self.normal_delta = 0.0001
     self.__description__ = f"Native NURBS (degree={degree_u}x{degree_v}, pts={self.control_points.shape[0]}x{self.control_points.shape[1]})"
示例#4
0
 def build(cls, implementation, degree, knotvector, control_points, weights=None, normalize_knots=False):
     kv_error = sv_knotvector.check(degree, knotvector, len(control_points))
     if kv_error is not None:
         raise Exception(kv_error)
     if implementation == SvNurbsCurve.NATIVE:
         if normalize_knots:
             knotvector = sv_knotvector.normalize(knotvector)
         return SvNativeNurbsCurve(degree, knotvector, control_points, weights)
     elif implementation == SvNurbsCurve.GEOMDL and geomdl is not None:
         return SvGeomdlCurve.build(degree, knotvector, control_points, weights, normalize_knots)
     else:
         raise Exception(f"Unsupported NURBS Curve implementation: {implementation}")
示例#5
0
    def build(cls, implementation, degree, knotvector, control_points, weights=None, normalize_knots=False):
        n = len(control_points)
        if weights is None:
            weights = np.ones((n,))

        if normalize_knots:
            knotvector = sv_knotvector.normalize(knotvector)

        pts = [Base.Vector(t[0], t[1], t[2]) for t in control_points]
        ms = sv_knotvector.to_multiplicity(knotvector)
        knots = [p[0] for p in ms]
        mults = [p[1] for p in ms]

        curve = Part.BSplineCurve()
        curve.buildFromPolesMultsKnots(pts, mults, knots, False, degree, weights)
        return SvFreeCadNurbsCurve(curve)
示例#6
0
文件: nurbs.py 项目: Moult/sverchok
 def __init__(self,
              degree,
              knotvector,
              control_points,
              weights=None,
              normalize_knots=False):
     self.control_points = np.array(control_points)  # (k, 3)
     k = len(control_points)
     if weights is not None:
         self.weights = np.array(weights)  # (k, )
     else:
         self.weights = np.ones((k, ))
     self.knotvector = np.array(knotvector)
     if normalize_knots:
         self.knotvector = sv_knotvector.normalize(self.knotvector)
     self.degree = degree
     self.basis = SvNurbsBasisFunctions(knotvector)
     self.tangent_delta = 0.001
     self.u_bounds = None  # take from knotvector
     self.__description__ = f"Native NURBS (degree={degree}, pts={k})"