def distance(self, pos, eps): if self.shape_type == 'line': p0 = self.points[0] p1 = self.points[1] vec1 = p1 - p0 vec2 = pos - p0 dis = ((QPointF.dotProduct(vec1, vec2) / QPointF.dotProduct(vec1, vec1)) * vec1 - vec2).manhattanLength() if dis <= eps: return dis return None
def draw_connection_points(painter: QPainter, geom: NodeGeometry, state: NodeState, model: NodeDataModel, scene: FlowSceneBase, node_style: NodeStyle, connection_style: ConnectionStyle ): """ Draw connection points Parameters ---------- painter : QPainter geom : NodeGeometry state : NodeState model : NodeDataModel scene : FlowScene connection_style : ConnectionStyle """ diameter = node_style.connection_point_diameter reduced_diameter = diameter * 0.6 for port in state.ports: scene_pos = port.scene_position can_connect = port.can_connect port_type = port.port_type data_type = port.data_type r = 1.0 if state.is_reacting and can_connect and port_type == state.reacting_port_type: diff = geom.dragging_pos - scene_pos dist = math.sqrt(QPointF.dotProduct(diff, diff)) registry = scene.registry dtype1, dtype2 = state.reacting_data_type, data_type if port_type != PortType.input: dtype2, dtype1 = dtype1, dtype2 type_convertable = registry.get_type_converter(dtype1, dtype2) is not None if dtype1.id == dtype2.id or type_convertable: thres = 40.0 r = ((2.0 - dist / thres) if dist < thres else 1.0) else: thres = 80.0 r = ((dist / thres) if dist < thres else 1.0) if connection_style.use_data_defined_colors: brush = connection_style.get_normal_color(data_type.id) else: brush = node_style.connection_point_color painter.setBrush(brush) painter.drawEllipse(scene_pos, reduced_diameter * r, reduced_diameter * r)
def check_hit_scene_point(self, port_type: PortType, scene_point: QPointF, scene_transform: QTransform) -> Port: """ Check hit scene point Parameters ---------- port_type : PortType scene_point : QPointF scene_transform : QTransform Returns ------- value : Port """ if port_type == PortType.none: return None tolerance = 2.0 * self._style.connection_point_diameter for idx, port in self._node.state[port_type].items(): pos = port.get_mapped_scene_position(scene_transform) - scene_point distance = math.sqrt(QPointF.dotProduct(pos, pos)) if distance < tolerance: return port
def check_hit_scene_point( self, port_type: PortType, scene_point: QPointF, scene_transform: QTransform) -> typing.Optional[Port]: """ Check a scene point for a specific port type. Parameters ---------- port_type : PortType The port type to check for. scene_point : QPointF The point in the scene. scene_transform : QTransform The scene transform. Returns ------- port : Port or None The nearby port, if found. """ if port_type == PortType.none: return None nearby_port = None tolerance = 2.0 * self._style.connection_point_diameter for idx, port in self._node.state[port_type].items(): pos = port.get_mapped_scene_position(scene_transform) - scene_point distance = math.sqrt(QPointF.dotProduct(pos, pos)) if distance < tolerance: nearby_port = port break return nearby_port