Просмотр исходного кода

- Gerber Editor: work in progress to add multiple modes of drawing for the Region Tool

Marius Stanciu 6 лет назад
Родитель
Сommit
b91e492805
2 измененных файлов с 170 добавлено и 4 удалено
  1. 1 0
      README.md
  2. 169 4
      flatcamEditors/FlatCAMGrbEditor.py

+ 1 - 0
README.md

@@ -14,6 +14,7 @@ CAD program, and create G-Code for Isolation routing.
 - Gerber Editor: added some messages to warn user if no selection exists when trying to do aperture deletion or aperture geometry deletion
 - fixed version check
 - added custom mouse cursors for some tools in Gerber Editor
+- Gerber Editor: work in progress to add multiple modes of drawing for the Region Tool
 
 16.04.2019
 

+ 169 - 4
flatcamEditors/FlatCAMGrbEditor.py

@@ -616,14 +616,19 @@ class FCRegion(FCShapeTool):
             QtGui.QGuiApplication.restoreOverrideCursor()
         except:
             pass
-
         self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero.png'))
         QtGui.QGuiApplication.setOverrideCursor(self.cursor)
 
+        self.mode = 1
+
         self.start_msg = _("Click on 1st point ...")
 
     def click(self, point):
         self.draw_app.in_action = True
+
+        if self.inter_point is not None:
+            self.points.append(self.inter_point)
+
         self.points.append(point)
 
         if len(self.points) > 0:
@@ -637,16 +642,129 @@ class FCRegion(FCShapeTool):
         self.gridy_size = float(self.draw_app.app.ui.grid_gap_y_entry.get_value())
 
     def utility_geometry(self, data=None):
+
+        x = data[0]
+        y = data[1]
+
         if len(self.points) == 0:
             return DrawToolUtilityShape(Point(data).buffer(self.buf_val))
 
         if len(self.points) == 1:
             self.temp_points = [x for x in self.points]
-            self.temp_points.append(data)
-            return DrawToolUtilityShape(LineString(self.temp_points).buffer(self.buf_val, join_style=1))
+
+            old_x = self.points[0][0]
+            old_y = self.points[0][1]
+            mx = abs(round((x - old_x) / self.gridx_size))
+            my = abs(round((y - old_y) / self.gridy_size))
+
+            if self.draw_app.app.ui.grid_snap_btn.isChecked():
+                if self.mode != 5:
+                    if self.mode == 1:
+                        if x > old_x:
+                            if mx > my:
+                                self.inter_point = (old_x + self.gridx_size * (mx - my), old_y)
+                            if mx < my:
+                                if y < old_y:
+                                    self.inter_point = (old_x, old_y - self.gridy_size * (my - mx))
+                                else:
+                                    self.inter_point = (old_x, old_y - self.gridy_size * (mx - my))
+                        if x < old_x:
+                            if mx > my:
+                                self.inter_point = (old_x - self.gridx_size * (mx - my), old_y)
+                            if mx < my:
+                                if y < old_y:
+                                    self.inter_point = (old_x, old_y - self.gridy_size * (my - mx))
+                                else:
+                                    self.inter_point = (old_x, old_y - self.gridy_size * (mx - my))
+                    elif self.mode == 2:
+                        if x > old_x:
+                            if mx > my:
+                                self.inter_point = (old_x + self.gridx_size * my, y)
+                            if mx < my:
+                                if y < old_y:
+                                    self.inter_point = (x, old_y - self.gridy_size * mx)
+                                else:
+                                    self.inter_point = (x, old_y + self.gridy_size * mx)
+                        if x < old_x:
+                            if mx > my:
+                                self.inter_point = (old_x - self.gridx_size * my, y)
+                            if mx < my:
+                                if y < old_y:
+                                    self.inter_point = (x, old_y - self.gridy_size * mx)
+                                else:
+                                    self.inter_point = (x, old_y + self.gridy_size * mx)
+                    elif self.mode == 3:
+                        self.temp_points.append((old_x, y))
+                    elif self.mode == 4:
+                        self.temp_points.append((x, old_y))
+                    if self.inter_point is not None:
+                        self.temp_points.append(self.inter_point)
+                    else:
+                        self.inter_point = data
+                self.temp_points.append(data)
+            else:
+                self.inter_point = data
+                self.temp_points.append(data)
+
+            if len(self.temp_points) > 1:
+                try:
+                    return DrawToolUtilityShape(LineString(self.temp_points).buffer(self.buf_val, join_style=1))
+                except:
+                    pass
+            else:
+                return DrawToolUtilityShape(Point(self.temp_points).buffer(self.buf_val))
 
         if len(self.points) > 1:
             self.temp_points = [x for x in self.points]
