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 @@
-
-
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