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()))
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()))
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)
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())
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]
def rotate(self, ax, angle): return self.lazyinvoke( pyservoce.Shape.rotate, (self, vector3(ax), angle), {}, encache=False, decache=False, cls=LazyObjectShape, )
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())
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)
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
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)
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)
def short_rotate(fromvec, tovec): return pyservoce.short_rotate(vector3(fromvec), vector3(tovec))
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)
def rotate(ax, angle): return pyservoce.rotate(vector3(ax), angle)
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)
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()))
def rotate(v, a): return pyservoce.rotate(v=vector3(v), a=a)