+
+            old_x = self.points[-1][0]
+            old_y = self.points[-1][1]
+            mx = abs(round((x - old_x) / self.gridx_size))
+            my = abs(round((y - old_y) / self.gridy_size))
+
+            if self.draw_app.app.ui.grid_snap_btn.isChecked():
+                if self.mode != 5:
+                    if self.mode == 1:
+                        if x > old_x:
+                            if mx > my:
+                                self.inter_point = (old_x + self.gridx_size * (mx - my), old_y)
+                            if mx < my:
+                                if y < old_y:
+                                    self.inter_point = (old_x, old_y - self.gridy_size * (my - mx))
+                                else:
+                                    self.inter_point = (old_x, old_y - self.gridy_size * (mx - my))
+                        if x < old_x:
+                            if mx > my:
+                                self.inter_point = (old_x - self.gridx_size * (mx - my), old_y)
+                            if mx < my:
+                                if y < old_y:
+                                    self.inter_point = (old_x, old_y - self.gridy_size * (my - mx))
+                                else:
+                                    self.inter_point = (old_x, old_y - self.gridy_size * (mx - my))
+                    elif self.mode == 2:
+                        if x > old_x:
+                            if mx > my:
+                                self.inter_point = (old_x + self.gridx_size * my, y)
+                            if mx < my:
+                                if y < old_y:
+                                    self.inter_point = (x, old_y - self.gridy_size * mx)
+                                else:
+                                    self.inter_point = (x, old_y + self.gridy_size * mx)
+                        if x < old_x:
+                            if mx > my:
+                                self.inter_point = (old_x - self.gridx_size * my, y)
+                            if mx < my:
+                                if y < old_y:
+                                    self.inter_point = (x, old_y - self.gridy_size * mx)
+                                else:
+                                    self.inter_point = (x, old_y + self.gridy_size * mx)
+                    elif self.mode == 3:
+                        self.temp_points.append((old_x, y))
+                    elif self.mode == 4:
+                        self.temp_points.append((x, old_y))
+
+                    self.temp_points.append(self.inter_point)
+
             self.temp_points.append(data)
             return DrawToolUtilityShape(LinearRing(self.temp_points).buffer(self.buf_val, join_style=1))
         return None
@@ -673,6 +791,54 @@ class FCRegion(FCShapeTool):
                 self.draw_app.draw_utility_geometry(geo=geo)
                 return _("Backtracked one point ...")
 
+        if key == 'T' or key == QtCore.Qt.Key_T:
+            if self.mode == 1:
+                self.mode = 2
+                msg =  _('Track Mode 2: Reverse 45 degrees ...')
+            elif self.mode == 2:
+                self.mode = 3
+                msg = _('Track Mode 3: 90 degrees ...')
+            elif self.mode == 3:
+                self.mode = 4
+                msg = _('Track Mode 4: Reverse 90 degrees ...')
+            elif self.mode == 4:
+                self.mode = 5
+                msg = _('Track Mode 5: Free angle ...')
+            else:
+                self.mode = 1
+                msg = _('Track Mode 1: 45 degrees ...')
+
+            # Remove any previous utility shape
+            self.draw_app.tool_shape.clear(update=False)
+            geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y))
+            self.draw_app.draw_utility_geometry(geo=geo)
+
+            return msg
+
+        if key == 'R' or key == QtCore.Qt.Key_R:
+            if self.mode == 1:
+                self.mode = 5
+                msg = _('Track Mode 5: Free angle ...')
+            elif self.mode == 5:
+                self.mode = 4
+                msg = _('Track Mode 4: Reverse 90 degrees ...')
+            elif self.mode == 4:
+                self.mode = 3
+                msg = _('Track Mode 3: 90 degrees ...')
+            elif self.mode == 3:
+                self.mode = 2
+                msg = _('Track Mode 2: Reverse 45 degrees ...')
+            else:
+                self.mode = 1
+                msg = _('Track Mode 1: 45 degrees ...')
+
+            # Remove any previous utility shape
+            self.draw_app.tool_shape.clear(update=False)
+            geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y))
+            self.draw_app.draw_utility_geometry(geo=geo)
+
+            return msg
+
 
 class FCTrack(FCRegion):
     """
@@ -693,7 +859,6 @@ class FCTrack(FCRegion):
         QtGui.QGuiApplication.setOverrideCursor(self.cursor)
 
         self.draw_app.app.inform.emit(_('Track Mode 1: 45 degrees ...'))
-        self.mode = 1
 
     def make(self):
         if len(self.temp_points) == 1: