def handleVerticalMode(self, evt: QMouseEvent): if evt.type() != QMouseEvent.MouseButtonPress: return None self.triggerIndex(self.getPointIndex(self.imgView.mapToScene(evt.pos()))) if self.getIndexCnt() == 2: if static.getLineKey(self.indexA, self.indexB) not in self.lines: self.triggerIndex(self.indexA) elif self.getIndexCnt() == 3: A = self.points[self.indexA][0] B = self.points[self.indexB][0] C = self.points[self.indexC][0] if static.isOnALine(A, B, C): if static.getLineKey(self.indexB, self.indexC) in self.lines: self.triggerIndex(self.indexA) else: indexC = self.indexC self.endTrigger() self.triggerIndex(indexC) else: D = static.getFootPoint(A, B, C) indexD = self.addPoint(D) if not static.isOnSegment(A, B, D): self.addLine( (self.indexA if static.getDistance(A, D) < static.getDistance(B, D) else self.indexB), indexD ) self.addLine(self.indexC, indexD) self.endTriggerWith(self.indexC) self.updateAll()
def handleAngleMode(self, evt: QMouseEvent): if evt.type() != QMouseEvent.MouseButtonPress: return None self.triggerIndex(self.getPointIndex(self.imgView.mapToScene(evt.pos()))) if self.getIndexCnt() == 2 and static.getLineKey(self.indexA, self.indexB) not in self.lines: self.triggerIndex(self.indexA) elif self.getIndexCnt() == 3: if static.getLineKey(self.indexB, self.indexC) in self.lines: self.addAngle(self.indexA, self.indexB, self.indexC) self.endTriggerWith(self.indexC) else: indexC = self.indexC self.endTrigger() self.triggerIndex(indexC) self.updateAll()
def modifyIndex(self, index: int): newIndex, modify = QInputDialog.getInt(self, '更改标号', '请输入一个新的标号', index, 0, step=1) if not modify or newIndex == index: return None if newIndex <= 0: self.warning('标号不可小于或等于0!') return None if newIndex in self.points: self.warning('此标号已存在!') return None self.points[newIndex] = self.points[index] del self.points[index] for line in list(self.lines.keys()): if index in line: fixedIndex = line[0] + line[1] - index self.lines[static.getLineKey(newIndex, fixedIndex)] = self.lines[line] del self.lines[line] for angle in list(self.angles.keys()): if index in angle: if index == angle[1]: self.angles[angle[0], newIndex, angle[2]] = self.angles[angle] else: fixedIndex = angle[0] + angle[2] - index self.angles[static.getAngleKey(newIndex, angle[1], fixedIndex)] = self.angles[angle] del self.angles[angle] for circle in list(self.circles.keys()): if index in circle: if index == circle[0]: self.circles[(newIndex, circle[1])] = self.circles[circle] else: self.circles[(circle[0], newIndex)] = self.circles[circle] del self.circles[circle] if index in self.pivots: self.pivots.remove(index) self.pivots.add(newIndex)
def handleMidpointMode(self, evt: QMouseEvent): if evt.type() != QMouseEvent.MouseButtonPress: return None self.triggerIndex(self.getPointIndex(self.imgView.mapToScene(evt.pos()))) if self.getIndexCnt() == 2: if static.getLineKey(self.indexA, self.indexB) in self.lines: A = self.points[self.indexA][0] B = self.points[self.indexB][0] indexC = self.addPoint(static.getMidpoint(A, B)) self.addLine(self.indexA, indexC) self.addLine(self.indexB, indexC) self.endTriggerWith(self.indexB) else: self.triggerIndex(self.indexA) self.updateAll()
def addAngle(self, indexA: int, indexB: int, indexC: int): if self.img and static.getLineKey(indexA, indexB) in self.lines \ and static.getLineKey(indexB, indexC) in self.lines: self.angles[static.getAngleKey(indexA, indexB, indexC)] = self.color
def addLine(self, indexA: int, indexB: int): if self.img and indexA in self.points and indexB in self.points: self.lines[static.getLineKey(indexA, indexB)] = self.color