示例#1
0
class Channel(Connection):
    ''' Subclass of Connection used to draw channels between processes '''
    in_sig = out_sig = None

    def __init__(self, process):
        ''' Set generic parameters from Connection class '''
        super(Channel, self).__init__(process, process)
        self.label_in = QGraphicsTextItem('[]', parent=self)
        self.label_out = QGraphicsTextItem('[]', parent=self)
        if not Channel.in_sig:
            # keep at class level as long as only one process is supported
            # when copy-pasting a process the challel in/out signal lists
            # are not parsed. Workaround is to keep the list "global"
            # to allow a copy of both process and channel
            # Needed for the image exporter, that copies the scene to a
            # temporary one
            Channel.in_sig = '[{}]'.format(',\n'.join(
                sig['name'] for sig in process.input_signals))
            Channel.out_sig = '[{}]'.format(',\n'.join(
                sig['name'] for sig in process.output_signals))
        font = QFont('Ubuntu', pointSize=8)
        for each in (self.label_in, self.label_out):
            each.setFont(font)
            each.show()
        self.process = process
        self.reshape()

    @property
    def start_point(self):
        ''' Compute connection origin - redefined function '''
        parent_rect = self.process.boundingRect()
        return QPointF(parent_rect.x(), parent_rect.height() / 2)

    @property
    def end_point(self):
        ''' Compute connection end point - redefined function '''
        # Arrow always bumps at the screen edge
        try:
            view = self.scene().views()[0]
            view_pos = view.mapToScene(
                view.viewport().geometry()).boundingRect().topLeft()
            scene_pos_x = self.mapFromScene(view_pos).x()
            return QPointF(scene_pos_x, self.start_point.y())
        except (IndexError, AttributeError):
            # In case there is no view (e.g. Export PNG from cmd line)
            return QPointF(self.start_point.x() - 250, self.start_point.y())

    def reshape(self):
        ''' Redefine shape function to add the text areas '''
        super(Channel, self).reshape()

        self.label_in.setPlainText(self.in_sig)
        self.label_out.setPlainText(self.out_sig)

        width_in = self.label_in.boundingRect().width()

        self.label_in.setX(self.start_point.x() - width_in)
        self.label_in.setY(self.start_point.y() + 5)
        self.label_out.setX(self.end_point.x() + 10)
        self.label_out.setY(self.end_point.y() + 5)
示例#2
0
class Channel(Connection):
    ''' Subclass of Connection used to draw channels between processes '''
    in_sig = out_sig = None
    def __init__(self, process):
        ''' Set generic parameters from Connection class '''
        super(Channel, self).__init__(process, process)
        self.label_in = QGraphicsTextItem('[]', parent=self)
        self.label_out = QGraphicsTextItem('[]', parent=self)
        if not Channel.in_sig:
            # keep at class level as long as only one process is supported
            # when copy-pasting a process the challel in/out signal lists
            # are not parsed. Workaround is to keep the list "global"
            # to allow a copy of both process and channel
            # Needed for the image exporter, that copies the scene to a
            # temporary one
            Channel.in_sig = '[{}]'.format(',\n'.join(sig['name']
                                   for sig in process.input_signals))
            Channel.out_sig = '[{}]'.format(',\n'.join(sig['name']
                                    for sig in process.output_signals))
        font = QFont('Ubuntu', pointSize=8)
        for each in (self.label_in, self.label_out):
            each.setFont(font)
            each.show()
        self.process = process
        self.reshape()

    @property
    def start_point(self):
        ''' Compute connection origin - redefined function '''
        parent_rect = self.process.boundingRect()
        return QPointF(parent_rect.x(), parent_rect.height() / 2)

    @property
    def end_point(self):
        ''' Compute connection end point - redefined function '''
        # Arrow always bumps at the screen edge
        try:
            view = self.scene().views()[0]
            view_pos = view.mapToScene(
                           view.viewport().geometry()).boundingRect().topLeft()
            scene_pos_x = self.mapFromScene(view_pos).x()
            return QPointF(scene_pos_x, self.start_point.y())
        except (IndexError, AttributeError):
            # In case there is no view (e.g. Export PNG from cmd line)
            return QPointF(self.start_point.x() - 250, self.start_point.y())

    def reshape(self):
        ''' Redefine shape function to add the text areas '''
        super(Channel, self).reshape()

        self.label_in.setPlainText(self.in_sig)
        self.label_out.setPlainText(self.out_sig)

        width_in = self.label_in.boundingRect().width()

        self.label_in.setX(self.start_point.x() - width_in)
        self.label_in.setY(self.start_point.y() + 5)
        self.label_out.setX(self.end_point.x() + 10)
        self.label_out.setY(self.end_point.y() + 5)
