Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
 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()])
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
    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)
Exemplo n.º 9
0
 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)
Exemplo n.º 10
0
 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)
Exemplo n.º 11
0
 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)
Exemplo n.º 12
0
 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)
Exemplo n.º 13
0
            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()
Exemplo n.º 14
0
                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()
Exemplo n.º 15
0
                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()
Exemplo n.º 16
0
                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()
Exemplo n.º 17
0
                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()
Exemplo n.º 18
0
                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()
Exemplo n.º 19
0
                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()
Exemplo n.º 20
0
                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()

Exemplo n.º 21
0
    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)
Exemplo n.º 22
0
                            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])
Exemplo n.º 23
0
                    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()
Exemplo n.º 24
0
 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)
Exemplo n.º 25
0
                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()
Exemplo n.º 26
0
                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()
Exemplo n.º 27
0
 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