rscder-pub/rscder/gui/actions.py
2022-05-05 20:08:52 +08:00

397 lines
17 KiB
Python

import logging
import os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QAction, QActionGroup, QLabel, QFileDialog
from rscder.gui.project import Create
from rscder.utils.project import Project
from rscder.gui.plugins import PluginDialog
class ActionManager(QtCore.QObject):
def __init__(self,
double_map,
layer_tree,
follow_box,
result_box,
message_box,
parent=None):
super().__init__(parent)
self.w_parent = parent
self.actions = {}
self.action_groups = {}
self.action_group_actions = {}
self.double_map = double_map
self.layer_tree = layer_tree
self.follow_box = follow_box
self.result_box = result_box
self.message_box = message_box
self.allways_enable = []
self.init_enable = []
self.dataload_enable = []
self.toolbar = None
self.menubar = None
self.status_bar = None
def set_menus(self, menubar):
self.menubar = menubar
self.file_menu = menubar.addMenu('&文件')
self.basic_menu = menubar.addMenu('&基本工具')
self.change_detection_menu = menubar.addMenu('&通用变化检测')
self.special_chagne_detec_menu = menubar.addMenu('&专题变化检测')
self.seg_chagne_detec_menu = menubar.addMenu('&分类后变化检测')
self.postop_menu = menubar.addMenu('&检测后处理')
self.view_menu = menubar.addMenu('&视图')
self.plugin_menu = menubar.addMenu('&插件')
self.help_menu = menubar.addMenu('&帮助')
@property
def menus(self):
return {
'file_menu': self.file_menu,
'basic_menu': self.basic_menu,
'change_detection_menu': self.change_detection_menu,
'special_chagne_detec_menu': self.special_chagne_detec_menu,
'seg_chagne_detec_menu': self.seg_chagne_detec_menu,
'postop_menu': self.postop_menu,
'view_menu': self.view_menu,
'plugin_menu': self.plugin_menu,
'help_menu': self.help_menu,
'menu_bar': self.menubar
}
def set_toolbar(self, toolbar):
self.toolbar = toolbar
self.toolbar.setIconSize(QtCore.QSize(24, 24))
def set_status_bar(self, status_bar):
self.status_bar = status_bar
def set_actions(self):
'''
File menu
'''
project_create = self.add_action(QAction('&工程创建', self.w_parent), 'File')
project_open = self.add_action(QAction('&打开工程', self.w_parent), 'File')
project_save = self.add_action(QAction('&保存工程', self.w_parent), 'File')
data_load = self.add_action(QAction('&数据加载', self.w_parent), 'File')
view_setting = self.add_action(QAction('&界面定制', self.w_parent), 'File')
exit_app = self.add_action(QAction('&退出', self.w_parent), 'File')
project_create.triggered.connect(self.project_create)
project_open.triggered.connect(self.project_open)
project_save.triggered.connect(self.project_save)
data_load.triggered.connect(self.data_load)
view_setting.triggered.connect(self.view_setting)
exit_app.triggered.connect(self.w_parent.close)
self.allways_enable.extend([project_create, project_open, exit_app, view_setting])
self.init_enable.extend([project_save, data_load])
self.file_menu.addAction(project_create)
self.file_menu.addAction(project_open)
self.file_menu.addAction(project_save)
self.file_menu.addAction(data_load)
self.file_menu.addAction(view_setting)
self.file_menu.addAction(exit_app)
if self.toolbar is not None:
self.toolbar.addAction(project_create)
self.toolbar.addAction(project_open)
self.toolbar.addAction(project_save)
'''
Basic menu
'''
grid_line = self.add_action(QAction('&网格线', self.w_parent), 'Basic Line')
grid_line.setCheckable(True)
grid_line.setChecked(True)
zomm_in = self.add_action(QAction('&放大', self.w_parent), 'Basic')
zomm_out = self.add_action(QAction('&缩小', self.w_parent), 'Basic')
pan = self.add_action(QAction('&漫游', self.w_parent), 'Basic')
locate = self.add_action(QAction('&定位', self.w_parent), 'Basic')
pan.setCheckable(True)
pan.setChecked(True)
zomm_out.setCheckable(True)
zomm_out.setChecked(False)
zomm_in.setCheckable(True)
zomm_in.setChecked(False)
self.double_map.connect_map_tool(pan, zomm_in, zomm_out)
self.double_map.connect_grid_show(grid_line)
self.view_menu.addAction(grid_line)
self.view_menu.addSeparator()
self.view_menu.addAction(pan)
self.view_menu.addAction(zomm_in)
self.view_menu.addAction(zomm_out)
self.view_menu.addAction(locate)
'''
Plugin menu
'''
plugin_list = self.add_action(QAction('&插件列表', self.w_parent), 'Plugin')
plugin_list.triggered.connect(self.plugin_list)
self.plugin_menu.addAction(plugin_list)
# morphology_filter = self.add_action(QAction('&形态学滤波', self.w_parent), 'filter')
# lee_filter = self.add_action(QAction('&Lee滤波', self.w_parent), 'filter')
# auto_filter = self.add_action(QAction('&自适应滤波-自主', self.w_parent), 'filter')
# auto_filter_no_params = self.add_action(QAction('自动滤波(无参自适应滤波)-自主', self.w_parent), 'filter')
# double_filter = self.add_action(QAction('&双边滤波', self.w_parent), 'filter')
# filter_action_group = self.get_action_group('filter')
# filter_menu = self.basic_menu.addMenu('&滤波处理')
# for action in filter_action_group.actions():
# filter_menu.addAction(action)
# rgb2rgb = self.add_action(QAction('&光学-影像', self.w_parent), 'align')
# sar2sar = self.add_action(QAction('&SAR-影像', self.w_parent), 'align')
# multi_source = self.add_action(QAction('&多源影像', self.w_parent), 'align')
# align_menu = self.basic_menu.addMenu('&图像配准')
# align_menu.addAction(rgb2rgb)
# align_menu.addAction(sar2sar)
# align_menu.addAction(multi_source)
# cloud_menu = self.basic_menu.addMenu('&去云处理')
# defogging_menu = self.basic_menu.addMenu('&去雾处理')
# # self.preop_menu.addActionGroup(filter_action_group)
# # self.basic_menu.addAction(align_action)
# if self.toolbar is not None:
# self.toolbar.addAction(morphology_filter)
# self.toolbar.addAction(lee_filter)
# self.toolbar.addAction(auto_filter)
# self.toolbar.addAction(auto_filter_no_params)
# self.toolbar.addAction(double_filter)
# '''
# Change detection menu
# '''
# diff_method = self.add_action(QAction('&差分法', self.w_parent), 'unsuper_change_detection')
# log_diff = self.add_action(QAction('&对数差分法', self.w_parent), 'unsuper_change_detection')
# lsts_ = self.add_action(QAction('&LSTS法', self.w_parent), 'unsuper_change_detection')
# lhba = self.add_action(QAction('&LHBA法', self.w_parent), 'unsuper_change_detection')
# aht = self.add_action(QAction('&AHT法', self.w_parent), 'unsuper_change_detection')
# kpvd = self.add_action(QAction('&KPVD法', self.w_parent), 'unsuper_change_detection')
# mohd = self.add_action(QAction('&MOHD法', self.w_parent), 'unsuper_change_detection')
# sh = self.add_action(QAction('&SH法', self.w_parent), 'unsuper_change_detection')
# cva = self.add_action(QAction('&CVA法', self.w_parent), 'unsuper_change_detection')
# mls = self.add_action(QAction('&MLS法', self.w_parent), 'unsuper_change_detection')
# pca_kmean = self.add_action(QAction('&PCA-KMean法', self.w_parent), 'unsuper_change_detection')
# semi_fcm = self.add_action(QAction('&Semi-FCM法', self.w_parent), 'unsuper_change_detection')
# mls_svm = self.add_action(QAction('&MLS-SVM法', self.w_parent), 'unsuper_change_detection')
# cva_fcm = self.add_action(QAction('&CVA-FCM法', self.w_parent), 'unsuper_change_detection')
# cva_emgmm = self.add_action(QAction('&CVA-EMGMM法', self.w_parent), 'unsuper_change_detection')
# gwdm = self.add_action(QAction('&GWDM法', self.w_parent), 'unsuper_change_detection')
# mrf = self.add_action(QAction('&MRF法', self.w_parent), 'super_change_detection')
# mad = self.add_action(QAction('&MAD法', self.w_parent), 'super_change_detection')
# irmad = self.add_action(QAction('&IRMAD法', self.w_parent), 'super_change_detection')
# dcva = self.add_action(QAction('&DCVA法', self.w_parent), 'ai_change_detection')
# dp_fcn = self.add_action(QAction('&DP-FCN法', self.w_parent), 'ai_change_detection')
# rcnn = self.add_action(QAction('&RCNN法', self.w_parent), 'ai_change_detection')
# if self.toolbar is not None:
# self.toolbar.addAction(diff_method)
# self.toolbar.addAction(log_diff)
# self.toolbar.addAction(lsts_)
# self.toolbar.addAction(lhba)
# unsuper_change_detection = self.get_action_group('unsuper_change_detection')
# super_change_detection = self.get_action_group('super_change_detection')
# ai_change_detection = self.get_action_group('ai_change_detection')
# unsuper_menu = self.change_detection_menu.addMenu('&非监督')
# for action in unsuper_change_detection.actions():
# unsuper_menu.addAction(action)
# super_menu = self.change_detection_menu.addMenu('&监督')
# for action in super_change_detection.actions():
# super_menu.addAction(action)
# ai_menu = self.change_detection_menu.addMenu('&AI')
# for action in ai_change_detection.actions():
# ai_menu.addAction(action)
# # self.change_detection_menu.addActionGroup(super_change_detection)
# # self.change_detection_menu.addActionGroup(ai_change_detection)
# '''
# Special change detection menu
# '''
# water_change = self.add_action(QAction('&水体变化', self.w_parent), 'special_change_detection')
# vegetation_change = self.add_action(QAction('&植被变化', self.w_parent), 'special_change_detection')
# build_change = self.add_action(QAction('&房屋变化', self.w_parent), 'special_change_detection')
# self.special_chagne_detec_menu.addAction(water_change)
# self.special_chagne_detec_menu.addAction(vegetation_change)
# self.special_chagne_detec_menu.addAction(build_change)
# '''
# Postop menu
# '''
# slide_window = self.add_action(QAction('&滑动窗口法', self.w_parent), 'noise_reduction')
# density = self.add_action(QAction('&密度法', self.w_parent), 'noise_reduction')
# raster_export = self.add_action(QAction('&二值栅格数据导出', self.w_parent), 'export')
# txt_pos_export = self.add_action(QAction('&兼容ArcMap的坐标Txt文件', self.w_parent), 'export')
# render_export = self.add_action(QAction('&渲染图像导出', self.w_parent), 'export')
# noise_reduction = self.get_action_group('noise_reduction')
# export = self.get_action_group('export')
# noise_reduction_menu = self.postop_menu.addMenu('&噪声抑制')
# for action in noise_reduction.actions():
# noise_reduction_menu.addAction(action)
# export_menu = self.postop_menu.addMenu('&导出')
# for action in export.actions():
# export_menu.addAction(action)
# # self.postop_menu.addActionGroup(noise_reduction)
# # self.postop_menu.addActionGroup(export)
# '''
# Evaluation menu
# '''
# evaluation = self.add_action(QAction('&评估', self.w_parent), 'evaluation')
# self.postop_menu.addAction(evaluation)
'''
Help menu
'''
# about = self.add_action(QAction('&关于', self.w_parent), 'about')
# about.triggered.connect(lambda : AboutDialog(self.w_parent).show())
# self.help_menu.addAction(about)
self.message_box.info('Menu init finished')
self.message_box.info(self.actions.keys())
# for group in self.action_groups.keys():
# self.message_box.info('%s:' % (group))
# for action in self.action_groups[group].actions():
# action.setEnabled(False)
# self.message_box.info('\t%s' % (action.text()))
'''
Enabled actions
'''
# about.setEnabled(True)
project_create.setEnabled(True)
project_open.setEnabled(True)
Project().project_init.connect(self.project_init)
if self.status_bar is not None:
corr_widget = QLabel(self.status_bar)
# corr_widget.setLineWidth(200)
corr_widget.setFixedWidth(200)
self.status_bar.addWidget(corr_widget)
scale_widget = QLabel(self.status_bar)
scale_widget.setFixedWidth(200)
self.status_bar.addWidget(scale_widget)
self.double_map.corr_changed.connect(corr_widget.setText)
self.double_map.scale_changed.connect(scale_widget.setText)
def plugin_list(self):
dialog = PluginDialog(self.w_parent)
dialog.show()
def project_create(self):
project = Project()
projec_create = Create(self.w_parent)
if(projec_create.exec_()):
if project.is_init:
project.save()
project.clear()
project.setup(os.path.join(projec_create.file, projec_create.name + '.prj'))
project.is_init = True
project.cell_size = projec_create.cell_size
project.max_memory = projec_create.max_memory
project.save()
self.message_box.info('Project created')
def project_init(self, state):
self.message_box.info('Project init')
for group in self.action_groups.keys():
# self.message_box.info('%s:' % (group))
for action in self.action_groups[group].actions():
action.setEnabled(state)
# self.message_box.info('\t%s' % (action.text()))
self.message_box.info('Project init finished')
def project_open(self):
if Project().is_init:
Project().save()
project_file = QFileDialog.getOpenFileName(self.w_parent, '打开工程', '.', '*.prj')
if project_file[0] != '':
Project().clear()
Project().setup(project_file[0])
def project_save(self):
if Project().is_init:
Project().save()
def data_load(self):
if Project().is_init:
Project().save()
file_open = QFileDialog.getOpenFileNames(self.w_parent, '打开数据', Project().root, '*.*')
if file_open[0] != '':
if len(file_open[0]) != 2:
self.message_box.warning('请选择两个数据文件')
return
Project().add_layer(file_open[0][0], file_open[0][1])
self.message_box.info('Data loaded')
def view_setting(self):
pass
def add_action(self, action, group=None):
if group is None:
self.actions[action.text()] = action
else:
if group not in self.action_groups:
self.action_groups[group] = QActionGroup(self.w_parent)
self.action_groups[group].setExclusive(True)
self.action_groups[group].addAction(action)
self.action_group_actions[group] = action
return action
def get_action(self, action_name, group_name=None):
if action_name in self.actions:
return self.actions[action_name]
else:
if group_name is None:
return None
else:
if group_name not in self.action_group_actions:
return None
else:
group = self.action_group_actions[group_name]
for action in group.actions():
if action.text() == action_name:
return action
return None
def get_action_group(self, group_name):
return self.action_groups[group_name]
def get_action_group_action(self, group_name):
return self.action_group_actions[group_name]
def get_action_group_actions(self, group_name):
return self.action_group_actions[group_name].actions()
def get_actions(self):
return self.actions