2022-11-07 15:24:33 +08:00

231 lines
7.5 KiB
Python

from functools import partial
from threading import Thread
from plugins.misc.main import AlgFrontend
from rscder.gui.actions import ActionManager
from rscder.plugins.basic import BasicPlugin
from PyQt5.QtWidgets import QAction, QToolBar, QMenu, QDialog, QHBoxLayout, QVBoxLayout, QPushButton, QWidget, QLabel, QLineEdit, QPushButton, QComboBox, QDialogButtonBox
from rscder.gui.layercombox import PairLayerCombox
from rscder.utils.icons import IconInstance
from filter_collection import FILTER
from .scripts import VEG_CD
from thres import THRES
from misc import table_layer, AlgSelectWidget
from follow import FOLLOW
class VegtationCDMethod(QDialog):
def __init__(self, parent=None, alg: AlgFrontend = None):
super(VegtationCDMethod, self).__init__(parent)
self.alg = alg
self.setWindowTitle('植被变化检测:{}'.format(alg.get_name()))
self.setWindowIcon(IconInstance().LOGO)
self.initUI()
self.setMinimumWidth(500)
def initUI(self):
# 图层
self.layer_combox = PairLayerCombox(self)
layerbox = QHBoxLayout()
layerbox.addWidget(self.layer_combox)
self.filter_select = AlgSelectWidget(self, FILTER)
self.param_widget = self.alg.get_widget(self)
self.unsupervised_menu = self.param_widget
self.thres_select = AlgSelectWidget(self, THRES)
self.ok_button = QPushButton('确定', self)
self.ok_button.setIcon(IconInstance().OK)
self.ok_button.clicked.connect(self.accept)
self.ok_button.setDefault(True)
self.cancel_button = QPushButton('取消', self)
self.cancel_button.setIcon(IconInstance().CANCEL)
self.cancel_button.clicked.connect(self.reject)
self.cancel_button.setDefault(False)
buttonbox = QDialogButtonBox(self)
buttonbox.addButton(self.ok_button, QDialogButtonBox.NoRole)
buttonbox.addButton(self.cancel_button, QDialogButtonBox.NoRole)
buttonbox.setCenterButtons(True)
totalvlayout = QVBoxLayout()
totalvlayout.addLayout(layerbox)
totalvlayout.addWidget(self.filter_select)
if self.param_widget is not None:
totalvlayout.addWidget(self.param_widget)
totalvlayout.addWidget(self.thres_select)
totalvlayout.addStretch(1)
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(buttonbox)
totalvlayout.addLayout(hbox)
# totalvlayout.addStretch()
self.setLayout(totalvlayout)
@FOLLOW.register
class VegetationCDFollow(AlgFrontend):
@staticmethod
def get_name():
return '植被变化检测'
@staticmethod
def get_icon():
return IconInstance().VEGETATION
@staticmethod
def get_widget(parent=None):
widget = QWidget(parent)
layer_combox = PairLayerCombox(widget)
layer_combox.setObjectName('layer_combox')
filter_select = AlgSelectWidget(widget, FILTER)
filter_select.setObjectName('filter_select')
unsupervised_select = AlgSelectWidget(widget, VEG_CD)
unsupervised_select.setObjectName('unsupervised_select')
thres_select = AlgSelectWidget(widget, THRES)
thres_select.setObjectName('thres_select')
totalvlayout = QVBoxLayout()
totalvlayout.addWidget(layer_combox)
totalvlayout.addWidget(filter_select)
totalvlayout.addWidget(unsupervised_select)
totalvlayout.addWidget(thres_select)
totalvlayout.addStretch()
widget.setLayout(totalvlayout)
return widget
@staticmethod
def get_params(widget: QWidget = None):
if widget is None:
return dict()
layer_combox = widget.findChild(PairLayerCombox, 'layer_combox')
filter_select = widget.findChild(AlgSelectWidget, 'filter_select')
unsupervised_select = widget.findChild(
AlgSelectWidget, 'unsupervised_select')
thres_select = widget.findChild(AlgSelectWidget, 'thres_select')
layer1 = layer_combox.layer1
pth1 = layer_combox.layer1.path
pth2 = layer_combox.layer2.path
falg, fparams = filter_select.get_alg_and_params()
cdalg, cdparams = unsupervised_select.get_alg_and_params()
thalg, thparams = thres_select.get_alg_and_params()
if cdalg is None or thalg is None:
return dict()
return dict(
layer1=layer1,
pth1=pth1,
pth2=pth2,
falg=falg,
fparams=fparams,
cdalg=cdalg,
cdparams=cdparams,
thalg=thalg,
thparams=thparams,
)
@staticmethod
def run_alg(layer1=None,
pth1=None,
pth2=None,
falg=None,
fparams=None,
cdalg=None,
cdparams=None,
thalg=None,
thparams=None,
send_message=None):
if cdalg is None or thalg is None:
return
name = layer1.name
if falg is not None:
pth1 = falg.run_alg(
pth1, name=name, send_message=send_message, **fparams)
pth2 = falg.run_alg(
pth2, name=name, send_message=send_message, **fparams)
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,
send_message=send_message, **cdparams)
thpth = thalg.run_alg(
cdpth, name=name, send_message=send_message, **thparams)
table_layer(thpth, layer1, name, send_message)
class VegtationPlugin(BasicPlugin):
@staticmethod
def info():
return {
'name': 'VegtationPlugin',
'description': 'VegtationPlugin',
'author': 'RSCDER',
'version': '1.0.0',
}
def set_action(self):
veg_menu = ActionManager().veg_menu
# veg_menu.setIcon(IconInstance().UNSUPERVISED)
# ActionManager().veg_menu.addMenu(veg_menu)
for key in VEG_CD.keys():
alg: AlgFrontend = VEG_CD[key]
if alg.get_name() is None:
name = key
else:
name = alg.get_name()
action = QAction(name, veg_menu)
func = partial(self.run_cd, alg)
action.triggered.connect(func)
veg_menu.addAction(action)
def run_cd(self, alg):
dialog = VegtationCDMethod(self.mainwindow, alg)
dialog.show()
if dialog.exec_() == QDialog.Accepted:
t = Thread(target=self.run_cd_alg, args=(dialog,))
t.start()
def run_cd_alg(self, w: VegtationCDMethod):
layer1 = w.layer_combox.layer1
pth1 = w.layer_combox.layer1.path
pth2 = w.layer_combox.layer2.path
name = layer1.layer_parent.name
falg, fparams = w.filter_select.get_alg_and_params()
cdalg = w.alg
cdparams = w.alg.get_params()
thalg, thparams = w.thres_select.get_alg_and_params()
if cdalg is None or thalg is None:
return
if falg is not None:
pth1 = falg.run_alg(
pth1, name=name, send_message=self.send_message, **fparams)
pth2 = falg.run_alg(
pth2, name=name, send_message=self.send_message, **fparams)
cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,
send_message=self.send_message, **cdparams)
thpth = thalg.run_alg(
cdpth, name=name, send_message=self.send_message, **thparams)
table_layer(thpth, layer1, name, self.send_message)