From 48a1f0a0855bdd2a294d138e0de86c80501a831a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E6=B2=88=E6=98=8A?= Date: Sun, 29 May 2022 18:26:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=B9=B0=E7=9C=BC=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rscder/gui/eagle_eye.py | 89 ++++++++++++++++++++++++++++++++++++++++ rscder/gui/mainwindow.py | 13 ++++-- rscder/gui/mapcanvas.py | 13 +++--- rscder/utils/project.py | 5 ++- 4 files changed, 111 insertions(+), 9 deletions(-) create mode 100644 rscder/gui/eagle_eye.py diff --git a/rscder/gui/eagle_eye.py b/rscder/gui/eagle_eye.py new file mode 100644 index 0000000..697cb49 --- /dev/null +++ b/rscder/gui/eagle_eye.py @@ -0,0 +1,89 @@ +from PyQt5.QtCore import QSettings, QUrl, pyqtSignal, Qt, QVariant +from PyQt5.QtWidgets import QMessageBox, QWidget, QHBoxLayout +from PyQt5.QtGui import QColor, QDragEnterEvent, QDropEvent +from qgis.core import QgsGeometry, QgsRectangle +from qgis.gui import QgsMapCanvas,QgsRubberBand,QgsMapToolEmitPoint +from qgis.core import QgsRectangle,QgsPoint +from rscder.utils.project import BasicLayer, PairLayer, Project +class RectangleMapTool(QgsMapToolEmitPoint): + def __init__(self, canvas,color,witdth): + self.canvas = canvas + QgsMapToolEmitPoint.__init__(self, self.canvas) + self.rubberBand = QgsRubberBand(self.canvas, True) + self.rubberBand.setColor(color) + self.rubberBand.setWidth(witdth) + self.reset() + self.Extent=0 + def reset(self): + self.startPoint = self.endPoint = None + self.isEmittingPoint = False + self.rubberBand.reset(True) + def draw_extent(self,extent): + point1 = QgsPoint(extent.xMinimum(), extent.yMinimum()) + point2 = QgsPoint(extent.xMaximum(), extent.yMinimum()) + point3 = QgsPoint(extent.xMaximum(), extent.yMaximum()) + point4 = QgsPoint(extent.xMinimum(), extent.yMaximum()) + points=[point1,point2,point3,point4,point1] + self.rubberBand.setToGeometry(QgsGeometry.fromPolyline(points), None) + self.rubberBand.show() + +class eagleEye(QgsMapCanvas): + extent=pyqtSignal(object) + def __init__(self, parent): + super().__init__(parent) + self.layers = [] + self.grid_layers = [] + self.is_main = False + self.setCanvasColor(Qt.white) + self.enableAntiAliasing(True) + self.setAcceptDrops(False) + self.Extent=0 + self.changing=False + self.rubber=RectangleMapTool(self,Qt.yellow,1) + + + + def update_layer(self): + layers = Project().layers + layer_list_1 = [] + for layer in layers.values(): + if layer.enable: + for sub_layer in layer.layers: + if sub_layer.enable: + if sub_layer.view_mode == BasicLayer.LEFT_VIEW: + layer_list_1.append(sub_layer.layer) + elif sub_layer.view_mode == BasicLayer.BOATH_VIEW: + layer_list_1.append(sub_layer.layer) + self.setLayers(layer_list_1) + self.zoomToFeatureExtent(layer_list_1[0].extent()) + + def draw_extent(self,extent): + self.Extent=extent + self.rubber.draw_extent(self.Extent) + + + def reset_extent(self,center): + if not self.Extent: + return + center=self.rubber.toMapCoordinates(center) + x=(self.Extent.xMaximum()-self.Extent.xMinimum())//2 + y=(self.Extent.yMaximum()-self.Extent.yMinimum())//2 + self.Extent=QgsRectangle(center.x()-x,center.y()-y,center.x()+x,center.y()+y) + self.draw_extent(self.Extent) + + def mousePressEvent(self,e): + if not self.Extent: + return + self.changing=True + self.reset_extent(e.pos()) + self.extent.emit(self.Extent) + def mouseMoveEvent(self,e): + if self.changing: + self.reset_extent(e.pos()) + self.extent.emit(self.Extent) + + def mouseReleaseEvent(self,e): + self.changing=False + + def wheelEvent(self,e): + pass \ No newline at end of file diff --git a/rscder/gui/mainwindow.py b/rscder/gui/mainwindow.py index bbba437..919cc39 100644 --- a/rscder/gui/mainwindow.py +++ b/rscder/gui/mainwindow.py @@ -1,5 +1,5 @@ import pdb -from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow, QToolBox +from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow, QToolBox,QVBoxLayout from PyQt5.QtCore import Qt, QSize, QSettings, pyqtSignal from PyQt5.QtGui import QIcon from PyQt5 import QtGui @@ -14,7 +14,7 @@ from rscder.utils import Settings from rscder.utils.icons import IconInstance from rscder.utils.project import Project from rscder.gui.layercombox import LayerCombox - +from rscder.gui.eagle_eye import eagleEye import skimage import numpy as np import sys @@ -37,7 +37,9 @@ class MainWindow(QMainWindow): self.double_map, self.layer_tree, self.message_box, - self.result_box) + self.result_box, + self.eye + ) self.result_box.on_item_click.connect(self.double_map.zoom_to_extent) @@ -92,6 +94,11 @@ class MainWindow(QMainWindow): self.follow_box = QWidget(self) self.eye_box = QWidget(self) + self.eye=eagleEye(self) + self.double_map.extent.connect(self.eye.draw_extent) + eyeLayout=QVBoxLayout() + eyeLayout.addWidget(self.eye,Qt.AlignCenter) + self.eye_box.setLayout(eyeLayout) left_tool_box.setContextMenuPolicy(Qt.CustomContextMenu) left_tool_box.addItem(self.layer_tree, self.tr("图层控制")) left_tool_box.addItem(self.follow_box, self.tr("检测流程")) diff --git a/rscder/gui/mapcanvas.py b/rscder/gui/mapcanvas.py index dc12353..2219cf7 100644 --- a/rscder/gui/mapcanvas.py +++ b/rscder/gui/mapcanvas.py @@ -25,7 +25,7 @@ from rscder.utils.project import BasicLayer, PairLayer, Project class DoubleCanvas(QWidget): corr_changed = pyqtSignal(str) scale_changed = pyqtSignal(str) - + extent=pyqtSignal(object) def __init__(self, parent = None) -> None: super().__init__(parent) self.setAcceptDrops(False) @@ -44,10 +44,11 @@ class DoubleCanvas(QWidget): def set_map2_extent(): if self.mapcanva1.is_main: self.mapcanva2.set_extent(self.mapcanva1.extent()) - + def sent_extent(): + self.extent.emit(self.mapcanva1.extent()) self.mapcanva1.extentsChanged.connect(set_map2_extent) self.mapcanva2.extentsChanged.connect(set_map1_extent) - + self.mapcanva1.extentsChanged.connect(sent_extent) self.set_pan_tool(True) self.mapcanva1.update_scale_text.connect(self.scale_changed) @@ -88,7 +89,7 @@ class DoubleCanvas(QWidget): layer_list_2 = [] for layer in layers.values(): if layer.enable: - if layer.grid.enable and self.grid_show: + if layer.grid.enable : layer_list_1.append(layer.grid.layer) layer_list_2.append(layer.grid.layer) @@ -128,6 +129,7 @@ class CanvasWidget(QgsMapCanvas): self.layers.insert(0, layer) self.setLayers(self.layers) self.zoomToFeatureExtent(layer.extent()) + self.refresh() def add_grid_layer(self, layer): self.grid_layers.append(layer) @@ -160,7 +162,8 @@ class CanvasWidget(QgsMapCanvas): if self.is_main: return else: - self.zoomToFeatureExtent(extent) + self.setExtent(extent) + self.refresh()#zoomToFeatureExtent 源码里是rect.scale( 1.05 );setExtent( rect );放大1.05倍 def clear(self) -> None: self.setTheme('') diff --git a/rscder/utils/project.py b/rscder/utils/project.py index 5b02675..efb5a28 100644 --- a/rscder/utils/project.py +++ b/rscder/utils/project.py @@ -83,7 +83,8 @@ class Project(QObject): pair_canvas, layer_tree, message_box, - result_table): + result_table, + eye): self.pair_canvas = pair_canvas self.layer_tree = layer_tree self.message_box = message_box @@ -91,6 +92,8 @@ class Project(QObject): IconInstance(self) self.layer_tree_update.connect(layer_tree.update_layer) self.layer_show_update.connect(pair_canvas.update_layer) + self.layer_show_update.connect(eye.update_layer) + eye.extent.connect(pair_canvas.zoom_to_extent) self.layer_tree_update.connect(self.run_auto_save) self.layer_show_update.connect(self.run_auto_save)