Esempio n. 1
0
    def ellipse_parameters(self):
        if self.curvetype() != "ellipse":
            raise Exception("curve is not ellipse")

        o = self.AdaptorCurve().Ellipse()
        p = o.Position()

        return (point3(p.Location()), o.MajorRadius(), o.MinorRadius(),
                vector3(p.XDirection()), vector3(p.YDirection()))
Esempio n. 2
0
    def circle_parameters(self):
        if self.curvetype() != "circle":
            raise Exception("curve is not circle")

        o = self.AdaptorCurve().Circle()
        p = o.Position()

        return (point3(p.Location()), o.Radius(), vector3(p.XDirection()),
                vector3(p.YDirection()))
Esempio n. 3
0
def short_rotate(f, t):
    f, t = vector3(evalcache.unlazy_if_need(f)), vector3(
        evalcache.unlazy_if_need(t))

    f = f / np.linalg.norm(f)
    t = t / np.linalg.norm(t)

    if np.linalg.norm(f - t) < 1e-5:
        return nulltrans()

    axis = np.cross(f, t)
    dot_product = np.dot(f, t)
    angle = np.arccos(dot_product)

    return rotate(axis, angle)
Esempio n. 4
0
def _extrude(shp, vec, center=False):
    if type(vec) in (float, int):
        vec = vector3(0, 0, vec)
    else:
        vec = vector3(vec)

    if center:
        trs = translate(-vec / 2)
        return _extrude(trs(shp), vec)

    # Если в объекте есть только один face, но сам объект не face,
    # извлекаем face и применяем влгоритм на нём.
    shp = _restore_shapetype(shp)
    obj = shp.Shape()

    return Shape(BRepPrimAPI_MakePrism(obj, vec.Vec()).Shape())
Esempio n. 5
0
    def prepare(self, pnts, rel):
        if rel is None:
            rel = self.default_rel

        if rel is False:
            return points(pnts)
        else:
            return [self.current + vector3(p) for p in pnts]
Esempio n. 6
0
 def rotate(self, ax, angle):
     return self.lazyinvoke(
         pyservoce.Shape.rotate,
         (self, vector3(ax), angle),
         {},
         encache=False,
         decache=False,
         cls=LazyObjectShape,
     )
Esempio n. 7
0
    def normal(self, u=0, v=0):
        from zencad.geom.operations import _restore_shapetype
        shp = _restore_shapetype(self)

        if not shp.is_face():
            raise Exception(
                "Can't take normal from non face shape. type:", self.shapetype())

        return vector3(shp._SLProps(u, v).Normal())
Esempio n. 8
0
def pipe_shell(profiles,
               spine,
               frenet=False,
               binormal=vector3(0, 0, 0),
               parallel=vector3(0, 0, 0),
               force_approx_c1=False,
               solid=True,
               discrete=False,
               transition=0,
               path=None,
               proto=None):
    if path is not None:
        spine = path
        print("pipe: path option is renamed. use spine instead")
    if proto is not None:
        profiles = [proto]
        print("pipe: proto option was renamed. use profile instead")

    fwires = []
    for w in profiles:
        if w.shapetype() == "edge":
            fwires.append(w.as_edge())

        elif w.shapetype() == "face":
            if (len(w.wires()) == 1):
                fwires.append(w.wires()[0])
            else:
                raise Exception("faces with more than one wire is unsupported")

        else:
            fwires.append(w)

    return pyservoce.pipe_shell(profiles=fwires,
                                spine=spine,
                                frenet=frenet,
                                force_approx_c1=force_approx_c1,
                                binormal=vector3(binormal),
                                parallel=vector3(parallel),
                                discrete=discrete,
                                transition=transition,
                                solid=solid)
Esempio n. 9
0
    def arc(self, c, r, angle, rel=None):
        c, = self.prepare([c], rel)
        v = self.current - c

        vangle = v.angle()
        if zencad.vector3(1, 0, 0).cross(v).z < 0:
            vangle = -vangle

        shp = zencad.circle(r, angle=angle,
                            wire=True).rotZ(vangle).mov(vector3(c))
        self.edges.append(shp)
        ep = shp.endpoints().unlazy()
        self.current = ep[1] if angle >= 0 else ep[0]
        return self
