def paint(self, painter, option, index): super().paint(painter, option, index) selected = option.state & QStyle.State_Selected if index.column() == 0: s_data = index.data(ValueRole) if s_data == 0: color = QColor(123, 123, 123) elif s_data == 1: color = QColor(224, 0, 0) elif s_data == 2: color = QColor(40, 140, 40) painter.save() painter.setRenderHint(QPainter.Antialiasing) pen = painter.pen() pen.setStyle(Qt.NoPen) painter.setPen(pen) painter.setBrush(color) rect_1 = QRect(option.rect) rect_1.adjust(2, 2, -3, -2) painter.drawRoundedRect(rect_1, 2, 2) painter.restore() if selected: gradient = QLinearGradient(0, 0, 66, 0) gradient.setColorAt(0, QColor(0, 0, 0, 255)) gradient.setColorAt(1, QColor(0, 0, 0, 0)) painter.setPen(QPen(gradient, 1)) rect_2 = QRect(option.rect) painter.drawLine(rect_2.topLeft(), rect_2.topRight()) painter.drawLine(rect_2.bottomLeft(), rect_2.bottomRight())
def __init__(self): QDialog.__init__(self) self.resize(400, 300) self.setWindowTitle('Connection Dialog') self.label = QLabel(self) self.label.setGeometry(QRect(140, 150, 81, 20)) self.label.setText('username') self.label2 = QLabel(self) self.label2.setGeometry(QRect(140, 190, 81, 20)) self.label2.setText('password') self.label3 = QLabel(self) self.label3.setGeometry(QRect(40, 32, 151, 20)) self.label3.setText('Name of the Shogun Client') self.label4 = QLabel(self) self.label4.setGeometry(QRect(40, 82, 151, 20)) self.label4.setText('URL:') self.nameIn = QLineEdit(self) self.nameIn.setGeometry(QRect(200, 30, 180, 27)) self.nameIn.setText('Default Shogun Client') self.urlIn = QLineEdit(self) self.urlIn.setGeometry(QRect(122, 80, 258, 27)) self.urlIn.setPlaceholderText('i. e.: http(s)://.../shogun2-webapp') self.userIn = QLineEdit(self) self.userIn.setGeometry(QRect(230, 150, 150, 27)) self.passwordIn = QLineEdit(self) self.passwordIn.setGeometry(QRect(230, 190, 150, 27)) self.passwordIn.setEchoMode(QLineEdit.Password) self.okButton = QPushButton(self) self.okButton.setGeometry(QRect(270, 240, 85, 27)) self.okButton.setText('OK') self.cancelButton = QPushButton(self) self.cancelButton.setGeometry(QRect(180, 240, 85, 27)) self.cancelButton.setText('Cancel')
def set_thumbnail(self): """ Sets thumbnail to the document widget by cropping if necessary. :return: None :rtype: NoneType """ extension = self._displayName[self._displayName.rfind('.'):] QApplication.processEvents() doc_path = '{}/{}/{}/{}/{}{}'.format( source_document_location(), str(self.curr_profile.name), str(self._source_entity), str(self.doc_type_value()).replace(' ', '_'), str(self.fileUUID), str(extension) ).lower() ph_image = QImage(doc_path) ph_pixmap = QPixmap.fromImage(ph_image) # If width is larger than height, use height as width and height if ph_pixmap.width() > ph_pixmap.height(): rectangle = QRect(0, 0, ph_pixmap.height(), ph_pixmap.height()) ph_pixmap = ph_pixmap.copy(rectangle) # If height is larger than width, use width as width and height elif ph_pixmap.height() > ph_pixmap.width(): rectangle = QRect(0, 0, ph_pixmap.width(), ph_pixmap.width()) ph_pixmap = ph_pixmap.copy(rectangle) self.lblThumbnail.setPixmap(ph_pixmap) self.lblThumbnail.setScaledContents(True)
def __init__(self, canvas): QgsMapTool.__init__(self, canvas) self.canvas = canvas self.extent = None self.dragging = False self.rubber_band = None self.select_rect = QRect()
def __init__(self, icon_path, text, toolbar, action_group): """ Class constructor """ super().__init__(icon_path, text, toolbar, action_group) self.dragging = False # Select rectangle self.select_rect = QRect()
def __init__(self, canvas, snapradius=2): super(InfoTool, self).__init__(canvas) self.canvas = canvas self.radius = snapradius self.selectband = QgsRubberBand(self.canvas, QgsWkbTypes.PolygonGeometry) self.selectrect = QRect() self.dragging = False self.selectionlayers = {}
def __init__(self, iface, settings, action, index_action): """ Class constructor """ # Call ParentMapTool constructor super(ConnecMapTool, self).__init__(iface, settings, action, index_action) self.dragging = False # Select rectangle self.select_rect = QRect()
def initGui(self): # Create Graphical User Interface icon = QIcon() icon.addPixmap(QPixmap(os.path.dirname(__file__) + "/icon.png"), QIcon.Normal, QIcon.Off) self.setWindowIcon(icon) self.setWindowModality(Qt.WindowModal) self.setWindowFlags(Qt.Window | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) self.resize(520, 520) self.label = QLabel(self) self.label.setGeometry(QRect(10, 20, 500, 20)) font = QFont() font.setPointSize(14) font.setUnderline(True) self.label.setFont(font) self.label.setAlignment(Qt.AlignCenter) self.label_2 = QLabel(self) self.label_2.setGeometry(QRect(10, 70, 500, 16)) self.label_3 = QLabel(self) self.label_3.setGeometry(QRect(10, 90, 500, 16)) self.label_4 = QLabel(self) self.label_4.setGeometry(QRect(10, 110, 500, 16)) self.pushButton = QPushButton(self) self.pushButton.setGeometry(QRect(50, 150, 121, 24)) self.comboBox = QComboBox(self) self.comboBox.setGeometry(QRect(240, 150, 121, 24)) self.comboBox.addItem("Paso Malla 25m") self.comboBox.addItem("Paso Malla 200m") self.comboBox.addItem("Paso Malla 500m") self.comboBox.addItem("Paso Malla 1.000m") self.bt_view_map = QPushButton(self) self.bt_view_map.setGeometry(QRect(370, 150, 121, 24)) self.profile_jpg = QLabel(self) self.profile_jpg.setGeometry(QRect(20, 200, 480, 180)) self.message_box = QTextEdit(self) self.message_box.setGeometry(QRect(10, 400, 500, 111)) self.label.setText("KML / GPX TO 3D") self.label_2.setText( "Convert a GPX file without elevation, in a GPX and KML with elevation. It's only for Spain." ) self.label_3.setText( "Convierte un GPX sin elevación, en un GPX y KML con elevación.") self.label_4.setText( "Es solo para España ya que utiliza el servicio WCS del Instituto Geografico Nacional" ) self.pushButton.setText("File / Fichero") self.bt_view_map.setText("Map / Mapa") self.pushButton.clicked.connect(self.select_file) self.bt_view_map.clicked.connect( lambda: see_map(self.Output_KML_File).exec_())
def __init__(self, icon_path, text, toolbar, action_group, iface, settings, controller, plugin_dir): """ Class constructor """ # Call ParentMapTool constructor super().__init__(icon_path, text, toolbar, action_group, iface, settings, controller, plugin_dir) self.dragging = False # Select rectangle self.select_rect = QRect()
def canvasMoveEvent(self, event): if event.buttons() != Qt.LeftButton: return r = QRect() if not self.selectionActive: self.selectionActive = True rect = QRect(event.pos(), event.pos()) else: rect = QRect(event.pos(), self.dragStart) if self.rubberBand is not None: self.rubberBand.setToCanvasRectangle(rect)
def makeRectBy(self, point): rectSize = self.calcRectSize() width = rectSize[0] height = rectSize[1] rect = QRect(point.x() - width / 2, point.y() - height / 2, width, height) return rect
def noPermissionAccess(self): self.usertabel.setHidden(True) self.groupstabel.setHidden(True) self.noPermissionAccessLabel = QtGui.QLabel(self.tabs[3]) self.noPermissionAccessLabel.setGeometry(QRect(50, 50, 420, 50)) self.noPermissionAccessLabel.setText('Could not access application ' 'permissions. User permission is not high enough')
def setupUi(self): self.resize(815, 250) self.verticalLayout = QVBoxLayout(self) self.groupBox_2 = QGroupBox(self) self.groupBox_2.setObjectName("groupBox_2") self.database_combo = QComboBox(self.groupBox_2) self.database_combo.setGeometry(QRect(10, 30, 481, 34)) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.database_combo.sizePolicy().hasHeightForWidth()) self.database_combo.setSizePolicy(sizePolicy) self.database_combo.setObjectName("database_combo") self.verticalLayout.addWidget(self.groupBox_2) self.groupBox = QGroupBox(self) self.verticalLayoutBox = QVBoxLayout(self.groupBox) self.buttonBox = QDialogButtonBox(self) self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi() self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) QMetaObject.connectSlotsByName(self)
def set_text_image(self, text, color=Qt.gray): """ Set the item picture based on an SVG file created from the given text. :param text: Text to be rendered as SVG. :type text: str :param color: Font color :type color: QColor """ w, h = 200, 50 svg_path = self._gen_svg_path() svg_gen = QSvgGenerator() svg_gen.setFileName(svg_path) svg_gen.setTitle('QrBarCodeLayoutItem') svg_gen.setDescription('Image generated by QrBarCodeLayoutItem plugin') svg_gen.setSize(QSize(w, h)) svg_gen.setViewBox(QRect(0, 0, w, h)) # Paint text font = QFont('Arial', 14, QFont.Bold) p = QPainter() p.begin(svg_gen) p.setFont(font) p.setPen(color) p.drawText(QPointF(10, 20), text) p.end() # Set picture path self.setPicturePath(svg_path)
def paintEvent(self, event): self.updatePosition() painter = QPainter(self) painter.fillRect(self.rect(), Qt.transparent) painter.setRenderHint(QPainter.Antialiasing, True) if self.mCurrentCounter > self.mNumberOfLines: self.mCurrentCounter = 0 painter.setPen(Qt.NoPen) for i in range(self.mNumberOfLines): painter.save() painter.translate(self.mInnerRadius + self.mLineLength, self.mInnerRadius + self.mLineLength) rotateAngle = 360.0 * i / self.mNumberOfLines painter.rotate(rotateAngle) painter.translate(self.mInnerRadius, 0) distance = self.lineCountDistanceFromPrimary( i, self.mCurrentCounter, self.mNumberOfLines) color = self.currentLineColor(distance, self.mNumberOfLines, self.mTrailFadePercentage, self.mMinimumTrailOpacity, self.mColor) painter.setBrush(color) painter.drawRoundedRect( QRect(0, -self.mLineWidth // 2, self.mLineLength, self.mLineLength), self.mRoundness, Qt.RelativeSize) painter.restore()
def doLayout(self, rect, testOnly): x = rect.x() y = rect.y() lineHeight = 0 self.posicions = { } #Desarem les posicions dels elements del layout en un diccionari, on la clau serà el widget i el valor serà una tupla amb les posicions self.elements = [[]] i, j = 0, 0 for item in self.itemList: wid = item.widget() spaceX = self.spacing() + wid.style().layoutSpacing( QSizePolicy.PushButton, QSizePolicy.PushButton, Qt.Horizontal) spaceY = self.spacing() + wid.style().layoutSpacing( QSizePolicy.PushButton, QSizePolicy.PushButton, Qt.Vertical) nextX = x + item.sizeHint().width() + spaceX if nextX - spaceX > rect.right() and lineHeight > 0: x = rect.x() y = y + lineHeight + spaceY nextX = x + item.sizeHint().width() + spaceX lineHeight = 0 #Passem a la línia següent i += 1 j = 0 self.elements.append([]) if not testOnly: item.setGeometry(QRect(QPoint(x, y), item.sizeHint())) self.posicions[wid] = (i, j) self.elements[i].append(wid) x = nextX lineHeight = max(lineHeight, item.sizeHint().height()) j += 1 #Següent posició return y + lineHeight - rect.y()
def paint(self, painter, option, index): if index.column() != 1: QStyledItemDelegate.paint(self, painter, option, index) return model: Any[PlanetSearchResultsModel | QAbstractItemModel] = \ index.model() node = model.get_node(index) if node.node_type() in [NodeT.LOADING, NodeT.LOAD_MORE]: QStyledItemDelegate.paint(self, painter, option, index) return rect = option.rect painter.save() btn = QStyleOptionButton() btn.icon = COG_ICON btn.iconSize = QSize(18, 18) btn.features = QStyleOptionButton.Flat # btn.features |= QStyleOptionButton.HasMenu if option.state & QStyle.State_Selected: painter.fillRect(option.rect, option.palette.highlight()) btn.state = QStyle.State_Enabled btn.rect = QRect(rect.left() + rect.width() - 26, rect.top(), 26, rect.height()) QApplication.style().drawControl( QStyle.CE_PushButton, btn, painter) painter.restore()
def deactivateHoverEditing(self): self.hoverBox.setHidden(True) self.hoverEdit.setHidden(True) self.hoverAddButton.setHidden(True) self.infoEdit = QtGui.QLineEdit(self.tabs[0]) self.infoEdit.setEnabled(False) self.infoEdit.setText('only available for vector layers') self.infoEdit.setGeometry(QRect(180, 143, 200 ,27))
def newAppCreation(self): self.usertabel.setHidden(True) self.groupstabel.setHidden(True) self.noPermissionAccessLabel = QtGui.QLabel(self.tabs[4]) self.noPermissionAccessLabel.setGeometry(QRect(50, 50, 420, 100)) self.noPermissionAccessLabel.setText( 'You have to save and upload the ' 'new application once\nfirst, then you can edit it\'s permissions')
def __init__(self): QDockWidget.__init__(self) self.setWindowTitle('Shogun Editor') self.setContextMenuPolicy(Qt.DefaultContextMenu) self.setLayoutDirection(Qt.LeftToRight) self.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.setFloating(False) self.dockWidgetContents = QWidget(self) self.dockWidgetContents.setGeometry(QRect(20, 30, 320, 700)) self.newConnectionButton = QPushButton(self.dockWidgetContents) self.newConnectionButton.setGeometry(QRect(10, 0, 141, 27)) self.newConnectionButton.setText('New Connection') self.treeWidget = QTreeWidget(self.dockWidgetContents) self.treeWidget.setGeometry(QRect(10, 40, 300, 650)) self.treeWidget.setContextMenuPolicy(Qt.CustomContextMenu) self.treeWidget.setHeaderHidden(True) self.treeWidget.setColumnCount(1)
def mk_prj_edit_button(self) -> QToolButton: """Returns a tool button for the project edition. :return: button :rtype: QToolButton """ edit_button = QToolButton(self.tableWidget) edit_button.setGeometry(QRect(0, 0, 20, 20)) edit_button.setIcon(QIcon(str(DIR_PLUGIN_ROOT / "resources/edit.svg"))) edit_button.setToolTip(self.tr("Edit this project")) return edit_button
def setupUi(self, checks): self.resize(515, 450) self.verticalLayout = QVBoxLayout(self) self.groupBox_2 = QGroupBox(self) self.groupBox_2.setObjectName("groupBox_2") self.database_combo = QComboBox(self.groupBox_2) self.database_combo.setGeometry(QRect(10, 30, 481, 34)) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.database_combo.sizePolicy().hasHeightForWidth()) self.database_combo.setSizePolicy(sizePolicy) self.database_combo.setObjectName("database_combo") self.verticalLayout.addWidget(self.groupBox_2) self.groupBox = QGroupBox(self) self.verticalLayoutBox = QVBoxLayout(self.groupBox) self.check_pipe_friction = QCheckBox(self.groupBox) self.check_pipe_friction.setChecked(True) self.verticalLayoutBox.addWidget(self.check_pipe_friction) self.check_manhole_indicator = QCheckBox(self.groupBox) self.check_manhole_indicator.setChecked(True) self.verticalLayoutBox.addWidget(self.check_manhole_indicator) self.check_manhole_area = QCheckBox(self.groupBox) self.check_manhole_area.setChecked(True) self.verticalLayoutBox.addWidget(self.check_manhole_area) self.verticalLayout.addWidget(self.groupBox) self.check_only_empty_fields = QCheckBox(self) self.check_only_empty_fields.setChecked(True) self.verticalLayout.addWidget(self.check_only_empty_fields) self.buttonBox = QDialogButtonBox(self) self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi() self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) QMetaObject.connectSlotsByName(self)
def setupUi(self): self.resize(400, 400) self.setWindowTitle('Upload layer to Shogun') title = QtGui.QLabel(self) title.setGeometry(50,30,300,70) title.setText('Please select the layer you wish to upload to the \n Shogun Server') self.layerBox = QgsMapLayerComboBox(self) self.layerBox.setGeometry(QRect(50, 100, 300, 30)) self.uploadButton = QtGui.QPushButton(self) self.uploadButton.setGeometry(QRect(250, 160, 100, 35)) self.uploadButton.setText('Upload Layer') self.cancelButton = QtGui.QPushButton(self) self.cancelButton.setGeometry(QRect(140, 160, 100, 35)) self.cancelButton.setText('Cancel') self.cancelButton.clicked.connect(self.hide) self.logWindow = QtGui.QTextEdit(self) self.logWindow.setGeometry(QRect(50, 200, 300, 180)) self.logWindow.setReadOnly(True) self.logWindow.setText('Upload Log:')
def makeRectCursor(self): rectSize = self.calcRectSize() width = rectSize[0] height = rectSize[1] #make invisible rectangle when rectSize is too large if width > 2000: width = 0 if height > 2000: height = 0 image = QImage(QSize(width, height), QImage.Format_ARGB32) #fill with a invisible color image.fill(0) p = QPainter() p.begin(image) p.drawRect(QRect(0, 0, width - 1, height - 1)) p.end() return QPixmap.fromImage(image)
def setupUi(self, checks): self.resize(815, 266) self.verticalLayout = QVBoxLayout(self) self.groupBox_2 = QGroupBox(self) self.groupBox_2.setObjectName("groupBox_2") self.database_combo = QComboBox(self.groupBox_2) self.database_combo.setGeometry(QRect(10, 30, 481, 34)) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.database_combo.sizePolicy().hasHeightForWidth()) self.database_combo.setSizePolicy(sizePolicy) self.database_combo.setObjectName("database_combo") self.verticalLayout.addWidget(self.groupBox_2) self.groupBox = QGroupBox(self) self.verticalLayoutBox = QVBoxLayout(self.groupBox) self.check_all_rasters = QCheckBox(self.groupBox) self.check_all_rasters.setChecked(True) self.check_all_rasters.setDisabled(True) self.verticalLayoutBox.addWidget(self.check_all_rasters) # TODO: write improve function first # self.improve_when_necessary = QCheckBox(self.groupBox) # self.improve_when_necessary.setChecked(False) # self.improve_when_necessary.setDisabled(True) # self.verticalLayoutBox.addWidget(self.improve_when_necessary) self.verticalLayout.addWidget(self.groupBox) self.buttonBox = QDialogButtonBox(self) self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi() self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) QMetaObject.connectSlotsByName(self)
def paintEvent(self, ev): sz = self.size() l = 0.5 * min(sz.width(), sz.height()) painter = QPainter(self) painter.setPen(Qt.NoPen) painter.setRenderHint(QPainter.Antialiasing, True) for i in range(0, self.ticks): painter.save() painter.translate(0.5 * sz.width(), 0.5 * sz.height()) painter.rotate((360. * i) / self.ticks) painter.translate(0.4 * l, 0) k = float(self.ticks + (i - self.counter)) % self.ticks / self.ticks painter.setBrush(QColor(0, 0, 0, 255 * (0.9 * k + 0.1))) painter.drawRoundedRect(QRect(0, -0.1 * l, 0.6 * l, 0.2 * l), 0.15 * l, 0.1 * l) painter.restore()
def _get_composer_svg_image(self, width, height, dpi): # from qgscomposer.cpp, QgsComposer::on_mActionExportAsSVG_triggered, # near end of function svgpath = getTempfilePath('svg') temp_size = os.path.getsize(svgpath) svg_g = QSvgGenerator() # noinspection PyArgumentList svg_g.setTitle(QgsProject.instance().title()) svg_g.setFileName(svgpath) svg_g.setSize(QSize(width, height)) svg_g.setViewBox(QRect(0, 0, width, height)) svg_g.setResolution(dpi) sp = QPainter(svg_g) self._c.renderPage(sp, 0) sp.end() if temp_size == os.path.getsize(svgpath): return False, '' image = QImage(width, height, self._TestMapSettings.outputImageFormat()) image.fill(QColor(152, 219, 249).rgb()) image.setDotsPerMeterX(dpi / 25.4 * 1000) image.setDotsPerMeterY(dpi / 25.4 * 1000) svgr = QSvgRenderer(svgpath) p = QPainter(image) p.setRenderHint( QPainter.Antialiasing, self._TestMapSettings.testFlag(QgsMapSettings.Antialiasing)) p.setRenderHint(QPainter.TextAntialiasing) svgr.render(p) p.end() filepath = getTempfilePath('png') res = image.save(filepath, 'png') if not res: os.unlink(filepath) filepath = '' # TODO: remove .svg file as well? return res, filepath
def genIcon(self): TECName = self.profile['TECName'] svgName = os.path.join(os.path.dirname(__file__), TECName + '_' + self.name + '.svg') pix = QSvgGenerator() pix.setFileName(svgName) pix.setSize(QSize(200, 100)) painter = QPainter() painter.begin(pix) painter.setPen(Qt.NoPen) # Paint the background before draw the legend line.(Essential!!) painter.fillRect(QRect(0, 0, 200, 100), Qt.white) painter.setPen(QPen(self.color, self.width * 3, self.lineStyle)) # Draw icon painter.drawLine(QLine(0, 50, 200, 50)) painter.end() pixmap = QPixmap(svgName) icon = QIcon(pixmap) self.icoName = svgName self.setIcon(icon)
def image(self): width = (self.xmax - self.xmin + 1) * self.TILE_SIZE height = (self.ymax - self.ymin + 1) * self.TILE_SIZE image = QImage(width, height, QImage.Format_ARGB32_Premultiplied) image.fill(Qt.transparent) p = QPainter(image) for tile in self.tiles.values(): if not tile.data: continue x = tile.x - self.xmin y = tile.y - self.ymin rect = QRect(x * self.TILE_SIZE, y * self.TILE_SIZE, self.TILE_SIZE, self.TILE_SIZE) timg = QImage() res = timg.loadFromData(tile.data) if res: p.drawImage(rect, timg) if debug_mode: p.setPen(Qt.black) p.drawText( rect, Qt.AlignBottom | Qt.AlignRight, # "x: %s, y:%s\nz: %s, data: %s" % (x, y, tile.zoom, tile.data.size()) "z: %s, data: %s" % (tile.zoom, tile.data.size())) if not res: p.setPen(Qt.darkRed) p.drawText(rect, Qt.AlignCenter, "Bad tile") p.setPen(Qt.black) p.drawRect(rect) return image
def cvt_vtr(self): QSWATMOD_path_dict = self.dirs_and_paths() selectedVector = self.dlg.comboBox_vector_lyrs.currentText() layer = QgsProject.instance().mapLayersByName(str(selectedVector))[0] # Find .dis file and read number of rows, cols, x spacing, and y spacing (not allowed to change) for filename in glob.glob(str(QSWATMOD_path_dict['SMfolder']) + "/*.dis"): with open(filename, "r") as f: data = [] for line in f.readlines(): if not line.startswith("#"): data.append(line.replace('\n', '').split()) nrow = int(data[0][1]) ncol = int(data[0][2]) delr = float(data[2][1]) # is the cell width along rows (y spacing) delc = float( data[3][1]) # is the cell width along columns (x spacing). # get extent ext = layer.extent() xmin = ext.xMinimum() xmax = ext.xMaximum() ymin = ext.yMinimum() ymax = ext.yMaximum() extent = "{a},{b},{c},{d}".format(a=xmin, b=xmax, c=ymin, d=ymax) fdnames = [ field.name() for field in layer.dataProvider().fields() if not (field.name() == 'fid' or field.name() == 'id' or field.name() == 'xmin' or field.name() == 'xmax' or field.name() == 'ymin' or field.name() == 'ymax' or field.name() == 'grid_id' or field.name() == 'row' or field.name() == 'col' or field.name() == 'elev_mf') ] # Create swatmf_results tree inside root = QgsProject.instance().layerTreeRoot() if root.findGroup("swatmf_results"): swatmf_results = root.findGroup("swatmf_results") else: swatmf_results = root.insertGroup(0, "swatmf_results") if root.findGroup(selectedVector): rastergroup = root.findGroup(selectedVector) else: rastergroup = swatmf_results.insertGroup(0, selectedVector) per = 0 self.dlg.progressBar_cvt_vtr.setValue(0) for fdnam in fdnames: QCoreApplication.processEvents() nodata = float(self.dlg.lineEdit_nodata.text()) mincolor = self.dlg.mColorButton_min_rmap.color().name() maxcolor = self.dlg.mColorButton_max_rmap.color().name() name = fdnam name_ext = "{}.tif".format(name) output_dir = QSWATMOD_path_dict['SMshps'] # create folder for each layer output rasterpath = os.path.join(output_dir, selectedVector) if not os.path.exists(rasterpath): os.makedirs(rasterpath) output_raster = os.path.join(rasterpath, name_ext) params = { 'INPUT': layer, 'FIELD': fdnam, 'UNITS': 1, 'WIDTH': delc, 'HEIGHT': delr, 'EXTENT': extent, 'NODATA': nodata, 'DATA_TYPE': 5, #Float32 'OUTPUT': output_raster } processing.run("gdal:rasterize", params) rasterlayer = QgsRasterLayer(output_raster, '{0} ({1})'.format(fdnam, selectedVector)) QgsProject.instance().addMapLayer(rasterlayer, False) rastergroup.insertChildNode(0, QgsLayerTreeLayer(rasterlayer)) stats = rasterlayer.dataProvider().bandStatistics( 1, QgsRasterBandStats.All) rmin = stats.minimumValue rmax = stats.maximumValue fnc = QgsColorRampShader() lst = [ QgsColorRampShader.ColorRampItem(rmin, QColor(mincolor)), QgsColorRampShader.ColorRampItem(rmax, QColor(maxcolor)) ] fnc.setColorRampItemList(lst) fnc.setColorRampType(QgsColorRampShader.Interpolated) shader = QgsRasterShader() shader.setRasterShaderFunction(fnc) renderer = QgsSingleBandPseudoColorRenderer(rasterlayer.dataProvider(), 1, shader) rasterlayer.setRenderer(renderer) rasterlayer.triggerRepaint() # create image img = QImage(QSize(800, 800), QImage.Format_ARGB32_Premultiplied) # set background color # bcolor = QColor(255, 255, 255, 255) bcolor = QColor(255, 255, 255, 0) img.fill(bcolor.rgba()) # create painter p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing) # create map settings ms = QgsMapSettings() ms.setBackgroundColor(bcolor) # set layers to render flayer = QgsProject.instance().mapLayersByName(rasterlayer.name()) ms.setLayers([flayer[0]]) # set extent rect = QgsRectangle(ms.fullExtent()) rect.scale(1.1) ms.setExtent(rect) # set ouptut size ms.setOutputSize(img.size()) # setup qgis map renderer render = QgsMapRendererCustomPainterJob(ms, p) render.start() render.waitForFinished() # get timestamp p.drawImage(QPoint(), img) pen = QPen(Qt.red) pen.setWidth(2) p.setPen(pen) font = QFont() font.setFamily('Times') # font.setBold(True) font.setPointSize(18) p.setFont(font) # p.setBackground(QColor('sea green')) doesn't work p.drawText(QRect(0, 0, 800, 800), Qt.AlignRight | Qt.AlignBottom, fdnam) p.end() # save the image img.save(os.path.join(rasterpath, '{:03d}_{}.jpg'.format(per, fdnam))) # Update progress bar per += 1 progress = round((per / len(fdnames)) * 100) self.dlg.progressBar_cvt_vtr.setValue(progress) QCoreApplication.processEvents() self.dlg.raise_() duration = self.dlg.doubleSpinBox_ani_r_time.value() # filepaths fp_in = os.path.join(rasterpath, '*.jpg') fp_out = os.path.join(rasterpath, '{}.gif'.format(selectedVector)) # https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#gif fimg, *fimgs = [Image.open(f) for f in sorted(glob.glob(fp_in))] fimg.save(fp=fp_out, format='GIF', append_images=fimgs, save_all=True, duration=duration * 1000, loop=0, transparency=0) msgBox = QMessageBox() msgBox.setWindowIcon(QtGui.QIcon(':/QSWATMOD2/pics/sm_icon.png')) msgBox.setWindowTitle("Coverted!") msgBox.setText( "Fields from {} were converted successfully!".format(selectedVector)) msgBox.exec_() questionBox = QMessageBox() questionBox.setWindowIcon(QtGui.QIcon(':/QSWATMOD2/pics/sm_icon.png')) reply = QMessageBox.question(questionBox, 'Open?', 'Do you want to open the animated gif file?', QMessageBox.Yes, QMessageBox.No) if reply == QMessageBox.Yes: os.startfile(os.path.join(rasterpath, '{}.gif'.format(selectedVector)))