def preview(self, input, direction): if self.step == 0: # object to rotate self.prev_dat['object'] = input return [] elif self.step == 1: # axis to rotate about dirvec = vec(0, 0, 0) dirvec[direction] = 1 axis = gp.gp_Ax1(input, dirvec.to_gp_Dir()) # make a copy (copy.copy does not work) point = gp_.gp_Pnt_(input) point[direction] += 2 input[direction] -= .2 axis_plot = BRepBuilderAPI.BRepBuilderAPI_MakeEdge( GC.GC_MakeSegment(input, point).Value()).Edge() self.prev_dat['point'] = input self.prev_dat['dirvec'] = dirvec self.prev_dat['axis'] = axis self.prev_dat['axis-plot'] = axis_plot return [axis_plot] elif self.step == 2: # start point self.prev_dat['point_start'] = input return [self.prev_dat['axis-plot']] elif self.step == 3: p0 = self.prev_dat['point'] vec0 = self.prev_dat['point_start'] - p0 vec1 = input - p0 dirvec = self.prev_dat['dirvec'] n0 = dirvec.cross(vec0) n1 = dirvec.cross(vec1) try: cos = n0.dot(n1) / (n0.length() * n1.length()) except ZeroDivisionError: raise InvalidInputException angle = math.acos(min(max(cos, -1), 1)) # cos might be (-)1.000001 oriented_dirvec = n0.cross(n1) if oriented_dirvec == vec(0, 0, 0): raise InvalidInputException axis = gp.gp_Ax1(p0, oriented_dirvec.to_gp_Dir()) tr = gp.gp_Trsf() tr.SetRotation(axis, angle) t = self.prev_dat['object'].Moved(TopLoc.TopLoc_Location(tr)) t = copy_geom.copy(t) self._final = [t] self.remove = [self.prev_dat['object']] return [t, self.prev_dat['axis-plot']]
def preview(self, inp, direction): if self.step == 0: self.previous_data = [inp] return [BRepBuilderAPI.BRepBuilderAPI_MakeVertex(inp).Vertex()] elif self.step == 1: point0 = self.previous_data[0] point1 = inp # checking if the previous points are identical: This is necessary # before continuing in order to avoid a crash on Windows if point0 == point1: raise InvalidInputException dirvec = vec(0, 0, 0) dirvec[direction] = 1 axis = gp.gp_Ax2(point0, dirvec.to_gp_Dir()) d = point0 - inp d[direction] = 0 dist = d.length() a = Geom.Geom_Circle(axis, dist).GetHandle() b = BRepBuilderAPI.BRepBuilderAPI_MakeEdge(a).Edge() c = BRepBuilderAPI.BRepBuilderAPI_MakeWire(b).Wire() d = BRepBuilderAPI.BRepBuilderAPI_MakeFace(c).Face() self._final = [d] return self._final
def preview(self, input, direction): assert self.step == 0 vec_ = vec(0, 0, 0) vec_[direction] = 1 tr = gp.gp_Trsf() tr.SetMirror(gp.gp_Ax2(gp_.gp_Pnt(0, 0, 0), vec_.to_gp_Dir())) # object.Moved() cannot be used here because it does not adjust # the surface orientation and will result in incorrect models t = BRepBuilderAPI.BRepBuilderAPI_Transform(input, tr).Shape() t = copy_geom.copy(t) self._final = [t] self.remove = [input] return self._final
def preview(self, input, direction): if self.step == 0: self.previous_data = [input] return [] elif self.step == 1: object = self.previous_data[0] dirvec = vec(0, 0, 0) dirvec[direction] = 1 axis = gp.gp_Ax1(input, dirvec.to_gp_Dir()) self.remove = [self.previous_data[0]] self._final = [BRepPrimAPI.BRepPrimAPI_MakeRevol( object, axis).Shape()] return self._final
def preview(self, input, direction): veclist = [] for edge in subshapes(input, TopAbs_EDGE): vertices = subshapes(edge, TopAbs_VERTEX) vec_ = gp_Pnt_(vertices[0]) - gp_Pnt_(vertices[1]) veclist.append(vec_) prisms = [] for vec_ in veclist: vec_ = vec_ * (1/vec_.length())*100 v = vec(vec_[1], -vec_[0], 100) prism = BRepPrimAPI.BRepPrimAPI_MakePrism(input, gp.gp_Vec(v[0], v[1], v[2])).Shape() prisms.append(prism) p = prisms.pop() for p_ in prisms: p = intersection(p, p_)[0] self._final = [p] return self._final
def __sub__(self, other): return vec(self[i] - other[i] for i in range(3))