def valueChanged(self, text): try: if self.shape and self.proName: setattr(self.shape, self.proName, self.getValue()) # 为shape赋值 ExInterFace.getCurrentBoard().repaint() except ValueError as e: #没有找到',' 或者其他格式错误 不修改 直接赋予原值 self.setText(self.oriValue)
def drawerItemChanged(self, item, checked): self.clearCurrentVar() Board = ExInterFace.getCurrentBoard() for action in self.paintShapeMenu.actions(): action.setChecked(False) if checked: if item is self.__lineContenItem: MainPlugin.__state[Board.id] = MainPlugin.PAINT_LINE self.lineAction.setChecked(True) elif item is self.__arcContenItem: MainPlugin.__state[Board.id] = MainPlugin.PAINT_ARC self.arcAction.setChecked(True) elif item is self.__circleContenItem: MainPlugin.__state[Board.id] = MainPlugin.PAINT_CIRCLE self.circleAction.setChecked(True) elif item is self.__selectContenItem: MainPlugin.__state[Board.id] = MainPlugin.SELECT self.selectAction.setChecked(True) elif item is self.__handContenItem: MainPlugin.__state[Board.id] = MainPlugin.HAND self.handAction.setChecked(True) else: raise RuntimeError("未知错误 传入了未知的值") else: MainPlugin.__state[Board.id] = MainPlugin.FREE Board.repaint() ExInterFace.exclusive(self)
def wheelEvent(self, QWheelEvent): Board = ExInterFace.getCurrentBoard() if MainPlugin.__state[Board.id] != MainPlugin.FREE: # 根据鼠标滚轮缩放 if QWheelEvent.angleDelta().y() > 0: MainPlugin.__scale[Board.id] += 0.03 else: MainPlugin.__scale[Board.id] -= 0.03 Board.repaint() if MainPlugin.__state[Board.id] == MainPlugin.PAINT_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_ARC: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC0: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.FREE: pass elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_BOARD: pass elif MainPlugin.__state[Board.id] == MainPlugin.SELECT: pass
def getSelectShapes(self): Board = ExInterFace.getCurrentBoard() result = [] for shape in MainPlugin.__shapes[Board.id]: if shape.selected: result.append(shape) return result
def mousePressEvent(self, QMouseEvent): Board = ExInterFace.getCurrentBoard() # 坐标转换 将鼠标坐标转换为 常用数学坐标 mousePos = MainPlugin.translatePt(QMouseEvent.pos(), Board) if QMouseEvent.button() == Qt.LeftButton: if MainPlugin.__state[Board.id] == MainPlugin.PAINT_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_ARC: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC0: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC1: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.FREE: pass elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_BOARD: pass elif MainPlugin.__state[Board.id] == MainPlugin.HAND: #if not MainPlugin.__hand_start_pt[Board.id]: #MainPlugin.__hand_start_pt[Board.id] = ExPoint(mousePos) MainPlugin.__hand_start_pt[Board.id].x = QMouseEvent.pos().x( ) #这里使用Boadr坐标没有转换后的,移动就必须要一个原点固定的坐标系 MainPlugin.__hand_start_pt[Board.id].y = QMouseEvent.pos().y() MainPlugin.__state[Board.id] = MainPlugin.HANDED elif MainPlugin.__state[Board.id] == MainPlugin.SELECT: pt = self.getPressPoint(mousePos) #查找是否点击到点上 selectedShapes = self.getSelectShapes() if pt and len(selectedShapes ) == 1 and pt.parent == selectedShapes[0]: # 如果点到了点且是当前选中的点 就开始准备移动 MainPlugin.__state[Board.id] = MainPlugin.MOVING_SHAPE #放入撤销栈 MainPlugin.__go_back_stack[Board.id].append([ selectedShapes[0], "change", copy.deepcopy(selectedShapes[0]) ]) MainPlugin.__changing_pt[Board.id] = pt else: if not QMouseEvent.modifiers( ) == Qt.ControlModifier: #没有按下ctr 清空所有的选择 self.cancelAllSelected() if MainPlugin.__hover_shape[Board.id]: #有点到 图形上 MainPlugin.__hover_shape[ Board.id].origin_shape.selected = True self.propertyDock.updateValues( MainPlugin.__hover_shape[Board.id].origin_shape) else: self.propertyDock.clearAll() Board.repaint()
def keyPressEvent(self, QKeyEvent): Board = ExInterFace.getCurrentBoard() key_value = QKeyEvent.key() if QKeyEvent.modifiers() == Qt.ControlModifier: if key_value == Qt.Key_Z: self.revokeAction.triggered.emit(True) #self.revokeActionTrigger() elif key_value == Qt.Key_X: self.forwardAction.triggered.emit(True) #self.forwardActionTrigger() if key_value == Qt.Key_Q: self.__drawerItem.setChecked(self.__lineContenItem, True) elif key_value == Qt.Key_W: self.__drawerItem.setChecked(self.__arcContenItem, True) elif key_value == Qt.Key_E: self.__drawerItem.setChecked(self.__circleContenItem, True) elif key_value == Qt.Key_R: self.__drawerItem.setChecked(self.__handContenItem, True) elif key_value == Qt.Key_T: self.__drawerItem.setChecked(self.__selectContenItem, True) elif key_value == Qt.Key_Escape: if MainPlugin.__state[ Board. id] == MainPlugin.PAINTING_ARC0 or MainPlugin.__state[ Board.id] == MainPlugin.PAINTING_ARC1: MainPlugin.__state[Board.id] = MainPlugin.PAINT_ARC elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: MainPlugin.__state[Board.id] = MainPlugin.PAINT_CIRCLE MainPlugin.__assist_circle[Board.id].setVisible(True) elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: MainPlugin.__state[Board.id] = MainPlugin.PAINT_LINE elif key_value == Qt.Key_Delete: self.deleteAction.triggered.emit(True) #self.deleteActionTrigger() if MainPlugin.__state[Board.id] == MainPlugin.PAINT_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_ARC: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC0: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.FREE: pass elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_BOARD: pass Board.repaint()
def deleteActionTrigger(self): #self.__drawerItem.setChecked(self.__selectContenItem, b) Board = ExInterFace.getCurrentBoard() for i in range(len(MainPlugin.__shapes[Board.id]) - 1, -1, -1): if MainPlugin.__shapes[Board.id][i].selected: deletedShape = MainPlugin.__shapes[Board.id].pop(i) MainPlugin.__go_back_stack[Board.id].append( [deletedShape, "delete"]) Board.repaint()
def getPressPoint(self, mousePt): #主要是用于获取 点击的点 来拉动修改图形 为了和checkHoverPoint解耦 allPoints = [] Board = ExInterFace.getCurrentBoard() # 生成所有的点列表 for shape in MainPlugin.__shapes[Board.id]: allPoints += shape.getPoints() # 检查是否悬停到点上了 for pt in allPoints: if pt.isPointNearShape(mousePt, 2.5, MainPlugin) and pt.parent.selected: return pt return None
def keyReleaseEvent(self, QKeyEvent): Board = ExInterFace.getCurrentBoard() if MainPlugin.__state[Board.id] == MainPlugin.PAINT_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_ARC: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC0: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.FREE: pass elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_BOARD: pass
def mouseDoubleClickEvent(self, QMouseEvent): Board = ExInterFace.getCurrentBoard() if MainPlugin.__state[Board.id] == MainPlugin.PAINT_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_ARC: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC0: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.FREE: pass elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_BOARD: pass
def forwardActionTrigger(self): Board = ExInterFace.getCurrentBoard() if not MainPlugin.__forward_stack[Board.id]: return revokeList = MainPlugin.__forward_stack[Board.id].pop() if revokeList[1] == "add": revokeList[1] = "delete" # 实际删除 即从__shape中移除 MainPlugin.__shapes[Board.id].remove(revokeList[0]) elif revokeList[1] == "delete": revokeList[1] = "add" MainPlugin.__shapes[Board.id].append(revokeList[0]) elif revokeList[1] == "change": temp = copy.deepcopy(revokeList[0]) MainPlugin.SynShapObj(revokeList[0], revokeList[2]) revokeList[2] = temp MainPlugin.__go_back_stack[Board.id].append(revokeList)
def paintEvent(self, QPaintEvent): Board = ExInterFace.getCurrentBoard() painter = QPainter(Board) painter.setRenderHint(QPainter.Antialiasing, True) #打开反走样 #在坐标转换之前先绘制文字 #坐标系转换为 y朝上和x朝右的通用数学坐标系 painter.setWindow(0, Board.height(), Board.width(), -Board.height()) painter.translate( MainPlugin.__origin_position[Board.id].x * MainPlugin.unit_pixel, MainPlugin.__origin_position[Board.id].y * MainPlugin.unit_pixel) painter.scale(MainPlugin.__scale[Board.id], MainPlugin.__scale[Board.id]) #绘制十字原点 MainPlugin.__origin_cross.drawIt(painter, MainPlugin.__scale[Board.id]) #绘制图形 for shape in MainPlugin.__shapes[Board.id]: shape.draw(painter, MainPlugin) if MainPlugin.__state[ Board.id] <= MainPlugin.PAINTING_CIRCLE and MainPlugin.__state[ Board.id] >= MainPlugin.PAINTING_LINE: #绘制正在绘制的图形 if MainPlugin.__painting_shape[Board.id]: MainPlugin.__painting_shape[Board.id].draw(painter, MainPlugin) if MainPlugin.__state[Board.id] == MainPlugin.PAINT_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_CIRCLE: # 在绘制圆的时候使用 if MainPlugin.__assist_circle[Board.id]: MainPlugin.__assist_circle[Board.id].draw(painter, MainPlugin) elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_ARC: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC0: if MainPlugin.__assist_line[Board.id]: MainPlugin.__assist_line[Board.id].draw(painter, MainPlugin) elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC1: if MainPlugin.__assist_line[Board.id]: MainPlugin.__assist_line[Board.id].draw(painter, MainPlugin) elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.FREE: pass elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_BOARD: pass if MainPlugin.__state[Board.id] == MainPlugin.SELECT: if MainPlugin.__hover_shape[Board.id]: MainPlugin.__hover_shape[Board.id].draw(painter, MainPlugin) if MainPlugin.__state[ Board.id] >= MainPlugin.PAINT_LINE and MainPlugin.__state[ Board.id] <= MainPlugin.MOVING_SHAPE: # 绘制悬停对象 if MainPlugin.__hover_point[Board.id]: MainPlugin.__hover_point[Board.id].draw(painter, MainPlugin) # 绘制 匹配到的虚线 vLine = None hLine = None if MainPlugin.__matched_x[Board.id]: vLine = FreeLine(MainPlugin.__matched_x[Board.id], 0, MainPlugin.__matched_x[Board.id], Board.height()) if MainPlugin.__matched_y[Board.id]: hLine = FreeLine(0, MainPlugin.__matched_y[Board.id], Board.width(), MainPlugin.__matched_y[Board.id]) if vLine: vLine.draw(painter, MainPlugin) if hLine: hLine.draw(painter, MainPlugin)
def valueChangedSlot(self, value): if self.shape and self.proName: setattr(self.shape, self.proName, self.getValue()) # 为shape赋值 ExInterFace.getCurrentBoard().repaint()
def boardSwitched(self, curindex): Board = ExInterFace.getCurrentBoard() MainPlugin.__state[Board.id] = self.getCurrentSelectedState()
def addShapeCompeleted(shape): board = ExInterFace.getCurrentBoard() MainPlugin.__go_back_stack[board.id].append([shape, "add"]) #用shape对象自身来索引
def cancelAllSelected(self): Board = ExInterFace.getCurrentBoard() for shape in MainPlugin.__shapes[Board.id]: shape.selected = False
def mouseReleaseEvent(self, QMouseEvent): Board = ExInterFace.getCurrentBoard() # 坐标转换 将鼠标坐标转换为 常用数学坐标 mousePos = MainPlugin.translatePt(QMouseEvent.pos(), Board) matchedPt = self.getMatchedPoint(mousePos, Board) if QMouseEvent.button() == Qt.LeftButton: if MainPlugin.__state[Board.id] == MainPlugin.PAINT_LINE: #matchedPt = self.getMatchedPoint(mousePos, Board) MainPlugin.__painting_shape[Board.id] = ExLine( matchedPt.x, matchedPt.y, mousePos.x, mousePos.y) MainPlugin.__state[Board.id] = MainPlugin.PAINTING_LINE elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_CIRCLE: MainPlugin.__painting_shape[Board.id] = ExCircle( matchedPt.x, matchedPt.y, 0) MainPlugin.__assist_circle[Board.id].setVisible(False) MainPlugin.__state[Board.id] = MainPlugin.PAINTING_CIRCLE elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_ARC: MainPlugin.__painting_shape[Board.id] = ExArc() MainPlugin.__assist_line[Board.id] = ExLine() MainPlugin.__assist_line[Board.id].setPenStyle(Qt.DotLine) MainPlugin.__painting_shape[Board.id].setPt0(matchedPt) MainPlugin.__assist_line[Board.id].setPt0(matchedPt) MainPlugin.__state[Board.id] = MainPlugin.PAINTING_ARC0 elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC0: if matchedPt != MainPlugin.__painting_shape[Board.id].pt0: MainPlugin.__state[Board.id] = MainPlugin.PAINTING_ARC1 MainPlugin.__painting_shape[Board.id].setPt1(matchedPt) MainPlugin.__assist_line[Board.id].setPt1(matchedPt) elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC1: if MainPlugin.__painting_shape[Board.id].isVisible( ) and not matchedPt == MainPlugin.__painting_shape[ Board. id].pt0 and not matchedPt == MainPlugin.__painting_shape[ Board.id].pt1: MainPlugin.__state[Board.id] = MainPlugin.PAINT_ARC MainPlugin.__painting_shape[Board.id].setPt2(matchedPt) MainPlugin.__shapes[Board.id].append( MainPlugin.__painting_shape[Board.id]) #增加到go_back中 MainPlugin.addShapeCompeleted( MainPlugin.__painting_shape[Board.id]) MainPlugin.__painting_shape[Board.id] = None MainPlugin.__assist_line[Board.id] = None elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: if MainPlugin.__painting_shape[Board.id]: MainPlugin.__shapes[Board.id].append( MainPlugin.__painting_shape[Board.id]) MainPlugin.__assist_circle[Board.id].setVisible(True) MainPlugin.__assist_circle[Board.id].centerPt = matchedPt # 增加到go_back中 MainPlugin.addShapeCompeleted( MainPlugin.__painting_shape[Board.id]) MainPlugin.__state[Board.id] = MainPlugin.PAINT_CIRCLE elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: if MainPlugin.__painting_shape[Board.id]: MainPlugin.__shapes[Board.id].append( MainPlugin.__painting_shape[Board.id]) # 增加到go_back中 MainPlugin.addShapeCompeleted( MainPlugin.__painting_shape[Board.id]) MainPlugin.__painting_shape[Board.id] = None MainPlugin.__state[Board.id] = MainPlugin.PAINT_LINE elif MainPlugin.__state[Board.id] == MainPlugin.FREE: pass elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_BOARD: pass elif MainPlugin.__state[Board.id] == MainPlugin.SELECT: pass elif MainPlugin.__state[Board.id] == MainPlugin.HANDED: MainPlugin.__state[Board.id] = MainPlugin.HAND elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_SHAPE: MainPlugin.__state[Board.id] = MainPlugin.SELECT #鼠标松开 返回到选择状态 MainPlugin.__hover_shape[Board.id] = None elif QMouseEvent.button() == Qt.RightButton: if MainPlugin.__state[Board.id] == MainPlugin.PAINT_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_ARC: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC0: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.FREE: pass elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_BOARD: pass elif MainPlugin.__state[Board.id] == MainPlugin.SELECT: pass Board.repaint()
def mouseMoveEvent(self, QMouseEvent): Board = ExInterFace.getCurrentBoard() mousePos = MainPlugin.translatePt(QMouseEvent.pos(), Board) # 开了Tracking所以只要鼠标移动就会调用,不用按下左键 # 检查 并设置悬停 # 只有在选中模式下 才有shape的hover if MainPlugin.__state[Board.id] == MainPlugin.SELECT: self.checkHoverShape(mousePos, Board) #在绘制,绘制中,选中 都可以有 hover点和匹配 # 原则是点到点 就不会点到shape if MainPlugin.__state[Board.id] < MainPlugin.SELECT: self.checkHoverPoint(mousePos, Board) self.checkMatch(mousePos, Board) #一定要在上面代码的后面 matchedPt = self.getMatchedPoint(mousePos, Board) if MainPlugin.__state[Board.id] == MainPlugin.PAINT_LINE: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_CIRCLE: if not MainPlugin.__assist_circle[Board.id]: MainPlugin.__assist_circle[Board.id] = ExCircle(matchedPt, 10) MainPlugin.__assist_circle[Board.id].setPenStyle(Qt.DotLine) MainPlugin.__assist_circle[Board.id].centerPt = matchedPt elif MainPlugin.__state[Board.id] == MainPlugin.PAINT_ARC: pass elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC0: if MainPlugin.__assist_line[Board.id]: MainPlugin.__assist_line[Board.id].setPt1(matchedPt) elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_ARC1: if MainPlugin.__painting_shape[Board.id]: if not matchedPt == MainPlugin.__painting_shape[ Board. id].pt0 and not matchedPt == MainPlugin.__painting_shape[ Board.id].pt1: #MainPlugin.__painting_shape MainPlugin.__painting_shape[Board.id].setPt2(matchedPt) if not MainPlugin.__painting_shape[Board.id].calculate(): MainPlugin.__painting_shape[Board.id].setVisible(False) else: MainPlugin.__painting_shape[Board.id].setVisible(True) elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_CIRCLE: if MainPlugin.__painting_shape[Board.id]: #计算半径 r = math.sqrt( (matchedPt.x - MainPlugin.__painting_shape[Board.id].centerPt.x)**2 + (matchedPt.y - MainPlugin.__painting_shape[Board.id].centerPt.y)**2) MainPlugin.__painting_shape[Board.id].r = r elif MainPlugin.__state[Board.id] == MainPlugin.PAINTING_LINE: if MainPlugin.__painting_shape[Board.id]: #matchedPt = self.getMatchedPoint(mousePos, Board) MainPlugin.__painting_shape[Board.id].setPt1( matchedPt.x, matchedPt.y) elif MainPlugin.__state[Board.id] == MainPlugin.FREE: pass elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_BOARD: pass elif MainPlugin.__state[Board.id] == MainPlugin.HANDED: MainPlugin.__origin_position[Board.id].x += ( QMouseEvent.pos().x() - MainPlugin.__hand_start_pt[Board.id].x) / MainPlugin.unit_pixel MainPlugin.__origin_position[Board.id].y -= ( QMouseEvent.pos().y() - MainPlugin.__hand_start_pt[Board.id].y) / MainPlugin.unit_pixel MainPlugin.__hand_start_pt[Board.id].x = QMouseEvent.pos().x() MainPlugin.__hand_start_pt[Board.id].y = QMouseEvent.pos().y() elif MainPlugin.__state[Board.id] == MainPlugin.MOVING_SHAPE: #直接修改 hover_pt的值 MainPlugin.__changing_pt[Board.id].x = matchedPt.x MainPlugin.__changing_pt[Board.id].y = matchedPt.y if not MainPlugin.__changing_pt[ Board.id].parent.calculate(): #需要间接计算一下 MainPlugin.__changing_pt[Board.id].parent.setVisible(False) else: MainPlugin.__changing_pt[Board.id].parent.setVisible(True) Board.repaint()
def currentIndexChangedSlot(self, index): if self.shape and self.proName: setattr(self.shape, self.proName, self.getValue()) ExInterFace.getCurrentBoard().repaint()