Tengo un complemento (imagen_1) que funciona perfectamente. Pero me da error al querer hacer un cambio.
Añado el código de mis dos .py
archivos.
Quiero cambiar esta dirección: "C:/Users/SENARA/AppData/Roaming/QGIS/QGIS3/profiles/default/python/plugins/RiegoSenara/LogoSenara.png"
y usa esto:
os.path.join(os.path.dirname(__file__),"LogoSenara.png")
Ce site funciona en el complemento.py
DialogBase, DialogType = uic.loadUiType(os.path.join(os.path.dirname(__file__),
u'DialogoEjemplo1.ui'))
Pero no funciona en qgis_minimal_plugin.py
self.action = QAction(QIcon(os.path.join(os.path.dirname(__file__), u"LogoSenara.png"),
QCoreApplication.translate('RiegoSenara', 'RiegoSenara'),
self.iface.mainWindow())
Imagen_2
Esto me da el siguiente error: NameError: name __file__ is not defined
. Otras veces no funciona en absoluto.
Imagen_3
COMPLEMENTO DE CÓDIGO DE CARPETA
from PyQt5 import uic
from PyQt5.QtGui import *
import os
from qgis.core import QgsVectorLayer
from qgis.core import *
from qgis.utils import *
from PyQt5.QtWidgets import *
from pathlib import Path, PureWindowsPath
#DialogBase, DialogType =
uic.loadUiType(os.path.join(os.path.dirname(__file__),
u'DialogoEjemplo1.ui'), resource_suffix='')
DialogBase, DialogType =
uic.loadUiType(os.path.join(os.path.dirname(__file__),
u'DialogoEjemplo1.ui'))
class GeometryOperationDialog(DialogType, DialogBase):
def __init__(self,parent=None):
super().__init__(parent)
self.setupUi(self)
self.Buscar.clicked.connect(self.loadLayers)
self.Buscar1.clicked.connect(self.cargarnodos)
# self.loadLayers()
# self.cargarnodos()
def loadLayers(self):
#Cargando el archivo con rutas de hojas cartográficas y archivos de texto del proyecto
global Nuevaruta
global Rutanueva
self.file_path = QFileDialog.getOpenFileName(self, 'Cargar Lineas', './', filter="All Files(*.*);;Text Files(*.txt)")
if self.file_path[0]:
self.file_name = (self.file_path[0].split('/'))[-1]
Narchivo=len(self.file_name)
self.setWindowTitle("{} - Notepad".format(self.file_name))
file_open = open(self.file_path[0], 'r+')
Nuevaruta = Path(self.file_path[0])
Cadena1=len(str(Nuevaruta))
Nuevaruta2=str(Nuevaruta)
fincadena=int(Cadena1-Narchivo-1)
Rutanueva=Nuevaruta2 [0:fincadena]
# Cargando un archivo txt wkt(000 000, 000 000),separado por tabulaciones con datos de lineas
fn4=str(Nuevaruta)+str("?encoding=UTF-8&delimiter=\\t&wktField=wkt_geom&useheader=no&crs=epsg:5367&decimal=.")
layer1 = QgsVectorLayer("file:///"+fn4,"Conduccion","delimitedtext")
# Compruebe si la capa es válida
if not layer1 . isValid ():
print ( "Capa TXT NO cargada" )
fn5=Rutanueva
fn5=fn5.rstrip()
fn5=fn5+"\Tuberiasdr.shp"
fn5=fn5.rstrip()
QgsVectorFileWriter.writeAsVectorFormat(layer1, fn5, 'UTF-8', layer1.crs(), 'ESRI Shapefile')
#Conviertiendo archivo lineas temporal en Shape para diametros
fn9=Rutanueva
fn9=fn9.rstrip()
fn9=fn9+"\Tuberiadiam.shp"
fn9=fn9.rstrip()
QgsVectorFileWriter.writeAsVectorFormat(layer1, fn9, 'UTF-8', layer1.crs(), 'ESRI Shapefile')
#Cargando Shape Lineas sdr
fn6=Rutanueva
fn6=fn6.rstrip()
fn6=fn6+"\Tuberiasdr.shp"
fn6=fn6.rstrip()
layer4 = QgsVectorLayer(fn6, 'TuberiaSDR', 'ogr')
QgsProject.instance().addMapLayer(layer4)#Lo añado al mapa de capas
#Cargando Shape Lineas diametro
fn10=Rutanueva
fn10=fn10.rstrip()
fn10=fn10+"\Tuberiadiam.shp"
fn10=fn10.rstrip()
layer7 = QgsVectorLayer(fn10, 'TuberiaDiam', 'ogr')
QgsProject.instance().addMapLayer(layer7)#Lo añado al mapa de capas
QgsProject.instance().layerTreeRoot().findLayer(layer7.id()).setItemVisibilityChecked(False)#Quita el check de la capa para que no se muestre
QgsProject.instance().layerTreeRoot().findLayer(layer7.id()).setExpanded(False)
#CATEGORIZADO SDR
#Esta funcion detecta el tipo de geometria
def validatedDefaultSymbol(geometryType):
symbol = QgsSymbol.defaultSymbol(geometryType)
if symbol is None:
if geometryType == Qgis.Point:#== operador booleano true o false
symbol = QgsMarkerSymbol()
elif geometryType == Qgis.Line:
symbol = QgsLineSymbol()
elif geometryType == Qgis.Polygon:
symbol = QgsFillSymbol()
return symbol
def makeSymbologyForRange(layer, min, max, title, color):#Funcion asigna color y ancho
symbol = validatedDefaultSymbol(layer4.geometryType())
symbol.setColor(color)
symbol.setWidth(0.5)
range = QgsRendererRange(min, max, symbol, title)#asigna min max tipo geometria y texto de titulo
return range
def applySymbologyFixedDivisions(layer, field):#Funcion crea rango categorizado
rangeList = []#Crea un rango
rangeList.append( makeSymbologyForRange(layer4, 14, 14, 'DR14', #Asigna valores a la lista del rango
QColor("Green") ) )
rangeList.append( makeSymbologyForRange(layer4, 17, 17, 'SDR17', #Asigna valores a la lista del rango
QColor("Red") ) )
rangeList.append( makeSymbologyForRange(layer4, 26, 26, 'SDR26',
QColor("Blue") ) )
rangeList.append( makeSymbologyForRange(layer4, 32.5, 32.5, 'SDR32.5',
QColor("Yellow") ) )
rangeList.append( makeSymbologyForRange(layer4, 41, 41, 'SDR41',
QColor("Black") ) )
renderer = QgsGraduatedSymbolRenderer(field, rangeList)#Asigna parametros y titulo de columna con los valores
renderer.setMode(QgsGraduatedSymbolRenderer.Custom)#setmode Obsoleto QGIS 3.10 use classficationMethod en su lugar
layer4.setRenderer(renderer)
if layer4.isValid():
applySymbologyFixedDivisions(layer4, "SDR")
QgsProject.instance().addMapLayer(layer4)
#CATEGORIZADO DIAMETRO
#Esta funcion detecta el tipo de geometria
def validatedDefaultSymbol(geometryType):
symbol = QgsSymbol.defaultSymbol(geometryType)
if symbol is None:
if geometryType == Qgis.Point:#== operador booleano true o false
symbol = QgsMarkerSymbol()
elif geometryType == Qgis.Line:
symbol = QgsLineSymbol()
elif geometryType == Qgis.Polygon:
symbol = QgsFillSymbol()
return symbol
def makeSymbologyForRange(layer, min, max, title, color):#Funcion asigna color y ancho
symbol = validatedDefaultSymbol(layer7.geometryType())
symbol.setColor(color)
symbol.setWidth(0.5)
range = QgsRendererRange(min, max, symbol, title)#asigna min max tipo geometria y texto de titulo
return range
def applySymbologyFixedDivisions(layer, field):#Funcion crea rango categorizado
rangeList = []#Crea un rango
rangeList.append( makeSymbologyForRange(layer7, 0, 57, '2"', #Asigna valores a la lista del rango
QColor("Black") ) )
rangeList.append( makeSymbologyForRange(layer7, 57, 70, '2.5"', #Asigna valores a la lista del rango
QColor("darkMagenta") ) )
rangeList.append( makeSymbologyForRange(layer7, 70, 85, '3"',
QColor("Yellow") ) )
rangeList.append( makeSymbologyForRange(layer7, 85, 109, '4"',
QColor("Green") ) )
rangeList.append( makeSymbologyForRange(layer7, 109, 160, '6"',
QColor("Blue") ) )
rangeList.append( makeSymbologyForRange(layer7, 160, 208, '8"',
QColor("Red") ) )
rangeList.append( makeSymbologyForRange(layer7, 208, 260, '10"',
QColor("Cyan") ) )
rangeList.append( makeSymbologyForRange(layer7, 260, 308, '12"',
QColor("Magenta") ) )
renderer = QgsGraduatedSymbolRenderer(field, rangeList)#Asigna parametros y titulo de columna con los valores
renderer.setMode(QgsGraduatedSymbolRenderer.Custom)#setmode Obsoleto QGIS 3.10 use classficationMethod en su lugar
layer7.setRenderer(renderer)
if layer7.isValid():
applySymbologyFixedDivisions(layer7, "diametro")
QgsProject.instance().addMapLayer(layer7)
#Agregando Etiquetas a la Tubería diametro
for layer in QgsProject.instance().mapLayers().values():
layer_settings = QgsPalLayerSettings()
text_format = QgsTextFormat()
text_format.setFont(QFont("Arial", 8))
text_format.setSize(8)
text_format.setColor(QColor('Black'))
buffer_settings = QgsTextBufferSettings()
buffer_settings.setEnabled(True)
buffer_settings.setSize(0.10)
buffer_settings.setColor(QColor('black'))
text_format.setBuffer(buffer_settings)
layer_settings.setFormat(text_format)
layer_settings.fieldName = "diametro"
layer_settings.placement = layer_settings.Line
layer_settings.enabled = True
layer_settings = QgsVectorLayerSimpleLabeling(layer_settings)
layer4.setLabelsEnabled(True)
layer4.setLabeling(layer_settings)
layer4.triggerRepaint()
#Agregando Etiquetas a la Tubería SDR
for layer in QgsProject.instance().mapLayers().values():
layer_settings = QgsPalLayerSettings()
text_format = QgsTextFormat()
text_format.setFont(QFont("Arial", 8))
text_format.setSize(8)
text_format.setColor(QColor('Black'))
buffer_settings = QgsTextBufferSettings()
buffer_settings.setEnabled(True)
buffer_settings.setSize(0.10)
buffer_settings.setColor(QColor('black'))
text_format.setBuffer(buffer_settings)
layer_settings.setFormat(text_format)
layer_settings.fieldName = "SDR"
layer_settings.placement = layer_settings.Line
layer_settings.enabled = True
layer_settings = QgsVectorLayerSimpleLabeling(layer_settings)
layer7.setLabelsEnabled(True)
layer7.setLabeling(layer_settings)
layer7.triggerRepaint()
def cargarnodos(self):
self.file_path = QFileDialog.getOpenFileName(self, 'Cargar Nodos', './', filter="All Files(*.*);;Text Files(*.txt)")
if self.file_path[0]:
self.file_name = (self.file_path[1].split('/'))[-1]
self.setWindowTitle("{} - Notepad".format(self.file_name))
file_open = open(self.file_path[0], 'r+')
Nuevaruta1 = Path(self.file_path[0])
#Cargando un archivo txt de Puntos
fn4=str(Nuevaruta1)+str("?encoding=UTF-8&delimiter=\\t&xField=COORDEX&yField=COORDEY&useheader=no&crs=epsg:5367&decimal=.")
layer5 = QgsVectorLayer("file:///"+fn4,"Nodos","delimitedtext")
# Compruebe si la capa es válida
if not layer5 . isValid ():
print ( "Capa Nodos NO cargada" )
#QgsProject.instance().addMapLayer(layer5)#Lo añado al mapa de capas
#Conviertiendo archivo puntos temporal en Shape
fn7=Rutanueva
fn7=fn7.rstrip()
fn7=fn7+"\Datos Puntos Qgis.shp"
fn7=fn7.rstrip()
QgsVectorFileWriter.writeAsVectorFormat(layer5, fn7, 'UTF-8', layer5.crs(), 'ESRI Shapefile')
#Cargando Shape Puntos
fn8=Rutanueva
fn8=fn8.rstrip()
fn8=fn8+"\Datos Puntos Qgis.shp"
fn8=fn8.rstrip()
layer6 = QgsVectorLayer(fn8, 'ObrasCiviles', 'ogr')
QgsProject.instance().addMapLayer(layer6)#Lo añado al mapa de capas
QgsProject.instance().layerTreeRoot().findLayer(layer6.id()).setExpanded(False)
#Cargando Shape Puntos 2
fn11=Rutanueva
fn11=fn11.rstrip()
fn11=fn11+"\Datos Puntos Qgis.shp"
fn11=fn11.rstrip()
layer11 = QgsVectorLayer(fn11, 'Nodos', 'ogr')
QgsProject.instance().addMapLayer(layer11)#Lo añado al mapa de capas
QgsProject.instance().layerTreeRoot().findLayer(layer11.id()).setItemVisibilityChecked(False)#Quita el check de la capa para que no se muestre
# Definiendo la clase forma
shape = QgsSimpleMarkerSymbolLayerBase
# Creando un diccionario prara guardad campo,color, texto y forma
land_class = {
'PT': (QColor("blue"), 'PuenteTubo', shape. Arrow,3.5),
'D': (QColor("yellow"), 'Desarenador', shape.Star,4),
'TQ': (QColor("green"), 'TQuiebragradiente', shape.Diamond,3),
'FT': (QColor("red"), 'Filtrado', shape.HalfSquare,3.5),
'VT': (QColor("red"), 'Toma', shape.CrossFill,3),
'R': (QColor("cyan"), 'Reservorio', shape.Pentagon,3.5),
}
# Crear una lista para almacenar propiedades de la simbologia
categories = []
# Iterate through the dictionary
for classes, (colour, label, shape,tamaño) in land_class.items():
# Define symbol based on layer's geometry
symbol = QgsSymbol.defaultSymbol(layer6.geometryType())
# Set shape
symbol.symbolLayer(0).setShape(shape)
# Set Size
symbol.setSize(tamaño)
# Set colour
symbol.setColor(QColor(colour))
# Set the renderer properties
category = QgsRendererCategory(classes, symbol, label, shape)
categories.append(category)
# Field name
expression = 'VALVULA'
# Set the categorized renderer
renderer = QgsCategorizedSymbolRenderer(expression, categories)
layer6.setRenderer(renderer)
# Refresh layer
layer6.triggerRepaint()
QgsProject.instance().addMapLayer(layer6)
#Agregando Etiquetas a los Puntos
for layer in QgsProject.instance().mapLayers().values():
layer_settings = QgsPalLayerSettings()
text_format = QgsTextFormat()
text_format.setFont(QFont("Arial", 10))
text_format.setSize(10)
text_format.setColor(QColor('Red'))
buffer_settings = QgsTextBufferSettings()
buffer_settings.setEnabled(True)
buffer_settings.setSize(0.05)
buffer_settings.setColor(QColor('Red'))
text_format.setBuffer(buffer_settings)
layer_settings.setFormat(text_format)
layer_settings.fieldName = """concat("PUNTO")"""
layer_settings.isExpression=True#Agregado nuevo
layer_settings.placement = 4
layer_settings.enabled = True
layer_settings = QgsVectorLayerSimpleLabeling(layer_settings)
layer6.setLabelsEnabled(True)
layer6.setLabeling(layer_settings)
layer6.triggerRepaint()
#Agregando Etiquetas a los Puntos Generales
for layer in QgsProject.instance().mapLayers().values():
layer_settings = QgsPalLayerSettings()
text_format = QgsTextFormat()
text_format.setFont(QFont("Arial", 10))
text_format.setSize(10)
text_format.setColor(QColor('Red'))
buffer_settings = QgsTextBufferSettings()
buffer_settings.setEnabled(True)
buffer_settings.setSize(0.05)
buffer_settings.setColor(QColor('Red'))
text_format.setBuffer(buffer_settings)
layer_settings.setFormat(text_format)
layer_settings.fieldName = """concat("PUNTO", ' (', "VALVULA",')')"""
layer_settings.isExpression=True#Agregado nuevo
layer_settings.placement = 4
layer_settings.enabled = True
layer_settings = QgsVectorLayerSimpleLabeling(layer_settings)
layer11.setLabelsEnabled(True)
layer11.setLabeling(layer_settings)
layer11.triggerRepaint()
CÓDIGO DE CARPETA qgis_minimal_plugin
import os
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from .Complemento import GeometryOperationDialog
#from .MapaQgis import Mapa
#from .Prueba import Mensaje
class MinimalPlugin:
def __init__(self, iface):
self.iface = iface
def initGui(self):
self.action =
QAction(QIcon("C:/Users/SENARA/AppData/Roaming/QGIS/QGIS3/profiles/
default/python/plugins/RiegoSenara/LogoSenara.png"),
QCoreApplication.translate('RiegoSenara',
'RiegoSenara'),
self.iface.mainWindow())
# print (os.path.join(os.path.dirname(__file__),"LogoSenara.png"))
# self.action =
QAction(QIcon(os.path.join(os.path.dirname(__file__),u"LogoSenara.png"),
# QCoreApplication.translate('RiegoSenara',
'RiegoSenara'),
# self.iface.mainWindow())
# self.action =
QAction(QIcon(os.path.join(os.path.dirname(__file__), "LogoSenara.png")),
# self.tr('RiegoSenara'),
# self.iface.mainWindow())
# self.action = QAction(u'RiegoSenara', self.iface.mainWindow())
self.action.triggered.connect(self.run)
self.iface.addToolBarIcon(self.action)
# def AbrirArchivo(self):
# filename=QFileDialog.getSaveFileName(self,"Selecione Hoja(s)
Cartograficas","",'*.txt')
# self.dlg.lineEdit.setText(filename)
def unload(self):
self.iface.removeToolBarIcon(self.action)
del self.action
def run(self):
# QMessageBox.information(None, u'Minimal plugin',u'Do something
useful here')
dialogo=GeometryOperationDialog()
dialogo.exec_()
# mens=Mensaje()
# MiClase=Mapa()
# MiClase.exec_()
CÓDIGO DE CARPETA __init__
from .qgis_minimal_plugin import MinimalPlugin
def classFactory(iface):
return MinimalPlugin(iface)