from PyQt5.
QtWidgets import QApplication, QColorDialog, QDialog, QVBoxLayout,
QPushButton, QHBoxLayout, QScrollArea, QWidget, QLabel
from qgis.core import QgsProject, QgsFeatureRequest, QgsGeometry, QgsPointXY,
QgsFeature, QgsVectorLayer, QgsField, QgsWkbTypes
from qgis.gui import QgsMapCanvas
def select_features_by_colors(layer, colors):
renderer = layer.renderer()
renderer_type = renderer.type()
if renderer_type not in ['singleSymbol', 'categorizedSymbol',
'graduatedSymbol']:
return
matching_values = []
if renderer_type == 'singleSymbol':
symbol = renderer.symbol()
if symbol.color().name() in colors:
layer.selectAll()
return
if renderer_type == 'categorizedSymbol':
categories = renderer.categories()
matching_values = [cat.value() for cat in categories if
cat.symbol().color().name() in colors]
if renderer_type == 'graduatedSymbol':
ranges = renderer.ranges()
matching_values = [r.lowerValue() for r in ranges if
r.symbol().color().name() in colors]
if not matching_values:
return
expression = f'"{renderer.classAttribute()}" IN ({", ".join(map(str,
matching_values))})'
request = QgsFeatureRequest().setFilterExpression(expression)
layer.select(request)
def apply_color_filter(colors):
layers = QgsProject.instance().mapLayers().values()
for layer in layers:
select_features_by_colors(layer, colors)
def create_temporary_layer(layer_type):
layer_name = f'Temp_{layer_type}'
layer = QgsVectorLayer(f'{layer_type}?crs=EPSG:4326', layer_name, 'memory')
provider = layer.dataProvider()
provider.addAttributes([QgsField('id', QVariant.Int)])
layer.updateFields()
QgsProject.instance().addMapLayer(layer)
return layer
def export_selected_features():
layers = QgsProject.instance().mapLayers().values()
selected_features = []
for layer in layers:
if not layer.selectedFeatureCount():
continue
for feature in layer.selectedFeatures():
selected_features.append(feature)
if not selected_features:
return
point_layer = None
line_layer = None
polygon_layer = None
for feature in selected_features:
geometry = feature.geometry()
if geometry.type() == QgsWkbTypes.PointGeometry:
if not point_layer:
point_layer = create_temporary_layer('Point')
point = QgsFeature(point_layer.fields())
point.setGeometry(geometry)
point.setAttributes([feature.id()])
point_layer.addFeature(point)
elif geometry.type() == QgsWkbTypes.LineGeometry:
if not line_layer:
line_layer = create_temporary_layer('LineString')
line = QgsFeature(line_layer.fields())
line.setGeometry(geometry)
line.setAttributes([feature.id()])
line_layer.addFeature(line)
elif geometry.type() == QgsWkbTypes.PolygonGeometry:
if not polygon_layer:
polygon_layer = create_temporary_layer('Polygon')
polygon = QgsFeature(polygon_layer.fields())
polygon.setGeometry(geometry)
polygon.setAttributes([feature.id()])
polygon_layer.addFeature(polygon)
if point_layer:
QgsProject.instance().addMapLayer(point_layer)
if line_layer:
QgsProject.instance().addMapLayer(line_layer)
if polygon_layer:
QgsProject.instance().addMapLayer(polygon_layer)
def show_color_dialog():
app = QApplication.instance()
if not app:
app = QApplication([])
dialog = QDialog()
dialog.setWindowTitle('Selecione as cores do filtro')
layout = QVBoxLayout()
scroll_area = QScrollArea()
scroll_widget = QWidget()
scroll_layout = QHBoxLayout()
scroll_widget.setLayout(scroll_layout)
scroll_area.setWidget(scroll_widget)
scroll_area.setWidgetResizable(True)
layout.addWidget(scroll_area)
add_color_button = QPushButton('Adicionar cor')
layout.addWidget(add_color_button)
apply_button = QPushButton('Aplicar filtro')
layout.addWidget(apply_button)
export_button = QPushButton('Exportar feições selecionadas')
layout.addWidget(export_button)
dialog.setLayout(layout)
colors = []
def create_color_button(color):
color_button = QPushButton()
color_button.color = color
color_button.setFixedSize(64, 64)
color_button.setCheckable(True)
color_button.clicked.connect(lambda: toggle_color(color_button))
color_button_layout = QVBoxLayout()
color_button_layout.setContentsMargins(0, 0, 0, 0)
color_top_widget = QWidget()
color_top_widget.setStyleSheet(f'background-color: {color};')
color_button_layout.addWidget(color_top_widget)
color_bottom_label = QLabel(color)
color_bottom_label.setAlignment(Qt.AlignCenter)
color_button_layout.addWidget(color_bottom_label)
color_button.setLayout(color_button_layout)
scroll_layout.addWidget(color_button)
def toggle_color(color_button):
if color_button.color in colors:
colors.remove(color_button.color)
else:
colors.append(color_button.color)
color_button.setStyleSheet(f'background-color: {color_button.color if
color_button.color in colors else "none"};')
def add_color():
color_dialog = QColorDialog()
if color_dialog.exec_():
color = color_dialog.selectedColor().name()
create_color_button(color)
def apply_filter():
apply_color_filter(colors)
def export_features():
export_selected_features()
add_color_button.clicked.connect(add_color)
apply_button.clicked.connect(apply_filter)
export_button.clicked.connect(export_features)
dialog.exec_()
# Exemplo de uso:
show_color_dialog()