Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
    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)
Exemple #4
0
    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()
Exemple #5
0
    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)
Exemple #6
0
    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
Exemple #7
0
 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)
Exemple #8
0
 def theta_bbox(self) -> Rect:
     return Rect.from_center_size(Point2(0, 0), self.body_width(), self.body_length())
Exemple #9
0
 def bbox(self) -> Rect:
     longest_dim = max(self.width, self.length)
     return Rect.from_center_size(self.center, longest_dim, longest_dim)