Пример #1
0
    def get_handle_at_point(self, pos, split=True):
        view = self.view
        connection_v = view.hovered_item
        handle = None

        end_handles = connection_v.end_handles(include_waypoints=True)
        if len(end_handles) == 4:
            from_handle, from_handle_waypoint, to_handle_waypoint, to_handle = end_handles
            cur_pos = self.view.get_matrix_v2i(connection_v).transform_point(
                *pos)

            max_distance = connection_v.line_width / 2.

            distance_from_segment, _ = distance_line_point(
                from_handle.pos, from_handle_waypoint.pos, cur_pos)
            if distance_from_segment < max_distance:
                return connection_v, from_handle

            distance_to_segment, _ = distance_line_point(
                to_handle.pos, to_handle_waypoint.pos, cur_pos)
            if distance_to_segment < max_distance:
                return connection_v, to_handle

        if split:
            try:
                segment = Segment(self.item, self.view)
            except TypeError:
                pass
            else:
                handle = segment.split(pos)

        if not handle:
            connection_v, handle = super(SegmentHandleFinder,
                                         self).get_handle_at_point(pos)
        return connection_v, handle
Пример #2
0
    def unselect(self):
        item = self.item
        handle = self.handle
        handles = item.handles()

        # don't merge using first or last handle
        if handles[0] is handle or handles[-1] is handle:
            return True

        handle_index = handles.index(handle)
        segment = handle_index - 1

        # cannot merge starting from last segment
        if segment == len(item.ports()) - 1:
            segment = -1
        assert segment >= 0 and segment < len(item.ports()) - 1

        before = handles[handle_index - 1]
        after = handles[handle_index + 1]
        d, p = distance_line_point(before.pos, after.pos, handle.pos)

        if d < 2:
            assert len(self.view.canvas.solver._marked_cons) == 0
            Segment(item, self.view).merge_segment(segment)

        if handle:
            item.request_update()
Пример #3
0
    def unselect(self):
        item = self.item
        handle = self.handle
        handles = item.handles()

        # don't merge using first or last handle
        if handles[0] is handle or handles[-1] is handle:
            return True

        handle_index = handles.index(handle)
        segment = handle_index - 1

        # cannot merge starting from last segment
        if segment == len(item.ports()) - 1:
            segment =- 1
        assert segment >= 0 and segment < len(item.ports()) - 1

        before = handles[handle_index - 1]
        after = handles[handle_index + 1]
        d, p = distance_line_point(before.pos, after.pos, handle.pos)

        if d < 2:
            assert len(self.view.canvas.solver._marked_cons) == 0
            Segment(item, self.view).merge_segment(segment)

        if handle:
            item.request_update()
Пример #4
0
def maybe_merge_segments(view, item, handle):
    handles = item.handles()

    # don't merge using first or last handle
    if handles[0] is handle or handles[-1] is handle:
        return

    # ensure at least three handles
    handle_index = handles.index(handle)
    segment = handle_index - 1

    # cannot merge starting from last segment
    if segment == len(item.ports()) - 1:
        segment = -1
    assert segment >= 0 and segment < len(item.ports()) - 1

    before = handles[handle_index - 1]
    after = handles[handle_index + 1]
    d, p = distance_line_point(before.pos, after.pos, handle.pos)

    if d > 2:
        return

    try:
        Segment(item, view.model).merge_segment(segment)
    except ValueError:
        pass
    else:
        if handle:
            view.model.request_update(item)
Пример #5
0
    def unselect(self):
        self.view.canvas.solver.solve()

        item = self.item
        handle = self.handle
        handles = item.handles()

        # don't merge using first or last handle
        if handles[0] is handle or handles[-1] is handle:
            return True

        handle_index = handles.index(handle)
        segment = handle_index - 1

        # cannot merge starting from last segment
        if segment == len(item.ports()) - 1:
            segment = -1
        assert 0 <= segment < len(item.ports()) - 1

        before = handles[handle_index - 1]
        after = handles[handle_index + 1]
        d, p = distance_line_point(before.pos, after.pos, handle.pos)

        # Checks how far the waypoint is from an imaginary line connecting the previous and next way/end point
        # If it is close, the two segments are merged to one
        merge_distance = item.line_width * 4
        if d < merge_distance:
            assert len(self.view.canvas.solver._marked_cons) == 0
            Segment(item, self.view).merge_segment(segment)

        if handle:
            item.request_update()