示例#3
0
class QNEPort(QGraphicsPathItem):
    (NamePort, TypePort) = (1, 2)
    (Type) = (QGraphicsItem.UserType + 1)

    def __init__(self, parent):
        super(QNEPort, self).__init__(parent)

        self.label = QGraphicsTextItem(self)
        self.radius_ = 4
        self.margin = 3
        self.widgetWidth = 50

        self.setPen(QPen(QApplication.palette().text().color(), 1))
        self.setBrush(QApplication.palette().highlight())
        self.setFlag(QGraphicsItem.ItemSendsScenePositionChanges)

        self.valueText = QNEValue(self)
        self.valueText.setPort(self)

        self.outputPort = QNEOutputPort(self)

        self.m_portFlags = 0
        self.hasInput_ = False
        self.hasOutput_ = False

        self.m_block = None
        self.m_connections = []

    def __del__(self):
        #print("Del QNEPort %s" % self.name)
        pass

    def delete(self):
        for connection in self.m_connections:
            connection.delete()
        if self.scene():
            self.scene().removeItem(self)
        self.m_block = None
        self.m_connections = []

    def setName(self, name):
        self.name = name
        self.label.setPlainText(name)
        self.label.setPos(self.radius_ + self.margin,
                          -self.label.boundingRect().height() / 2)

    def setValue(self, value):
        self.value = value
        self.valueText.showValue(value)

    def setCanConnect(self, hasInput, hasOutput):
        self.hasInput_ = hasInput
        self.hasOutput_ = hasOutput

        if self.hasOutput_:
            self.outputPort.setVisible(True)
        else:
            self.outputPort.setVisible(False)

        path = QPainterPath()
        if self.hasInput_:
            path.addEllipse(0, -self.radius_, 2 * self.radius_,
                            2 * self.radius_)
        else:
            pass
        self.setPath(path)

    def setWidth(self, width):
        self.outputPort.setPos(width, 0)
        self.valueText.setPos(
            width - self.widgetWidth - self.radius_ - self.margin,
            -self.valueText.boundingRect().height() / 2)

    def setNEBlock(self, block):
        self.m_block = block

    def setPortFlags(self, flags):
        self.m_portFlags = flags

        if self.m_portFlags & self.TypePort:
            font = self.scene().font()
            font.setItalic(True)
            self.label.setFont(font)
            self.valueText.setVisible(False)
            self.setPath(QPainterPath())
        elif self.m_portFlags & self.NamePort:
            font = self.scene().font()
            font.setBold(True)
            self.label.setFont(font)
            self.valueText.setVisible(False)
            self.setPath(QPainterPath())

    def innerSize(self):
        fontmetrics = QFontMetrics(self.scene().font())
        height = fontmetrics.height()
        width = fontmetrics.width(self.name)

        if self.m_portFlags == 0:
            width = width + self.widgetWidth

        return QSize(width, height)

    def type(self):
        return self.Type

    def radius(self):
        return self.radius_

    def portName(self):
        return self.name

    def hasInput(self):
        return self.hasInput_

    def hasOutput(self):
        return self.hasOutput_

    def isInput(self):
        return True

    def isOutput(self):
        return False

    def block(self):
        return self.m_block

    def portFlags(self):
        return self.m_portFlags

    def addConnection(self, connection):
        self.m_connections.append(connection)

    def removeConnection(self, connection):
        try:
            self.m_connections.remove(connection)
        except:
            pass

    def connections(self):
        return self.m_connections

    def isConnected(self, other):
        for connection in self.m_connections:
            if connection.port1() == other or connection.port2() == other:
                return True

        return False

    def itemChange(self, change, value):
        if change == QGraphicsItem.ItemScenePositionHasChanged:
            for connection in self.m_connections:
                connection.updatePosFromPorts()
                connection.updatePath()

        return value
