rscder-pub/rscder/gui/layercombox.py
2023-02-10 21:51:03 +08:00

199 lines
6.6 KiB
Python

from PyQt5.QtWidgets import QComboBox, QWidget, QLabel, QHBoxLayout, QVBoxLayout
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
from rscder.utils.icons import IconInstance
from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer,SingleBandRasterLayer
class LayerCombox(QComboBox):
def __init__(self, parent=None):
super().__init__(parent)
self.addItem('---', None)
self.setMinimumWidth(200)
for layer in Project().layers.values():
self.addItem(IconInstance().LAYER, layer.name, layer.id)
self.currentIndexChanged.connect(self.on_changed)
self.current_layer = None
def on_changed(self, index):
if index == 0:
self.current_layer = None
else:
self.current_layer = Project().layers[self.itemData(index)]
class PairLayerCombox(QWidget):
def __init__(self, parent=None) -> None:
super().__init__(parent)
self.layer1 = None
self.layer2 = None
self.initUI()
def initUI(self):
self.layer_combox = LayerCombox(self)
layer_label = QLabel('图层组:')
hbox = QHBoxLayout()
hbox.setAlignment(Qt.AlignLeft)
hbox.addWidget(layer_label)
hbox.addWidget(self.layer_combox, 2)
self.raster_layer1 = QComboBox(self)
self.raster_layer1.addItem('---', None)
self.raster_layer2 = QComboBox(self)
self.raster_layer2.addItem('---', None)
self.raster_layer1.currentIndexChanged.connect(self.on_raster_layer1_changed)
self.raster_layer2.currentIndexChanged.connect(self.on_raster_layer2_changed)
self.layer_combox.currentIndexChanged.connect(self.on_group_changed)
hbox1 = QHBoxLayout()
hbox1.setAlignment(Qt.AlignLeft)
hbox1.addWidget(QLabel('时相1:'))
hbox1.addWidget(self.raster_layer1, 2)
hbox2 = QHBoxLayout()
hbox2.setAlignment(Qt.AlignLeft)
hbox2.addWidget(QLabel('时相2:'))
hbox2.addWidget(self.raster_layer2, 2)
vbox = QVBoxLayout()
vbox.addLayout(hbox)
vbox.addLayout(hbox1)
vbox.addLayout(hbox2)
self.setLayout(vbox)
def on_raster_layer1_changed(self, index):
if index == 0:
self.layer1 = None
else:
self.layer1 = self.raster_layer1.itemData(index)
def on_raster_layer2_changed(self, index):
if index == 0:
self.layer2 = None
else:
self.layer2 = self.raster_layer2.itemData(index)
def on_group_changed(self, index):
if index == 0:
self.raster_layer1.clear()
self.raster_layer2.clear()
self.raster_layer1.addItem('---', None)
self.raster_layer2.addItem('---', None)
else:
self.raster_layer1.clear()
self.raster_layer2.clear()
self.raster_layer1.addItem('---', None)
self.raster_layer2.addItem('---', None)
for sub in self.layer_combox.current_layer.layers:
if issubclass(sub.__class__, RasterLayer):
self.raster_layer1.addItem(IconInstance().RASTER, sub.name, sub)
self.raster_layer2.addItem(IconInstance().RASTER, sub.name, sub)
class RasterLayerCombox(QComboBox):
def __init__(self, parent=None, layer:PairLayer=None):
super().__init__(parent)
self.addItem('---', None)
if layer is not None:
for sub in layer.layers:
if issubclass(sub.__class__, RasterLayer):
self.addItem(IconInstance().RASTER, sub.name, sub)
else:
for layer in Project().layers.values():
for sub in layer.layers:
if issubclass(sub.__class__, RasterLayer):
self.addItem(IconInstance().RASTER, sub.name, sub)
self.currentIndexChanged.connect(self.on_changed)
self.current_layer = None
def on_changed(self, index):
if index == 0:
self.current_layer = None
else:
self.current_layer = self.itemData(index)
class ResultPointLayerCombox(QComboBox):
def __init__(self, parent=None):
super().__init__(parent)
self.addItem('---', None)
for layer in Project().layers.values():
for sub in layer.layers:
if isinstance(sub, ResultPointLayer):
self.addItem(IconInstance().VECTOR, sub.name, sub)
self.currentIndexChanged.connect(self.on_changed)
self.current_layer = None
def on_changed(self, index):
if index == 0:
self.current_layer = None
else:
self.current_layer = self.itemData(index)
class ResultLayercombox(QWidget):
def __init__(self, parent=None) -> None:
super().__init__(parent)
self.current_layer = None
self.initUI()
def initUI(self):
self.layer_combox = LayerCombox(self)
layer_label = QLabel('图层组:')
hbox = QHBoxLayout()
hbox.addWidget(layer_label)
hbox.addWidget(self.layer_combox)
self.raster_layer1 = QComboBox(self)
self.raster_layer1.addItem('---', None)
self.raster_layer1.currentIndexChanged.connect(self.on_raster_layer1_changed)
self.layer_combox.currentIndexChanged.connect(self.on_group_changed)
hbox1 = QHBoxLayout()
hbox1.addWidget(QLabel('二值化结果:'))
hbox1.addWidget(self.raster_layer1)
vbox = QVBoxLayout()
vbox.addLayout(hbox)
vbox.addLayout(hbox1)
self.setLayout(vbox)
def on_raster_layer1_changed(self, index):
if index == 0:
self.current_layer = None
else:
self.current_layer = self.raster_layer1.itemData(index)
def on_group_changed(self, index):
if index == 0:
self.raster_layer1.clear()
self.raster_layer1.addItem('---', None)
else:
self.raster_layer1.clear()
self.raster_layer1.addItem('---', None)
for l in self.layer_combox.current_layer.layers:
if isinstance(l,ResultPointLayer):
for k,v in l.result_path.items():
self.raster_layer1.addItem(IconInstance().RASTER,k,SingleBandRasterLayer(path = v, style_info={}))