0% found this document useful (0 votes)
2 views4 pages

Filtro COR

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views4 pages

Filtro COR

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 4

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()

You might also like