示例#4
0
class QNEPort(QGraphicsPathItem):
    (NamePort, TypePort) = (1, 2)
    (Type) = (QGraphicsItem.UserType +1)

    def __init__(self, parent):
        super(QNEPort, self).__init__(parent)

        self.label = QGraphicsTextItem(self)
        self.radius_ = 4
        self.margin = 3
        self.widgetWidth = 50

        self.setPen(QPen(QApplication.palette().text().color(), 1))
        self.setBrush(QApplication.palette().highlight())
        self.setFlag(QGraphicsItem.ItemSendsScenePositionChanges)
        
        self.valueText = QNEValue(self)
        self.valueText.setPort(self)

        self.outputPort = QNEOutputPort(self)

        self.m_portFlags = 0
        self.hasInput_ = False
        self.hasOutput_ = False

        self.m_block = None
        self.m_connections = []


    def __del__(self):
        #print("Del QNEPort %s" % self.name)
        pass


    def delete(self):
        for connection in self.m_connections:
            connection.delete()
        if self.scene():
            self.scene().removeItem(self)
        self.m_block = None
        self.m_connections = []


    def setName(self, name):
        self.name = name
        self.label.setPlainText(name)
        self.label.setPos(self.radius_ + self.margin, -self.label.boundingRect().height()/2)


    def setValue(self, value):
        self.value = value
        self.valueText.showValue(value)


    def setAccess(self, access):
        self.valueText.setAccess(access)


    def setCanConnect(self, hasInput, hasOutput):
        self.hasInput_ = hasInput
        self.hasOutput_ = hasOutput

        if self.hasOutput_:
            self.outputPort.setVisible(True)
        else:
            self.outputPort.setVisible(False)

        path = QPainterPath()
        if self.hasInput_:
            path.addEllipse(0, -self.radius_, 2*self.radius_, 2*self.radius_)
        else:
            pass
        self.setPath(path)


    def setWidth(self, width):
        self.outputPort.setPos(width, 0)
        self.valueText.setPos(width - self.widgetWidth - self.radius_ - self.margin,
                              -self.valueText.boundingRect().height()/2)

        
    def setNEBlock(self, block):
        self.m_block = block


    def setPortFlags(self, flags):
        self.m_portFlags = flags

        if self.m_portFlags & self.TypePort:
            font = self.scene().font()
            font.setItalic(True)
            self.label.setFont(font)
            self.valueText.setVisible(False)
            self.setPath(QPainterPath())
        elif self.m_portFlags & self.NamePort:
            font = self.scene().font()
            font.setBold(True)
            self.label.setFont(font)
            self.valueText.setVisible(False)
            self.setPath(QPainterPath())


    def innerSize(self):
        fontmetrics = QFontMetrics(self.scene().font())
        height = fontmetrics.height()
        width = fontmetrics.width(self.name)

        if self.m_portFlags == 0:
            width = width + self.widgetWidth

        return QSize(width, height)


    def type(self):
        return self.Type


    def radius(self):
        return self.radius_


    def portName(self):
        return self.name


    def hasInput(self):
        return self.hasInput_


    def hasOutput(self):
        return self.hasOutput_


    def isInput(self):
        return True


    def isOutput(self):
        return False


    def block(self):
        return self.m_block


    def portFlags(self):
        return self.m_portFlags
	

    def addConnection(self, connection):
        self.m_connections.append(connection)


    def removeConnection(self, connection):
        try:
            self.m_connections.remove(connection)
        except: pass


    def connections(self):
        return self.m_connections


    def isConnected(self, other):
        for connection in self.m_connections:
            if connection.port1() == other or connection.port2() == other:
                return True

        return False


    def itemChange(self, change, value):
        if change == QGraphicsItem.ItemScenePositionHasChanged:
            for connection in self.m_connections:
                connection.updatePosFromPorts()
                connection.updatePath()

        return value
示例#5
0
class QNEPort(QGraphicsPathItem):
    (NamePort, TypePort) = (1, 2)
    (Type) = (QGraphicsItem.UserType +1)

    def __init__(self, parent):
        super(QNEPort, self).__init__(parent)

        self.label = QGraphicsTextItem(self)
        self.radius_ = 4
        self.margin = 3

        path = QPainterPath()
        path.addEllipse(-self.radius_, -self.radius_, 2*self.radius_, 2*self.radius_);
        self.setPath(path)

        self.setPen(QPen(Qt.darkRed))
        self.setBrush(Qt.red)

        self.setFlag(QGraphicsItem.ItemSendsScenePositionChanges)

        self.m_portFlags = 0
        self.isOutput_ = False

        self.m_block = None
        self.m_connections = []


    def __del__(self):
        #print("Del QNEPort %s" % self.name)
        pass


    def delete(self):
        for connection in self.m_connections:
            connection.delete()
        self.scene().removeItem(self)
        self.m_block = None
        self.m_connections = []


    def setName(self, name):
        self.name = name
        self.label.setPlainText(name)


    def setIsOutput(self, isOutput):
        self.isOutput_ = isOutput

        if self.isOutput_:
            self.label.setPos(-self.radius_ - self.margin - self.label.boundingRect().width(),
                -self.label.boundingRect().height()/2);
        else:
            self.label.setPos(self.radius_ + self.margin,
                -self.label.boundingRect().height()/2);



    def setNEBlock(self, block):
        self.m_block = block


    def setPortFlags(self, flags):
        self.m_portFlags = flags

        if self.m_portFlags & self.TypePort:
            font = self.scene().font()
            font.setItalic(True)
            self.label.setFont(font)
            self.setPath(QPainterPath())
        elif self.m_portFlags & self.NamePort:
            font = self.scene().font()
            font.setBold(True)
            self.label.setFont(font)
            self.setPath(QPainterPath())


    def setPtr(self, ptr):
        self.m_ptr = ptr


    def type(self):
        return self.Type


    def radius(self):
        return self.radius_


    def portName(self):
        return self.name


    def isOutput(self):
        return self.isOutput_


    def block(self):
        return self.m_block


    def portFlags(self):
        return self.m_portFlags


    def ptr(self):
        return self.m_ptr;


    def addConnection(self, connection):
        self.m_connections.append(connection)


    def removeConnection(self, connection):
        try:
            self.m_connections.remove(connection)
        except: pass


    def connections(self):
        return self.m_connections


    def isConnected(self, other):
        for connection in self.m_connections:
            if connection.port1() == other or connection.port2() == other:
                return True

        return False


    def itemChange(self, change, value):
        if change == QGraphicsItem.ItemScenePositionHasChanged:
            for connection in self.m_connections:
                connection.updatePosFromPorts()
                connection.updatePath()

        return value