Merge remote-tracking branch 'origin/dev-eagle'
This commit is contained in:
commit
7efba2619a
89
rscder/gui/eagle_eye.py
Normal file
89
rscder/gui/eagle_eye.py
Normal file
@ -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
|
@ -1,5 +1,5 @@
|
|||||||
import pdb
|
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.QtCore import Qt, QSize, QSettings, pyqtSignal
|
||||||
from PyQt5.QtGui import QIcon
|
from PyQt5.QtGui import QIcon
|
||||||
from PyQt5 import QtGui
|
from PyQt5 import QtGui
|
||||||
@ -14,7 +14,7 @@ from rscder.utils import Settings
|
|||||||
from rscder.utils.icons import IconInstance
|
from rscder.utils.icons import IconInstance
|
||||||
from rscder.utils.project import Project
|
from rscder.utils.project import Project
|
||||||
from rscder.gui.layercombox import LayerCombox
|
from rscder.gui.layercombox import LayerCombox
|
||||||
|
from rscder.gui.eagle_eye import eagleEye
|
||||||
import skimage
|
import skimage
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import sys
|
import sys
|
||||||
@ -37,7 +37,9 @@ class MainWindow(QMainWindow):
|
|||||||
self.double_map,
|
self.double_map,
|
||||||
self.layer_tree,
|
self.layer_tree,
|
||||||
self.message_box,
|
self.message_box,
|
||||||
self.result_box)
|
self.result_box,
|
||||||
|
self.eye
|
||||||
|
)
|
||||||
|
|
||||||
self.result_box.on_item_click.connect(self.double_map.zoom_to_extent)
|
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.follow_box = QWidget(self)
|
||||||
self.eye_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.setContextMenuPolicy(Qt.CustomContextMenu)
|
||||||
left_tool_box.addItem(self.layer_tree, self.tr("图层控制"))
|
left_tool_box.addItem(self.layer_tree, self.tr("图层控制"))
|
||||||
left_tool_box.addItem(self.follow_box, self.tr("检测流程"))
|
left_tool_box.addItem(self.follow_box, self.tr("检测流程"))
|
||||||
|
@ -25,7 +25,7 @@ from rscder.utils.project import BasicLayer, PairLayer, Project
|
|||||||
class DoubleCanvas(QWidget):
|
class DoubleCanvas(QWidget):
|
||||||
corr_changed = pyqtSignal(str)
|
corr_changed = pyqtSignal(str)
|
||||||
scale_changed = pyqtSignal(str)
|
scale_changed = pyqtSignal(str)
|
||||||
|
extent=pyqtSignal(object)
|
||||||
def __init__(self, parent = None) -> None:
|
def __init__(self, parent = None) -> None:
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.setAcceptDrops(False)
|
self.setAcceptDrops(False)
|
||||||
@ -44,10 +44,11 @@ class DoubleCanvas(QWidget):
|
|||||||
def set_map2_extent():
|
def set_map2_extent():
|
||||||
if self.mapcanva1.is_main:
|
if self.mapcanva1.is_main:
|
||||||
self.mapcanva2.set_extent(self.mapcanva1.extent())
|
self.mapcanva2.set_extent(self.mapcanva1.extent())
|
||||||
|
def sent_extent():
|
||||||
|
self.extent.emit(self.mapcanva1.extent())
|
||||||
self.mapcanva1.extentsChanged.connect(set_map2_extent)
|
self.mapcanva1.extentsChanged.connect(set_map2_extent)
|
||||||
self.mapcanva2.extentsChanged.connect(set_map1_extent)
|
self.mapcanva2.extentsChanged.connect(set_map1_extent)
|
||||||
|
self.mapcanva1.extentsChanged.connect(sent_extent)
|
||||||
self.set_pan_tool(True)
|
self.set_pan_tool(True)
|
||||||
|
|
||||||
self.mapcanva1.update_scale_text.connect(self.scale_changed)
|
self.mapcanva1.update_scale_text.connect(self.scale_changed)
|
||||||
@ -88,7 +89,7 @@ class DoubleCanvas(QWidget):
|
|||||||
layer_list_2 = []
|
layer_list_2 = []
|
||||||
for layer in layers.values():
|
for layer in layers.values():
|
||||||
if layer.enable:
|
if layer.enable:
|
||||||
if layer.grid.enable and self.grid_show:
|
if layer.grid.enable :
|
||||||
layer_list_1.append(layer.grid.layer)
|
layer_list_1.append(layer.grid.layer)
|
||||||
layer_list_2.append(layer.grid.layer)
|
layer_list_2.append(layer.grid.layer)
|
||||||
|
|
||||||
@ -128,6 +129,7 @@ class CanvasWidget(QgsMapCanvas):
|
|||||||
self.layers.insert(0, layer)
|
self.layers.insert(0, layer)
|
||||||
self.setLayers(self.layers)
|
self.setLayers(self.layers)
|
||||||
self.zoomToFeatureExtent(layer.extent())
|
self.zoomToFeatureExtent(layer.extent())
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
def add_grid_layer(self, layer):
|
def add_grid_layer(self, layer):
|
||||||
self.grid_layers.append(layer)
|
self.grid_layers.append(layer)
|
||||||
@ -160,7 +162,8 @@ class CanvasWidget(QgsMapCanvas):
|
|||||||
if self.is_main:
|
if self.is_main:
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
self.zoomToFeatureExtent(extent)
|
self.setExtent(extent)
|
||||||
|
self.refresh()#zoomToFeatureExtent 源码里是rect.scale( 1.05 );setExtent( rect );放大1.05倍
|
||||||
|
|
||||||
def clear(self) -> None:
|
def clear(self) -> None:
|
||||||
self.setTheme('')
|
self.setTheme('')
|
||||||
|
@ -83,7 +83,8 @@ class Project(QObject):
|
|||||||
pair_canvas,
|
pair_canvas,
|
||||||
layer_tree,
|
layer_tree,
|
||||||
message_box,
|
message_box,
|
||||||
result_table):
|
result_table,
|
||||||
|
eye):
|
||||||
self.pair_canvas = pair_canvas
|
self.pair_canvas = pair_canvas
|
||||||
self.layer_tree = layer_tree
|
self.layer_tree = layer_tree
|
||||||
self.message_box = message_box
|
self.message_box = message_box
|
||||||
@ -91,6 +92,8 @@ class Project(QObject):
|
|||||||
IconInstance(self)
|
IconInstance(self)
|
||||||
self.layer_tree_update.connect(layer_tree.update_layer)
|
self.layer_tree_update.connect(layer_tree.update_layer)
|
||||||
self.layer_show_update.connect(pair_canvas.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_tree_update.connect(self.run_auto_save)
|
||||||
self.layer_show_update.connect(self.run_auto_save)
|
self.layer_show_update.connect(self.run_auto_save)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user