def mouseMoveEvent(self, event: QMouseEvent) -> None: pos = self.mapToScene(event.localPos().toPoint()) x = int(pos.x()) y = int(pos.y()) if self.status == 'line': self.temp_item.p_list[1] = [x, y] if self.status == 'ellipse': if self.temp_item == None: print("Hit Here") pass self.temp_item.p_list[1] = [x, y] if self.status == "polygon": # save the last position mouse stay # and make Item move as mouse did # Here Hit crash at one time if self.temp_item == None: pass else: self.temp_item.p_list[-1] = [x, y] if self.status == "translate": self.temp_item.p_list = alg.translate(self.temp_p_list, x - self.start_point[0], y - self.start_point[1]) if self.status == "scale": xp = ((x - self.start_point[0])**2 + (y - self.start_point[1])**2) / 10000 # print("缩放倍数:",xp) self.temp_item.p_list = alg.scale(self.temp_p_list, self.start_point[0], self.start_point[1], xp) if self.status == 'clip_LB' or self.status == 'clip_CS': x_1 = min(self.start_point[0], x) x_2 = max(self.start_point[0], x) y_1 = min(self.start_point[1], y) y_2 = max(self.start_point[1], y) self.temp_item1.p_list = [[x_1, y_1], [x_1, y_2], [x_2, y_2], [x_2, y_1], [x_1, y_1]] if self.status == 'clip_LB': self.temp_item.p_list = alg.clip(self.temp_p_list, self.start_point[0], self.start_point[1], x, y, "Liang-Barsky") else: self.temp_item.p_list = alg.clip(self.temp_p_list, self.start_point[0], self.start_point[1], x, y, "Cohen-Sutherland") if self.status == "curve": if self.temp_item == None: pass else: self.temp_item.p_list[-1] = [x, y] if self.status == 'free': if self.temp_item == None: print("Hit Here") pass self.temp_item.p_list.append([x, y]) self.updateScene([self.sceneRect()]) super().mouseMoveEvent(event)
def mouseReleaseEvent(self, event: QMouseEvent) -> None: #print('mouseReleaseEvent') if self.status == 'line': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'polygon': pass #不需要有动作 elif self.status == 'ellipse': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'curve': pass #不需要有动作 elif self.status == 'translate': self.temp_loc = [0, 0] elif self.status == 'rotate': self.temp_loc = [0, 0] elif self.status == 'clip': if self.selected_id != '': x_min = min(self.temp_loc[0], self.clip_loc[0]) x_max = max(self.temp_loc[0], self.clip_loc[0]) y_min = min(self.temp_loc[1], self.clip_loc[1]) y_max = max(self.temp_loc[1], self.clip_loc[1]) self.item_dict[self.selected_id].p_list = alg.clip(self.item_dict[self.selected_id].p_list, x_min, y_min, x_max, y_max, self.temp_algorithm) self.item_dict[self.selected_id].update() self.updateScene([self.sceneRect()]) super().mouseReleaseEvent(event)
def transform(self, t_type, **kwargs): if self.selected_id: p_type = self.selected_item.item_type p_list = self.selected_item.p_list center = self.selected_item.rectCenter( ) if 'center' not in kwargs else kwargs['center'] isset = kwargs['set'] if 'set' in kwargs else False ret = [] if t_type == 'translate': ret = alg.translate( p_list.real, kwargs['dx'], kwargs['dy']) elif t_type == 'rotate': ret = deepcopy(p_list) ret.rotate(center, kwargs['r']) if p_type != 'ellipse' else ret elif t_type == 'scale': ret = deepcopy(p_list) if isset: ret.scale_set(center, kwargs['sx'], kwargs['sy']) else: ret.scale(center, kwargs['sx'], kwargs['sy']) elif t_type == 'clip': ret = alg.clip( p_list.real, *kwargs['box'], kwargs['algorithm']) if not ret: ret = QMessageBox.warning(self, '警告', '未裁剪有效部分,将移除该线段。\n是否裁剪?', QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Cancel) if ret == QMessageBox.Ok: self.remove_selected_item() self.updateScene([self.sceneRect()]) return self.stack.do(Action( Action.TRANSFORM, item_id=self.selected_id, p_list=[deepcopy(p_list), deepcopy(ret)], t_type=t_type)) self.selected_item.p_list = PList(ret) self.selected_item.noticeUpdate() self.updateScene([self.sceneRect()])
def mouseReleaseEvent(self, event: QMouseEvent) -> None: if self.status == 'line': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'ellipse': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'clip': if self.selected_id != '': temp_list = alg.clip(self.origin_list, self.x0, self.y0, self.x1, self.y1, self.temp_algorithm) self.item_dict[self.selected_id].p_list = temp_list elif self.status == 'pclip': if self.selected_id != '': temp_list = alg.pclip(self.origin_list, self.x0, self.y0, self.x1, self.y1) self.item_dict[self.selected_id].p_list = temp_list elif self.status == 'copy': if self.selected_id != '': self.item_dict[self.temp_item.id] = self.temp_item self.list_widget.addItem(self.temp_item.id) self.finish_draw() self.clear_selection() if self.status != 'undo': self.updateScene([self.sceneRect()]) self.save_status() super().mouseReleaseEvent(event)
def mouseMoveEvent(self, event: QMouseEvent) -> None: pos = self.mapToScene(event.localPos().toPoint()) x = int(pos.x()) y = int(pos.y()) if self.status == 'line': self.temp_item.p_list[1] = [x, y] #TODO elif self.status == 'polygon': self.temp_item.p_list[-1] = [x, y] elif self.status == 'ellipse': self.temp_item.p_list[1] = [x, y] elif self.status == 'curve': self.temp_item.p_list[-1] = [x, y] elif self.status == 'translate': self.temp_item.p_list = alg.translate(self.pList, x - self.select_xy[0], y - self.select_xy[1]) elif self.status == 'rotate': pass elif self.status == 'scale': pass elif self.status == 'clip': self.temp_item.p_list = alg.clip(self.pList, self.select_xy[0], self.select_xy[1], x, y, self.temp_algorithm) self.updateScene([self.sceneRect()]) super().mouseMoveEvent(event)
def clip(self, x1, y1, x2, y2, algorithm): if self.item_type == 'line': xmin = min(x1, x2) ymin = min(y1, y2) xmax = max(x1, x2) ymax = max(y1, y2) temp_list = alg.clip(self.p_list, xmin, ymin, xmax, ymax, algorithm) self.p_list = temp_list
def mouseReleaseEvent(self, event: QMouseEvent) -> None: if self.status == 'line': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'ellipse': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'polygon': self.item_dict[self.temp_id] = self.temp_item if not self.list_widget.findItems(self.temp_id, Qt.MatchContains): self.list_widget.addItem(self.temp_id) elif self.status == 'curve': self.item_dict[self.temp_id] = self.temp_item if not self.list_widget.findItems(self.temp_id, Qt.MatchContains): self.list_widget.addItem(self.temp_id) elif self.status == 'clip': pos = self.mapToScene(event.localPos().toPoint()) x = int(pos.x()) y = int(pos.y()) if self.selected_id != '' and self.origin_pos is not None and self.temp_item.item_type == 'line': x_min = min(int(self.origin_pos.x()), x) x_max = max(int(self.origin_pos.x()), x) y_min = min(int(self.origin_pos.y()), y) y_max = max(int(self.origin_pos.y()), y) temp_p_list = alg.clip(self.origin_p_list, x_min, y_min, x_max, y_max, self.temp_algorithm) if len(temp_p_list) == 0: # self.selected_id = '' # print(self.number) number = self.list_widget.findItems( self.selected_id, Qt.MatchContains) row = self.list_widget.row(number[0]) # self.list_widget.removeItemWidget(self.number[0]) temp_id = self.selected_id self.clear_selection() self.list_widget.clearSelection() self.scene().removeItem(self.temp_item) self.temp_item = None del self.item_dict[temp_id] self.list_widget.takeItem(row) else: self.temp_item.p_list = temp_p_list if self.border is not None: self.scene().removeItem(self.border) self.border = None self.updateScene([self.sceneRect()]) elif self.status == 'freedom': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() super().mouseReleaseEvent(event)
def mouseReleaseEvent(self, event: QMouseEvent) -> None: if self.status == 'line': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'ellipse': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'clip' and ( self.temp_item.item_type == 'line' or self.temp_item.item_type == 'polygon' or self.temp_item.item_type == 'polygonDone'): pos = self.mapToScene(event.localPos().toPoint()) x = int(pos.x()) y = int(pos.y()) self.clipPoint2 = [x, y] if self.temp_item.item_type == 'line': clipped_list = alg.clip( self.temp_item.p_list, min(self.clipPoint1[0], self.clipPoint2[0]), min(self.clipPoint1[1], self.clipPoint2[1]), max(self.clipPoint1[0], self.clipPoint2[0]), max(self.clipPoint1[1], self.clipPoint2[1]), self.temp_algorithm) else: clipped_list = alg.clipPolygon( self.temp_item.p_list, min(self.clipPoint1[0], self.clipPoint2[0]), min(self.clipPoint1[1], self.clipPoint2[1]), max(self.clipPoint1[0], self.clipPoint2[0]), max(self.clipPoint1[1], self.clipPoint2[1])) if clipped_list == '': self.temp_item = '' else: self.temp_item.p_list = clipped_list self.temp_item.update() QApplication.setOverrideCursor(Qt.ArrowCursor) # self.status = '' self.temp_id = '' self.helperLines_item.p_list = [] self.helperPoints_item.p_list = [] self.updateScene([self.sceneRect()]) elif self.status == 'translate' or self.status == 'rotate' or self.status == 'scale': QApplication.setOverrideCursor(Qt.ArrowCursor) # self.status = '' self.temp_id = '' self.temp_plist = self.temp_item.p_list[:] super().mouseReleaseEvent(event)
def mouseReleaseEvent(self, event: QMouseEvent) -> None: if self.status == 'line' or self.status == 'ellipse': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'rotate': self.xstart = -1 self.ystart = -1 elif self.status == 'clip': self.rb.hide() self.temp_item.p_list = alg.clip(self.p_list_copy, self.xcenter, self.ycenter, self.xstart, self.ystart, self.temp_algorithm) self.updateScene([self.sceneRect()]) super().mouseReleaseEvent(event)
def mouseMoveEvent(self, event: QMouseEvent) -> None: pos = self.mapToScene(event.localPos().toPoint()) x = int(pos.x()) y = int(pos.y()) if self.status == 'line': if (self.temp_item == None): pass else: self.temp_item.p_list[1] = [x, y] elif self.status == 'ellipse': if (self.temp_item == None): pass else: self.temp_item.p_list[1] = [x, y] elif self.status == 'polygon': if (self.temp_item == None): pass else: self.temp_item.p_list[-1] = [x, y] elif self.status == 'fill_polygon': if (self.temp_item == None): pass else: self.temp_item.p_list[-1] = [x, y] elif self.status == 'curve': if (self.temp_item == None): pass else: self.temp_item.p_list[-1] = [x, y] elif self.status == 'translate': self.temp_item.p_list = alg.translate(self.plist, x - self.start_xy[0], y - self.start_xy[1]) elif self.status == 'scale': s = ((x - self.start_xy[0])**2 + (y - self.start_xy[1])**2) / 10000 self.temp_item.p_list = alg.scale(self.plist, self.start_xy[0], self.start_xy[1], s) elif self.status == 'clip': self.temp_item.p_list = alg.clip(self.plist, self.start_xy[0], self.start_xy[1], x, y, self.temp_algorithm) elif self.status == 'polygon_clip': self.temp_item.p_list = alg.polygon_clip(self.plist, self.start_xy[0], self.start_xy[1], x, y) self.updateScene([self.sceneRect()]) #self.prepareGeometryChange() super().mouseMoveEvent(event)
def clip(self, p_list, algorithm): xmin = min(p_list[0][0], p_list[1][0]) ymin = min(p_list[0][1], p_list[1][1]) xmax = max(p_list[0][0], p_list[1][0]) ymax = max(p_list[0][1], p_list[1][1]) self.p_list = alg.clip(self.p_list, xmin, ymin, xmax, ymax, algorithm)
def item_clip(self, x_min, y_min, x_max, y_max, algorithm): self.prepareGeometryChange() if self.p_list: self.p_list = alg.clip(self.p_list, x_min, y_min, x_max, y_max, algorithm)
elif line[0] == 'translate': plist = alg.translate(item_dict[line[1]][1], int(line[2]), int(line[3])) item_dict[line[1]][1] = plist elif line[0] == 'rotate': # 椭圆不需要旋转 if item_dict[line[1]][0] == 'ellipse': line = fp.readline() continue plist = alg.rotate(item_dict[line[1]][1], int(line[2]), int(line[3]), -1 * int(line[4])) item_dict[line[1]][1] = plist elif line[0] == 'scale': plist = alg.scale(item_dict[line[1]][1], int(line[2]), int(line[3]), float(line[4])) item_dict[line[1]][1] = plist elif line[0] == 'clip': x_min = min(int(line[2]), int(line[4])) x_max = max(int(line[2]), int(line[4])) y_min = min(int(line[3]), int(line[5])) y_max = max(int(line[3]), int(line[5])) plist = alg.clip(item_dict[line[1]][1], x_min, y_min, x_max, y_max, line[6]) if plist == []: del item_dict[line[1]] else: item_dict[line[1]][1] = plist ... line = fp.readline()
p_list = item_dict[item_id][1] p_list = alg.translate(p_list, dx, dy) item_dict[item_id][1] = p_list elif line[0] == 'rotate': item_id = line[1] x = int(line[2]) y = int(line[3]) r = int(line[4]) p_list = item_dict[item_id][1] p_list = alg.rotate(p_list, x, y, r) item_dict[item_id][1] = p_list elif line[0] == 'scale': item_id = line[1] x = int(line[2]) y = int(line[3]) s = float(line[4]) p_list = item_dict[item_id][1] item_dict[item_id][1] = alg.scale(p_list, x, y, s) elif line[0] == 'clip': item_id = line[1] x0 = int(line[2]) y0 = int(line[3]) x1 = int(line[4]) y1 = int(line[5]) algorithm = line[6] p_list = item_dict[item_id][1] item_dict[item_id][1] = alg.clip(p_list, x0, y0, x1, y1, algorithm) line = fp.readline()
item_dict[item_id] = [item_type, newp_list, algorithm, color] elif line[0] == 'rotate': item_id = line[1] item_type, p_list, algorithm, color = item_dict[item_id] x = int(line[2]) y = int(line[3]) r = int(line[4]) newp_list = alg.rotate(p_list, x, y, r) item_dict[item_id] = [item_type, newp_list, algorithm, color] elif line[0] == 'scale': item_id = line[1] item_type, p_list, algorithm, color = item_dict[item_id] x = int(line[2]) y = int(line[3]) s = int(float(line[4])) newp_list = alg.scale(p_list, x, y, s) item_dict[item_id] = [item_type, newp_list, algorithm, color] elif line[0] == 'clip': item_id = line[1] item_type, p_list, algorithm, color = item_dict[item_id] x_min = int(line[2]) y_min = int(line[3]) x_max = int(line[4]) y_max = int(line[5]) algorithmclip = line[6] newp_list = alg.clip(p_list, x_min, y_min, x_max, y_max, algorithmclip) item_dict[item_id] = [item_type, newp_list, algorithm, color] line = fp.readline()
item_type, p_list, algorithm, color = item_dict[id] pixels = alg.translate(p_list, x0, y0) item_dict[id] = [item_type, pixels, algorithm, color] elif line[0] == 'rotate': id = line[1] x0 = int(line[2]) y0 = int(line[3]) r = int(line[4]) item_type, p_list, algorithm, color = item_dict[id] pixels = alg.rotate(p_list, x0, y0, r) item_dict[id] = [item_type, pixels, algorithm, color] elif line[0] == 'scale': id = line[1] x0 = int(line[2]) y0 = int(line[3]) s = float(line[4]) item_type, p_list, algorithm, color = item_dict[id] pixels = alg.scale(p_list, x0, y0, s) item_dict[id] = [item_type, pixels, algorithm, color] elif line[0] == 'clip': id = line[1] x0 = int(line[2]) y0 = int(line[3]) x1 = int(line[4]) y1 = int(line[5]) clip_algo = line[6] item_type, p_list, algorithm, color = item_dict[id] pixels = alg.clip(p_list, x0, y0, x1, y1, clip_algo) item_dict[id] = [item_type, pixels, algorithm, color] line = fp.readline()
else: p_list = item_dict[item_id][1] item_dict[item_id][1] = alg.scale(p_list, x, y, s) elif line[0] == 'clip': if n != 7: print("第", lineno, "行错误:clip参数数量错误") continue item_id = line[1] x0 = int(line[2]) y0 = int(line[3]) x1 = int(line[4]) y1 = int(line[5]) algorithm = line[6] if algorithm != 'Cohen-Sutherland' and algorithm != 'Liang-Barsky': print("第", lineno, "行错误:不存在算法", algorithm) elif item_id not in item_dict.keys(): print("第", lineno, "行错误:不存在图元", item_id) elif item_dict[item_id][0] != 'line': print("第", lineno, "行错误:禁止对线段以外的图元进行裁剪") else: p_list = item_dict[item_id][1] ret = alg.clip(p_list, x0, min(y0, y1), x1, max(y0, y1), algorithm) if ret: item_dict[item_id][1] = ret else: del item_dict[item_id] else: print("第", lineno, "行错误:未知的指令") # ... # line = fp.readline()
temp_item[1] = alg.translate(temp_item[1], dx, dy) item_dict[item_id] = temp_item elif line[0] == 'rotate': item_id = line[1] x = int(line[2]) y = int(line[3]) r = int(line[4]) temp_item = item_dict.pop(item_id) temp_item[1] = alg.rotate(temp_item[1], x, y, r) item_dict[item_id] = temp_item elif line[0] == 'scale': item_id = line[1] x = int(line[2]) y = int(line[3]) s = float(line[4]) temp_item = item_dict.pop(item_id) temp_item[1] = alg.scale(temp_item[1], x, y, s) item_dict[item_id] = temp_item elif line[0] == 'clip': item_id = line[1] x0 = int(line[2]) y0 = int(line[3]) x1 = int(line[4]) y1 = int(line[5]) algorithm = line[6] temp_item = item_dict.pop(item_id) temp_item[1] = alg.clip(temp_item[1], min(x0, x1), min(y0, y1), max(x0, x1), max(y0, y1), algorithm) item_dict[item_id] = temp_item line = fp.readline()
pointSet = item_dict[item_id][1] algorithm = item_dict[item_id][2] color = item_dict[item_id][3] pointSet = alg.rotate(pointSet, x, y, r) item_dict[item_id] = [item_type, pointSet, algorithm, color] elif line[0] == 'scale': item_id = line[1] x = int(line[2]) y = int(line[3]) s = float(line[4]) item_type = item_dict[item_id][0] pointSet = item_dict[item_id][1] algorithm = item_dict[item_id][2] color = item_dict[item_id][3] pointSet = alg.scale(pointSet, x, y, s) item_dict[item_id] = [item_type, pointSet, algorithm, color] elif line[0] == 'clip': item_id = line[1] x_min = int(line[2]) y_min = int(line[3]) x_max = int(line[4]) y_max = int(line[5]) clip_algorithm = line[-1] item_type = item_dict[item_id][0] pointSet = item_dict[item_id][1] algorithm = item_dict[item_id][2] color = item_dict[item_id][3] pointSet = alg.clip(pointSet, x_min, y_min, x_max, y_max, clip_algorithm) item_dict[item_id] = [item_type, pointSet, algorithm, color] line = fp.readline()
item_dict[item_id] = item_type, p_list, algorithm, color elif line[0] == 'rotate': item_id = line[1] x = int(line[2]) y = int(line[3]) r = int(line[4]) item_type, p_list, algorithm, color = item_dict[item_id] p_list = alg.rotate(p_list, x, y, r) item_dict[item_id] = item_type, p_list, algorithm, color elif line[0] == 'scale': item_id = line[1] x = int(line[2]) y = int(line[3]) s = float(line[4]) item_type, p_list, algorithm, color = item_dict[item_id] p_list = alg.scale(p_list, x, y, s) item_dict[item_id] = item_type, p_list, algorithm, color elif line[0] == 'clip': item_id = line[1] x0 = int(line[2]) y0 = int(line[3]) x1 = int(line[4]) y1 = int(line[5]) clip_algorithm = line[6] item_type, p_list, algorithm, color = item_dict[item_id] p_list = alg.clip(p_list, x0, y0, x1, y1, clip_algorithm) item_dict[item_id] = item_type, p_list, algorithm, color line = fp.readline()
def mouseReleaseEvent(self, event: QMouseEvent) -> None: if self.status == 'line': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'polygon': pass elif self.status == 'ellipse': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'curve': pass elif self.status == 'select': x0, y0 = self.temp_item.p_list[0] x1, y1 = self.temp_item.p_list[1] x = min(x0, x1) y = min(y0, y1) w = max(x0, x1) - x h = max(y0, y1) - y self.selection_changed(x, y, w, h) self.scene().removeItem(self.temp_item) self.finish_select() elif self.status == 'rect': self.item_dict[self.temp_id] = self.temp_item self.list_widget.addItem(self.temp_id) self.finish_draw() elif self.status == 'move': self.finish_move() elif self.status == 'rotate': if len(self.temp_item.p_list) == 2: self.scene().removeItem(self.temp_item) x0, y0 = self.temp_item.p_list[0] for item in self.selected_items: item.p_list = alg.rotate(item.p_list, x0, y0, item.rotate_angle) self.finish_rotate() elif self.status == 'scale': if len(self.temp_item.p_list) == 2: self.scene().removeItem(self.temp_item) x0, y0 = self.temp_item.p_list[0] for item in self.selected_items: item.p_list = alg.scale(item.p_list, x0, y0, item.scale_ratio) self.finish_scale() elif self.status == 'clip': x0, y0 = self.temp_item.p_list[0] x1, y1 = self.temp_item.p_list[1] x = min(x0, x1) y = min(y0, y1) w = max(x0, x1) - x h = max(y0, y1) - y for item in self.selected_items: if item.item_type == 'line': item.p_list = alg.clip(item.p_list, x, y, x + w, y + h, self.temp_algorithm) if len(item.p_list) < 2: self.scene().removeItem(item) # need to remove from Item List self.scene().removeItem(self.temp_item) self.finish_clip() self.updateScene([self.sceneRect()]) super().mouseReleaseEvent(event)
r = float(item_type[3]) newpixels = alg.scale( p_list, x, y, r, algorithm, item_type[len(item_type) - 1]) if newpixels is not None: for x, y in newpixels: canvas[y, x] = color elif item_type[0] == 'clip': pixels = [] newpixels = [] xm = int(item_type[1]) ym = int(item_type[2]) xM = int(item_type[3]) yM = int(item_type[4]) clipalg = item_type[5] newpixels = alg.clip(p_list, xm, ym, xM, yM, clipalg, algorithm) if newpixels is not None: for x, y in newpixels: canvas[y, x] = color Image.fromarray(canvas).save( os.path.join(output_dir, save_name + '.bmp'), 'bmp') elif line[0] == 'setColor': pen_color[0] = int(line[1]) pen_color[1] = int(line[2]) pen_color[2] = int(line[3]) elif line[0] == 'drawLine': item_id = line[1] x0 = int(line[2]) y0 = int(line[3]) x1 = int(line[4])
item_dict[item_id][1] = alg.translate( item_dict[item_id][1], dx, dy) elif line[0] == 'rotate': item_id = line[1] if item_id in item_dict: x = int(line[2]) y = int(line[3]) r = float(line[4]) item_dict[item_id][1] = alg.rotate(item_dict[item_id][1], x, y, r) elif line[0] == 'scale': item_id = line[1] if item_id in item_dict: x = int(line[2]) y = int(line[3]) s = float(line[4]) item_dict[item_id][1] = alg.scale(item_dict[item_id][1], x, y, s) elif line[0] == 'clip': item_id = line[1] if item_id in item_dict: x_min = int(line[2]) y_min = int(line[3]) x_max = int(line[4]) y_max = int(line[5]) algorithm = line[-1] item_dict[item_id][1] = alg.clip(item_dict[item_id][1], x_min, y_min, x_max, y_max, algorithm) line = fp.readline()
def mouseMoveEvent(self, event: QMouseEvent) -> None: pos = self.mapToScene(event.localPos().toPoint()) x = int(pos.x()) y = int(pos.y()) if self.status == 'line': if self.temp_item: self.temp_item.p_list[1] = [x, y] elif self.status == 'rectangle': if self.temp_item: self.temp_item.p_list[1] = [x, y] elif self.status == 'polygon': if self.temp_item: x0, y0 = self.temp_item.p_list[0] if math.sqrt((x - x0)**2 + (y - y0)**2) <= 10 and len( self.temp_item.p_list) >= 4: self.temp_item.p_list.pop(len(self.temp_item.p_list) - 1) self.temp_item.finished = True self.item_dict[self.temp_id] = self.temp_item self.finish_draw() else: self.temp_item.p_list[-1] = [x, y] elif self.status == 'ellipse': if self.temp_item: self.temp_item.p_list[1] = [x, y] elif self.status == 'curve': if self.temp_item: self.temp_item.p_list[-1] = [x, y] elif self.status == 'translate_p1': pass elif self.status == 'translate_p2': if self.temp_coordinate: sx, sy = self.temp_coordinate self.temp_item.p_list = alg.translate(self.temp_plist, x - sx, y - sy) elif self.status == 'rotate': self.rotate_end = [x, y] # 计算向量夹角 sx, sy = self.rotate_start ex, ey = self.rotate_end cx, cy = self.rotate_center vec1 = np.array([sx - cx, sy - cy]) vec2 = np.array([ex - cx, ey - cy]) len1 = np.sqrt(vec1.dot(vec1)) len2 = np.sqrt(vec2.dot(vec2)) r = np.arccos(vec1.dot(vec2) / (len1 * len2)) angle = int(math.degrees(r) + 0.5) if sx == ex: if sy < ey and cx > sx: angle = 360 - angle elif sy > ey and cx < sx: angle = 360 - angle else: k = (ey - sy) / (ex - sx) b = sy - k * sx if sx > ex and cy > k * cx + b: angle = 360 - angle elif sx < ex and cy < k * cx + b: angle = 360 - angle if self.temp_item: self.temp_item.p_list = alg.rotate(self.temp_plist, self.rotate_center[0], self.rotate_center[1], -angle) elif self.status == 'scale': self.scale_end = [x, y] # 计算向量夹角 sx, sy = self.scale_start ex, ey = self.scale_end cx, cy = self.scale_center s = math.sqrt((ex - sx)**2 + (ey - sy)**2) / 80 if self.temp_item: self.temp_item.p_list = alg.scale(self.temp_plist, cx, cy, s) elif self.status == 'clip': sx, sy = self.temp_coordinate if self.temp_item: self.temp_item.p_list = alg.clip(self.temp_plist, sx, sy, x, y, self.temp_algorithm) elif self.status == 'polygon_clip': sx, sy = self.temp_coordinate if self.temp_algorithm == 'Sutherland-Hodgman': if self.temp_item: self.temp_item.p_list = alg.polygon_clip( self.temp_plist, sx, sy, x, y, self.temp_algorithm) elif self.status == '': pass self.updateScene([self.sceneRect()]) super().mouseMoveEvent(event)
control_point = item_dict[item_id][1] algorithm = item_dict[item_id][2] color = item_dict[item_id][3] new_control_point = alg.scale(control_point, x0, y0, s) item_dict[item_id] = [ graph_type, new_control_point, algorithm, color ] elif line[0] == 'clip': item_id = line[1] x0 = int(line[2]) y0 = int(line[3]) x1 = int(line[4]) y1 = int(line[5]) algorithm = line[6] graph_type = item_dict[item_id][0] control_point = item_dict[item_id][1] color = item_dict[item_id][3] new_control_point = alg.clip(control_point, x0, y0, x1, y1, algorithm) algorithm = item_dict[item_id][2] if len(new_control_point) == 0: del item_dict[item_id] else: item_dict[item_id] = [ graph_type, new_control_point, algorithm, color ] ... line = fp.readline()
item_id = line[1] dx = int(line[2]) dy = int(line[3]) item_dict[item_id][1] = alg.translate(item_dict[item_id][1], dx, dy) elif line[0] == 'rotate': item_id = line[1] x = int(line[2]) y = int(line[3]) r = int(line[4]) item_dict[item_id][1] = alg.rotate(item_dict[item_id][1], x, y, r) elif line[0] == 'scale': item_id = line[1] x = int(line[2]) y = int(line[3]) s = float(line[4]) item_dict[item_id][1] = alg.scale(item_dict[item_id][1], x, y, s) elif line[0] == 'clip': item_id = line[1] x0 = int(line[2]) y0 = int(line[3]) x1 = int(line[4]) y1 = int(line[5]) algorithm = line[6] item_dict[item_id][1] = alg.clip(item_dict[item_id][1], x0, y0, x1, y1, algorithm) line = fp.readline()
def paint(self, painter: QPainter, option: QStyleOptionGraphicsItem, \ widget: Optional[QWidget] = ...) -> None: def angle(v1, v2): """计算v2相对于v1的顺时针角度 v1 = [[x0,y0],[x1,y1]], v2同理 """ dx1 = v1[1][0] - v1[0][0] dy1 = v1[1][1] - v1[0][1] dx2 = v2[1][0] - v2[0][0] dy2 = v2[1][1] - v2[0][1] angle1 = math.atan2(dy1, dx1) angle1 = int(angle1 * 180/math.pi) angle2 = math.atan2(dy2, dx2) angle2 = int(angle2 * 180/math.pi) ret = angle1 - angle2 return ret def thick_draw_point(painter, poi): """加粗绘制一个点,用于裁剪线段时高亮选中部分""" painter.drawPoint(*[poi[0]+1,poi[1]+1]) painter.drawPoint(*[poi[0]+1,poi[1]-1]) painter.drawPoint(*[poi[0]-1,poi[1]+1]) painter.drawPoint(*[poi[0]-1,poi[1]-1]) return def paint_small_cycle(painter, p_list): for poi in p_list: pixels = alg.draw_ellipse([[poi[0]-2,poi[1]-2],[poi[0]+2,poi[1]+2]]) for p in pixels: painter.drawPoint(*p) return def paint_dotted_line(painter, p_list): pixels = alg.draw_dotted_line(p_list) for p in pixels: painter.drawPoint(*p) if self.p_list == [] or self.item_type == 'delete': # be deleted return # change p_list accoring to edit_type new_p_list = self.p_list if self.edit_type == 'translate': # 控制点 painter.setPen(QColor(255,0,255)) paint_small_cycle(painter, [self.poi, self.poi1]) paint_dotted_line(painter, [self.poi, self.poi1]) new_p_list = alg.translate(self.p_list, self.poi1[0]-self.poi[0], \ self.poi1[1]-self.poi[1]) if self.edit_over == 1: # finish self.edit_finish(new_p_list) elif self.edit_type == 'rotate': if self.item_type == 'ellipse': # g_window.statusBar().clearMessage() print("Can't rotate ellipse.") self.edit_finish(self.p_list) else: painter.setPen(QColor(255,0,255)) if self.param_cnt==1: paint_small_cycle(painter, [self.center]) elif self.param_cnt == 2: paint_small_cycle(painter, [self.center, self.poi, self.poi1]) paint_dotted_line(painter, [self.center, self.poi]) paint_dotted_line(painter, [self.center, self.poi1]) # center and poi, poi1 all gotten theta = angle([self.center, self.poi], [self.center, self.poi1]) new_p_list = alg.rotate(self.p_list, \ self.center[0], self.center[1], theta) if self.edit_over == 1: # clear self.edit_finish(new_p_list) elif self.edit_type == 'scale': painter.setPen(QColor(255,0,255)) if self.param_cnt == 1: paint_small_cycle(painter, [self.center]) if self.param_cnt == 2: paint_small_cycle(painter, [self.center, self.poi, self.poi1]) paint_dotted_line(painter, [self.center, self.poi]) paint_dotted_line(painter, [self.center, self.poi1]) # 缩放倍数, 根据dx的比值确定 if self.poi[0]-self.center[0] == 0: s = 1 else : s = (self.poi1[0]-self.center[0])/(self.poi[0]-self.center[0]) new_p_list = alg.scale(self.p_list, \ self.center[0], self.center[1], s) if self.edit_over == 1: self.edit_finish(new_p_list) elif self.edit_type == 'clip': if self.edit_over == 0: # draw the clip window painter.setPen(QColor(0,255,0)) painter.drawRect( self.regionRect([self.poi,self.poi1]) ) tmp_p_list = alg.clip(self.p_list, self.poi[0], self.poi[1],\ self.poi1[0], self.poi1[1], self.edit_algorithm) if tmp_p_list != []: # highlight the line in clip window tmp_pixels = self.get_draw_pixels(tmp_p_list,self.algorithm) painter.setPen(QColor(0, 255, 0)) for p in tmp_pixels: thick_draw_point(painter, p) elif self.edit_over == 1: # 得到裁剪后的端点 new_p_list = alg.clip(self.p_list, self.poi[0], self.poi[1],\ self.poi1[0], self.poi1[1], self.edit_algorithm) self.edit_finish(new_p_list) if self.p_list == []: # 线段被裁剪没了 self.item_type = 'delete' self.pixels = [] g_canvas.clear_selection() g_list_widget.takeItem(g_list_widget.currentRow()) del g_canvas.item_dict[self.id] #下面这句加了后,画布大小改变后再删除图元会崩溃 # g_canvas.scene().removeItem(self) return # 填充 if self.isPadding: painter.setPen(self.paddingColor) polygon_padding(painter, self) item_pixels = [] if new_p_list != []: if self.id == g_canvas.cur_id: item_pixels = self.get_draw_pixels(new_p_list, self.algorithm) self.pixels = item_pixels else: item_pixels = self.pixels else : print("Undefined Behavior: new_p_list shouldn't be []") # 线段被裁剪没了的话不该到这一步 return # draw painter.setPen(self.penColor) for p in item_pixels: painter.drawPoint(*p) # draw bound if self.selected: painter.setPen(QColor(255, 0, 0)) painter.drawRect(self.regionRect(new_p_list)) pass