diff --git a/generate_rc.py b/generate_rc.py new file mode 100644 index 0000000..b243945 --- /dev/null +++ b/generate_rc.py @@ -0,0 +1,16 @@ +import shutil +import subprocess +import os +path = os.path.dirname(os.path.realpath(__file__)) +icon_path = os.path.join(path, 'icons') + +with open(os.path.join(path, 'res.qrc'), 'w') as f: + f.write(f'\n') + f.write(f' \n') + for icon in os.listdir(icon_path): + f.write(f' {"icons/" + icon}\n') + f.write(f' \n') + f.write(f'\n') + +# subprocess.run(['pyrcc5', 'res.qrc', '-o', 'rc.py'], cwd=os.path.join(path, '..')) +# shutil.rmtree(icon_path) \ No newline at end of file diff --git a/icons/AI变化检测.png b/icons/AI变化检测.png new file mode 100644 index 0000000..5a5f21a Binary files /dev/null and b/icons/AI变化检测.png differ diff --git a/icons/assessment.svg b/icons/assessment.svg deleted file mode 100644 index 7c9bd45..0000000 --- a/icons/assessment.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/clear.svg b/icons/clear.svg deleted file mode 100644 index 72bc3ec..0000000 --- a/icons/clear.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/create.png b/icons/create.png deleted file mode 100644 index ba3d7d1..0000000 Binary files a/icons/create.png and /dev/null differ diff --git a/icons/edit.svg b/icons/edit.svg deleted file mode 100644 index 2c23b9e..0000000 --- a/icons/edit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/exit.svg b/icons/exit.svg deleted file mode 100644 index 6008f00..0000000 --- a/icons/exit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/export.svg b/icons/export.svg deleted file mode 100644 index 359844e..0000000 --- a/icons/export.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/font.svg b/icons/font.svg deleted file mode 100644 index f92ba9d..0000000 --- a/icons/font.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/full.svg b/icons/full.svg deleted file mode 100644 index 6be915f..0000000 --- a/icons/full.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/load.svg b/icons/load.svg deleted file mode 100644 index 5968cdd..0000000 --- a/icons/load.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/logo.svg b/icons/logo.svg deleted file mode 100644 index 4ecf1b3..0000000 --- a/icons/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/model.svg b/icons/model.svg deleted file mode 100644 index 128a1d8..0000000 --- a/icons/model.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/open.png b/icons/open.png deleted file mode 100644 index 5103f23..0000000 Binary files a/icons/open.png and /dev/null differ diff --git a/icons/outline.svg b/icons/outline.svg deleted file mode 100644 index 0d6e64b..0000000 --- a/icons/outline.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/paint.svg b/icons/paint.svg deleted file mode 100644 index 041f3e8..0000000 --- a/icons/paint.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/pan.svg b/icons/pan.svg deleted file mode 100644 index 15759f0..0000000 --- a/icons/pan.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/qt.svg b/icons/qt.svg deleted file mode 100644 index d5aab41..0000000 --- a/icons/qt.svg +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/icons/save.png b/icons/save.png deleted file mode 100644 index 09ff1b8..0000000 Binary files a/icons/save.png and /dev/null differ diff --git a/icons/settings.svg b/icons/settings.svg deleted file mode 100644 index ea7e8e8..0000000 --- a/icons/settings.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/start.svg b/icons/start.svg deleted file mode 100644 index 19160dd..0000000 --- a/icons/start.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/vector.svg b/icons/vector.svg deleted file mode 100644 index 4f88c95..0000000 --- a/icons/vector.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/zoomin.svg b/icons/zoomin.svg deleted file mode 100644 index f830872..0000000 --- a/icons/zoomin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/zoomout.svg b/icons/zoomout.svg deleted file mode 100644 index aa18703..0000000 --- a/icons/zoomout.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/公路变化.png b/icons/公路变化.png new file mode 100644 index 0000000..f446386 Binary files /dev/null and b/icons/公路变化.png differ diff --git a/icons/tools.png b/icons/其他/具体工具.png similarity index 100% rename from icons/tools.png rename to icons/其他/具体工具.png diff --git a/icons/delete.png b/icons/其他/删除_画板 1.png similarity index 100% rename from icons/delete.png rename to icons/其他/删除_画板 1.png diff --git a/icons/change_detect.png b/icons/其他/变化检测.png similarity index 100% rename from icons/change_detect.png rename to icons/其他/变化检测.png diff --git a/icons/layer.png b/icons/其他/图层_画板 1.png similarity index 100% rename from icons/layer.png rename to icons/其他/图层_画板 1.png diff --git a/icons/zoom_to.png b/icons/其他/定位.png similarity index 100% rename from icons/zoom_to.png rename to icons/其他/定位.png diff --git a/icons/toolbox.png b/icons/其他/工具箱_画板 1.png similarity index 100% rename from icons/toolbox.png rename to icons/其他/工具箱_画板 1.png diff --git a/icons/pan_1.png b/icons/其他/平移_画板 1.png similarity index 100% rename from icons/pan_1.png rename to icons/其他/平移_画板 1.png diff --git a/icons/其他/打开工程.png b/icons/其他/打开工程.png new file mode 100644 index 0000000..36cbeb4 Binary files /dev/null and b/icons/其他/打开工程.png differ diff --git a/icons/zoom_out.png b/icons/其他/放大.png similarity index 100% rename from icons/zoom_out.png rename to icons/其他/放大.png diff --git a/icons/其他/数据加载.png b/icons/其他/数据加载.png new file mode 100644 index 0000000..4704efa Binary files /dev/null and b/icons/其他/数据加载.png differ diff --git a/icons/data_load.png b/icons/其他/数据加载_画板 1.png similarity index 100% rename from icons/data_load.png rename to icons/其他/数据加载_画板 1.png diff --git a/icons/document.png b/icons/其他/文档.png similarity index 100% rename from icons/document.png rename to icons/其他/文档.png diff --git a/icons/filter.png b/icons/其他/滤波_画板 1.png similarity index 100% rename from icons/filter.png rename to icons/其他/滤波_画板 1.png diff --git a/icons/pan.png b/icons/其他/漫游_画板 1.png similarity index 100% rename from icons/pan.png rename to icons/其他/漫游_画板 1.png diff --git a/icons/view.png b/icons/其他/界面定制.png similarity index 100% rename from icons/view.png rename to icons/其他/界面定制.png diff --git a/icons/zoom_in.png b/icons/其他/缩小2_画板 1.png similarity index 100% rename from icons/zoom_in.png rename to icons/其他/缩小2_画板 1.png diff --git a/icons/grid_close.png b/icons/其他/网格线-关_画板 1.png similarity index 100% rename from icons/grid_close.png rename to icons/其他/网格线-关_画板 1.png diff --git a/icons/grid.png b/icons/其他/网格线_画板 1.png similarity index 100% rename from icons/grid.png rename to icons/其他/网格线_画板 1.png diff --git a/icons/exit.png b/icons/其他/退出_画板 1.png similarity index 100% rename from icons/exit.png rename to icons/其他/退出_画板 1.png diff --git a/icons/select.png b/icons/其他/选择要素.png similarity index 100% rename from icons/select.png rename to icons/其他/选择要素.png diff --git a/icons/创建工程.png b/icons/创建工程.png new file mode 100644 index 0000000..19dbce5 Binary files /dev/null and b/icons/创建工程.png differ diff --git a/icons/删除.png b/icons/删除.png new file mode 100644 index 0000000..5ed44f3 Binary files /dev/null and b/icons/删除.png differ diff --git a/icons/单窗口.png b/icons/单窗口.png new file mode 100644 index 0000000..8f7f565 Binary files /dev/null and b/icons/单窗口.png differ diff --git a/icons/去云.png b/icons/去云.png new file mode 100644 index 0000000..14d0350 Binary files /dev/null and b/icons/去云.png differ diff --git a/icons/双窗口.png b/icons/双窗口.png new file mode 100644 index 0000000..f8c62c7 Binary files /dev/null and b/icons/双窗口.png differ diff --git a/icons/logo.png b/icons/变化检测.png similarity index 100% rename from icons/logo.png rename to icons/变化检测.png diff --git a/icons/噪声处理.png b/icons/噪声处理.png new file mode 100644 index 0000000..59dfceb Binary files /dev/null and b/icons/噪声处理.png differ diff --git a/icons/图像质量.png b/icons/图像质量.png new file mode 100644 index 0000000..2b3fdb9 Binary files /dev/null and b/icons/图像质量.png differ diff --git a/icons/图像配准.png b/icons/图像配准.png new file mode 100644 index 0000000..35b0560 Binary files /dev/null and b/icons/图像配准.png differ diff --git a/icons/图层.png b/icons/图层.png new file mode 100644 index 0000000..aeef5d3 Binary files /dev/null and b/icons/图层.png differ diff --git a/icons/定位.png b/icons/定位.png new file mode 100644 index 0000000..c038c1b Binary files /dev/null and b/icons/定位.png differ diff --git a/icons/工具.png b/icons/工具.png new file mode 100644 index 0000000..b8ab4f8 Binary files /dev/null and b/icons/工具.png differ diff --git a/icons/工具箱.png b/icons/工具箱.png new file mode 100644 index 0000000..b40aecd Binary files /dev/null and b/icons/工具箱.png differ diff --git a/icons/工程保存.png b/icons/工程保存.png new file mode 100644 index 0000000..81c7a5d Binary files /dev/null and b/icons/工程保存.png differ diff --git a/icons/帮助.png b/icons/帮助.png new file mode 100644 index 0000000..b29a71d Binary files /dev/null and b/icons/帮助.png differ diff --git a/icons/平移.png b/icons/平移.png new file mode 100644 index 0000000..31b4c73 Binary files /dev/null and b/icons/平移.png differ diff --git a/icons/弱监督.png b/icons/弱监督.png new file mode 100644 index 0000000..a34800a Binary files /dev/null and b/icons/弱监督.png differ diff --git a/icons/影像.png b/icons/影像.png new file mode 100644 index 0000000..dcd855b Binary files /dev/null and b/icons/影像.png differ diff --git a/icons/打开工程.png b/icons/打开工程.png new file mode 100644 index 0000000..feb339f Binary files /dev/null and b/icons/打开工程.png differ diff --git a/icons/插件配置-展开.png b/icons/插件配置-展开.png new file mode 100644 index 0000000..cf46f21 Binary files /dev/null and b/icons/插件配置-展开.png differ diff --git a/icons/插件配置-收起.png b/icons/插件配置-收起.png new file mode 100644 index 0000000..478f997 Binary files /dev/null and b/icons/插件配置-收起.png differ diff --git a/icons/插件配置.png b/icons/插件配置.png new file mode 100644 index 0000000..7200251 Binary files /dev/null and b/icons/插件配置.png differ diff --git a/icons/放大.png b/icons/放大.png new file mode 100644 index 0000000..fc5b0ea Binary files /dev/null and b/icons/放大.png differ diff --git a/icons/数据加载.png b/icons/数据加载.png new file mode 100644 index 0000000..4704efa Binary files /dev/null and b/icons/数据加载.png differ diff --git a/icons/文件.png b/icons/文件.png new file mode 100644 index 0000000..1673028 Binary files /dev/null and b/icons/文件.png differ diff --git a/icons/文档.png b/icons/文档.png new file mode 100644 index 0000000..0a0d944 Binary files /dev/null and b/icons/文档.png differ diff --git a/icons/植被变化.bmp b/icons/植被变化.bmp new file mode 100644 index 0000000..a565fc8 Binary files /dev/null and b/icons/植被变化.bmp differ diff --git a/icons/水体变化.png b/icons/水体变化.png new file mode 100644 index 0000000..057dee2 Binary files /dev/null and b/icons/水体变化.png differ diff --git a/icons/海岸变化.png b/icons/海岸变化.png new file mode 100644 index 0000000..0b35468 Binary files /dev/null and b/icons/海岸变化.png differ diff --git a/icons/滑坡变化.png b/icons/滑坡变化.png new file mode 100644 index 0000000..b6034cb Binary files /dev/null and b/icons/滑坡变化.png differ diff --git a/icons/滤波.png b/icons/滤波.png new file mode 100644 index 0000000..6878d10 Binary files /dev/null and b/icons/滤波.png differ diff --git a/icons/田地变化.png b/icons/田地变化.png new file mode 100644 index 0000000..cfb2325 Binary files /dev/null and b/icons/田地变化.png differ diff --git a/icons/监督.png b/icons/监督.png new file mode 100644 index 0000000..4f648f5 Binary files /dev/null and b/icons/监督.png differ diff --git a/icons/矢量.png b/icons/矢量.png new file mode 100644 index 0000000..a06b1ea Binary files /dev/null and b/icons/矢量.png differ diff --git a/icons/精度评估.png b/icons/精度评估.png new file mode 100644 index 0000000..bd3575b Binary files /dev/null and b/icons/精度评估.png differ diff --git a/icons/缩小.png b/icons/缩小.png new file mode 100644 index 0000000..808f651 Binary files /dev/null and b/icons/缩小.png differ diff --git a/icons/缩放到.png b/icons/缩放到.png new file mode 100644 index 0000000..f9e27c0 Binary files /dev/null and b/icons/缩放到.png differ diff --git a/icons/网格关闭.png b/icons/网格关闭.png new file mode 100644 index 0000000..d5a68cc Binary files /dev/null and b/icons/网格关闭.png differ diff --git a/icons/网格开.png b/icons/网格开.png new file mode 100644 index 0000000..f487e7d Binary files /dev/null and b/icons/网格开.png differ diff --git a/icons/视图设置.png b/icons/视图设置.png new file mode 100644 index 0000000..dffc4e9 Binary files /dev/null and b/icons/视图设置.png differ diff --git a/icons/退出.png b/icons/退出.png new file mode 100644 index 0000000..c8ed837 Binary files /dev/null and b/icons/退出.png differ diff --git a/icons/选择要素.png b/icons/选择要素.png new file mode 100644 index 0000000..d80d24e Binary files /dev/null and b/icons/选择要素.png differ diff --git a/icons/道路变化.png b/icons/道路变化.png new file mode 100644 index 0000000..d092d71 Binary files /dev/null and b/icons/道路变化.png differ diff --git a/icons/遥感.png b/icons/遥感.png new file mode 100644 index 0000000..d4396ac Binary files /dev/null and b/icons/遥感.png differ diff --git a/icons/铁路变化.png b/icons/铁路变化.png new file mode 100644 index 0000000..a17f519 Binary files /dev/null and b/icons/铁路变化.png differ diff --git a/icons/非监督.png b/icons/非监督.png new file mode 100644 index 0000000..244ca3e Binary files /dev/null and b/icons/非监督.png differ diff --git a/log.txt b/log.txt index ff46a6d..e42a4df 100644 --- a/log.txt +++ b/log.txt @@ -1,4 +1,4 @@ -2022-05-27 10:22:57,895 - root - INFO - lic data:2022-12-01 00:00:00 -2022-05-27 10:22:57,896 - root - INFO - remain_days: 187 -2022-05-27 10:22:59,201 - root - INFO - lic data:2022-12-01 00:00:00 -2022-05-27 10:22:59,201 - root - INFO - remain_days: 187 +2022-05-28 17:23:06,221 - root - INFO - lic data:2022-12-01 00:00:00 +2022-05-28 17:23:06,221 - root - INFO - remain_days: 186 +2022-05-28 17:23:07,606 - root - INFO - lic data:2022-12-01 00:00:00 +2022-05-28 17:23:07,606 - root - INFO - remain_days: 186 diff --git a/plugins/about/main.py b/plugins/about/main.py index 0847560..8ab7d75 100644 --- a/plugins/about/main.py +++ b/plugins/about/main.py @@ -1,9 +1,12 @@ +from rscder.gui.actions import ActionManager from rscder.plugins.basic import BasicPlugin from PyQt5.QtWidgets import QDialog, QAction, QApplication, QLabel, QTextEdit, QVBoxLayout from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon +from rscder.utils.icons import IconInstance + class AboutDialog(QDialog): def __init__(self, parent=None): super(AboutDialog, self).__init__(parent) @@ -56,11 +59,10 @@ class AboutPlugin(BasicPlugin): } def set_action(self): - menu = self.ctx['help_menu'] - action = QAction('&关于', self.ctx['menu_bar']) + + action = QAction(IconInstance().HELP, '&关于', ActionManager().help_menu) action.triggered.connect(self.on_about) - - menu.addAction(action) + ActionManager().help_menu.addAction(action) def on_about(self): # print('on_about') diff --git a/plugins/basic_change/main.py b/plugins/basic_change/main.py index 0848178..dcc007e 100644 --- a/plugins/basic_change/main.py +++ b/plugins/basic_change/main.py @@ -6,6 +6,7 @@ from rscder.plugins.basic import BasicPlugin from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushButton from PyQt5.QtCore import pyqtSignal from PyQt5.QtGui import QIcon +from rscder.utils.icons import IconInstance from rscder.utils.project import BasicLayer, Project, RasterLayer, SingleBandRasterLayer from rscder.gui.layercombox import PairLayerCombox from osgeo import gdal @@ -18,20 +19,20 @@ class MyDialog(QDialog): super().__init__(parent) self.setWindowTitle('差分法') - self.setWindowIcon(QIcon(":/icons/logo.png")) + self.setWindowIcon(IconInstance().LOGO) - self.setFixedWidth(500) + # self.setFixedWidth(500) self.layer_select = PairLayerCombox(self) # self.number_input = QLineEdit(self) self.ok_button = QPushButton('确定', self) - self.ok_button.setIcon(QIcon(":/icons/ok.svg")) + self.ok_button.setIcon(IconInstance().OK) self.ok_button.clicked.connect(self.on_ok) self.cancel_button = QPushButton('取消', self) - self.cancel_button.setIcon(QIcon(":/icons/cancel.svg")) + self.cancel_button.setIcon(IconInstance().CANCEL) self.cancel_button.clicked.connect(self.on_cancel) self.button_layout = QHBoxLayout() diff --git a/plugins/evaluation/main.py b/plugins/evaluation/main.py index 35865f1..76e7657 100644 --- a/plugins/evaluation/main.py +++ b/plugins/evaluation/main.py @@ -1,3 +1,6 @@ +import os +import subprocess +import sys from threading import Thread import numpy as np @@ -7,8 +10,17 @@ from rscder.gui.layercombox import RasterLayerCombox from PyQt5.QtWidgets import QAction, QFileDialog, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt -from osgeo import gdal -from rscder.utils.project import SingleBandRasterLayer +from osgeo import gdal +from rscder.utils.icons import IconInstance +from rscder.utils.project import Project, SingleBandRasterLayer + +def kappa(confusion_matrix): + pe_rows = np.sum(confusion_matrix, axis=0) + pe_cols = np.sum(confusion_matrix, axis=1) + sum_total = sum(pe_cols) + pe = np.dot(pe_rows, pe_cols) / float(sum_total ** 2) + po = np.trace(confusion_matrix) / float(sum_total) + return (po - pe) / (1 - pe) class EvalutationDialog(QDialog): @@ -16,7 +28,7 @@ class EvalutationDialog(QDialog): super().__init__(parent) self.setWindowTitle('精度评估') - self.setWindowIcon(QIcon(":/icons/logo.png")) + self.setWindowIcon(IconInstance().LOGO) self.layer_select = RasterLayerCombox(self) self.gt_file = None @@ -34,11 +46,11 @@ class EvalutationDialog(QDialog): hbox2.addWidget(self.layer_select) self.ok_button = QPushButton('确定', self) - self.ok_button.setIcon(QIcon(":/icons/ok.svg")) + self.ok_button.setIcon(IconInstance().OK) self.ok_button.clicked.connect(self.on_ok) self.cancel_button = QPushButton('取消', self) - self.cancel_button.setIcon(QIcon(":/icons/cancel.svg")) + self.cancel_button.setIcon(IconInstance().CANCEL) self.cancel_button.clicked.connect(self.on_cancel) self.button_layout = QHBoxLayout() @@ -77,7 +89,7 @@ class EvaluationPlugin(BasicPlugin): } def set_action(self): - self.action = QAction(QIcon(":/icons/evaluation.svg"), '精度评估', self.mainwindow) + self.action = QAction(IconInstance().EVALUATION, '精度评估', self.mainwindow) self.action.triggered.connect(self.show_dialog) ActionManager().evaluation_menu.addAction(self.action) @@ -127,6 +139,31 @@ class EvaluationPlugin(BasicPlugin): for l in range(2): cfm[k,l] += np.sum((pred_block == k) & (gt_block == l)) + result_path = os.path.join(Project().other_path, f'{layer.name}_{os.path.basename(gt)}_evaluation.txt') + with open(result_path, 'w', encoding='utf-8') as f: + f.write(f'预测结果:{layer.path}\n') + f.write(f'真值: {gt}\n') + f.write('混淆矩阵结果:\n') + f.write(f''' + 真实值 | 变化 | 未变化 + 预测值 + 变化 {cfm[1,1]}\t, {cfm[1,0]} + 未变化 {cfm[0,1]}\t, {cfm[0,0]} + + + 归一化混淆矩阵: + 真实值 | 变化 | 未变化 + 预测值 + 变化 {cfm[1,1]/np.sum(cfm)}\t, {cfm[1,0]/np.sum(cfm)} + 未变化 {cfm[0,1]/np.sum(cfm)}\t, {cfm[0,0]/np.sum(cfm)} + + OA: {(cfm[1,1] + cfm[0,0])/np.sum(cfm)} + F1: {cfm[1,1] / (np.sum(cfm[1,:]) + np.sum(cfm[:,1]) - cfm[1,1])} + Kappa: {kappa(cfm)} + ''') + f.flush() + + os.system(f'c:/windows/notepad.exe "{result_path}"') self.send_message.emit('精度评估完成') @@ -134,7 +171,7 @@ class EvaluationPlugin(BasicPlugin): dialog = EvalutationDialog(self.mainwindow) dialog.exec_() if dialog.result() == QDialog.Accepted: - layer = dialog.layer_select.current_layer() + layer = dialog.layer_select.current_layer if not isinstance(layer, SingleBandRasterLayer): self.send_message.emit('请选择一个单波段栅格图层') return diff --git a/plugins/export_to/main.py b/plugins/export_to/main.py index dbae49d..3eb1f15 100644 --- a/plugins/export_to/main.py +++ b/plugins/export_to/main.py @@ -1,5 +1,6 @@ import shutil from rscder.gui.actions import ActionManager +from rscder.utils.icons import IconInstance from rscder.utils.project import Project, PairLayer, ResultPointLayer from rscder.plugins.basic import BasicPlugin from PyQt5.QtWidgets import QDialog, QHBoxLayout, QFileDialog, QComboBox, QVBoxLayout, QPushButton, QLabel, QLineEdit, QAction @@ -10,7 +11,7 @@ class ExportDialog(QDialog): super().__init__(parent) self.setWindowTitle('Export') - self.setWindowIcon(QIcon(":/icons/logo.png")) + self.setWindowIcon(IconInstance().LOGO) self.out_path = None self.result_layer = None @@ -23,7 +24,7 @@ class ExportDialog(QDialog): for layer in Project().layers.values(): for result_layer in layer.layers: if isinstance(result_layer, ResultPointLayer): - result_layer_select.addItem(QIcon(":/icons/layer.png"), result_layer.name, result_layer) + result_layer_select.addItem(IconInstance().VECTOR, result_layer.name, result_layer) def on_result_layer_select(index): self.result_layer = result_layer_select.currentData() @@ -43,9 +44,9 @@ class ExportDialog(QDialog): out_path_btn = QPushButton('...', self) out_path_btn.clicked.connect(on_out_path_btn) - ok_btn = QPushButton('OK', self) + ok_btn = QPushButton('确定', self) ok_btn.clicked.connect(self.accept) - cancel_btn = QPushButton('Cancel', self) + cancel_btn = QPushButton('取消', self) cancel_btn.clicked.connect(self.reject) @@ -80,7 +81,7 @@ class ExportPlugin(BasicPlugin): } def set_action(self): - self.export_txt = QAction(QIcon(":/icons/document.png"), '导出为 Arcgis 兼容的TXT', self.mainwindow) + self.export_txt = QAction(IconInstance().DOCUMENT, '导出为 Arcgis 兼容的TXT', self.mainwindow) self.export_txt.triggered.connect(self.export_txt_action) ActionManager().export_menu.addAction(self.export_txt) diff --git a/plugins/plugins.yaml b/plugins/plugins.yaml index 0059eb2..bf506ab 100644 --- a/plugins/plugins.yaml +++ b/plugins/plugins.yaml @@ -39,4 +39,11 @@ module: table_result name: TableResult path: ./plugin\table_result + version: 1.0.0 +- author: RSCDER + description: Evaluation + enabled: true + module: evaluation + name: Evaluation + path: ./plugin\evaluation version: 1.0.0 \ No newline at end of file diff --git a/plugins/some_filter/main.py b/plugins/some_filter/main.py index 362c916..8a3342b 100644 --- a/plugins/some_filter/main.py +++ b/plugins/some_filter/main.py @@ -4,6 +4,7 @@ from PyQt5.QtWidgets import QDialog, QAction from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt, QModelIndex, pyqtSignal from rscder.gui.actions import ActionManager +from rscder.utils.icons import IconInstance from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer from rscder.plugins.basic import BasicPlugin from rscder.gui.layercombox import RasterLayerCombox @@ -13,12 +14,12 @@ from skimage.morphology import disk, rectangle class FilterSetting(QDialog): def __init__(self, parent=None): super(FilterSetting, self).__init__(parent) - self.setWindowTitle('Filter Setting') + self.setWindowTitle('滤波设置') # self.setWindowFlags(Qt.WindowStaysOnTopHint) - self.setFixedSize(300, 200) + # self.setFixedSize(300, 200) # self.setStyleSheet("QDialog{background-color:rgb(255,255,255);}") - self.setWindowIcon(QtGui.QIcon(':/plugins/some_filter/icon.png')) - self.setWindowIconText('Filter Setting') + self.setWindowIcon(IconInstance().FILTER) + # self.setWindowIconText('Filter Setting') # self.setWindowModality(Qt.ApplicationModal) self.initUI() # self.show() diff --git a/plugins/table_result/main.py b/plugins/table_result/main.py index 7ce2c07..29e59aa 100644 --- a/plugins/table_result/main.py +++ b/plugins/table_result/main.py @@ -6,6 +6,7 @@ from rscder.plugins.basic import BasicPlugin from PyQt5.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton from PyQt5.QtCore import pyqtSignal from PyQt5.QtGui import QIcon +from rscder.utils.icons import IconInstance from rscder.utils.project import Project, ResultPointLayer, SingleBandRasterLayer from osgeo import gdal @@ -15,7 +16,7 @@ class TableResultDialog(QDialog): super().__init__(parent) self.setWindowTitle('表格结果') - self.setWindowIcon(QIcon(":/icons/logo.png")) + self.setWindowIcon(IconInstance().LOGO) self.layer_select = RasterLayerCombox(self) hbox = QHBoxLayout() @@ -23,11 +24,11 @@ class TableResultDialog(QDialog): hbox.addWidget(self.layer_select) self.ok_button = QPushButton('确定', self) - self.ok_button.setIcon(QIcon(":/icons/ok.svg")) + self.ok_button.setIcon(IconInstance().OK) self.ok_button.clicked.connect(self.on_ok) self.cancel_button = QPushButton('取消', self) - self.cancel_button.setIcon(QIcon(":/icons/cancel.svg")) + self.cancel_button.setIcon(IconInstance().CANCEL) self.cancel_button.clicked.connect(self.on_cancel) self.button_layout = QHBoxLayout() @@ -58,7 +59,7 @@ class TableResultPlugin(BasicPlugin): } def set_action(self): - self.action = QAction(QIcon(":/icons/table_result.svg"), '表格结果', self.mainwindow) + self.action = QAction(IconInstance().VECTOR, '表格结果', self.mainwindow) self.action.triggered.connect(self.show_dialog) ActionManager().position_menu.addAction(self.action) diff --git a/plugins/threshold/main.py b/plugins/threshold/main.py index 76e8041..adfefb7 100644 --- a/plugins/threshold/main.py +++ b/plugins/threshold/main.py @@ -8,6 +8,7 @@ from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushBut from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt from rscder.gui.layercombox import RasterLayerCombox +from rscder.utils.icons import IconInstance from rscder.utils.project import Project, RasterLayer, SingleBandRasterLayer from threshold.otsu import OTSU from osgeo import gdal @@ -17,7 +18,7 @@ class OTSUDialog(QDialog): super().__init__(parent) self.setWindowTitle('OTSU阈值') - self.setWindowIcon(QIcon(":/icons/logo.png")) + self.setWindowIcon(IconInstance().LOGO) self.setFixedWidth(500) @@ -26,11 +27,11 @@ class OTSUDialog(QDialog): self.ok_button = QPushButton('确定', self) - self.ok_button.setIcon(QIcon(":/icons/ok.svg")) + self.ok_button.setIcon(IconInstance().OK) self.ok_button.clicked.connect(self.on_ok) self.cancel_button = QPushButton('取消', self) - self.cancel_button.setIcon(QIcon(":/icons/cancel.svg")) + self.cancel_button.setIcon(IconInstance().CANCEL) self.cancel_button.clicked.connect(self.on_cancel) self.button_layout = QHBoxLayout() diff --git a/res.qrc b/res.qrc index 7bd32c7..9b9e7be 100644 --- a/res.qrc +++ b/res.qrc @@ -1,45 +1,53 @@ - icons\change_detect.png - icons\cancel.svg - icons\clear.svg - icons\edit.svg - icons\exit.png - icons\export.svg - icons\font.svg - icons\full.svg - icons\create.png - icons\data_load.png - icons\delete.png - icons\document.png - icons\filter.png - icons\grid_close.png - icons\grid.png - icons\layer.png - icons\open.png - icons\pan.png - icons\pan_1.png - icons\save.png - icons\select.png - icons\toolbox.png - icons\tools.png - icons\view.png - icons\zoom_in.png - icons\zoom_out.png - icons\zoom_to.png - icons\load.svg - icons\logo.png - icons\model.svg - icons\ok.svg - icons\outline.svg - icons\paint.svg - icons\pan.svg - icons\qt.svg - icons\settings.svg - icons\splash.png - icons\start.svg - icons\vector.svg - icons\zoomin.svg - icons\zoomout.svg + icons/AI仯.png + icons/ʹð.png + icons/·仯.png + icons/ + icons/.png + icons/ɾ.png + icons/ѧ.png + icons/.png + icons/ȥ.png + icons/˫.png + icons/.png + icons/ͼ.png + icons/ͼ׼.png + icons/ͼ.png + icons/λ.png + icons/.png + icons/.png + icons/̱.png + icons/ (1).png + icons/.png + icons/ƽ.png + icons/ල.png + icons/Ӱ.png + icons/򿪹.png + icons/ (1).png + icons/-չ.png + icons/-.png + icons/.png + icons/ݼ.png + icons/ļ.png + icons/ĵ.png + icons/ֲ仯.bmp + icons/ˮ仯.png + icons/仯.png + icons/±仯.png + icons/˲.png + icons/ر仯.png + icons/涨.png + icons/ල.png + icons/ʸ.png + icons/ر.png + icons/.png + icons/ͼ.png + icons/˳.png + icons/ѡҪ.png + icons/·仯.png + icons/ң.png + icons/·仯.png + icons/Ǽල.png diff --git a/rscder/gui/actions.py b/rscder/gui/actions.py index 20869c1..56aa8be 100644 --- a/rscder/gui/actions.py +++ b/rscder/gui/actions.py @@ -5,6 +5,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QAction, QActionGroup, QLabel, QFileDialog, QMenuBar from rscder.gui import project from rscder.gui.project import Create +from rscder.utils.icons import IconInstance from rscder.utils.project import Project from rscder.utils.misc import singleton from rscder.gui.plugins import PluginDialog @@ -49,44 +50,29 @@ class ActionManager(QtCore.QObject): self.menubar = menubar self.file_menu = menubar.addMenu( '&文件') self.basic_menu = menubar.addMenu( '&基础工具') - self.filter_menu = self.basic_menu.addMenu('&滤波处理') - self.change_detection_menu = menubar.addMenu( '&通用变化检测') - self.unsupervised_menu = self.change_detection_menu.addMenu('&无监督变化检测') - self.supervised_menu = self.change_detection_menu.addMenu('&监督变化检测') - self.ai_menu = self.change_detection_menu.addMenu('&AI变化检测') + self.filter_menu = self.basic_menu.addMenu(IconInstance().FILTER, '&滤波处理') + self.change_detection_menu = menubar.addMenu('&通用变化检测') + self.unsupervised_menu = self.change_detection_menu.addMenu(IconInstance().UNSUPERVISED, '&无监督变化检测') + self.supervised_menu = self.change_detection_menu.addMenu(IconInstance().SUPERVISED,'&监督变化检测') + self.ai_menu = self.change_detection_menu.addMenu(IconInstance().AI_DETECT,'&AI变化检测') self.special_chagne_detec_menu = menubar.addMenu( '&专题变化检测') - self.water_menu = self.special_chagne_detec_menu.addMenu('&水体变化检测') - self.veg_menu = self.special_chagne_detec_menu.addMenu('&植被变化检测') - self.road_menu = self.special_chagne_detec_menu.addMenu('&道路变化检测') - self.landslide_menu = self.special_chagne_detec_menu.addMenu('&滑坡变化检测') + self.water_menu = self.special_chagne_detec_menu.addMenu(IconInstance().WATER_CHANGE,'&水体变化检测') + self.veg_menu = self.special_chagne_detec_menu.addMenu(IconInstance().VEGETATION,'&植被变化检测') + self.road_menu = self.special_chagne_detec_menu.addMenu(IconInstance().ROAD_CHANGE,'&道路变化检测') + self.landslide_menu = self.special_chagne_detec_menu.addMenu(IconInstance().LANDSIDE,'&滑坡变化检测') self.seg_chagne_detec_menu = menubar.addMenu('&分类后变化检测') self.postop_menu = menubar.addMenu( '&检测后处理') - self.noise_menu = self.postop_menu.addMenu('&噪声处理') - self.position_menu = self.postop_menu.addMenu('&变化位置估计') - self.evaluation_menu = self.postop_menu.addMenu('&定量评价') - self.export_menu = self.postop_menu.addMenu('&结果导出') + self.noise_menu = self.postop_menu.addMenu(IconInstance().NOISE,'&噪声处理') + self.position_menu = self.postop_menu.addMenu(IconInstance().LOCATION,'&变化位置估计') + self.evaluation_menu = self.postop_menu.addMenu(IconInstance().EVALUATION,'&定量评价') + self.export_menu = self.postop_menu.addMenu(IconInstance().DOCUMENT,'&结果导出') 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)) @@ -98,12 +84,12 @@ class ActionManager(QtCore.QObject): ''' File menu ''' - project_create = self.add_action(QAction(QtGui.QIcon( ':/icons/create.png' ), '&工程创建', self.w_parent), 'File') - project_open = self.add_action(QAction(QtGui.QIcon( ':/icons/open.png' ), '&打开工程', self.w_parent), 'File') - project_save = self.add_action(QAction(QtGui.QIcon( ':/icons/save.png' ),'&保存工程', self.w_parent), 'File') - data_load = self.add_action(QAction(QtGui.QIcon( ':/icons/data_load.png' ),'&数据加载', self.w_parent), 'File') - view_setting = self.add_action(QAction(QtGui.QIcon( ':/icons/view.png' ),'&界面定制', self.w_parent), 'File') - exit_app = self.add_action(QAction(QtGui.QIcon( ':/icons/exit.png' ),'&退出', self.w_parent), 'File') + project_create = self.add_action(QAction(IconInstance().CREATE, '&工程创建', self.w_parent), 'File') + project_open = self.add_action(QAction(IconInstance().OPEN, '&打开工程', self.w_parent), 'File') + project_save = self.add_action(QAction(IconInstance().SAVE,'&保存工程', self.w_parent), 'File') + data_load = self.add_action(QAction(IconInstance().DATA_LOAD,'&数据加载', self.w_parent), 'File') + view_setting = self.add_action(QAction(IconInstance().VIEW_SETTING,'&界面定制', self.w_parent), 'File') + exit_app = self.add_action(QAction(IconInstance().EXCIT,'&退出', 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) @@ -130,14 +116,14 @@ class ActionManager(QtCore.QObject): ''' Basic menu ''' - grid_line = self.add_action(QAction(QtGui.QIcon( ':/icons/grid.png' ),'&网格线', self.w_parent), 'Basic Line') + grid_line = self.add_action(QAction(IconInstance().GRID_ON,'&网格线', self.w_parent), 'Basic Line') grid_line.setCheckable(True) grid_line.setChecked(True) - zomm_in = self.add_action(QAction(QtGui.QIcon( ':/icons/zoom_out.png' ),'&放大', self.w_parent), 'Basic') - zomm_out = self.add_action(QAction(QtGui.QIcon( ':/icons/zoom_in.png' ),'&缩小', self.w_parent), 'Basic') - pan = self.add_action(QAction(QtGui.QIcon( ':/icons/pan_1.png' ),'&漫游', self.w_parent), 'Basic') - locate = self.add_action(QAction(QtGui.QIcon( ':/icons/zoom_to.png' ),'&定位', self.w_parent), 'Basic') + zomm_in = self.add_action(QAction(IconInstance().ZOOM_OUT,'&放大', self.w_parent), 'Basic') + zomm_out = self.add_action(QAction(IconInstance().ZOOM_IN,'&缩小', self.w_parent), 'Basic') + pan = self.add_action(QAction(IconInstance().PAN,'&漫游', self.w_parent), 'Basic') + locate = self.add_action(QAction(IconInstance().ZOOM_TO,'&定位', self.w_parent), 'Basic') pan.setCheckable(True) pan.setChecked(True) @@ -159,12 +145,12 @@ class ActionManager(QtCore.QObject): ''' Plugin menu ''' - plugin_list = self.add_action(QAction(QtGui.QIcon( ':/icons/toolbox.png' ),'&插件列表', self.w_parent), 'Plugin') + plugin_list = self.add_action(QAction(IconInstance().PLUGINS,'&插件列表', self.w_parent), 'Plugin') plugin_list.triggered.connect(self.plugin_list) self.plugin_menu.addAction(plugin_list) - self.message_box.info('Menu init finished') + self.message_box.info('菜单初始化完成') self.message_box.info(self.actions.keys()) ''' @@ -208,17 +194,17 @@ class ActionManager(QtCore.QObject): project.cell_size = projec_create.cell_size project.max_memory = projec_create.max_memory project.save() - self.message_box.info('Project created') + self.message_box.info('项目创建成功') def project_init(self, state): - self.message_box.info('Project init') + # self.message_box.info('项目初始化完成') 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') + self.message_box.info('项目初始化完成') def project_open(self): if Project().is_init: @@ -242,8 +228,6 @@ class ActionManager(QtCore.QObject): if(file_loader.exec_()): Project().add_layer(file_loader.path1,file_loader.path2,file_loader.style1,file_loader.style2) self.message_box.info('Data loaded') - - def view_setting(self): pass diff --git a/rscder/gui/keygen.py b/rscder/gui/keygen.py index ad4d27c..1214702 100644 --- a/rscder/gui/keygen.py +++ b/rscder/gui/keygen.py @@ -1,6 +1,7 @@ from PyQt5.QtWidgets import QDialog, QLineEdit, QDateTimeEdit, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QTextEdit, QFileDialog, QMessageBox from PyQt5 import QtCore from PyQt5.QtGui import QIcon +from rscder.utils.icons import IconInstance from rscder.utils.license import LicenseHelper import re @@ -9,17 +10,17 @@ class LicenseGen(QDialog): def __init__(self, parent = None, flags = QtCore.Qt.WindowFlags() ) -> None: super().__init__(parent, flags) - self.setWindowTitle("License Generator") - self.setWindowIcon(QIcon(':/icons/logo.png')) + self.setWindowTitle("证书生成器") + self.setWindowIcon(IconInstance().LOGO) - mac_address_label = QLabel("MAC Address:") + mac_address_label = QLabel("MAC地址:") self.mac_address_text = QLineEdit() hbox1 = QHBoxLayout() hbox1.addWidget(mac_address_label) hbox1.addWidget(self.mac_address_text) - end_date_label = QLabel("End Date:") + end_date_label = QLabel("结束日期:") self.end_date_text = QDateTimeEdit() hbox2 = QHBoxLayout() @@ -30,7 +31,7 @@ class LicenseGen(QDialog): self.license_file_path_text = QLineEdit() self.license_file_path_text.setReadOnly(True) - btn_open = QPushButton("Open") + btn_open = QPushButton("选择保存路径") btn_open.clicked.connect(self.open_file) hbox3 = QHBoxLayout() @@ -39,10 +40,10 @@ class LicenseGen(QDialog): # hbox3.addWidget(btn_open) - self.btn_generate = QPushButton("Generate") + self.btn_generate = QPushButton("生成") self.btn_generate.clicked.connect(self.generate_license) - self.btn_cancel = QPushButton("Cancel") + self.btn_cancel = QPushButton("取消") self.btn_cancel.clicked.connect(self.reject) hbox4 = QHBoxLayout() @@ -58,7 +59,7 @@ class LicenseGen(QDialog): self.setLayout(vbox) def open_file(self) -> None: - file_path, _ = QFileDialog.getSaveFileName(self, "Save License File", "", "License Files (*.lic)") + file_path, _ = QFileDialog.getSaveFileName(self, "保存证书路径", "", "License Files (*.lic)") if file_path: self.license_file_path_text.setText(file_path) @@ -72,7 +73,7 @@ class LicenseGen(QDialog): if self.mac_address_text.text() and self.license_file_path_text.text() and \ self.end_date_text.dateTime().isValid(): if not self.isValidMac(self.mac_address_text.text()): - QMessageBox.warning(self, "Warning", "Invalid MAC Address") + QMessageBox.warning(self, "Warning", "非法MAC地址") end_date = self.end_date_text.dateTime().toPyDateTime().strftime("%Y-%m-%d %H:%M:%S") @@ -80,4 +81,4 @@ class LicenseGen(QDialog): with open(self.license_file_path_text.text(), 'w') as f: f.write(lic[::-1]) - QMessageBox.information(self, "Information", "License Generated") \ No newline at end of file + QMessageBox.information(self, "Information", "证书生成成功") \ No newline at end of file diff --git a/rscder/gui/layercombox.py b/rscder/gui/layercombox.py index 4e711dd..5556c06 100644 --- a/rscder/gui/layercombox.py +++ b/rscder/gui/layercombox.py @@ -1,6 +1,7 @@ from PyQt5.QtWidgets import QComboBox, QWidget, QLabel, QHBoxLayout, QVBoxLayout from PyQt5.QtGui import QIcon -from rscder.utils.project import Project, RasterLayer, ResultPointLayer +from rscder.utils.icons import IconInstance +from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer class LayerCombox(QComboBox): def __init__(self, parent=None): @@ -8,12 +9,8 @@ class LayerCombox(QComboBox): self.addItem('---', None) for layer in Project().layers.values(): - self.addItem(layer.name, layer.id) + self.addItem(IconInstance().LAYER, layer.name, layer.id) - for i in range(self.count() - 1): - self.setItemIcon(i + 1, QIcon(':/icons/layer.png')) - - self.currentIndexChanged.connect(self.on_changed) self.current_layer = None @@ -90,29 +87,25 @@ class PairLayerCombox(QWidget): self.raster_layer1.addItem('---', None) self.raster_layer2.addItem('---', None) for sub in self.layer_combox.current_layer.layers: - if isinstance(sub, RasterLayer): - self.raster_layer1.addItem(QIcon(':/icons/layer.png'), sub.name, sub) - self.raster_layer2.addItem(QIcon(':/icons/layer.png'), sub.name, sub) + 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=None): + 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(sub.name, sub) + 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(sub.name, sub) - # self.addItem(layer.name, layer.id) - - for i in range(self.count() - 1): - self.setItemIcon(i + 1, QIcon(':/icons/layer.png')) + self.addItem(IconInstance().RASTER, sub.name, sub) self.currentIndexChanged.connect(self.on_changed) @@ -134,12 +127,8 @@ class ResultPointLayerCombox(QComboBox): for layer in Project().layers.values(): for sub in layer.layers: if isinstance(sub, ResultPointLayer): - self.addItem(sub.name, sub) + self.addItem(IconInstance().VECTOR, sub.name, sub) - for i in range(self.count() - 1): - self.setItemIcon(i + 1, QIcon(':/icons/layer.png')) - - self.currentIndexChanged.connect(self.on_changed) self.current_layer = None diff --git a/rscder/gui/layertree.py b/rscder/gui/layertree.py index 63bc22f..6ee912d 100644 --- a/rscder/gui/layertree.py +++ b/rscder/gui/layertree.py @@ -6,6 +6,7 @@ from PyQt5.QtCore import Qt,QModelIndex from PyQt5.QtGui import QStandardItemModel, QStandardItem, QCursor, QIcon from PyQt5.QtWidgets import (QTreeView, QTreeWidgetItem, QAbstractItemView, QHeaderView, QStyleFactory) from rscder.gui.actions import get_action_manager +from rscder.utils.icons import IconInstance from rscder.utils.project import PairLayer, Project @@ -35,7 +36,7 @@ class LayerTree(QtWidgets.QWidget): # self.tree.setHeaderLabels(['图层']) self.root.setText(0,'图层') - self.root.setIcon(0,QtGui.QIcon(':/icons/layer.png')) + self.root.setIcon(0,IconInstance().LAYER) self.tree.expandAll() @@ -90,7 +91,7 @@ class LayerTree(QtWidgets.QWidget): self.tree.addTopLevelItem(self.root) self.tree.expandAll() self.root.setText(0,'图层') - self.root.setIcon(0,QtGui.QIcon(':/icons/layer.png')) + self.root.setIcon(0,IconInstance().LAYER) self.root.setExpanded(self._expand) def right_menu_show(self, position): diff --git a/rscder/gui/license.py b/rscder/gui/license.py index 302f13f..88b781a 100644 --- a/rscder/gui/license.py +++ b/rscder/gui/license.py @@ -3,6 +3,7 @@ from PyQt5 import QtWidgets from PyQt5 import QtCore from PyQt5.QtGui import QIcon import os +from rscder.utils.icons import IconInstance from rscder.utils.license import LicenseHelper @@ -10,19 +11,19 @@ class License(QtWidgets.QDialog): def __init__(self, parent = None, flags = QtCore.Qt.WindowFlags() ) -> None: super().__init__(parent, flags) - self.setWindowTitle("License") - self.setWindowIcon(QIcon(':/icons/logo.png')) + self.setWindowTitle("证书") + self.setWindowIcon(IconInstance().LOGO) self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint) self.setFixedSize(600, 400) self.text = QtWidgets.QLineEdit() self.text.setReadOnly(False) self.label = QtWidgets.QLabel() - self.label.setText("License File Path: ") + self.label.setText("证书文件路径: ") self.setModal(True) - self.btn_open = QtWidgets.QPushButton("Open") + self.btn_open = QtWidgets.QPushButton("打开") self.btn_open.clicked.connect(self.open_file) hlayout = QtWidgets.QHBoxLayout() @@ -30,7 +31,7 @@ class License(QtWidgets.QDialog): hlayout.addWidget(self.text, 0, alignment=QtCore.Qt.AlignTop) hlayout.addWidget(self.btn_open, 0, alignment=QtCore.Qt.AlignTop) - self.btn_ok = QtWidgets.QPushButton("OK") + self.btn_ok = QtWidgets.QPushButton("确定") self.btn_ok.clicked.connect(self.ok_clicked) hlayout2 = QtWidgets.QHBoxLayout() @@ -56,7 +57,7 @@ class License(QtWidgets.QDialog): self.setLayout(vlayout) def open_file(self) -> None: - file_path = QtWidgets.QFileDialog.getOpenFileName(self, "Open File", "", "License Files (*.*)") + file_path = QtWidgets.QFileDialog.getOpenFileName(self, "打开文件", "", "License Files (*.*)") if file_path[0]: self.text.setText(file_path[0]) # self.label.setText("License File Path: " + file_path[0]) diff --git a/rscder/gui/load.py b/rscder/gui/load.py index c0fe3a7..70322ad 100644 --- a/rscder/gui/load.py +++ b/rscder/gui/load.py @@ -4,6 +4,7 @@ from PyQt5.QtWidgets import QDialog, QFileDialog, QLineEdit, QPushButton, QVBoxL from PyQt5.QtCore import Qt, QSize, QSettings from PyQt5.QtGui import QIcon,QColor from PyQt5 import QtGui +from rscder.utils.icons import IconInstance from rscder.utils.setting import Settings from rscder.gui.mapcanvas import DoubleCanvas from qgis.gui import QgsMapCanvas @@ -12,7 +13,7 @@ class loader(QDialog): def __init__(self, parent=None) -> None: super().__init__(parent) self.setWindowTitle('载入数据') - self.setWindowIcon(QIcon(":/icons/data_load.png")) + self.setWindowIcon(IconInstance().DATA_LOAD) self.path1='' self.path2='' self.bands=['red:','green:','blue:','NIR:'] @@ -29,11 +30,11 @@ class loader(QDialog): maplayout.addWidget(self.mapcanva1) maplayout.addWidget(self.mapcanva2) - path1_label = QLabel('Pic 1:') + path1_label = QLabel('时相1影像:') path1_label.setFixedWidth(60) path1_input = QLineEdit() - path1_input.setPlaceholderText('Pic 1') - path1_input.setToolTip('Pic 1') + path1_input.setPlaceholderText('时相1影像') + path1_input.setToolTip('时相1影像') path1_input.setReadOnly(True) path1_input.setText(self.path1) self.path1_input = path1_input @@ -68,11 +69,11 @@ class loader(QDialog): style1_layout.addWidget(style1_inputs[i]) style1_layout.addWidget(style1_set) - path2_label = QLabel('Pic 2:') + path2_label = QLabel('时相2影像:') path2_label.setFixedWidth(60) path2_input = QLineEdit() - path2_input.setPlaceholderText('Pic 1') - path2_input.setToolTip('Pic 1') + path2_input.setPlaceholderText('时相2影像') + path2_input.setToolTip('时相2影像') path2_input.setReadOnly(True) path2_input.setText(self.path2) self.path2_input = path2_input diff --git a/rscder/gui/mainwindow.py b/rscder/gui/mainwindow.py index 979addc..a33c157 100644 --- a/rscder/gui/mainwindow.py +++ b/rscder/gui/mainwindow.py @@ -11,6 +11,7 @@ from rscder.gui.messagebox import MessageBox from rscder.gui.result import ResultTable from rscder.plugins.loader import PluginLoader from rscder.utils import Settings +from rscder.utils.icons import IconInstance from rscder.utils.project import Project from rscder.gui.layercombox import LayerCombox class MainWindow(QMainWindow): @@ -19,12 +20,9 @@ class MainWindow(QMainWindow): def __init__(self, parent=None, **kargs): super().__init__(parent) - # self.current_instance = kargs.get('current_instance', 0) - # if self.current_instance > 0: - # self.setWindowTitle(QApplication.applicationName() + ' ' + str(self.current_instance)) - # else: self.setWindowTitle(QApplication.applicationName()) - self.setWindowIcon(QIcon(":/icons/change_detect.png")) + IconInstance(self) + self.setWindowIcon(IconInstance().LOGO) self.setAcceptDrops(False) self.setContextMenuPolicy(Qt.CustomContextMenu) @@ -54,11 +52,9 @@ class MainWindow(QMainWindow): pair_canvas=self.double_map, message_box=self.message_box, result_table=self.result_box, - project=Project(self), mainwindow=self, toolbar=self.toolbar, statusbar=self.statusBar(), - **self.action_manager.menus )).load_plugin() self.resize(*Settings.General().size) diff --git a/rscder/gui/messagebox.py b/rscder/gui/messagebox.py index b06c0d9..6c4a377 100644 --- a/rscder/gui/messagebox.py +++ b/rscder/gui/messagebox.py @@ -3,6 +3,8 @@ from PyQt5 import QtWidgets from PyQt5.QtGui import QTextCursor, QIcon from PyQt5.QtCore import Qt from datetime import datetime, time + +from rscder.utils.icons import IconInstance class MessageBox(QTextEdit): INFO=0 @@ -24,7 +26,7 @@ class MessageBox(QTextEdit): def right_menu_show(self, position): rightMenu = QtWidgets.QMenu(self) # QAction = QtWidgets.QAction(self.menuBar1) - action = QtWidgets.QAction(QIcon(':/icons/exit.png'), '清空') + action = QtWidgets.QAction(IconInstance().EXCIT, '清空') action.triggered.connect(self.clear) rightMenu.addAction(action) diff --git a/rscder/gui/plugins.py b/rscder/gui/plugins.py index bd9d01a..c1b5ce3 100644 --- a/rscder/gui/plugins.py +++ b/rscder/gui/plugins.py @@ -5,14 +5,15 @@ from PyQt5.QtWidgets import * from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt from rscder.plugins.loader import PluginLoader +from rscder.utils.icons import IconInstance from rscder.utils.setting import Settings class PluginDialog(QDialog): def __init__(self, parent=None): super().__init__(parent) - self.setWindowTitle('Plugins') - self.setWindowIcon(QIcon(":/icons/logo.png")) + self.setWindowTitle('插件') + self.setWindowIcon(IconInstance().PLUGINS) self.setMinimumWidth(900) self.setMinimumHeight(600) self.plugins = list(Settings.Plugin().plugins) @@ -21,7 +22,7 @@ class PluginDialog(QDialog): self.plugin_table.setSelectionMode(QAbstractItemView.ExtendedSelection) self.plugin_table.setColumnWidth(0, 200) self.plugin_table.setColumnWidth(1, 500) - self.plugin_table.setHorizontalHeaderLabels(['Name', 'Module', 'Enabled']) + self.plugin_table.setHorizontalHeaderLabels(['名称', '模块ID', '启用']) self.plugin_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.plugin_table.cellDoubleClicked.connect(self.edit_plugin) for idx, plugin in enumerate(self.plugins): @@ -34,13 +35,13 @@ class PluginDialog(QDialog): self.plugin_table.setItem(idx, 1, module_item) self.plugin_table.setItem(idx, 2, enabled_item) - self.add_button = QPushButton('Add', self) + self.add_button = QPushButton('添加', self) self.add_button.clicked.connect(self.add_plugin) - self.remove_button = QPushButton('Remove', self) + self.remove_button = QPushButton('移除', self) self.remove_button.clicked.connect(self.remove_plugin) - self.save_button = QPushButton('Save', self) + self.save_button = QPushButton('保存', self) self.save_button.clicked.connect(self.save_plugin) - self.cancel_button = QPushButton('Cancel', self) + self.cancel_button = QPushButton('取消', self) self.cancel_button.clicked.connect(self.close) layout = QVBoxLayout(self) @@ -74,7 +75,7 @@ class PluginDialog(QDialog): self.plugin_table.insertRow(self.plugin_table.rowCount()) name_item = QTableWidgetItem(info['name']) - name_item.setIcon(QIcon(':/icons/tools.png')) + name_item.setIcon(IconInstance().TOOLBOX) module_item = QTableWidgetItem(info['module']) enabled_item = QTableWidgetItem('启用') enabled_item.setCheckState(Qt.Checked) diff --git a/rscder/gui/project.py b/rscder/gui/project.py index 1f3a429..bc14347 100644 --- a/rscder/gui/project.py +++ b/rscder/gui/project.py @@ -2,6 +2,7 @@ from pathlib import Path from PyQt5.QtWidgets import QDialog, QFileDialog, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, QMessageBox from PyQt5.QtGui import QIcon, QIntValidator from PyQt5.QtCore import Qt +from rscder.utils.icons import IconInstance from rscder.utils.project import Project from rscder.utils.setting import Settings @@ -10,7 +11,7 @@ class Create(QDialog): def __init__(self, parent=None) -> None: super().__init__(parent) self.setWindowTitle(self.tr('创建项目')) - self.setWindowIcon(QIcon(":/icons/logo.png")) + self.setWindowIcon(IconInstance().LOGO) self.file = str(Path(Settings.General().last_path)) self.name = '未命名' diff --git a/rscder/mul/mulstart.py b/rscder/mul/mulstart.py index 55b4838..1d89290 100644 --- a/rscder/mul/mulstart.py +++ b/rscder/mul/mulstart.py @@ -27,7 +27,7 @@ class MulStart: # pyrcc5 res.qrc -o rc.py - import rscder.rc + # import rscder.rc app = QgsApplication([], True) QgsApplication.initQgis() @@ -38,7 +38,7 @@ class MulStart: else: sys.exit(0) # Create and display the splash screen - splash_pix = QPixmap(':/icons/splash.png') + splash_pix = QPixmap("./icons/splash.png") # splash_pix.scaledToWidth(800) # splash_pix.scaledToHeight(600) diff --git a/rscder/plugins/basic.py b/rscder/plugins/basic.py index f1de42b..af9a62d 100644 --- a/rscder/plugins/basic.py +++ b/rscder/plugins/basic.py @@ -1,5 +1,5 @@ from PyQt5.QtCore import QObject, pyqtSignal -from rscder.utils.project import PairLayer +from rscder.utils.project import PairLayer, Project class BasicPlugin(QObject): @@ -34,11 +34,9 @@ class BasicPlugin(QObject): self.pair_canvas = ctx['pair_canvas'] self.message_box = ctx['message_box'] self.result_table = ctx['result_table'] - self.project = ctx['project'] self.mainwindow = ctx['mainwindow'] self.set_action() - # self.project.layer_load.connect(self.on_data_load) - self.project.project_init.connect(self.setup) + Project().project_init.connect(self.setup) self.send_message.connect(self.message_box.info) diff --git a/rscder/utils/generate_rc.py b/rscder/utils/generate_rc.py deleted file mode 100644 index 1047b2d..0000000 --- a/rscder/utils/generate_rc.py +++ /dev/null @@ -1,15 +0,0 @@ -import shutil -import subprocess -import os -path = os.path.dirname(os.path.realpath(__file__)) -icon_path = os.path.join(path, '..', 'icons') -with open(os.path.join(path, '..', 'res.qrc'), 'w') as f: - f.write(f'\n') - f.write(f' \n') - for icon in os.listdir(icon_path): - f.write(f' {os.path.join("icons", icon)}\n') - f.write(f' \n') - f.write(f'\n') - -subprocess.run(['pyrcc5', 'res.qrc', '-o', 'rc.py'], cwd=os.path.join(path, '..')) -shutil.rmtree(icon_path) \ No newline at end of file diff --git a/rscder/utils/icons.py b/rscder/utils/icons.py index e5e494a..e307cbf 100644 --- a/rscder/utils/icons.py +++ b/rscder/utils/icons.py @@ -8,6 +8,48 @@ class IconInstance(QObject): def __init__(self, parent) -> None: super().__init__(parent) - self.GRID_ON = QIcon(':/icons/grid.png') - self.TABLE = QIcon(':/icons/table.png') - self.DELETE = QIcon(':/icons/delete.png') \ No newline at end of file + self.GRID_ON = QIcon('./icons/格网开.png') + self.AI_DETECT = QIcon('./icons/AI变化检测.png') + self.EVALUATION = QIcon('./icons/精度评估.png') + self.SPLASH = QIcon('./icons/splash.png') + self.HELP = QIcon('./icons/帮助.png') + self.LOGO = QIcon('./icons/变化检测.png') + self.CHANGE = QIcon('./icons/变化检测.png') + self.OK = QIcon('./icons/ok.svg') + self.CANCEL = QIcon('./icons/cancel.svg') + self.PLUGINS = QIcon('./icons/插件配置.png') + self.CREATE = QIcon('./icons/创建工程.png') + self.OPEN = QIcon('./icons/打开工程.png') + self.SAVE = QIcon('./icons/工程保存.png') + self.TOOLS = QIcon('./icons/工具.png') + self.TOOLBOX = QIcon('./icons/工具箱.png') + self.LOCATION = QIcon('./icons/定位.png') + self.UNSUPERVISED = QIcon('./icons/非监督.png') + self.ROAD_CHANGE = QIcon('./icons/道路变化.png') + self.LANDSIDE = QIcon('./icons/海岸变化.png') + self.SUPERVISED = QIcon('./icons/监督.png') + self.VIEW_SETTING = QIcon('./icons/视图设置.png') + self.FILTER = QIcon('./icons/滤波.png') + self.PAN = QIcon('./icons/平移.png') + self.CLOUD_REMOVE = QIcon('./icons/去云.png') + self.WEAK_SUPERVISED = QIcon('./icons/弱监督.png') + self.DELETE = QIcon('./icons/删除.png') + self.VECTOR = QIcon('./icons/矢量.png') + self.WATER_CHANGE = QIcon('./icons/水体变化.png') + self.ZOOM_TO = QIcon('./icons/缩放到.png') + + self.LAYER = QIcon('./icons/图层.png') + self.GRID_OFF = QIcon('./icons/格网关闭.png') + self.DOCUMENT = QIcon('./icons/文档.png') + self.FILE = QIcon('./icons/文件.png') + self.SELECT = QIcon('./icons/选择要素.png') + self.RASTER = QIcon('./icons/影像.png') + self.VEGETATION = QIcon('./icons/植被变化.png') + self.NOISE = QIcon('./icons/噪声处理.png') + + self.DATA_LOAD = QIcon('./icons/数据加载.png') + + self.EXCIT = QIcon('./icons/退出.png') + + self.ZOOM_IN = QIcon('./icons/放大.png') + self.ZOOM_OUT = QIcon('./icons/缩小.png') \ No newline at end of file diff --git a/rscder/utils/project.py b/rscder/utils/project.py index e43ff63..5b02675 100644 --- a/rscder/utils/project.py +++ b/rscder/utils/project.py @@ -269,7 +269,7 @@ class BasicLayer(QObject): item = QTreeWidgetItem(root) if self.icon is not None: - item.setIcon(0, QIcon(self.icon)) + item.setIcon(0, self.icon) item.setText(0, self.name) item.setCheckState(0, Qt.Checked if self.enable else Qt.Unchecked) item.item_update = self.item_update @@ -331,7 +331,7 @@ class GridLayer(BasicLayer): def __init__(self, proj, geo, x_size, y_size, enable=True, name='格网', cell_size=(100,100), style_opts={}): - super().__init__(name, enable, icon='') + super().__init__(name, enable, icon=IconInstance().GRID_ON) self.cell_size = cell_size self.proj = proj @@ -388,7 +388,7 @@ class RasterLayer(BasicLayer): def __init__(self, name=None, enable=False, path=None, view_mode=BasicLayer.BOATH_VIEW,style_info={'r':3,'g':2,'b':1,'NIR':3}): if name is None: name = os.path.splitext(os.path.basename(path))[0] - super().__init__(name, enable, ':/icons/raster.png', path, BasicLayer.IN_FILE, view_mode) + super().__init__(name, enable, IconInstance().RASTER, path, BasicLayer.IN_FILE, view_mode) self.layer = QgsRasterLayer(self.path, self.name) self.style_info=style_info self.apply_style() @@ -461,7 +461,7 @@ class ResultPointLayer(BasicLayer): def __init__(self, path, name=None, enable = False, proj = None, geo = None): if name is None: name = os.path.splitext(os.path.basename(path))[0] - super().__init__(name, enable, icon=':/icons/points.png', path=path, path_mode = BasicLayer.IN_FILE, view_mode=BasicLayer.BOATH_VIEW ) + super().__init__(name, enable, icon=IconInstance().VECTOR, path=path, path_mode = BasicLayer.IN_FILE, view_mode=BasicLayer.BOATH_VIEW ) self.data = None self.wkt = proj self.geo = geo @@ -616,7 +616,7 @@ class PairLayer(BasicLayer): name = os.path.basename(pth1)[:4] + '-' + os.path.basename(pth2)[:4] # self.layer_update.connect(Project().layer_updated) - super().__init__(name, True, ':/icons/document.png') + super().__init__(name, True, IconInstance().DOCUMENT) self.layer = self.main_l1.layer if self.check(): self.geo = self.main_l1.geo