def get_keypoint_viewport_box(self, keypoint: AlignKeypoint) -> Rect: """ Get a bbox rect in view coordinates for a keypoint :param keypoint: :return: """ p = self.get_keypoint_viewport_center(keypoint) return Rect.from_center_size(p, width=self.d1 * 2, height=self.d1 * 2)
def fit_point_cloud(self, points: List[Vec2]): new_points = [project_point(self.__rotate_flip, p) for p in points] if not new_points: return r = Rect.from_center_size(new_points.pop()) for p in new_points: r.point_merge(p) self.__fit_postrotate_rect(r)
def theta_bbox(self) -> Rect: if self.side_pins[0] or self.side_pins[2]: x_axis = self.dim_2_pincenter + self.pin_contact_length + self.pin_contact_width * 2 else: x_axis = self.dim_2_body if self.side_pins[1] or self.side_pins[3]: y_axis = self.dim_1_pincenter + self.pin_contact_length + self.pin_contact_width * 2 else: y_axis = self.dim_1_body return Rect.from_center_size(Point2(0, 0), x_axis, y_axis)
def update_if_necessary(self) -> None: if not self.needs_rebuild(update=True): return components = self.__project.artwork.components self.__top_side_pads.restart() self.__top_side_labels.restart() self.__bottom_side_labels.restart() self.__bottom_side_pads.restart() for cmp in components: if cmp.side == SIDE.Top: pad_batch = self.__top_side_pads else: pad_batch = self.__bottom_side_pads for pad in cmp.get_pads(): if pad.is_through(): r = Rect.from_center_size(Point2(0, 0), pad.length * 0.6, pad.width * 0.6) else: r = Rect.from_center_size(Point2(0, 0), pad.length * 0.8, pad.width * 0.8) mat = cmp.matrix.dot(pad.translate_mat) r_top = r.copy() s = "%s: %s" % (pad.pad_no, pad.pad_name) ti = pad_batch.get_string(s) text_mat = mat.dot(ti.get_render_to_mat(r_top)) pad_batch.add(text_mat, ti) self.__top_side_pads.prepare() self.__top_side_labels.prepare() self.__bottom_side_labels.prepare() self.__bottom_side_pads.prepare()
def __init__(self, pt: Vec2, viapair: 'ViaPair', r: float, net: Optional['pcbre.model.net.Net'] = None) -> None: super(Via, self).__init__() self.pt = pt self.r = r self.viapair = viapair self._net = net self._bbox = Rect.from_center_size(pt, r * 2, r * 2) self._project = None self.__poly_repr = ShapelyPoint(pt).buffer(self.r)
def get_handle_index_for_mouse(self, pos: Vec2) -> Optional[int]: """ Returns the index of a handle (or None if one isn't present) given a MoveEvent""" for n, handle in enumerate(self.model.all_handles()): if handle is None: continue # get the pix-wise BBOX of the handle p = self.im2V(handle) # Rect encompassing the handle r = Rect.from_center_size(p, HANDLE_HALF_SIZE * 2, HANDLE_HALF_SIZE * 2) # If event inside the bbox if r.point_test(pos) != 0: return n return None
def theta_bbox(self) -> Rect: length = max(self.pin_d + self.pin_corner_vec.x, self.body_corner_vec.x) width = max(self.pin_corner_vec.y, self.body_corner_vec.y) return Rect.from_center_size(Point2(0, 0), length * 2, width * 2)
def theta_bbox(self) -> Rect: return Rect.from_center_size(Point2(0, 0), self.body_width(), self.body_length())
def bbox(self) -> Rect: longest_dim = max(self.width, self.length) return Rect.from_center_size(self.center, longest_dim, longest_dim)