113 lines
4.6 KiB
Python
113 lines
4.6 KiB
Python
|
|
import logging
|
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
from PyQt5.QtCore import Qt,QModelIndex, pyqtSignal
|
|
from PyQt5.QtGui import QStandardItemModel, QStandardItem
|
|
from PyQt5.QtWidgets import (QTableWidgetItem, QTableWidget, QMessageBox, QAbstractItemView, QHeaderView, QStyleFactory)
|
|
from qgis.core import QgsRectangle
|
|
from rscder.utils.project import PairLayer, Project, ResultPointLayer
|
|
|
|
class ResultTable(QtWidgets.QWidget):
|
|
|
|
on_item_click = pyqtSignal(QgsRectangle)
|
|
on_item_changed = pyqtSignal(dict)
|
|
|
|
def __init__(self, parent=None):
|
|
super(ResultTable, self).__init__(parent)
|
|
# self.tableview = QTableView(self)
|
|
self.tablewidget = QTableWidget(self)
|
|
self.tablewidget.setColumnCount(3)
|
|
self.tablewidget.setRowCount(0)
|
|
self.tablewidget.setHorizontalHeaderLabels(['变化位置(x,y)', '疑似变化概率', '目视判读'])
|
|
self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
|
|
|
|
self.tablewidget.cellClicked.connect(self.onClicked)
|
|
# self.tablewidget.cellClicked.connect(self.onClicked)
|
|
self.tablewidget.cellChanged.connect(self.onChanged)
|
|
layout = QtWidgets.QVBoxLayout(self)
|
|
layout.addWidget(self.tablewidget)
|
|
self.setLayout(layout)
|
|
self.result = None
|
|
self.is_in_set_data = False
|
|
self.no_change = False
|
|
|
|
def clear(self):
|
|
self.tablewidget.clear()
|
|
self.tablewidget.setColumnCount(3)
|
|
self.tablewidget.setRowCount(0)
|
|
self.tablewidget.setHorizontalHeaderLabels(['变化位置(x,y)', '疑似变化概率', '目视判读'])
|
|
|
|
def onChanged(self, row, col):
|
|
if self.is_in_set_data or self.no_change:
|
|
return
|
|
if col == 2:
|
|
self.no_change = True
|
|
item_idx = row
|
|
item_status = self.tablewidget.item(row, col).checkState() == Qt.Checked
|
|
if item_status:
|
|
self.tablewidget.item(row, col).setBackground(Qt.yellow)
|
|
self.tablewidget.item(row, col).setText('YES')
|
|
else:
|
|
self.tablewidget.item(row, col).setBackground(Qt.green)
|
|
self.tablewidget.item(row, col).setText('NO')
|
|
# logging
|
|
# logging.info()
|
|
self.result.update({'row':item_idx, 'value':item_status})
|
|
self.no_change = False
|
|
|
|
def onClicked(self, row, col):
|
|
if col != 0:
|
|
return
|
|
data = self.result.data[row]
|
|
x = data[0]
|
|
y = data[1]
|
|
xres = self.result.layer_parent.geo[1]
|
|
yres = self.result.layer_parent.geo[5]
|
|
cell_size = self.result.layer_parent.cell_size
|
|
x_min = x - xres * cell_size[0]
|
|
x_max = x + xres * cell_size[0]
|
|
y_min = y - yres * cell_size[1]
|
|
y_max = y + yres * cell_size[1]
|
|
extent = QgsRectangle(x_min, y_min, x_max, y_max)
|
|
|
|
self.on_item_click.emit(extent)
|
|
|
|
def save(self):
|
|
if self.result is None:
|
|
return
|
|
self.result.save()
|
|
|
|
def on_result(self, layer_id, result_id):
|
|
self.is_in_set_data = True
|
|
result = Project().layers[layer_id].results[result_id]
|
|
if result != self.result:
|
|
self.save()
|
|
self.result = result
|
|
self.clear()
|
|
self.show_result(result)
|
|
|
|
def show_result(self, data:ResultPointLayer):
|
|
self.is_in_set_data = True
|
|
self.result = data
|
|
self.tablewidget.setRowCount(len(data.data))
|
|
# print(len(data.data))
|
|
self.tablewidget.setVerticalHeaderLabels([ str(i+1) for i in range(len(data.data))])
|
|
for i, d in enumerate(data.data):
|
|
self.tablewidget.setItem(i, 0, QTableWidgetItem('%.3f,%.3f'%(d[0], d[1]))) # X
|
|
self.tablewidget.setItem(i, 1, QTableWidgetItem('%.2f'%d[2])) # Y
|
|
status_item = QTableWidgetItem('')
|
|
if d[3] == 0:
|
|
status_item.setBackground(Qt.green)
|
|
status_item.setCheckState(Qt.Unchecked)
|
|
status_item.setText('NO')
|
|
elif d[3] == 1:
|
|
status_item.setBackground(Qt.yellow)
|
|
status_item.setCheckState(Qt.Checked)
|
|
status_item.setText('YES')
|
|
self.tablewidget.setItem(i, 2, status_item) # 变化
|
|
self.tablewidget.resizeColumnsToContents()
|
|
self.tablewidget.resizeRowsToContents()
|
|
self.tablewidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
|
self.tablewidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
|
|
|
self.is_in_set_data = False |