Esempio n. 10
0
def _wideedge(spine, rad, last_p0, last_p1, circled_joints):
    # TODO: переимплементировать без сегмента
    import zencad

    if spine.shapetype() != "edge":
        raise Exception("argument 'curve' should be edge")

    ad0 = spine.endpoints()[0]
    ad1 = spine.endpoints()[1]

    d10 = spine.d1(spine.range()[0]).cross(vector3(0, 0, 1)).normalize()
    d11 = spine.d1(spine.range()[1]).cross(vector3(0, 0, 1)).normalize()
    #p0 = pyservoce.vertex((pt*rad/2).to_point3())
    #p1 = pyservoce.vertex((-pt*rad/2).to_point3())

    # начальные точки
    p00 = ad0 + (d10 * rad)
    p01 = ad0 - (d10 * rad)

    #конечные точки
    p10 = ad1 + (d11 * rad)
    p11 = ad1 - (d11 * rad)

    perp = pyservoce.segment(p00, p01)
    wc = pyservoce.pipe(profile=perp, spine=spine, mode="corrected_frenet")

    wc = wc.faces()[0]

    if circled_joints is False:
        if last_p1 is not None and last_p0 is not None:
            wc = wc + pyservoce.polygon([last_p0, p00, ad0])
            wc = wc + pyservoce.polygon([last_p1, p01, ad0])
    else:
        if last_p1 is not None and last_p0 is not None:
            wc += pyservoce.circle(r=rad).mov(vector3(ad0))

    return wc, p10, p11  #union(edgs)
Esempio n. 11
0
def _wideedge(spine, rad, last_p0, last_p1, circled_joints):
    import zencad.geom.sweep as sweep
    # TODO: переимплементировать без сегмента
    import zencad

    if spine.shapetype() != "edge":
        raise Exception("argument 'curve' should be edge")

    ad0 = spine.endpoints()[0]
    ad1 = spine.endpoints()[1]

    d10 = spine.d1(spine.range()[0]).cross(vector3(0, 0, 1)).normalize()
    d11 = spine.d1(spine.range()[1]).cross(vector3(0, 0, 1)).normalize()

    # начальные точки
    p00 = ad0 + (d10 * rad)
    p01 = ad0 - (d10 * rad)

    # конечные точки
    p10 = ad1 + (d11 * rad)
    p11 = ad1 - (d11 * rad)

    perp = wire_module._segment(p01, p00)
    wc = sweep._pipe(perp, spine, mode="corrected_frenet")

    wc = wc.faces()[0]

    if circled_joints is False:
        if last_p1 is not None and last_p0 is not None:
            wc = wc + face._polygon([last_p0, p00, ad0])
            wc = wc + face._polygon([last_p1, p01, ad0])
    else:
        if last_p1 is not None and last_p0 is not None:
            wc += face._circle(r=rad).mov(vector3(ad0))

    return wc, p10, p11  # union(edgs)
Esempio n. 12
0
def short_rotate(fromvec, tovec):
    return pyservoce.short_rotate(vector3(fromvec), vector3(tovec))
Esempio n. 13
0
def linear_extrude(shp, vec, center=False):
    if isinstance(vec, (int, float)):
        vec = vector3(0, 0, vec)
    return pyservoce.make_linear_extrude(shp, vector3(vec), center)
Esempio n. 14
0
def rotate(ax, angle):
    return pyservoce.rotate(vector3(ax), angle)
Esempio n. 15
0
def short_rotate(f, t):
    _f, _t = vector3(f).normalize(), vector3(t).normalize()
    if _f.early(_t, 1e-5):
        return nulltrans()
    return pyservoce.short_rotate(t=_t, f=_f)
Esempio n. 16
0
 def d1(self, arg):
     assert (self.is_edge())
     adaptor = self.AdaptorCurve()
     pnt, vec = gp_Pnt(), gp_Vec()
     self.AdaptorCurve().D1(arg, pnt, vec)
     return vector3((vec.X(), vec.Y(), vec.Z()))
Esempio n. 17
0
def rotate(v, a):
    return pyservoce.rotate(v=vector3(v), a=a)