Exemplo n.º 1
0
class Component(QGraphicsItem):
    """!
    @if English

    Superclass for visual components.

    @endif

    @if Slovak

    Supertrieda pre vizualne komponenty.

    @endif
    """
    def __init__(self, className, position=QPoint(0, 0), parent=None):
        super(Component, self).__init__(parent)

        # self.isSelected=False			# priznak vybraneho komponentu
        self.setPos(position)
        self.setFlag(QGraphicsItem.ItemIsSelectable)

        # cesta k umiestneniu suboru - treba pre urcenie umiestnenia
        # suboru s obrazkom k shape v adresaroch ./img
        file_path = sys.modules[self.__class__.__module__].__file__
        self.path, file_name = os.path.split(file_path)

        self.shapeSvg = None  # referencia na svg ikony v shape
        self.shapePng = None
        self.position = position  # aktualna poloha objektu

        self.uid = 1  # identifikacne cislo objektu
        self.className = className  # meno triedy objektu
        self.diagram = None  # ref na diagram, na ktorom je umiestneny komponent
        self.compType = TYPE_DECORATION  # typ objektu
        self.box = QRectF(0, 0, 10, 10)  # ohranicenie objektu
        self.shapeImage = ''  # obrazok komponentu (SVG,PNG ... - ak je pouzity)
        self.shapeColor = Color.red  # farba komponentu vytvoreneho na graf. kontexte
        self.shapeFillColor = Color.cadetBlue  # farba vyplne komponentu
        self.borderColor = Color.blue  # farba ohranicenia objektu

        self.flippedVertical = False  # priznak vertikalneho preklopenia
        self.flippedHorizontal = False  # priznak horizontalneho preklopenia

        self.terminal = {}  # zoznam terminalov komponentu

        self.parameter = {}  # parametre komponentu
        self.paramList = [
        ]  # zoznam parametrov komponentu v poradi ich vytvaranie,
        # pouziva sa pri editovani vlastnosti komponentu
        # (nahrada usporiadaneho slovnika pre Python 2)

        self.addParameter(
            'Ref', 'A')  # default parameter - referencia alebo meno komponentu
        self.setZValue(10)

    def __str__(self):
        '''
        '''
        s = '\n'
        s = s + '<C> Comp. name :' + str(self.className) + '\n'
        s = s + '           uid :' + str(self.uid) + '\n'
        s = s + '           ref :' + self.parameter['Ref'].value + '\n'
        s = s + '      selected :' + str(self.isSelected()) + '\n'
        s = s + '    Terminal(s):' + '\n'
        for t in self.terminal.keys():
            s = s + '          Number :' + str(self.terminal[t].num) + '\n'
            s = s + '          Name   :' + str(self.terminal[t].name) + '\n'
            s = s + '          Value  :' + str(self.terminal[t].value) + '\n'
            s = s + '          Type   :' + \
                str(self.terminal[t].termType) + '\n'
            if len(self.terminal[t].connect) == 0:
                s = s + '             Connect: []' + '\n'
            else:
                s = s + '             Connect:' + '\n'
                for n in self.terminal[t].connect:
                    s = s + '             Net name: ' + str(n.name) + ' Start = ' \
                          + n.startComponent.parameter['Ref'].value + '[' + str(n.startTerminal) + '] \t' + \
                        '  End  = ' + n.endComponent.parameter[
                            'Ref'].value + '[' + str(n.endTerminal) + ']' + '\n'
        return s

    def drawShape(self, painter):
        """!
        @if English

        @endif

        @if Slovak

        Virtualna metoda implementovana v derivovanych komponentoch, neimplementovat v supertriede,
        spolocne vlastnosti su implementovane v metode paint.

        @endif
        """
        pass

    def paint(self, painter, option, widget=None):
        painter.setRenderHint(QPainter.Antialiasing)

        # vykreslenie komponentu
        self.drawShape(painter)

        # vykreslenie terminalov na povrchu komponentu
        # TODO - volba vykreslenia terminalov
        for n in self.terminal:
            self.terminal[n].drawTerminal(painter)

        # vykreslenie borderu komponentu
        if self.isSelected() is True:
            painter.setPen(QPen(self.borderColor, 1, Qt.DashLine))
            painter.setBrush(QBrush(Qt.NoBrush))
            painter.drawRect(self.box)

    def boundingRect(self):
        '''
        @if English

        @endif

        @if Slovak

        Ohraničenie komponentu.

        Štandardné ohraničenie komponentu, pre správnu identifikaciu terminalov je rozmer
        ohraničenia zvačšeny o 10px vzhladom na viditelny box.

        @endif
        '''
        box = QRectF(self.box)  # deep copy povodneho ohranicenia
        box.adjust(-5, -5, 10, 10)  # temp. uprava rozmerov
        return box

    def updateShape(self):
        '''
        @if English

        @endif

        @if Slovak

        Aktualizácia zobrazenia komponentu.

        Uprava shape komponentu po jeho vytvoreni, zmene parametrov alebo vlastnosti. V derivovanych
        komponentoch moze obsahovat obnovenie farebnej schemy objektu napr. po odstraneni chyby,
        ktora bola opticky indikovana odlisnym (cervenym) sfarbenim objektu.

        @endif
        '''
        # nacitanie grafickeho obrazku shapeImage
        shapeFile = self.path + '/img/' + self.shapeImage

        if os.path.isfile(shapeFile) is True:

            if shapeFile.endswith('.svg') is True:
                self.shapeSvg = QSvgWidget(shapeFile)
                self.shapeSvg.setAttribute(Qt.WA_NoSystemBackground)

            if shapeFile.endswith('.png') is True:
                self.shapePng = QPixmap(shapeFile)

    def drawIcon(self, gc, x, y):
        '''
        @if English

        @endif

        @if Slovak

        Vykreslenie ikony komponentu (SVG alebo PNG).

        Ikona komponentu sa nemení pri horizontálnom preklopení (flip horizontal) komponentu.

        @endif
        '''
        # zrusenie preklopenia komponentu
        if self.flippedHorizontal is True:
            t = gc.transform()
            t.setMatrix(-t.m11(), t.m12(), t.m13(), t.m21(), t.m22(), t.m23(),
                        t.m31(), t.m32(), t.m33())
            gc.setTransform(t)

        #print(self.shapePng)
        if self.shapePng is not None:
            w = self.shapePng.width()
            h = self.shapePng.height()
            gc.drawPixmap(x, y, w, h, self.shapePng)

        if self.shapeSvg is not None:
            self.shapeSvg.render(gc, targetOffset=QPoint(x, y))

        # obnovenie predchadzajuceho nastavenia
        if self.flippedHorizontal is True:
            t = gc.transform()
            t.setMatrix(-t.m11(), t.m12(), t.m13(), t.m21(), t.m22(), t.m23(),
                        t.m31(), t.m32(), t.m33())
            gc.setTransform(t)

    def deleteShape(self):
        """!
        @if English

        @endif

        @if Slovak

        Upratanie externych casti komponentu pri mazanie pocas editovania,
        ktore nie su zaradene do struktury grafickych komponentov.

        Metoda sa volá pri operacii delete komponentu z editora.

        Priklad použitia - interaktivny komponent (QPushButton) je vložený na plochu
        QGraphicsScene priamo metodou addWidget, pri delete komponentu
        nie je možné vložený button zmazať vyradením z kontainera itemov.

        @endif
        """
        pass

    def addTerminal(self,
                    name='',
                    num=1,
                    termtype=0,
                    position=(0, 0),
                    direction=0,
                    connType=TERM.NONE,
                    discType=TERM.CROSS):
        """!
        @if English

        Define new terminal.

        @endif

        @if Slovak

        Pridanie noveho terminálu komponentu.

        Vytvorenie noveho terminálu a zaradenie ho do slovnika terminalov, klúčom je číslo terminálu.
        Vrati referenciu terminalu pre dalsie upravy.

        @endif
        """
        term = Terminal(self, name, num, termtype, position, direction)
        self.terminal[num] = term
        term.termDiscType = discType
        term.termConnType = connType

        return term

    def setPosition(self, position):
        '''
        Nastavenie polohy komponentu.
        '''
        self.setPos(position)
        self.position = position

    def addParameter(self,
                     name,
                     value,
                     visible=False,
                     position=QPoint(0, 0),
                     color=Color.black,
                     visibleName=False,
                     paramType=PARAM.NONE):
        '''!
        @if English

        Add new component parameter.

        @endif

        @if Slovak

        Priradenie noveho parametra komponentu.

        @endif
        '''
        # kontrola na existenciu parametra, zabranenie opakovanemu vytvaraniu rovnakych parametrov
        if name not in self.parameter:
            # vytvorenie noveho parameter
            param = Parameter(name, value, visible, position, color,
                              visibleName, paramType, self)
            self.parameter[name] = param
            self.paramList.append(param)
        else:
            # update vlastnosti existujuceho parametra
            self.parameter[name].value = value
            self.parameter[name].visibleValue = visible
            self.parameter[name].position = position
            self.parameter[name].color = color
            self.parameter[name].visibleName = visibleName
            self.parameter[name].paramType = paramType

    def sim(self, flag, value, time, step):
        """!
        @if English

        @endif

        @if Slovak

        Implementácia algoritmu simulácie.

        Metóda je definovana v derivovaných objektoch.

        @endif
        """
        pass

    def gen(self):
        """!
        @if English

        @endif

        @if Slovak

        @endif
        """
        pass