示例#1
0
    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
示例#2
0
    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)
示例#3
0
    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
示例#4
0
    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