pyqt/cal.py

556 lines
23 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
import os
import sys
from demo import *
from PyQt5.QtGui import QPen, QImage, QCursor
from PyQt5.QtWidgets import QWidget, QApplication, QFileDialog, \
QMainWindow
from PyQt5.Qt import QPixmap, QPoint, Qt, QPainter
from libs.canvas import Canvas
from libs.tools import line_intersection, str_tuple, norm
def read(filename, default=None):
try:
with open(filename, 'rb') as f:
return f.read()
except:
return default
class ImageBox(QWidget):
def __init__(self):
super(ImageBox, self).__init__()
self.img = None
self.scaled_img = None
self.start_pos = QPoint(0, 0)
self.end_pos = QPoint(0, 0)
self.left_click = False
self.wheel_flag = False
self.scale = 1
self.old_scale = 1
self.point = QPoint(0, 0)
self.x = -1
self.y = -1
self.new_height = -1
self.new_width = -1
def init_ui(self):
self.setWindowTitle("ImageBox")
def set_image(self, img_path):
self.img = QPixmap(img_path)
print(type(img_path))
global path_img
path_img = img_path
width, height = self.img.width(), self.img.height()
if height / width > 1000 / 1800:
new_height = 1000
new_width = width * 1000 / height
else:
new_height = height * 1800 / width
new_width = 1800
self.point = QPoint(int((1800 - new_width) * 0.5), int((1000 - new_height) * 0.5))
self.img = self.img.scaled(new_width, new_height, Qt.KeepAspectRatio)
self.scaled_img = self.img
self.new_height = new_height
self.new_width = new_width
self.scale = 1
# def set_image(self, img_path):
# self.img = QPixmap(img_path)
# print(type(img_path))
# global path_img
# path_img = img_path
# width, height = self.img.width(), self.img.height()
# if height / width > 990 / 660:
# new_height = 990
# new_width = width * 990 / height
# else:
# new_height = height * 660 / width
# new_width = 660
# self.point = QPoint(int((660 - new_width) * 0.5), int((990 - new_height) * 0.5))
# self.img = self.img.scaled(new_width, new_height, Qt.KeepAspectRatio)
# self.scaled_img = self.img
#
# self.new_height = new_height
# self.new_width = new_width
# self.scale = 1
def paintEvent(self, e):
if self.scaled_img:
painter = QPainter(self)
painter.begin(self)
# 设置画笔的颜色, 字体大小, 线的实心样式
pen = QPen(Qt.red, 3)
painter.setPen(pen)
painter.scale(self.scale, self.scale)
if self.wheel_flag: # 定点缩放
self.wheel_flag = False
# 判断当前鼠标pos在不在图上
this_left_x = self.point.x() * self.old_scale
this_left_y = self.point.y() * self.old_scale
this_scale_width = self.new_width * self.old_scale
this_scale_height = self.new_height * self.old_scale
# 鼠标点在图上,以鼠标点为中心动作
gap_x = self.x - this_left_x
gap_y = self.y - this_left_y
if 0 < gap_x < this_scale_width and 0 < gap_y < this_scale_height:
new_left_x = int(self.x / self.scale - gap_x / self.old_scale)
new_left_y = int(self.y / self.scale - gap_y / self.old_scale)
self.point = QPoint(new_left_x, new_left_y)
# 鼠标点不在图上,固定左上角进行缩放
else:
true_left_x = int(self.point.x() * self.old_scale / self.scale)
true_left_y = int(self.point.y() * self.old_scale / self.scale)
self.point = QPoint(true_left_x, true_left_y)
painter2 = QPainter(self.scaled_img)
painter2.drawLine(self.start_pos, self.end_pos)
# self.start_pos = self.end_pos
# painter.drawPoint(self.start_pos)
# painter2 = QPainter(self)
painter.drawPixmap(0, 0, self.scaled_img) # 此函数中还会用scale对point进行处理
painter.end()
def wheelEvent(self, event):
angle = event.angleDelta() / 8 # 返回QPoint对象为滚轮转过的数值单位为1/8度
angleY = angle.y()
self.old_scale = self.scale
self.x, self.y = event.x(), event.y()
self.wheel_flag = True
# 获取当前鼠标相对于view的位置
if angleY > 0:
self.scale *= 1.08
else: # 滚轮下滚
self.scale *= 0.92
if self.scale < 0.3:
self.scale = 0.3
self.adjustSize()
self.update()
def mouseMoveEvent(self, e):
if self.left_click:
self.end_pos = e.pos()
self.update()
# if self.left_click:
# self.end_pos = e.pos() - self.start_pos # 当前位置-起始位置=差值
# self.point = self.point + self.end_pos / self.scale # 左上角的距离变化
# self.start_pos = e.pos()
# self.repaint()
def mousePressEvent(self, e):
if e.button() == Qt.LeftButton:
self.left_click = True
self.start_pos = e.pos()
def mouseReleaseEvent(self, e):
if e.button() == Qt.LeftButton:
self.left_click = False
self.end_pos = e.pos()
self.update()
class MyWindow(Ui_MainWindow, QMainWindow):
def __init__(self):
super().__init__()
self.height = None
self.width = None
self.length = None
self.setupUi(self)
self.init_ui()
def init_ui(self):
self.canvas = Canvas()
self.canvas.zoomRequest.connect(self.zoomRequest)
self.scrollArea.setWidget(self.canvas)
self.scrollArea.setWidgetResizable(True)
self.scrollBars = {
Qt.Vertical: self.scrollArea.verticalScrollBar(),
Qt.Horizontal: self.scrollArea.horizontalScrollBar()
}
self.adjustZoomSlider.valueChanged.connect(self.adjustZoom)
self.canvas.scrollRequest.connect(self.scrollRequest)
self.canvas.newShape.connect(self.newShape)
# self.canvas.shapeMoved.connect(self.setDirty)
# self.canvas.selectionChanged.connect(self.shapeSelectionChanged)
self.canvas.drawingPolygon.connect(self.toggleDrawingSensitive)
self.canvas.updateData.connect(self.updateData)
self.itemsToShapes = {}
self.shapesToItems = {}
# Application state.
self.image = QImage()
self.original_image = QImage()
self.open_file.clicked.connect(self.open_image)
self.btn1.clicked.connect(self.push_btn1)
self.btn2.clicked.connect(self.push_btn2)
self.btn3.clicked.connect(self.push_btn3)
self.btn4.clicked.connect(self.push_btn4)
self.btn5.clicked.connect(self.push_btn5)
self.btn6.clicked.connect(self.push_btn6)
self.btn7.clicked.connect(self.push_btn7)
self.btn8.clicked.connect(self.push_btn8)
self.btn9.clicked.connect(self.push_btn9)
self.btn10.clicked.connect(self.push_btn10)
self.btn_refLen1.clicked.connect(self.ref_len)
self.btn_refLen2.clicked.connect(self.ref_width)
self.btn_refheight.clicked.connect(self.ref_height)
self.btn_height.clicked.connect(self.cal_height)
self.btn_length.clicked.connect(self.cal_length)
self.btn_width.clicked.connect(self.cal_length)
def open_image(self):
try:
filename, _ = QFileDialog.getOpenFileName(None, "Open Image File", "", "All Files(*);;*.jpg;;*.png;;*.jpeg")
if filename:
if isinstance(filename, (tuple, list)):
filename = filename[0]
self.loadFile(filename)
except Exception as ex:
print(ex)
def adjustZoom(self, value):
self.adjustZoomNumLabel.setText(str.format("{value} %", value=value))
self.paintCanvas()
def scrollRequest(self, delta, orientation):
units = - delta / (8 * 15)
bar = self.scrollBars[orientation]
bar.setValue(bar.value() + bar.singleStep() * units)
def newShape(self):
"""Pop-up and give focus to the label editor.
position MUST be in global coordinates.
"""
self.canvas.setEditing(True)
def toggleDrawingSensitive(self, drawing=True):
"""In the middle of drawing, toggling between modes should be disabled."""
pass
def qpoint_tupleStr(self, qpoint):
return str((int(qpoint.x()), int(qpoint.y())))
def zoomRequest(self, delta):
# get the current scrollbar positions
# calculate the percentages ~ coordinates
h_bar = self.scrollBars[Qt.Horizontal]
v_bar = self.scrollBars[Qt.Vertical]
# get the current maximum, to know the difference after zooming
h_bar_max = h_bar.maximum()
v_bar_max = v_bar.maximum()
# get the cursor position and canvas size
# calculate the desired movement from 0 to 1
# where 0 = move left
# 1 = move right
# up and down analogous
cursor = QCursor()
pos = cursor.pos()
relative_pos = QWidget.mapFromGlobal(self, pos)
cursor_x = relative_pos.x()
cursor_y = relative_pos.y()
w = self.scrollArea.width()
h = self.scrollArea.height()
# the scaling from 0 to 1 has some padding
# you don't have to hit the very leftmost pixel for a maximum-left movement
margin = 0.1
move_x = (cursor_x - margin * w) / (w - 2 * margin * w)
move_y = (cursor_y - margin * h) / (h - 2 * margin * h)
# clamp the values from 0 to 1
move_x = min(max(move_x, 0), 1)
move_y = min(max(move_y, 0), 1)
# get the difference in scrollbar values
# this is how far we can move
d_h_bar_max = h_bar.maximum() - h_bar_max
d_v_bar_max = v_bar.maximum() - v_bar_max
# get the new scrollbar values
new_h_bar_value = h_bar.value() + move_x * d_h_bar_max
new_v_bar_value = v_bar.value() + move_y * d_v_bar_max
h_bar.setValue(new_h_bar_value)
v_bar.setValue(new_v_bar_value)
def resetState(self):
self.itemsToShapes.clear()
self.shapesToItems.clear()
self.canvas.resetState()
def loadFile(self, filePath=None):
"""Load the specified file"""
self.resetState()
self.canvas.setEnabled(False)
unicodeFilePath = str(filePath)
if unicodeFilePath and os.path.exists(unicodeFilePath):
# Load image:
# read data first and store for saving into label file.
imageData = read(unicodeFilePath, None)
image = QImage.fromData(imageData)
self.image = image
self.original_image = image
pixmap = QPixmap.fromImage(image)
self.canvas.loadPixmap(pixmap)
self.canvas.setEnabled(True)
# self.adjustScale()
self.paintCanvas()
return True
return False
def paintCanvas(self):
assert not self.image.isNull(), "cannot paint null image"
self.canvas.scale = 0.01 * self.adjustZoomSlider.value()
self.canvas.adjustSize()
self.canvas.update()
def updateData(self, x):
if x == 1:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
elif x == 2:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
self.beg2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[0]))
self.end2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[1]))
elif x == 3:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
self.beg2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[0]))
self.end2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[1]))
self.beg3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[0]))
self.end3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[1]))
elif x == 4:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
self.beg2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[0]))
self.end2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[1]))
self.beg3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[0]))
self.end3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[1]))
self.beg4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[0]))
self.end4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[1]))
elif x == 5:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
self.beg2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[0]))
self.end2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[1]))
self.beg3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[0]))
self.end3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[1]))
self.beg4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[0]))
self.end4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[1]))
self.beg7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[0]))
self.end7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[1]))
elif x == 6:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
self.beg2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[0]))
self.end2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[1]))
self.beg3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[0]))
self.end3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[1]))
self.beg4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[0]))
self.end4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[1]))
self.beg7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[0]))
self.end7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[1]))
self.beg8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[0]))
self.end8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[1]))
elif x == 7:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
self.beg2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[0]))
self.end2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[1]))
self.beg3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[0]))
self.end3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[1]))
self.beg4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[0]))
self.end4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[1]))
self.beg7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[0]))
self.end7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[1]))
self.beg8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[0]))
self.end8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[1]))
self.beg5.setText(self.qpoint_tupleStr(self.canvas.shapes[6].points[0]))
self.end5.setText(self.qpoint_tupleStr(self.canvas.shapes[6].points[1]))
elif x == 8:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
self.beg2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[0]))
self.end2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[1]))
self.beg3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[0]))
self.end3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[1]))
self.beg4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[0]))
self.end4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[1]))
self.beg7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[0]))
self.end7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[1]))
self.beg8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[0]))
self.end8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[1]))
self.beg5.setText(self.qpoint_tupleStr(self.canvas.shapes[6].points[0]))
self.end5.setText(self.qpoint_tupleStr(self.canvas.shapes[6].points[1]))
self.beg6.setText(self.qpoint_tupleStr(self.canvas.shapes[7].points[0]))
self.end6.setText(self.qpoint_tupleStr(self.canvas.shapes[7].points[1]))
elif x == 9:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
self.beg2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[0]))
self.end2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[1]))
self.beg3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[0]))
self.end3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[1]))
self.beg4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[0]))
self.end4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[1]))
self.beg7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[0]))
self.end7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[1]))
self.beg8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[0]))
self.end8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[1]))
self.beg5.setText(self.qpoint_tupleStr(self.canvas.shapes[6].points[0]))
self.end5.setText(self.qpoint_tupleStr(self.canvas.shapes[6].points[1]))
self.beg9.setText(self.qpoint_tupleStr(self.canvas.shapes[8].points[0]))
self.end9.setText(self.qpoint_tupleStr(self.canvas.shapes[8].points[1]))
elif x == 10:
self.beg1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[0]))
self.end1.setText(self.qpoint_tupleStr(self.canvas.shapes[0].points[1]))
self.beg2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[0]))
self.end2.setText(self.qpoint_tupleStr(self.canvas.shapes[1].points[1]))
self.beg3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[0]))
self.end3.setText(self.qpoint_tupleStr(self.canvas.shapes[2].points[1]))
self.beg4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[0]))
self.end4.setText(self.qpoint_tupleStr(self.canvas.shapes[3].points[1]))
self.beg7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[0]))
self.end7.setText(self.qpoint_tupleStr(self.canvas.shapes[4].points[1]))
self.beg8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[0]))
self.end8.setText(self.qpoint_tupleStr(self.canvas.shapes[5].points[1]))
self.beg5.setText(self.qpoint_tupleStr(self.canvas.shapes[6].points[0]))
self.end5.setText(self.qpoint_tupleStr(self.canvas.shapes[6].points[1]))
self.beg9.setText(self.qpoint_tupleStr(self.canvas.shapes[8].points[0]))
self.end9.setText(self.qpoint_tupleStr(self.canvas.shapes[8].points[1]))
self.beg10.setText(self.qpoint_tupleStr(self.canvas.shapes[9].points[0]))
self.end10.setText(self.qpoint_tupleStr(self.canvas.shapes[9].points[1]))
def push_btn1(self):
self.canvas.setEditing(False)
def push_btn2(self):
self.canvas.setEditing(False)
def push_btn3(self):
self.canvas.setEditing(False)
def push_btn4(self):
self.canvas.setEditing(False)
def push_btn5(self):
self.canvas.setEditing(False)
def push_btn6(self):
self.canvas.setEditing(False)
def push_btn7(self):
self.canvas.setEditing(False)
def push_btn8(self):
self.canvas.setEditing(False)
def push_btn9(self):
self.canvas.setEditing(False)
def push_btn10(self):
self.canvas.setEditing(False)
def ref_len(self):
self.len = eval(self.refLen1.text())
def ref_width(self):
self.wid = eval(self.refLen2.text())
def ref_height(self):
self.hei = eval(self.refHei.text())
def cal_height(self):
xVanish = line_intersection([str_tuple(self.beg1.text()), str_tuple(self.end1.text())], [str_tuple(self.beg2.text()), str_tuple(self.end2.text())])
yVanish = line_intersection([str_tuple(self.beg3.text()), str_tuple(self.end3.text())], [str_tuple(self.beg4.text()), str_tuple(self.end4.text())])
zVanish = line_intersection([str_tuple(self.beg7.text()), str_tuple(self.end7.text())], [str_tuple(self.beg8.text()), str_tuple(self.end8.text())])
vertex = line_intersection([xVanish, yVanish], [str_tuple(self.beg5.text()), str_tuple(self.beg6.text())])
bot = str_tuple(self.beg6.text())
ref = line_intersection([vertex, str_tuple(self.end5.text())], [str_tuple(self.beg6.text()), str_tuple(self.end6.text())])
top = str_tuple(self.end6.text())
ref_height = self.hei
height = (norm(top, bot)/norm(ref, bot))*(norm(zVanish, ref)/norm(zVanish, top))*ref_height
self.height.setText(str(height))
def cal_length(self):
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()