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
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()
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()
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)
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()
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)
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)
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
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)
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
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
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
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
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
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