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