def createWidgets(self): """ QtWidgets creation """ self.mainTab = QTabWidget() mainLayout = QVBoxLayout() self.toRead = QLabel( "%s" % "Release notes are specific to each version of the server, SUT adapters, libraries and toolbox. More details on each HISTORY files." ) mainLayout.addWidget(self.toRead) mainLayout.addWidget(self.mainTab) palette = QPalette() brush = QBrush(QColor(240, 240, 240)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Active, QPalette.Base, brush) # treewidget for server rn self.rn = QTreeWidget(self) self.rn.setHeaderHidden(True) self.rn.setFrameShape(QFrame.NoFrame) self.rn.setSelectionMode(QAbstractItemView.NoSelection) self.rn.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.rn.setRootIsDecorated(False) self.rn.setPalette(palette) # treewidget for adapter rn self.rnAdp = QTreeWidget(self) self.rnAdp.setHeaderHidden(True) self.rnAdp.setFrameShape(QFrame.NoFrame) self.rnAdp.setSelectionMode(QAbstractItemView.NoSelection) self.rnAdp.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.rnAdp.setRootIsDecorated(False) self.rnAdp.setPalette(palette) # treewidget for library rn self.rnLibAdp = QTreeWidget(self) self.rnLibAdp.setHeaderHidden(True) self.rnLibAdp.setFrameShape(QFrame.NoFrame) self.rnLibAdp.setSelectionMode(QAbstractItemView.NoSelection) self.rnLibAdp.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.rnLibAdp.setRootIsDecorated(False) self.rnLibAdp.setPalette(palette) # treewidget for agent rn self.rnToolbox = QTreeWidget(self) self.rnToolbox.setHeaderHidden(True) self.rnToolbox.setFrameShape(QFrame.NoFrame) self.rnToolbox.setSelectionMode(QAbstractItemView.NoSelection) self.rnToolbox.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.rnToolbox.setRootIsDecorated(False) self.rnToolbox.setPalette(palette) self.mainTab.addTab( self.rn, Settings.instance().readValue( key = 'Common/acronym-server' ) ) self.mainTab.addTab( self.rnAdp, "Sut Adapters" ) self.mainTab.addTab( self.rnLibAdp, "Sut Librairies" ) self.mainTab.addTab( self.rnToolbox, "Toolbox" ) self.setLayout(mainLayout)
def getBrushFromCmnd(self, brushinfo): ''' Returns a QBrush based on the information in the dictionary brushinfo. A ValueError is raised if the value for the "style" key, if given, is not recognized. Recognized keys in the fill dictionary are: "color": color name or 24-bit RGB integer value (eg, 0xFF0088) "alpha": alpha value from 0 (transparent) to 255 (opaque) "style": brush style name ("solid", "dense1" to "dense7", "none", "hor", "ver", "cross", "bdiag", "fdiag", "diagcross") ''' try: mycolor = self.getColorFromCmnd(brushinfo) mybrush = QBrush(mycolor) except KeyError: mybrush = QBrush() try: mystyle = brushinfo["style"] if mystyle == "solid": mystyle = Qt.SolidPattern elif mystyle == "dense1": mystyle = Qt.Dense1Pattern elif mystyle == "dense2": mystyle = Qt.Dense2Pattern elif mystyle == "dense3": mystyle = Qt.Dense3Pattern elif mystyle == "dense4": mystyle = Qt.Dense4Pattern elif mystyle == "dense5": mystyle = Qt.Dense5Pattern elif mystyle == "dense6": mystyle = Qt.Dense6Pattern elif mystyle == "dense7": mystyle = Qt.Dense7Pattern elif mystyle == "none": mystyle = Qt.NoBrush elif mystyle == "hor": mystyle = Qt.HorPattern elif mystyle == "ver": mystyle = Qt.VerPattern elif mystyle == "cross": mystyle = Qt.CrossPattern elif mystyle == "bdiag": mystyle = Qt.BDiagPattern elif mystyle == "fdiag": mystyle = Qt.FDiagPattern elif mystyle == "diagcross": mystyle = Qt.DiagCrossPattern else: raise ValueError( self.__viewer.tr( \ "Unknown brush style %1").arg(str(mystyle)) ) mybrush.setStyle(mystyle) except KeyError: pass return mybrush
def addLog(self, log): self.log.append(log) self.logbtn.show() palette = QPalette() brush = QBrush(QColor(240, 100, 100)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Normal, QPalette.Background, brush) self.label.setPalette(palette) self.label.setAutoFillBackground(True)
def drawPoints(self): img = qrcode.make('TestCode 001',image_factory=qrcode.image.svg.SvgImage ) type(img) gitem = QGraphicsScene() self.graphicsView.setScene(gitem) #gitem.addLine(0, 0, 2, 2) qbrush = QBrush() qbrush.setStyle(Qt.SolidPattern) qbrush.setColor(Qt.black) gitem.addRect(0, 0, 2, 2, brush=qbrush ) self.graphicsView.show()
def createDialog(self): """ Create qt dialog """ self.setWindowTitle("%s %s" % (self.tr("Release Notes"), self.name)) self.setWindowFlags(self.windowFlags() | Qt.WindowSystemMenuHint | Qt.WindowMinMaxButtonsHint) layout = QVBoxLayout() self.toRead = QLabel("%s" % self.tr( "Release notes of the application. More details in HISTORY.")) layout.addWidget(self.toRead) self.rn = QTreeWidget(self) self.rn.setHeaderHidden(True) self.rn.setFrameShape(QFrame.NoFrame) self.rn.setSelectionMode(QAbstractItemView.NoSelection) self.rn.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel) self.rn.setRootIsDecorated(False) palette = QPalette() brush = QBrush(QColor(240, 240, 240)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Active, QPalette.Base, brush) self.rn.setPalette(palette) layout.addWidget(self.rn) buttonLayout = QHBoxLayout() buttonLayout.addStretch() self.closeButton = QPushButton(self.tr("Close"), self) self.closeButton.clicked.connect(self.reject) buttonLayout.addWidget(self.closeButton) layout.addLayout(buttonLayout) self.setLayout(layout) # resise the window size = QSize(700, 500) self.resize(size)
def loadStyleSheet(self): try: with open(Utils.CSS_FILE, "r") as f: self.setStyleSheet(f.read()) # If my file disappears for some reason, load crappy black color scheme except IOError: self.printMessage('No style sheet found!') palette = QPalette() brush = QBrush(QColor(0, 0, 0)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Active, QPalette.Text, brush) brush = QBrush(QColor(0, 0, 0)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Inactive, QPalette.Text, brush) self.ui.textBrowser.setPalette(palette)
def _updateDtmListItems(self): layer = self._getCurrentSelectedLayer() self.dtmList.clear() dtms = list(self._getDtmsForLayer(layer)) redBrush = QBrush(QColor(255, 0, 0, 255)) redBrush.setStyle(1) greenBrush = QBrush(QColor(0, 255, 0, 255)) greenBrush.setStyle(1) for dtm in dtms: newListItem = QListWidgetItem() newListItem.setText(dtm) if self._dtmInFolder(dtm): newListItem.setBackground(greenBrush) else: newListItem.setBackground(redBrush) self.dtmList.insertItem(0, newListItem)
def __init__(self): super(QFramesInTracksScene, self).__init__() self._coords = CoordTransform() self._track_items = {} self._frame_items = {} pen = QPen() pen.setWidthF(1.25) pen.setColor(Qt.black) # pen.setCapStyle(Qt.RoundCap) pen.setJoinStyle(Qt.RoundJoin) brush = QBrush() brush.setColor(Qt.blue) brush.setStyle(Qt.SolidPattern) self._frame_pen_brush = pen, brush pen = QPen(pen) pen.setWidthF(3.5) pen.setJoinStyle(Qt.RoundJoin) pen.setColor(Qt.blue) brush = QBrush(brush) brush.setColor(Qt.gray) self._track_pen_brush = pen, brush
def __init__(self, parent): QDialog.__init__(self, parent) palette = QPalette() brush = QBrush(QColor(255, 255, 255, 255)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Active, QPalette.Base, brush) palette.setBrush(QPalette.Active, QPalette.Window, brush) palette.setBrush(QPalette.Inactive, QPalette.Base, brush) palette.setBrush(QPalette.Inactive, QPalette.Window, brush) palette.setBrush(QPalette.Disabled, QPalette.Base, brush) palette.setBrush(QPalette.Disabled, QPalette.Window, brush) self.setPalette(palette) self.ui = Ui_FlightPlannerSimpleBase() self.ui.setupUi(self) ''' buttons clicked connect ''' self.ui.btnClose.clicked.connect(self.reject) # self.ui.btnClose_2.clicked.connect(self.reject) self.ui.btnConstruct.clicked.connect(self.btnConstruct_Click) self.ui.btnPDTCheck.clicked.connect(self.btnPDTCheck_Click) self.ui.btnUpdateQA.clicked.connect(self.btnUpdateQA_Click) # self.ui.btnEvaluate.clicked.connect(self.btnEvaluate_Click) self.ui.btnOpenData.clicked.connect(self.openData) self.ui.btnSaveData.clicked.connect(self.saveData) self.ui.btnExportResult.clicked.connect(self.exportResult) self.ui.btnExportResult.setDisabled(True) self.ui.btnExportResult.setVisible(False) ''' properties ''' self.parametersPanel = None self.ui.btnUpdateQA.setVisible(False) # self.ui.btnUpdateQA_2.setVisible(False) self.uiStateInit() # self.obstacleTableInit() self.ui.btnPDTCheck.setVisible(False) icon = QIcon() icon.addPixmap(QPixmap("Resource/btnImage/dlgIcon.png"), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) self.resultLayerList = []
def paint(self, painter, option, widget=None): painter.save() path = self.path() brush = QBrush(self.brush()) pen = QPen(self.pen()) if option.state & QStyle.State_Selected: pen.setColor(Qt.red) brush.setStyle(Qt.DiagCrossPattern) brush.setColor(QColor(40, 40, 40, 100)) elif option.state & QStyle.State_MouseOver: pen.setColor(Qt.blue) if option.state & QStyle.State_MouseOver: brush.setColor(QColor(100, 100, 100, 100)) if brush.style() == Qt.NoBrush: # Make sure the highlight is actually visible. brush.setStyle(Qt.SolidPattern) painter.setPen(pen) painter.setBrush(brush) painter.drawPath(path) painter.restore()
def paint(self, painter, option, widget=None): painter.save() path = self.path() brush = QBrush(self.brush()) pen = QPen(self.pen()) if option.state & QStyle.State_Selected: pen.setColor(Qt.red) brush.setStyle(Qt.DiagCrossPattern) brush.setColor(QColor(40, 40, 40, 100)) elif option.state & QStyle.State_MouseOver: pen.setColor(Qt.blue) if option.state & QStyle.State_MouseOver: brush.setColor(QColor(100, 100, 100, 100)) if brush.style() == Qt.NoBrush: # Make sure the highlight is actually visible. brush.setStyle(Qt.SolidPattern) painter.setPen(pen) painter.setBrush(brush) painter.drawPath(path) painter.restore()
def occu_color(self): for r in range(0, self.rowCount()): val = int(self.item(r, 2).text()) if val == 0: color = QBrush(QColor(217, 214, 219)) color.setStyle(Qt.SolidPattern) self.item(r, 2).setBackground(color) elif val == 1: color = QBrush(QColor(122, 125, 128)) color.setStyle(Qt.SolidPattern) self.item(r, 2).setBackground(color) elif val == 2: color = QBrush(QColor(79, 74, 79)) color.setStyle(Qt.SolidPattern) self.item(r, 2).setBackground(color)
def setTiles(self): #background brush = QBrush() pix = QPixmap(os.getcwd() + "/robotImages/tile.png") brush.setTexture(pix) brush.setStyle(24) self.setBackgroundBrush(brush) #wall #left left = QGraphicsRectItem() pix = QPixmap(os.getcwd() + "/robotImages/tileVert.png") left.setRect(QtCore.QRectF(0, 0, pix.width(), self.height)) brush.setTexture(pix) brush.setStyle(24) left.setBrush(brush) left.name = 'left' self.addItem(left) #right right = QGraphicsRectItem() right.setRect(self.width - pix.width(), 0, pix.width(), self.height) right.setBrush(brush) right.name = 'right' self.addItem(right) #top top = QGraphicsRectItem() pix = QPixmap(os.getcwd() + "/robotImages/tileHori.png") top.setRect(QtCore.QRectF(0, 0, self.width, pix.height())) brush.setTexture(pix) brush.setStyle(24) top.setBrush(brush) top.name = 'top' self.addItem(top) #bottom bottom = QGraphicsRectItem() bottom.setRect(0, self.height - pix.height(), self.width, pix.height()) bottom.setBrush(brush) bottom.name = 'bottom' self.addItem(bottom)
def setupUi(self, showprogress): showprogress.setObjectName("showprogress") showprogress.resize(335, 310) self.verticalLayout = QVBoxLayout(showprogress) self.verticalLayout.setObjectName("verticalLayout") self.barProgress = QProgressBar(showprogress) self.barProgress.setProperty("value", QVariant(0)) self.barProgress.setObjectName("barProgress") self.verticalLayout.addWidget(self.barProgress) self.infoText = QTextEdit(showprogress) palette = QPalette() brush = QBrush(QColor(255, 255, 255)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Active, QPalette.Text, brush) brush = QBrush(QColor(0, 0, 0)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Active, QPalette.Base, brush) brush = QBrush(QColor(255, 255, 255)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Inactive, QPalette.Text, brush) brush = QBrush(QColor(0, 0, 0)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Inactive, QPalette.Base, brush) brush = QBrush(QColor(126, 125, 124)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Disabled, QPalette.Text, brush) brush = QBrush(QColor(255, 255, 255)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Disabled, QPalette.Base, brush) self.infoText.setPalette(palette) self.infoText.setObjectName("infoText") self.verticalLayout.addWidget(self.infoText) self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.fermer = QPushButton(showprogress) self.fermer.setObjectName("fermer") self.horizontalLayout.addWidget(self.fermer) self.verticalLayout.addLayout(self.horizontalLayout) self.retranslateUi(showprogress) QMetaObject.connectSlotsByName(showprogress)
def drawForeground(self, painter, rect): #print "BoreHoleScene.drawForeground" if self.__redraw: with self.__project.connect() as con: cur = con.cursor() self.__redraw = False self.clear() fm = painter.fontMetrics() if self.__id is None: QGraphicsScene.drawForeground(self, painter, rect) return cur.execute( "SELECT geom FROM albion.hole WHERE id='{}'".format( self.__id)) res = cur.fetchone() if not res: QGraphicsScene.drawForeground(self, painter, rect) return hole = wkb.loads(bytes.fromhex(res[0])) line = [p[2] for p in hole.coords] tick_width = 20 spacing = 5 tick_text_offset = -10 tabs = [50, 75, 150, 250, 350, 400, 500] zmin, zmax = min(line), max(line) zpmin, zpmax = 0, ((zmin - zmax) - 5) / self.m_per_pixel text = self.addText(self.__id) text.setPos(tabs[1], -5 * fm.height()) label = 'Depth [m]' text = self.addText(label) text.setRotation(-90) text.setPos(0, 0) text = self.addText('Formation') text.setPos(tabs[1], -3 * fm.height()) text = self.addText('Radiometry') text.setPos(tabs[2], -3 * fm.height()) text = self.addText('Resistivity') text.setPos(tabs[3], -3 * fm.height()) text = self.addText('Mineralization') text.setPos(tabs[4], -3 * fm.height()) top = zpmin - 3 * fm.height() pen = QPen() pen.setWidth(3) for tab in [tabs[1], tabs[2], tabs[3], tabs[4], tabs[6]]: self.addLine(tab, top, tab, zpmax, pen) self.addLine(tabs[1], zpmin, tabs[-1], zpmin, pen) self.addLine(tabs[1], zpmax, tabs[-1], zpmax, pen) self.addLine(tabs[1], top, tabs[-1], top, pen) # depth ticks for z in range(0, int(-(zmax - zmin) - 5), -10): text = "% 4.0f" % (max(line) + z) z /= self.m_per_pixel width = fm.width(text) text = self.addText(text) text.setPos(tabs[0] - width - spacing, tick_text_offset + int(z)) self.addLine(tabs[0], z, tabs[1], z) self.addLine(tabs[2], z, tabs[4], z) #res = cur.execute("SELECT AsText(GEOMETRY), code FROM lithologies WHERE forage={}".format(self.__id)).fetchall() ## litho image #for geom, code in res: # line = [(float(pt.split()[2])-z_tube+h_tube_sol) # for pt in geom.replace('LINESTRING Z(','').replace(')','').split(',')] # z_start = line[0]/self.m_per_pixel # z_end = line[-1]/self.m_per_pixel # brush = QBrush() # brush.setTextureImage(self.texture(code)) # self.addRect(tabs[1], z_start, tabs[2]-tabs[1], z_end-z_start, brush=brush) ## bar diagram grid #for i in range(1, 10): # pen.setWidth(1 if i != 5 else 2) # x = tabs[3]+(tabs[4]-tabs[3])*float(i)/10 # self.addLine(x, zmin, x, zmax, pen) # formation color cur.execute( "SELECT geom, code FROM albion.formation WHERE hole_id='{}'" .format(self.__id)) for geom, code in cur.fetchall(): line = [ p[2] for p in wkb.loads(bytes.fromhex(geom)).coords ] z_start = (line[0] - zmax) / self.m_per_pixel z_end = (line[-1] - zmax) / self.m_per_pixel brush = QBrush() brush.setStyle(Qt.SolidPattern) brush.setColor(self.formation_color(code)) self.addRect(tabs[1], z_start, tabs[2] - tabs[1], z_end - z_start, brush=brush) #width = fm.width(code); #text = self.addText(code) #text.setPos(tabs[2]+spacing, tick_text_offset+int(.5*(z_start+z_end))) self.addLine(tabs[2], z_start, tabs[2], z_start) self.addLine(tabs[2], z_end, tabs[2], z_end) # radiometry diagram cur.execute( "SELECT max(gamma) FROM albion.radiometry WHERE hole_id='{}'" .format(self.__id)) gamma_max = cur.fetchone()[0] cur.execute( "SELECT geom, gamma FROM albion.radiometry WHERE hole_id='{}' AND gamma>=0" .format(self.__id)) for geom, gamma in cur.fetchall(): line = [ p[2] for p in wkb.loads(bytes.fromhex(geom)).coords ] z_start = (line[0] - zmax) / self.m_per_pixel z_end = (line[-1] - zmax) / self.m_per_pixel brush = QBrush() brush.setStyle(Qt.SolidPattern) brush.setColor(QColor(55, 51, 149)) self.addRect(tabs[2], z_start, (tabs[3] - tabs[2]) * gamma / gamma_max, z_end - z_start, pen=QPen(Qt.NoPen), brush=brush) # resistivity diagram cur.execute( "SELECT max(rho) FROM albion.resistivity WHERE hole_id='{}'" .format(self.__id)) rho_max = cur.fetchone()[0] cur.execute( "SELECT geom, rho FROM albion.resistivity WHERE hole_id='{}' AND rho>=0" .format(self.__id)) for geom, rho in cur.fetchall(): line = [ p[2] for p in wkb.loads(bytes.fromhex(geom)).coords ] z_start = (line[0] - zmax) / self.m_per_pixel z_end = (line[-1] - zmax) / self.m_per_pixel brush = QBrush() brush.setStyle(Qt.SolidPattern) brush.setColor(QColor(155, 51, 49)) self.addRect(tabs[3], z_start, (tabs[4] - tabs[3]) * rho / rho_max, z_end - z_start, pen=QPen(Qt.NoPen), brush=brush) # mineralization cur.execute( "SELECT geom, oc, accu, grade FROM albion.mineralization WHERE hole_id='{}'" .format(self.__id)) for geom, oc, accu, grade in cur.fetchall(): line = [ p[2] for p in wkb.loads(bytes.fromhex(geom)).coords ] z_start = (line[0] - zmax) / self.m_per_pixel z_end = (line[-1] - zmax) / self.m_per_pixel brush = QBrush() brush.setStyle(Qt.SolidPattern) brush.setColor(QColor(250, 250, 50)) self.addRect(tabs[4], z_start, tabs[5] - tabs[4], z_end - z_start, brush=brush) txt = "oc=" + str(oc) + "\naccu=" + str( accu) + "\ngrade=" + str(grade) width = fm.width(txt) text = self.addText(txt) text.setPos( tabs[5] + spacing, -int(1.5 * fm.height()) + int(.5 * (z_start + z_end))) self.addLine(tabs[4], z_start, tabs[6], z_start) self.addLine(tabs[4], z_end, tabs[6], z_end) self.setSceneRect(self.itemsBoundingRect()) QGraphicsScene.drawForeground(self, painter, rect)
class masarUI(QMainWindow, ui_masar.Ui_masar): severityDict= {0: 'NO_ALARM', 1: 'MINOR_ALARM', 2: 'MAJOR_ALARM', 3: 'INVALID_ALARM', 4: 'ALARM_NSEV' } alarmDict = { 0: 'NO_ALARM', 1: 'READ_ALARM', 2: 'WRITE_ALARM', 3: 'HIHI_ALARM', 4: 'HIGH_ALARM', 5: 'LOLO_ALARM', 6: 'LOW_ALARM', 7: 'STATE_ALARM', 8: 'COS_ALARM', 9: 'COMM_ALARM', 10: 'TIMEOUT_ALARM', 11: 'HW_LIMIT_ALARM', 12: 'CALC_ALARM', 13: 'SCAN_ALARM', 14: 'LINK_ALARM', 15: 'SOFT_ALARM', 16: 'BAD_SUB_ALARM', 17: 'UDF_ALARM', 18: 'DISABLE_ALARM', 19: 'SIMM_ALARM', 20: 'READ_ACCESS_ALARM', 21: 'WRITE_ACCESS_ALARM', 22: 'ALARM_NSTATUS' } def __init__(self, channelname='masarService', parent=None): super(masarUI, self).__init__(parent) self.setupUi(self) self.__setDateTime() self.tabWindowDict = {'comment': self.commentTab} self.e2cDict = {} # event to config dictionary self.pv4cDict = {} # pv name list for each selected configuration self.data4eid = {} self.arrayData = {} # store all array data self.__service = 'masar' self.mc = masarClient.client(channelname) self.__initSystemBomboBox() self.currentConfigFilter = str(self.configFilterLineEdit.text()) self.eventConfigFilter = str(self.eventFilterLineEdit.text()) self.authorText = str(self.authorTextEdit.text()) self.UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now() self.time_format = "%Y-%m-%d %H:%M:%S" self.previewId = None self.previewConfName = None self.isPreviewSaved = True # set bad pv row to grey self.brushbadpv = QBrush(QColor(128, 128, 128)) self.brushbadpv.setStyle(Qt.SolidPattern) # DBR_TYPE definition #define DBF_STRING 0 #define DBF_INT 1 #define DBF_SHORT 1 #define DBF_FLOAT 2 #define DBF_ENUM 3 #define DBF_CHAR 4 #define DBF_LONG 5 #define DBF_DOUBLE 6 self.epicsLong = [1, 4, 5] self.epicsString = [0, 3] self.epicsDouble = [2, 6] self.epicsNoAccess = [7] def __initSystemBomboBox(self): self.systemCombox.addItem(_fromUtf8("")) self.systemCombox.setItemText(0, "all") results = self.getSystemList() if results: for i in range(len(results)): self.systemCombox.addItem(_fromUtf8("")) self.systemCombox.setItemText(i+1, results[i]) self.system = str(self.systemCombox.currentText()) def __setDateTime(self): self.eventStartDateTime.setDateTime(QDateTime.currentDateTime()) self.eventEndDateTime.setDateTime(QDateTime.currentDateTime()) def systemComboxChanged(self, qstring): self.system = str(qstring) def configFilterChanged(self): self.currentConfigFilter = str(self.configFilterLineEdit.text()) def eventFilterChanged(self): self.eventConfigFilter = str(self.eventFilterLineEdit.text()) def fetchConfigAction(self): self.setConfigTable() self.configTableWidget.resizeColumnsToContents() def authorTextChanged(self): self.authorText = str(self.authorTextEdit.text()) def __getComment(self): cdlg = commentdlg.CommentDlg() cdlg.exec_() if cdlg.isAccepted: return (cdlg.result()) else: return None def saveMachinePreviewAction(self): if self.isPreviewSaved: QMessageBox.warning(self, "Warning", "Preview (id: %s) for config (%s) has been save already." %(self.previewId, self.previewConfName)) return elif self.previewId == None or self.previewConfName == None: QMessageBox.warning(self, "Warning", "No preview to save.") reply = QMessageBox.question(self, 'Message', "Do you want to flag this preview as a good snapshot?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: comment = self.__getComment() else: return # comment result always returns a tuple # it return like (user, comment note) if comment and isinstance(comment, tuple): if comment[0] and comment[1]: self.saveMachinePreviewData(self.previewId, self.previewConfName, comment) else: QMessageBox.warning(self, "Warning", "Either user name or comment is empty.") return else: QMessageBox.warning(self, "Warning", "Comment is cancelled.") return self.isPreviewSaved = True def getMachinePreviewAction(self): selectedConfig = self.configTableWidget.selectionModel().selectedRows() lc = len(selectedConfig) if lc != 1: QMessageBox.warning(self, "Warning", "Please select one configuration, and one only.") return self.previewId = None self.previewConfName = None cname = str(self.configTableWidget.item(selectedConfig[0].row(), 0).text()) result = self.getMachinePreviewData(cname) if result: eid = result[0] data = result[1] self.pv4cDict[str(eid)] = data['PV Name'] self.data4eid[str(eid)] = data try: tabWidget = self.tabWindowDict['preview'] index = self.snapshotTabWidget.indexOf(tabWidget) except: tabWidget = QTableWidget() index = self.snapshotTabWidget.count() self.tabWindowDict['preview'] = tabWidget QObject.connect(tabWidget, SIGNAL(_fromUtf8("cellDoubleClicked (int,int)")), self.__showArrayData) self.setSnapshotTable(data, tabWidget, eid) tabWidget.resizeColumnsToContents() label = QString.fromUtf8((cname+': Preview')) self.snapshotTabWidget.addTab(tabWidget, label) self.snapshotTabWidget.setTabText(index, label) self.snapshotTabWidget.setCurrentIndex(index) self.previewId = eid self.previewConfName = cname self.isPreviewSaved = False def __find_key(self, dic, val): """return the key of dictionary dic given the value""" return [k for k, v in dic.iteritems() if v == val][0] def restoreSnapshotAction(self): curWidget = self.snapshotTabWidget.currentWidget() if not isinstance(curWidget, QTableWidget): QMessageBox.warning(self, 'Warning', 'No snapshot is selected yet.') return eid = self.__find_key(self.tabWindowDict, curWidget) if eid == 'comment' or eid == 'preview': QMessageBox.warning(self, 'Warning', 'No restore, preview is selected.') return selectedNoRestorePv = {} # get table rows rowCount = curWidget.rowCount() #Qt.Unchecked 0 The item is unchecked. #Qt.PartiallyChecked 1 The item is partially checked. # Items in hierarchical models may be partially checked if some, # but not all, of their children are checked. #Qt.Checked 2 The item is checked. for row in range(rowCount): selectedNoRestorePv[str(curWidget.item(row, 0).text())] = bool(curWidget.item(row, 8).checkState()) pvlist = list(self.pv4cDict[str(eid)]) data = self.data4eid[str(eid)] s_val = data['S_value'] d_val = data['D_value'] i_val = data['I_value'] dbrtype = data['DBR'] is_array = data['isArray'] # is_connected = data['isConnected'] # data['PV Name'] array_value = data['arrayValue'] r_pvlist = [] # restore all pv value in this list r_data = [] # value to be restored. no_restorepvs = [] # no restore from those pvs ignoreall = False # Ignore all pv those do not have any value. for index in range(len(pvlist)): try: # pv is unchecked, which means restore this pv if not selectedNoRestorePv[pvlist[index]]: r_pvlist.append(pvlist[index]) if is_array[index]: r_data.append(array_value[index]) elif dbrtype[index] in self.epicsDouble: r_data.append(d_val[index]) elif dbrtype[index] in self.epicsLong: r_data.append(i_val[index]) elif dbrtype[index] in self.epicsString: r_data.append(s_val[index]) elif dbrtype[index] in self.epicsNoAccess: if not ignoreall: reply = QMessageBox.warning(self, 'Warning', 'Cannot restore pv: %s\nValue is invalid. \nDo you want to ignore it and continue?'%(pvlist[index]), QMessageBox.Yes | QMessageBox.YesToAll | QMessageBox.Cancel, QMessageBox.Cancel) if reply == QMessageBox.Yes: no_restorepvs.append(pvlist[index]) elif reply == QMessageBox.YesToAll: no_restorepvs.append(pvlist[index]) ignoreall = True elif reply == QMessageBox.Cancel: return else: no_restorepvs.append(pvlist[index]) else: no_restorepvs.append(pvlist[index]) except: print (type(pvlist[index]), pvlist[index]) QMessageBox.warning(self, 'Warning', 'PV name (%s) is invalid.'%(pvlist[index])) return if len(no_restorepvs) == rowCount: QMessageBox.warning(self, 'Warning', 'All pvs are checked, and not restoring.') return #cagetres = cav3.caget(r_pvlist, throw=False) #problempvlist=[] #for rtmp in cagetres: # if not rtmp.ok: # problempvlist.append(rtmp) #ignoreallconnection = False #forceall = False #if len(problempvlist) > 0: # for problempv in problempvlist: # if not ignoreall and not forceall: # reply = QMessageBox.warning(self, 'Warning', 'There are a problem to connect pv %s. \nDo you want to ignore it and continue?'%(problempv), # QMessageBox.Yes | QMessageBox.YesToAll | QMessageBox.No | QMessageBox.NoToAll | QMessageBox.Cancel, QMessageBox.Cancel) # if reply == QMessageBox.Yes: # # ignore this pv only # no_restorepvs.append(problempv.name) # elif reply == QMessageBox.No: # # not ignore this pv # pass # elif reply == QMessageBox.YesToAll: # # ignore all pvs that there might have potential connection problem # # this does not overwrite all previous decisions # no_restorepvs.append(problempv.name) # ignoreallconnection = True # elif reply == QMessageBox.NoToAll: # # force restore pvs althouth there might have potential connection problem # # this does not overwrites all previous decisions # forceall = True # elif reply == QMessageBox.Cancel: # # cancel this operation # return # elif ignoreallconnection: # no_restorepvs.append(problempv.name) #if ignoreall or ignoreallconnection: if ignoreall: str_no_restore = "\n" for no_restorepv in no_restorepvs: str_no_restore += ' - %s' %no_restorepv + '\n' print("No restore for the following pvs:\n"+str_no_restore+"\n========list end (not to restore pv)========") elif len(no_restorepvs) > 0: str_no_restore = "\n" for no_restorepv in no_restorepvs: str_no_restore += ' - %s' %no_restorepv + '\n' reply = QMessageBox.question(self, 'Message', "Partial pv will not be restored. Do you want to continue?\n(Please check terminal for a full list.)", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.No: return print("No restore for the following pvs:\n"+str_no_restore+"\n========list end (not to restore pv)========") bad_pvs = [] try: final_restorepv = [] final_restorepvval = [] for i in range(len(r_pvlist)): if r_pvlist[i] not in no_restorepvs: final_restorepv.append(r_pvlist[i]) final_restorepvval.append(r_data[i]) if len(final_restorepv) > 0: results = cav3.caput(final_restorepv, final_restorepvval, wait=True, throw=False) for i in range(len(results)): res = results[i] if not res.ok: # try 3 times again to set value to each pv # first try wait 1 second, second try wait 2 seconds, and last try wait 3 seconds. for j in range(1, 4): ressub = cav3.caput(final_restorepv[i], final_restorepvval[i], wait=True, throw=False, timeout=j) if ressub.ok: break if not ressub.ok: # record as a bad pv if it still fails bad_pvs.append(res) except: QMessageBox.warning(self, 'Warning', 'Error during restoring snapshot to live machine.') return if len(bad_pvs) > 0: message = "Failed to restore some pvs. PLease check the terminal for a full list." QMessageBox.warning(self, 'Warning', message) output = "" for bad_pv in bad_pvs: output += "\n "+bad_pv.name + ": "+cav3.cadef.ca_message(bad_pv.errorcode) print ("Failed to restore the following pvs which is caused by:"+output+"\n========list end (failed to restore pv)========") else: QMessageBox.information(self, "Success", "Successfully restore machine with selected snapshot.") def __arrayTextFormat(self, arrayvalue): """ display max 8 characters in a table cell """ array_text = str(arrayvalue) if len(str(array_text)) > 8: array_text = str(array_text)[:8]+' ..., ...)' return array_text def getLiveMachineAction(self): curWidget = self.snapshotTabWidget.currentWidget() if isinstance(curWidget, QTableWidget): # get event id eid = self.__find_key(self.tabWindowDict, curWidget) # 2 special case: if eid == 'preview': eid = self.previewId # get event id for preview snapshot elif eid == 'comment': return # nothing should do here pvlist = self.pv4cDict[str(eid)] data = self.getLiveMachineData(pvlist) if data: channelName = data[0] s_value = data[1] d_value = data[2] i_value = data[3] dbrtype = data[4] # isConnected = data[5] is_array = data[6] array_value = data[7] dd = {} noMatchedPv = [] # put channel name and its order into a dictionary for i in range(len(channelName)): dd[str(channelName[i])] = i # get table rows rowCount = curWidget.rowCount() for i in range(rowCount): try: index = dd[str(curWidget.item(i, 0).text())] if is_array[index]: self.__setTableItem(curWidget, i, 6, self.__arrayTextFormat(array_value[index])) self.arrayData[channelName[index]+"_"+str(eid)+'_live'] = array_value[index] else: if dbrtype[index] in self.epicsDouble: self.__setTableItem(curWidget, i, 6, str(d_value[index])) try: saved_val = float(str(curWidget.item(i, 5).text())) if d_value[index] != None: delta = d_value[index] - saved_val if abs(delta) < 1.0e-6: delta = 0 else: delta = None except: delta='N/A' self.__setTableItem(curWidget, i, 7, str(delta)) elif dbrtype[index] in self.epicsLong: self.__setTableItem(curWidget, i, 6, str(i_value[index])) if dbrtype[index] in self.epicsNoAccess: pass else: try: saved_val = int(float(str(curWidget.item(i, 5).text()))) if i_value[index] != None: delta = i_value[index] - saved_val else: delta = None except: delta='N/A' self.__setTableItem(curWidget, i, 7, str(delta)) elif dbrtype[index] in self.epicsString: self.__setTableItem(curWidget, i, 6, str(s_value[index])) except: noMatchedPv.append(str(curWidget.item(i, 0).text())) if len(noMatchedPv) > 0: print ("Can not find the following pv for this snapshot: \n", noMatchedPv) else: QMessageBox.warning(self, "Warning", "Not a snapshot.") return def useTimeRange(self, state): if state == Qt.Checked: self.eventStartDateTime.setEnabled(True) self.eventEndDateTime.setEnabled(True) else: self.eventStartDateTime.setEnabled(False) self.eventEndDateTime.setEnabled(False) def fetchEventAction(self): selectedConfigs = self.configTableWidget.selectionModel().selectedRows() configIds=[] configNames = [] for idx in selectedConfigs: configIds.append(str(self.configTableWidget.item(idx.row(), 4).text())) configNames.append(str(self.configTableWidget.item(idx.row(), 0).text())) data = self.retrieveEventData(configids=configIds, confignames=configNames) if data: self.setEventTable(data) self.eventTableWidget.resizeColumnsToContents() def retrieveSnapshot(self): selectedItems = self.eventTableWidget.selectionModel().selectedRows() if len(selectedItems) <= 0: QMessageBox.warning(self, "Warning", "Please select at least one event.") return eventTs=[] eventNames=[] eventIds = [] for idx in selectedItems: eventNames.append(str(self.eventTableWidget.item(idx.row(), 0).text())) eventTs.append(str(self.eventTableWidget.item(idx.row(), 3).text())) eventIds.append(str(self.eventTableWidget.item(idx.row(), 4).text())) self.snapshotTabWidget.setStatusTip("Snapshot data") self.setSnapshotTabWindow(eventNames, eventTs, eventIds) def setConfigTable(self): data = self.retrieveConfigData() if data: self.setTable(data, self.configTableWidget) def setSnapshotTabWindow(self, eventNames, eventTs, eventIds): tabWidget = None isNew = True for i in range(len(eventIds)): if self.tabWindowDict.has_key(eventIds[i]): tabWidget = self.tabWindowDict[eventIds[i]] else: tabWidget = QTableWidget() self.tabWindowDict[eventIds[i]] = tabWidget QObject.connect(tabWidget, SIGNAL(_fromUtf8("cellDoubleClicked (int,int)")), self.__showArrayData) data = self.retrieveMasarData(eventid=eventIds[i]) if data: if isNew: for j in range(self.snapshotTabWidget.count(), 0, -1): self.snapshotTabWidget.removeTab(j) self.pv4cDict.clear() self.data4eid.clear() self.arrayData.clear() isNew = False tabWidget.clear() self.setSnapshotTable(data, tabWidget, eventIds[i]) tabWidget.resizeColumnsToContents() ts = eventTs[i].split('.')[0] label = QString.fromUtf8((eventNames[i]+': ' + ts)) self.snapshotTabWidget.addTab(tabWidget, label) self.snapshotTabWidget.setTabText(i+1, label) self.pv4cDict[str(eventIds[i])] = data['PV Name'] self.data4eid[str(eventIds[i])] = data self.snapshotTabWidget.setCurrentIndex(1) def __showArrayData(self, row, column): if column != 5 and column != 6: # display the array value only return curWidget = self.snapshotTabWidget.currentWidget() if not isinstance(curWidget, QTableWidget): QMessageBox.warning(self, 'Warning', 'No snapshot is selected yet.') return eid = self.__find_key(self.tabWindowDict, curWidget) if eid == 'comment': QMessageBox.warning(self, 'Warning', 'It is comment panel.') if eid == 'preview': eid = self.previewId pvname = str(curWidget.item(row, 0).text()) try: arraySaved = self.arrayData[pvname+'_'+str(eid)] except: QMessageBox.warning(self, 'Warning', 'No array data found for this pv.') return if eid != 'preview': try: arrayLive = self.arrayData[pvname+"_"+str(eid)+'_live'] arrardlg = ShowArrayValueDlg(pvname, arraySaved, arrayLive) except: arrardlg = ShowArrayValueDlg(pvname, arraySaved) else: arrardlg = ShowArrayValueDlg(pvname, arraySaved) arrardlg.exec_() def setEventTable(self, data): self.setTable(data, self.eventTableWidget) def __setTableItem(self, table, row, col, text): item = table.item(row, col) if item: item.setText(text) else: newitem = QTableWidgetItem(text) newitem.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable) table.setItem(row, col, newitem) def setSnapshotTable(self, data, table, eventid): if data: length = len(data.values()[0]) else: print ('data is empty, exit.') return for i in range(1, len(data.values())): if length != len(data.values()[i]): QMessageBox.warning(self, "Warning", "Data length are not consistent.") return if isinstance(data, odict) and isinstance(table, QTableWidget): table.setSortingEnabled(False) table.clear() nrows = len(data.values()[0]) # ('pv name label', 'dbr_type label', 'string value', 'int value', 'double value', 'status label', 'severity label', # 'ioc time stamp label', 'ioc time stamp nano label', 'is_array', 'array_value'), # => (pv_name, status, severity, ioc_timestamp, saved value) # ncols = len(data) - 6 # ncols = ncols + 3 # 2 columns for live data and (live data - saved data), selected restore pv ncols = len(data) - 3 table.setRowCount(nrows) table.setColumnCount(ncols) pvnames = data['PV Name'] status = data['Status'] severity = data['Severity'] ts = data['Time stamp'] ts_nano = data['Time stamp (nano)'] dbrtype = data['DBR'] s_value = data['S_value'] i_value = data['I_value'] d_value = data['D_value'] isConnected = data['isConnected'] is_array = data['isArray'] array_value = data['arrayValue'] keys = ['Name', 'Status', 'Severity', 'Time Stamp', 'Connection', 'Saved Value', 'Live Value', 'Delta', 'Not Restore'] table.setHorizontalHeaderLabels(keys) for i in range(nrows): item = table.item(i, 8) if item: item.setCheckState(False) else: item = QTableWidgetItem() item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsUserCheckable) table.setItem(i, 8, item) item.setCheckState(False) if pvnames[i]: self.__setTableItem(table, i, 0, pvnames[i]) if status[i]: self.__setTableItem(table, i, 1, str(status[i])) if severity[i]: self.__setTableItem(table, i, 2, str(severity[i])) if ts[i]: dt = str(datetime.datetime.fromtimestamp(ts[i]+ts_nano[i]*1.0e-9)) self.__setTableItem(table, i, 3, dt) if is_array[i]: self.__setTableItem(table, i, 5, self.__arrayTextFormat(array_value[i])) self.arrayData[pvnames[i]+'_'+str(eventid)] = array_value[i] else: if dbrtype[i] in self.epicsDouble: self.__setTableItem(table, i, 5, str(d_value[i])) elif dbrtype[i] in self.epicsLong: self.__setTableItem(table, i, 5, str(i_value[i])) elif dbrtype[i] in self.epicsString: self.__setTableItem(table, i, 5, str(s_value[i])) elif dbrtype[i] in self.epicsNoAccess: # channel are not connected. pass else: print('invalid dbr type (code = %s)'%(dbrtype[i])) if isConnected[i]: self.__setTableItem(table, i, 4, str(bool(isConnected[i]))) item.setFlags(item.flags() | Qt.ItemIsUserCheckable) else: self.__setTableItem(table, i, 4, 'False') item.setCheckState(True) item.setSelected(True) # disable user checkable function item.setFlags(item.flags() ^ Qt.ItemIsUserCheckable) for item_idx in range(9): itemtmp = table.item(i, item_idx) if not itemtmp: itemtmp = QTableWidgetItem() table.setItem(i, item_idx, itemtmp) itemtmp.setBackground(self.brushbadpv) table.setSortingEnabled(True) else: raise "Either given data is not an instance of OrderedDict or table is not an instance of QtGui.QTableWidget" def setTable(self, data, table): """ Set data view. The data has to be an ordered dictionary, and table is a QtGui.QTableWidget Here is an example to construct an ordered dictionary. """ if data: length = len(data.values()[0]) else: print ('data is empty, exit.') return for i in range(1, len(data.values())): if length != len(data.values()[i]): QMessageBox.warning(self, "Warning", "Data length are not consistent.") return if isinstance(data, odict) and isinstance(table, QTableWidget): nrows = len(data.values()[0]) ncols = len(data) table.setRowCount(nrows) table.setColumnCount(ncols) # Removes all items in the view, and also all selections table.clear() table.setHorizontalHeaderLabels(data.keys()) n = 0 for key in data: m = 0 for item in data[key]: if not isinstance(item, basestring): item = str(item) if item: newitem = QTableWidgetItem(item) newitem.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable) table.setItem(m, n, newitem) m += 1 n += 1 else: raise "Either given data is not an instance of OrderedDict or table is not an instance of QtGui.QTableWidget" def getSystemList(self): try: return self.mc.retrieveSystemList() except: QMessageBox.warning(self, "Warning", "Cannot connect to MASAR server.\nPlease check the serviceName, network connection, and service status.") return def retrieveConfigData(self): data = odict() params = {"system": self.system, "servicename": self.__service, "configname": self.currentConfigFilter} try: rpcResult = self.mc.retrieveServiceConfigs(params) utctimes = rpcResult[3] config_ts = [] for ut in utctimes: ts = str(datetime.datetime.fromtimestamp(time.mktime(time.strptime(ut, self.time_format))) - self.UTC_OFFSET_TIMEDELTA) config_ts.append(ts) except: QMessageBox.warning(self, "Warning", "Exception happened during retrieving configurations.") return False if not rpcResult: return False data['Name'] = rpcResult[1] data['Description'] = rpcResult[2] data['Date'] = config_ts data['Version'] = rpcResult[4] data['Id'] = rpcResult[0] return data def retrieveEventData(self,configids=None,confignames=None): start = None end = None if self.timeRangeCheckBox.isChecked(): start = self.eventStartDateTime.dateTime().toPyDateTime() + self.UTC_OFFSET_TIMEDELTA end = self.eventEndDateTime.dateTime().toPyDateTime() + self.UTC_OFFSET_TIMEDELTA if start > end: QMessageBox.warning(self, "Warning", "Please select a correct time range.") return event_ids = [] event_ts = [] event_desc = [] c_names = [] event_author = [] self.e2cDict.clear() if configids: for i in range(len(configids)): cid = configids[i] params = {'configid': cid, "comment": self.eventConfigFilter, "user": self.authorText} if self.timeRangeCheckBox.isChecked(): params['start'] = str(start) params['end'] = str(end) try: rpcResult = self.mc.retrieveServiceEvents(params) except: QMessageBox.warning(self, "Warning", "Except happened during retrieving events.") return False if not rpcResult: return False eids = rpcResult[0] usertag = rpcResult[1] utctimes = rpcResult[2] author = rpcResult[3] event_ids = event_ids[:] + (list(eids))[:] event_desc = event_desc[:] + (list(usertag))[:] event_author = event_author[:] + (list(author))[:] for j in range(len(eids)): self.e2cDict[str(eids[j])] = [cid, usertag[j],confignames[i]] for ut in utctimes: c_names.append(confignames[i]) ts = str(datetime.datetime.fromtimestamp(time.mktime(time.strptime(ut, self.time_format))) - self.UTC_OFFSET_TIMEDELTA) event_ts.append(ts) else: return False data = odict() data['Config'] = c_names data['Description'] = event_desc data['Author'] = event_author data['Time stamp'] = event_ts data['Id'] = event_ids return data def retrieveMasarData(self, eventid=None): data = odict() params = {'eventid': eventid} try: rpcResult = self.mc.retrieveSnapshot(params) except: QMessageBox.warning(self, "Warning", "Except happened during retrieving snapshot data.") return False if not rpcResult: return False pvnames = rpcResult[0] s_value = rpcResult[1] d_value = rpcResult[2] i_value = rpcResult[3] dbrtype = rpcResult[4] isConnected = rpcResult[5] ts = rpcResult[6] ts_nano = rpcResult[7] severity = list(rpcResult[8]) status = list(rpcResult[9]) is_array = rpcResult[10] raw_array_value = rpcResult[11] array_value = [] for i in range(len(severity)): try: severity[i] = self.severityDict[severity[i]] except: severity[i] = 'N/A' try: status[i] = self.alarmDict[status[i]] except: status[i] = 'N/A' if dbrtype[i] in self.epicsLong: array_value.append(raw_array_value[i][2]) elif dbrtype[i] in self.epicsDouble: array_value.append(raw_array_value[i][1]) elif dbrtype[i] in self.epicsString: # string value array_value.append(raw_array_value[i][0]) elif dbrtype[i] in self.epicsNoAccess: # when the value is no_access, use the double value no matter what it is array_value.append(raw_array_value[i][1]) data['PV Name'] = pvnames data['Status'] = status data['Severity'] = severity data['Time stamp'] = ts data['Time stamp (nano)'] = ts_nano data['DBR'] = dbrtype data['S_value'] = s_value data['I_value'] = i_value data['D_value'] = d_value data['isConnected'] = isConnected data['isArray'] = is_array data['arrayValue'] = array_value return data def saveMachinePreviewData(self, eventid, confname, comment): if not eventid: QMessageBox.warning(self, "Warning", "Unknown event.") return params = {'eventid': str(eventid), 'configname': str(confname), 'user': str(comment[0]), 'desc': str(comment[1])} try: result = self.mc.updateSnapshotEvent(params) except: QMessageBox.warning(self, "Warning", "Except happened during update snapshot event.") return False if result: QMessageBox.information(self,"Successful", " Succeed to save preview") else: QMessageBox.information(self, "Failures", "Failed to save preview.") def getMachinePreviewData(self, configName): params = {'configname': configName, 'servicename': 'masar'} try: rpcResult = self.mc.saveSnapshot(params) except: QMessageBox.warning(self, "Warning", "Except happened during getting machine preview.") return False if not rpcResult: return False eventid = rpcResult[0] pvnames = rpcResult[1] s_value = rpcResult[2] d_value = rpcResult[3] i_value = rpcResult[4] dbrtype = rpcResult[5] isConnected = rpcResult[6] ts = rpcResult[7] ts_nano = list(rpcResult[8]) severity = list(rpcResult[9]) status = list(rpcResult[10]) is_array = rpcResult[11] raw_array_value = rpcResult[12] array_value = [] for i in range(len(severity)): try: severity[i] = self.severityDict[severity[i]] except: severity[i] = 'N/A' try: status[i] = self.alarmDict[status[i]] except: status[i] = 'N/A' if dbrtype[i] in self.epicsLong: array_value.append(raw_array_value[i][2]) elif dbrtype[i] in self.epicsDouble: array_value.append(raw_array_value[i][1]) elif dbrtype[i] in self.epicsString: # string value array_value.append(raw_array_value[i][0]) elif dbrtype[i] in self.epicsNoAccess: # when the value is no_access, use the double value no matter what it is array_value.append(raw_array_value[i][1]) data = odict() data['PV Name'] = pvnames data['Status'] = status data['Severity'] = severity data['Time stamp'] = ts data['Time stamp (nano)'] = ts_nano data['DBR'] = dbrtype data['S_value'] = s_value data['I_value'] = i_value data['D_value'] = d_value data['isConnected'] = isConnected data['isArray'] = is_array data['arrayValue'] = array_value return (eventid, data) def getLiveMachineData(self, pvlist): params = {} for pv in pvlist: params[pv] = pv # channelName,stringValue,doubleValue,longValue,dbrType,isConnected, is_array, array_value array_value = [] try: rpcResult = self.mc.getLiveMachine(params) except: QMessageBox.warning(self, "Warning", "Except happened during getting live machine.") return False if not rpcResult: return False channelName = rpcResult[0] stringValue = rpcResult[1] doubleValue = rpcResult[2] longValue = rpcResult[3] dbrtype = rpcResult[4] isConnected = rpcResult[5] is_array = rpcResult[6] raw_array_value = rpcResult[7] for i in range(len(is_array)): if dbrtype[i] in self.epicsLong: array_value.append(raw_array_value[i][2]) elif dbrtype[i] in self.epicsDouble: array_value.append(raw_array_value[i][1]) elif dbrtype[i] in self.epicsString: # string value array_value.append(raw_array_value[i][0]) elif dbrtype[i] in self.epicsNoAccess: # when the value is no_access, use the double value no matter what it is array_value.append(raw_array_value[i][1]) return (channelName,stringValue,doubleValue,longValue,dbrtype,isConnected,is_array, array_value) def saveDataFileAction(self): """ Save data into a CSV file. """ curWidget = self.snapshotTabWidget.currentWidget() if not isinstance(curWidget, QTableWidget): QMessageBox.warning(self, 'Warning', 'No snapshot is selected yet.') return eid = self.__find_key(self.tabWindowDict, curWidget) # if eid == 'comment' or eid == 'preview': # QMessageBox.warning(self, 'Warning', 'No restore, preview is selected.') # return data = self.data4eid[str(eid)] pvnames = data['PV Name'] status = data['Status'] severity = data['Severity'] ts = data['Time stamp'] ts_nano = data['Time stamp (nano)'] dbrtype = data['DBR'] s_value = data['S_value'] i_value = data['I_value'] d_value = data['D_value'] isConnected = data['isConnected'] is_array = data['isArray'] array_value = data['arrayValue'] head = '# pv name, status, severity, time stamp, epics dbr, is connected, is array, value' filename = QFileDialog.getSaveFileName(self, 'Save File', '.') if not filename: return try: fname = open(filename, 'w') fname.write(head+'\n') for i in range(len(pvnames)): line = pvnames[i] line += ','+str(status[i]) line += ','+str(severity[i]) line += ','+str(datetime.datetime.fromtimestamp(ts[i]+ts_nano[i]*1.0e-9)) line += ','+str(dbrtype[i]) line += ','+str(bool(isConnected[i])) line += ','+str(bool(is_array[i])) if is_array[i]: line += ','+str(array_value[i]) else: if dbrtype[i] in self.epicsDouble: line += ','+str(d_value[i]) elif dbrtype[i] in self.epicsLong: line += ','+str(i_value[i]) elif dbrtype[i] in self.epicsString: line += ','+str(s_value[i]) else: line += '' fname.write(line+'\n') fname.close() except: QMessageBox.warning(self, "Warning", "Cannot write to the file. Please check the writing permission.")
app= QApplication (sys.argv) win= QMainWindow () scene= QGraphicsScene () item= QGraphicsPixmapItem () scene.addItem (item) view= QGraphicsView (scene, win) view.setFrameShadow (QFrame.Plain) view.setFrameStyle (QFrame.NoFrame) view.show() brush = QBrush(QColor(0, 0, 0)) brush.setStyle(Qt.SolidPattern) view.setBackgroundBrush(brush) runner= OMIMMain (view, scene, item, sys.argv[1]) timer= QTimer (app) timer.timeout.connect (runner.nextImage) timer.start (float (sys.argv[2])*1000) firstImage= QTimer.singleShot (200, runner.nextImage) win.setCentralWidget (view) win.showFullScreen () app.exec_ ()
def setupUi(self): self.setObjectName("SCJ") self.setFixedSize(600,260) #self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) self.verticalLayout = QVBoxLayout(self) self.verticalLayout.setObjectName("verticalLayout") #self.infoText = QTextEdit(self) self.infoText = QLabel(self) palette = QPalette() brush = QBrush(QColor(245, 245, 245)) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Normal, QPalette.Background, brush) self.infoText.setPalette(palette) self.infoText.setAutoFillBackground(True) self.infoText.setFixedHeight(200) self.infoText.setObjectName("infoText") #self.infoText.setReadOnly(True) self.infoText.setWordWrap(True) self.verticalLayout.addWidget(self.infoText) # Manage Actions buttons self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) ## Format de sortie self.outlabel = QLabel(self.trUtf8("Choix du format de destination")) self.horizontalLayout.addWidget(self.outlabel) self.output = QComboBox() self.output.addItems(self.modes) self.output.setCurrentIndex(self.output.findText(self.mode)) self.horizontalLayout.addWidget(self.output) # Buttons self.fermer = QPushButton(self) self.fermer.setObjectName("fermer") self.horizontalLayout.addWidget(self.fermer) self.convertDir = QPushButton(self) self.convertDir.setObjectName("convertDir") self.horizontalLayout.addWidget(self.convertDir) self.convertFile = QPushButton(self) self.convertFile.setObjectName("convertFile") self.horizontalLayout.addWidget(self.convertFile) self.verticalLayout.addLayout(self.horizontalLayout) # Layout for allButtons self.allLayout = QHBoxLayout() # Add startAll bouton self.startallbtn = QPushButton(self) self.allLayout.addWidget(self.startallbtn) self.startallbtn.hide() self.verticalLayout.addLayout(self.allLayout) # Add delAll bouton self.delallbtn = QPushButton(self) self.allLayout.addWidget(self.delallbtn) self.delallbtn.hide() # Mode avec scroll self.frame = QFrame() self.frame.setMinimumSize(520,250) self.frame.setMaximumWidth(520) self.scroll = QScrollArea() self.scroll.setMinimumHeight(180) self.jobsLayout = QVBoxLayout(self.frame) self.jobsLayout.setSizeConstraint(QLayout.SetMinAndMaxSize) #self.jobsLayout.setSizeConstraint(QLayout.SetMinimumSize) #self.jobsLayout.setSizeConstraint(QLayout.SetMaximumSize) self.scroll.setWidget(self.frame) self.scroll.setWidgetResizable(False) self.verticalLayout.addWidget(self.scroll) self.scroll.hide() # Mode sans scroll #self.jobsLayout = QVBoxLayout() #self.verticalLayout.addLayout(self.jobsLayout) # Add a strech to the bottom of the window self.verticalLayout.insertStretch(-1)
def slideshow(): folder = None time = None args = sys.argv[:1] for arg in sys.argv[2:]: if arg.startswith("--"): args.append(arg) continue if not folder: folder = arg continue time = arg if folder is None or time is None: # awwww :) print("""usage: %s ROOT SECONDS ROOT points to the root directory where the images are going to be picked up. SECONDS is the time between images.""" % sys.argv[0]) sys.exit(1) sys.argv = args cursor = Qt.BlankCursor app = QApplication(sys.argv) win = QMainWindow() QApplication.setOverrideCursor(cursor) QApplication.changeOverrideCursor(cursor) scene = QGraphicsScene() view = QGraphicsView(scene, win) view.setFrameShadow(QFrame.Plain) view.setFrameStyle(QFrame.NoFrame) view.show() brush = QBrush(QColor(0, 0, 0)) brush.setStyle(Qt.SolidPattern) view.setBackgroundBrush(brush) runner = MainWindow(view, scene, folder) timer = QTimer(app) timer.timeout.connect(runner.nextImage) timer.start(float(time) * 1000) QTimer.singleShot(200, runner.nextImage) timer2 = QTimer(app) timer2.timeout.connect(runner.updateAlbum) timer2.start(60 * 60 * 1000) win.setCentralWidget(view) win.showFullScreen() tv = TV() app.exec_() tv.stop()
class FeatureHighlightItem(QgsMapCanvasItem): # Code ported from QGIS QgsHighlight def __init__(self, mapCanvas, feature, layer): super(FeatureHighlightItem, self).__init__(mapCanvas) self._mapCanvas = None # QgsMapCanvas self._brush = QBrush() self._pen = QPen() self._feature = None # QgsFeature() self._layer = None # QgsMapLayer() self._buffer = 0.0 self._minWidth = 0.0 self._mapCanvas = mapCanvas if (not layer or not feature or not isinstance(feature, QgsFeature) or not feature.geometry() or feature.geometry().isEmpty() or not feature.geometry().isGeosValid()): return self._feature = QgsFeature(feature) # Force deep copy self._layer = layer self.setLineColor(Application.highlightLineColor()) self.setFillColor(Application.highlightFillColor()) self._minWidth = Application.highlightMinimumWidth() self._buffer = Application.highlightBuffer() if self._mapCanvas.mapSettings().hasCrsTransformEnabled(): ct = self._mapCanvas.mapSettings().layerTransform(self._layer) if ct: self._feature.geometry().transform(ct) self.updateRect() self.update() def remove(self): self._mapCanvas.scene().removeItem(self) def setLineWidth(self, width): self._pen.setWidth(width) def setLineColor(self, color): self._pen.setColor(color) def setFillColor(self, fillColor): self._brush.setColor(fillColor) self._brush.setStyle(Qt.SolidPattern) def setBuffer(self, buff): self._buffer = buff def setMinWidth(self, width): self._minWidth = width def layer(self): return self._layer def updatePosition(self): pass # protected: def paint(self, painter, option=None, widget=None): # Override if not self._feature: return mapSettings = self._mapCanvas.mapSettings() context = QgsRenderContext.fromMapSettings(mapSettings) renderer = self._getRenderer(context, self._pen.color(), self._brush.color()) if renderer: context.setPainter(painter) renderer.startRender(context, self._layer.fields()) renderer.renderFeature(self._feature, context) renderer.stopRender(context) def updateRect(self): if self._feature and self._feature.constGeometry(): m2p = self._mapCanvas.mapSettings().mapToPixel() topLeft = m2p.toMapPoint(0, 0) res = m2p.mapUnitsPerPixel() imageSize = self._mapCanvas.mapSettings().outputSize() rect = QgsRectangle(topLeft.x(), topLeft.y(), topLeft.x() + imageSize.width() * res, topLeft.y() - imageSize.height() * res) self.setRect(rect) self.setVisible(True) else: self.setRect(QgsRectangle()) # private: def _setSymbol(self, symbol, context, color, fillColor): if not symbol: return for symbolLayer in reversed(symbol.symbolLayers()): if symbolLayer: if symbolLayer.subSymbol(): self._setSymbol(symbolLayer.subSymbol(), context, color, fillColor) else: symbolLayer.setColor(color) symbolLayer.setOutlineColor(color) symbolLayer.setFillColor(fillColor) if isinstance(symbolLayer, QgsSimpleMarkerSymbolLayerV2): symbolLayer.setOutlineWidth( self._getSymbolWidth(context, symbolLayer.outlineWidth(), symbolLayer.outlineWidthUnit())) if symbolLayer.type() == QgsSymbolV2.Line: symbolLayer.setWidth( self._getSymbolWidth(context, symbolLayer.width(), symbolLayer.widthUnit())) if symbolLayer.type() == QgsSymbolV2.Fill: symbolLayer.setBorderWidth( self._getSymbolWidth(context, symbolLayer.borderWidth(), symbolLayer.outputUnit())) symbolLayer.removeDataDefinedProperty('color') symbolLayer.removeDataDefinedProperty('color_border') def _getSymbolWidth(self, context, width, unit): scale = 1.0 if unit == QgsSymbolV2.MapUnit: scale = QgsSymbolLayerV2Utils.lineWidthScaleFactor( context, QgsSymbolV2.MM) / QgsSymbolLayerV2Utils.lineWidthScaleFactor(context, QgsSymbolV2.MapUnit) width = max(width + 2 * self._buffer * scale, self._minWidth * scale) return width def _getRenderer(self, context, color, fillColor): renderer = None if self._layer and self._layer.rendererV2(): renderer = self._layer.rendererV2().clone() if renderer: for symbol in renderer.symbols2(context): self._setSymbol(symbol, context, color, fillColor) return renderer
class GeometryHighlightItem(QgsMapCanvasItem): # Code ported from QGIS QgsHighlight def __init__(self, mapCanvas, geometry, layer): super(GeometryHighlightItem, self).__init__(mapCanvas) self._mapCanvas = None # QgsMapCanvas self._geometry = None # QgsGeometry() self._brush = QBrush() self._pen = QPen() self._mapCanvas = mapCanvas if not geometry or not isinstance(geometry, QgsGeometry) or geometry.isEmpty( ) or not geometry.isGeosValid(): return self._geometry = QgsGeometry(geometry) # Force deep copy self.setLineColor(Application.highlightLineColor()) self.setFillColor(Application.highlightFillColor()) if (layer and self._mapCanvas.mapSettings().hasCrsTransformEnabled()): ct = self._mapCanvas.mapSettings().layerTransform(layer) if ct: self._geometry.transform(ct) self.updateRect() self.update() def remove(self): self._mapCanvas.scene().removeItem(self) def setLineWidth(self, width): self._pen.setWidth(width) def setLineColor(self, color): lineColor = QColor(color) lineColor.setAlpha(255) self._pen.setColor(lineColor) def setFillColor(self, fillColor): self._brush.setColor(fillColor) self._brush.setStyle(Qt.SolidPattern) def updatePosition(self): pass # protected: def paint(self, painter, option=None, widget=None): # Override if not self._geometry: return painter.setPen(self._pen) painter.setBrush(self._brush) wkbType = self._geometry.wkbType() if wkbType == QGis.WKBPoint or wkbType == QGis.WKBPoint25D: self._paintPoint(painter, self._geometry.geometry()) elif wkbType == QGis.WKBMultiPoint or wkbType == QGis.WKBMultiPoint25D: for point in self._geometry.geometry(): self._paintPoint(painter, point) elif wkbType == QGis.WKBLineString or wkbType == QGis.WKBLineString25D: self._paintLine(painter, self._geometry.geometry()) elif wkbType == QGis.WKBMultiLineString or wkbType == QGis.WKBMultiLineString25D: for line in self._geometry.geometry(): self._paintLine(painter, line) elif wkbType == QGis.WKBPolygon or wkbType == QGis.WKBPolygon25D: self._paintPolygon(painter, self._geometry.geometry()) elif wkbType == QGis.WKBMultiPolygon or wkbType == QGis.WKBMultiPolygon25D: for polygon in self._geometry.geometry(): self._paintPolygon(painter, polygon) def updateRect(self): if self._geometry: r = self._geometry.boundingBox() if r.isEmpty(): d = self._mapCanvas.extent().width() * 0.005 r.setXMinimum(r.xMinimum() - d) r.setYMinimum(r.yMinimum() - d) r.setXMaximum(r.xMaximum() + d) r.setYMaximum(r.yMaximum() + d) self.setRect(r) self.setVisible(True) else: self.setRect(QgsRectangle()) # private: def _paintPoint(self, painter, point): painter.drawEllipse(self.toCanvasCoordinates(point) - self.pos(), 2, 2) def _paintLine(self, painter, line): polyline = QPolygonF() for point in line: polyline.append(self.toCanvasCoordinates(point) - self.pos()) painter.drawPolyline(polyline) def _paintPolygon(self, painter, polygon): path = QPainterPath() for line in polygon: ring = QPolygonF() for point in line: cur = self.toCanvasCoordinates(point) - self.pos() ring.append(cur) ring.append(ring[0]) path.addPolygon(ring) painter.drawPath(path)
def __init__(self, parent): QDialog.__init__(self, parent) palette = QPalette(); brush = QBrush(QColor(255, 255, 255, 255)); brush.setStyle(Qt.SolidPattern); palette.setBrush(QPalette.Active, QPalette.Base, brush); palette.setBrush(QPalette.Active, QPalette.Window, brush); palette.setBrush(QPalette.Inactive, QPalette.Base, brush); palette.setBrush(QPalette.Inactive, QPalette.Window, brush); palette.setBrush(QPalette.Disabled, QPalette.Base, brush); palette.setBrush(QPalette.Disabled, QPalette.Window, brush); self.setPalette(palette); self.ui = Ui_FlightPlannerBase() self.ui.setupUi(self) self.newDlgExisting = False self.chbHideCloseInObst = QCheckBox(self.ui.grbResult) font = QFont() font.setBold(False) font.setWeight(50) self.chbHideCloseInObst.setFont(font) self.chbHideCloseInObst.setObjectName("chbHideCloseInObst") self.ui.vlResultGroup.addWidget(self.chbHideCloseInObst) self.chbHideCloseInObst.setText("Hide close-in obstacles") self.chbHideCloseInObst.setVisible(False) self.ui.tblHistory.setSelectionBehavior(1) # self.ui.tabCtrlGeneral.setTabsClosable(True) self.ui.btnUpdateQA.setVisible(False) self.ui.btnUpdateQA_2.setVisible(False) ''' combo boxes event ''' self.ui.cmbObstSurface.currentIndexChanged.connect(self.cmbObstSurfaceChanged) self.ui.cmbUnits.currentIndexChanged.connect(self.changeResultUnit) ''' buttons clicked connect ''' self.ui.btnClose.clicked.connect(self.reject) self.ui.btnClose_2.clicked.connect(self.reject) self.ui.btnHistoryClose.clicked.connect(self.reject) self.ui.btnConstruct.clicked.connect(self.btnConstruct_Click) self.ui.btnEvaluate.clicked.connect(self.btnEvaluate_Click) self.ui.btnOpenData.clicked.connect(self.openData) self.ui.btnSaveData.clicked.connect(self.saveData) self.ui.btnPDTCheck.clicked.connect(self.btnPDTCheck_Click) self.ui.btnExportResult.clicked.connect(self.exportResult) self.ui.tblHistory.clicked.connect(self.tblHistory_Click) self.ui.btnUpdateQA.clicked.connect(self.btnUpdateQA_Click) self.ui.btnUpdateQA_2.clicked.connect(self.btnUpdateQA_2_Click) self.ui.btnCriticalLocate.clicked.connect(self.criticalLocate) self.connect(self.ui.tblObstacles, SIGNAL("tableViewObstacleMouseReleaseEvent_rightButton"), self.tableViewObstacleMouseTeleaseEvent_rightButton) self.connect(self.ui.tblObstacles, SIGNAL("pressedEvent"), self.tblObstacles_pressed) ''' properties ''' self.parametersPanel = None self.obstaclesModel = None self.surfaceType = "" self.surfaceSubGroupNames = [] self.uiStateInit() self.obstacleTableInit() self.newDlgExisting = True self.resultColumnNames = [] self.stdItemModelHistory = QStandardItemModel() # self.stdItemModelHistory. self.ui.tblHistory.setModel(self.stdItemModelHistory) icon = QIcon() icon.addPixmap(QPixmap("Resource/btnImage/dlgIcon.png"), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) self.resultLayerList = [] self.symbolLayers = [] self.selectedObstacleMoselIndex = None self.changedCriticalObstacleValue = []
# QT from PyQt4.QtCore import * from PyQt4.QtGui import QTableWidget, QTableWidgetItem, QBrush, QColor # Python <2.7 suport try: from collections import OrderedDict except: from lib.ordered_dictionary import OrderedDict # COLORS red = QBrush(QColor(255, 0, 0)) red.setStyle(Qt.SolidPattern) white = QBrush(QColor(255, 255, 255)) white.setStyle(Qt.SolidPattern) blue = QBrush(QColor(51, 153, 255)) blue.setStyle(Qt.SolidPattern) color = {"red": red, "white": white, "blue": blue} # Tooltips dic_orbital_space = OrderedDict([('btn_frozen', 'Frozen orbital'), ('btn_active', 'Active orbital'), ('btn_inactive', 'Useless orbital')]) class OrbitalTable(QTableWidget): status = [] def __init__(self, *args): QTableWidget.__init__(self, *args) self.setHorizontalHeaderLabels(['Energy', 'Occu', 'Orbital'])
class GeometryHighlightItem(QgsMapCanvasItem): # Code ported from QGIS QgsHighlight def __init__(self, mapCanvas, geometry, layer): super(GeometryHighlightItem, self).__init__(mapCanvas) self._mapCanvas = None # QgsMapCanvas self._geometry = None # QgsGeometry() self._brush = QBrush() self._pen = QPen() self._mapCanvas = mapCanvas if not geometry or not isinstance(geometry, QgsGeometry) or geometry.isEmpty() or not geometry.isGeosValid(): return self._geometry = QgsGeometry(geometry) # Force deep copy self.setLineColor(Application.highlightLineColor()) self.setFillColor(Application.highlightFillColor()) if (layer and self._mapCanvas.mapSettings().hasCrsTransformEnabled()): ct = self._mapCanvas.mapSettings().layerTransform(layer) if ct: self._geometry.transform(ct) self.updateRect() self.update() def remove(self): self._mapCanvas.scene().removeItem(self) def setLineWidth(self, width): self._pen.setWidth(width) def setLineColor(self, color): lineColor = QColor(color) lineColor.setAlpha(255) self._pen.setColor(lineColor) def setFillColor(self, fillColor): self._brush.setColor(fillColor) self._brush.setStyle(Qt.SolidPattern) def updatePosition(self): pass # protected: def paint(self, painter, option=None, widget=None): # Override if not self._geometry: return painter.setPen(self._pen) painter.setBrush(self._brush) wkbType = self._geometry.wkbType() if wkbType == QGis.WKBPoint or wkbType == QGis.WKBPoint25D: self._paintPoint(painter, self._geometry.geometry()) elif wkbType == QGis.WKBMultiPoint or wkbType == QGis.WKBMultiPoint25D: for point in self._geometry.geometry(): self._paintPoint(painter, point) elif wkbType == QGis.WKBLineString or wkbType == QGis.WKBLineString25D: self._paintLine(painter, self._geometry.geometry()) elif wkbType == QGis.WKBMultiLineString or wkbType == QGis.WKBMultiLineString25D: for line in self._geometry.geometry(): self._paintLine(painter, line) elif wkbType == QGis.WKBPolygon or wkbType == QGis.WKBPolygon25D: self._paintPolygon(painter, self._geometry.geometry()) elif wkbType == QGis.WKBMultiPolygon or wkbType == QGis.WKBMultiPolygon25D: for polygon in self._geometry.geometry(): self._paintPolygon(painter, polygon) def updateRect(self): if self._geometry: r = self._geometry.boundingBox() if r.isEmpty(): d = self._mapCanvas.extent().width() * 0.005 r.setXMinimum(r.xMinimum() - d) r.setYMinimum(r.yMinimum() - d) r.setXMaximum(r.xMaximum() + d) r.setYMaximum(r.yMaximum() + d) self.setRect(r) self.setVisible(True) else: self.setRect(QgsRectangle()) # private: def _paintPoint(self, painter, point): painter.drawEllipse(self.toCanvasCoordinates(point) - self.pos(), 2, 2) def _paintLine(self, painter, line): polyline = QPolygonF() for point in line: polyline.append(self.toCanvasCoordinates(point) - self.pos()) painter.drawPolyline(polyline) def _paintPolygon(self, painter, polygon): path = QPainterPath() for line in polygon: ring = QPolygonF() for point in line: cur = self.toCanvasCoordinates(point) - self.pos() ring.append(cur) ring.append(ring[0]) path.addPolygon(ring) painter.drawPath(path)
def __init__(self): super(NodeViewScene, self).__init__() backgroundBrush = QBrush(QColor(0, 0, 0, 20)) backgroundBrush.setStyle(QtCore.Qt.CrossPattern) self.setBackgroundBrush(backgroundBrush)
class FeatureHighlightItem(QgsMapCanvasItem): # Code ported from QGIS QgsHighlight def __init__(self, mapCanvas, feature, layer): super(FeatureHighlightItem, self).__init__(mapCanvas) self._mapCanvas = None # QgsMapCanvas self._brush = QBrush() self._pen = QPen() self._feature = None # QgsFeature() self._layer = None # QgsMapLayer() self._buffer = 0.0 self._minWidth = 0.0 self._mapCanvas = mapCanvas if (not layer or not feature or not isinstance(feature, QgsFeature) or not feature.geometry() or feature.geometry().isEmpty() or not feature.geometry().isGeosValid()): return self._feature = QgsFeature(feature) # Force deep copy self._layer = layer self.setLineColor(Application.highlightLineColor()) self.setFillColor(Application.highlightFillColor()) self._minWidth = Application.highlightMinimumWidth() self._buffer = Application.highlightBuffer() if self._mapCanvas.mapSettings().hasCrsTransformEnabled(): ct = self._mapCanvas.mapSettings().layerTransform(self._layer) if ct: self._feature.geometry().transform(ct) self.updateRect() self.update() def remove(self): self._mapCanvas.scene().removeItem(self) def setLineWidth(self, width): self._pen.setWidth(width) def setLineColor(self, color): self._pen.setColor(color) def setFillColor(self, fillColor): self._brush.setColor(fillColor) self._brush.setStyle(Qt.SolidPattern) def setBuffer(self, buff): self._buffer = buff def setMinWidth(self, width): self._minWidth = width def layer(self): return self._layer def updatePosition(self): pass # protected: def paint(self, painter, option=None, widget=None): # Override if not self._feature: return mapSettings = self._mapCanvas.mapSettings() context = QgsRenderContext.fromMapSettings(mapSettings) renderer = self._getRenderer(context, self._pen.color(), self._brush.color()) if renderer: context.setPainter(painter) renderer.startRender(context, self._layer.fields()) renderer.renderFeature(self._feature, context) renderer.stopRender(context) def updateRect(self): if self._feature and self._feature.constGeometry(): m2p = self._mapCanvas.mapSettings().mapToPixel() topLeft = m2p.toMapPoint(0, 0) res = m2p.mapUnitsPerPixel() imageSize = self._mapCanvas.mapSettings().outputSize() rect = QgsRectangle(topLeft.x(), topLeft.y(), topLeft.x() + imageSize.width() * res, topLeft.y() - imageSize.height() * res) self.setRect(rect) self.setVisible(True) else: self.setRect(QgsRectangle()) # private: def _setSymbol(self, symbol, context, color, fillColor): if not symbol: return for symbolLayer in reversed(symbol.symbolLayers()): if symbolLayer: if symbolLayer.subSymbol(): self._setSymbol(symbolLayer.subSymbol(), context, color, fillColor) else: symbolLayer.setColor(color) symbolLayer.setOutlineColor(color) symbolLayer.setFillColor(fillColor) if isinstance(symbolLayer, QgsSimpleMarkerSymbolLayerV2): symbolLayer.setOutlineWidth( self._getSymbolWidth( context, symbolLayer.outlineWidth(), symbolLayer.outlineWidthUnit())) if symbolLayer.type() == QgsSymbolV2.Line: symbolLayer.setWidth( self._getSymbolWidth(context, symbolLayer.width(), symbolLayer.widthUnit())) if symbolLayer.type() == QgsSymbolV2.Fill: symbolLayer.setBorderWidth( self._getSymbolWidth(context, symbolLayer.borderWidth(), symbolLayer.outputUnit())) symbolLayer.removeDataDefinedProperty('color') symbolLayer.removeDataDefinedProperty('color_border') def _getSymbolWidth(self, context, width, unit): scale = 1.0 if unit == QgsSymbolV2.MapUnit: scale = QgsSymbolLayerV2Utils.lineWidthScaleFactor( context, QgsSymbolV2.MM) / QgsSymbolLayerV2Utils.lineWidthScaleFactor( context, QgsSymbolV2.MapUnit) width = max(width + 2 * self._buffer * scale, self._minWidth * scale) return width def _getRenderer(self, context, color, fillColor): renderer = None if self._layer and self._layer.rendererV2(): renderer = self._layer.rendererV2().clone() if renderer: for symbol in renderer.symbols2(context): self._setSymbol(symbol, context, color, fillColor) return renderer
def onSubmitClicked(self): self.wordsMatched = True self.allWordsMatched = True brushRed = QBrush(QColor(255,0,0)) brushRed.setStyle(Qt.SolidPattern) brushGreen = QBrush(QColor(0,255,0)) brushGreen.setStyle(Qt.SolidPattern) # validate whether the user all matched the blanks with a value #self.onNextSubmitValidation() textNotFilled = False for row in range(0, len(self.currentSentenceListInTable)): if self.sentenceToFillTable.item(row, 0).text() == self.currentSentenceListInTable[row]: textNotFilled = True if textNotFilled: QMessageBox.information(self, "Fill the sentences", "Match all the sentences in the table", QMessageBox.Ok) else: splittedSentence = [] foundWordInSentence = "" self.rightWordListCopy = self.rightWordList for row in range(0, len(self.currentSentenceListInTable)): sentenceFilled = str(self.sentenceToFillTable.item(row, 0).text()) newSplittedSentence = [word.strip() for word in sentenceFilled.split()] splittedSentence = [] for word in newSplittedSentence: match = re.search(r'\w+', word) if match: splittedSentence.append(str(match.group())) wordList = self.rightWordListCopy[row] if len(wordList) > 1: firstWord = wordList[0].strip() secondWord = wordList[1].strip() if ' ' in firstWord: for word in firstWord.split(): if word not in splittedSentence: self.wordsMatched = False else: if firstWord not in splittedSentence: self.wordsMatched = False if self.wordsMatched: ## check is valid only if the first word is matched if ' ' in secondWord: for word in secondWord.split(): if word not in splittedSentence: self.wordsMatched = False else: if secondWord not in splittedSentence: self.wordsMatched = False elif len(wordList) == 1: word = wordList[0].strip() if word not in splittedSentence: self.wordsMatched = False if self.wordsMatched: self.sentenceToFillTable.item(row, 0).setBackground(brushGreen) else: self.sentenceToFillTable.item(row, 0).setBackground(brushRed) self.allWordsMatched = False self.wordsMatched = True if self.allWordsMatched: self.nextButton.setEnabled(True) QMessageBox.information(self, "Fill the sentences", "All sentences are matched", QMessageBox.Ok)