Пример #6
0
    def point(self, pos):
        """Find distance to lifeline item.

        Distance to lifeline's head and lifeline's lifetime is
        calculated and minimum is returned.
        """
        d1 = super().point(pos)
        top = self.lifetime.top
        bottom = self.lifetime.bottom
        d2 = distance_line_point(top.pos, bottom.pos, pos)[0]
        return min(d1, d2)
Пример #7
0
    def point(self, x, y):
        """Find distance to lifeline item.

        We calculate the distance to the lifeline's head, and then we
        calculate the lifetime. We return the minimum.
        """
        d1 = super().point(x, y)
        top = self.lifetime.top
        bottom = self.lifetime.bottom
        d2 = distance_line_point(top.pos, bottom.pos, (x, y))[0]
        return min(d1, d2)
Пример #8
0
 def glue(self, pos):
     """Behaves like simple line port, but for folded interface suggests
     connection to the middle point of a port."""
     if self.is_folded():
         px = (self.start.x + self.end.x) / 2
         py = (self.start.y + self.end.y) / 2
         d = distance_point_point((px, py), pos)
         return (px, py), d
     else:
         d, pl = distance_line_point(self.start, self.end, pos)
         return pl, d
Пример #9
0
    def point(self, pos):
        """
        Find distance to lifeline item.

        Distance to lifeline's head and lifeline's lifetime is calculated
        and minimum is returned.
        """
        d1 = super(LifelineItem, self).point(pos)
        top = self.lifetime.top
        bottom = self.lifetime.bottom
        d2 = distance_line_point(top.pos, bottom.pos, pos)[0]
        return min(d1, d2)
Пример #10
0
    def glue(self, pos):
        """
        Get glue point on the port and distance to the port.

        >>> p1, p2 = (0.0, 0.0), (100.0, 100.0)
        >>> port = LinePort(p1, p2)
        >>> port.glue((50, 50))
        ((50.0, 50.0), 0.0)
        >>> port.glue((0, 10))
        ((5.0, 5.0), 7.0710678118654755)
        """
        d, pl = distance_line_point(self.start, self.end, pos)
        return pl, d
Пример #11
0
    def glue(self, pos):
        """
        Get glue point on the port and distance to the port.

        >>> p1, p2 = (0.0, 0.0), (100.0, 100.0)
        >>> port = LinePort(p1, p2)
        >>> port.glue((50, 50))
        ((50.0, 50.0), 0.0)
        >>> port.glue((0, 10))
        ((5.0, 5.0), 7.0710678118654755)
        """
        d, pl = distance_line_point(self.start, self.end, pos)
        return pl, d
Пример #12
0
    def glue(self, pos: SupportsFloatPos) -> Tuple[Pos, float]:
        """Get glue point on the port and distance to the port.

        >>> p1, p2 = (0.0, 0.0), (100.0, 100.0)
        >>> port = LinePort(p1, p2)
        >>> port.glue((50, 50))
        ((50.0, 50.0), 0.0)
        >>> port.glue((0, 10))
        ((5.0, 5.0), 7.0710678118654755)
        """
        d, pl = distance_line_point(self.start.tuple(), self.end.tuple(),
                                    (float(pos[0]), float(pos[1])))
        return pl, d
Пример #13
0
 def glue(self, pos):
     """
     Behaves like simple line port, but for folded interface suggests
     connection to the middle point of a port.
     """
     if self.iface.folded:
         px = old_div((self.start.x + self.end.x), 2)
         py = old_div((self.start.y + self.end.y), 2)
         d = distance_point_point((px, py), pos)
         return (px, py), d
     else:
         p1 = self.start
         p2 = self.end
         d, pl = distance_line_point(p1, p2, pos)
         return pl, d
Пример #14
0
 def glue(self, pos):
     """
     Behaves like simple line port, but for folded interface suggests
     connection to the middle point of a port.
     """
     if self.iface.folded:
         px = (self.start.x + self.end.x) / 2
         py = (self.start.y + self.end.y) / 2
         d = distance_point_point((px, py), pos)
         return (px, py), d
     else:
         p1 = self.start
         p2 = self.end
         d, pl = distance_line_point(p1, p2, pos)
         return pl, d
Пример #15
0
 def point(self, pos):
     h1, h2 = self._handles
     d, p = distance_line_point(h1.pos, h2.pos, pos)
     # Substract line_width / 2
     return d - 3
Пример #16
0
 def point(self, pos):
     h1, h2 = self._handles
     d, p = distance_line_point(h1.pos, h2.pos, pos)
     # Substract line_width / 2
     return d - 3
Пример #17
0
 def point(self, x, y):
     h1, h2 = self._handles
     d, p = distance_line_point(h1.pos, h2.pos, (x, y))
     # Subtract line_width / 2
     return d - 3