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

Buffer selected geometry in Drawing tool. Fixes #133.

Juan Pablo Caram 10 лет назад
Родитель
Сommit
9e854f802e
1 измененных файлов с 72 добавлено и 7 удалено
  1. 72 7
      FlatCAMDraw.py

+ 72 - 7
FlatCAMDraw.py

@@ -1,6 +1,8 @@
 from PyQt4 import QtGui, QtCore, Qt
 import FlatCAMApp
 from camlib import *
+from FlatCAMTool import FlatCAMTool
+from ObjectUI import LengthEntry
 
 from shapely.geometry import Polygon, LineString, Point, LinearRing
 from shapely.geometry import MultiPoint, MultiPolygon
@@ -19,6 +21,47 @@ from numpy.linalg import solve
 from rtree import index as rtindex
 
 
+class BufferSelectionTool(FlatCAMTool):
+    """
+    Simple input for buffer distance.
+    """
+
+    toolName = "Buffer Selection"
+
+    def __init__(self, app, fcdraw):
+        FlatCAMTool.__init__(self, app)
+
+        self.fcdraw = fcdraw
+
+        ## Title
+        title_label = QtGui.QLabel("<font size=4><b>%s</b></font>" % self.toolName)
+        self.layout.addWidget(title_label)
+
+        ## Form Layout
+        form_layout = QtGui.QFormLayout()
+        self.layout.addLayout(form_layout)
+
+        ## Buffer distance
+        self.buffer_distance_entry = LengthEntry()
+        form_layout.addRow("Buffer distance:", self.buffer_distance_entry)
+
+        ## Buttons
+        hlay = QtGui.QHBoxLayout()
+        self.layout.addLayout(hlay)
+        hlay.addStretch()
+        self.buffer_button = QtGui.QPushButton("Buffer")
+        hlay.addWidget(self.buffer_button)
+
+        self.layout.addStretch()
+
+        ## Signals
+        self.buffer_button.clicked.connect(self.on_buffer)
+
+    def on_buffer(self):
+        buffer_distance = self.buffer_distance_entry.get_value()
+        self.fcdraw.buffer(buffer_distance)
+
+
 class DrawToolShape(object):
     """
     Encapsulates "shapes" under a common class.
@@ -578,22 +621,29 @@ class FlatCAMDraw(QtCore.QObject):
         self.app.ui.addToolBar(self.snap_toolbar)
 
         ### Application menu ###
-        # self.menu = QtGui.QMenu("Drawing")
-        # self.app.ui.menu.insertMenu(self.app.ui.menutoolaction, self.menu)
+        self.menu = QtGui.QMenu("Drawing")
+        self.app.ui.menu.insertMenu(self.app.ui.menutoolaction, self.menu)
         # self.select_menuitem = self.menu.addAction(QtGui.QIcon('share/pointer16.png'), "Select 'Esc'")
         # self.add_circle_menuitem = self.menu.addAction(QtGui.QIcon('share/circle16.png'), 'Add Circle')
         # self.add_arc_menuitem = self.menu.addAction(QtGui.QIcon('share/arc16.png'), 'Add Arc')
         # self.add_rectangle_menuitem = self.menu.addAction(QtGui.QIcon('share/rectangle16.png'), 'Add Rectangle')
         # self.add_polygon_menuitem = self.menu.addAction(QtGui.QIcon('share/polygon16.png'), 'Add Polygon')
         # self.add_path_menuitem = self.menu.addAction(QtGui.QIcon('share/path16.png'), 'Add Path')
-        # self.union_menuitem = self.menu.addAction(QtGui.QIcon('share/union16.png'), 'Polygon Union')
-        # self.intersection_menuitem = self.menu.addAction(QtGui.QIcon('share/intersection16.png'), 'Polygon Intersection')
+        self.union_menuitem = self.menu.addAction(QtGui.QIcon('share/union16.png'), 'Polygon Union')
+        self.intersection_menuitem = self.menu.addAction(QtGui.QIcon('share/intersection16.png'), 'Polygon Intersection')
         # self.subtract_menuitem = self.menu.addAction(QtGui.QIcon('share/subtract16.png'), 'Polygon Subtraction')
-        # self.cutpath_menuitem = self.menu.addAction(QtGui.QIcon('share/cutpath16.png'), 'Cut Path')
+        self.cutpath_menuitem = self.menu.addAction(QtGui.QIcon('share/cutpath16.png'), 'Cut Path')
         # self.move_menuitem = self.menu.addAction(QtGui.QIcon('share/move16.png'), "Move Objects 'm'")
         # self.copy_menuitem = self.menu.addAction(QtGui.QIcon('share/copy16.png'), "Copy Objects 'c'")
-        # self.delete_menuitem = self.menu.addAction(QtGui.QIcon('share/deleteshape16.png'), "Delete Shape '-'")
-        # self.menu.addSeparator()
+        self.delete_menuitem = self.menu.addAction(QtGui.QIcon('share/deleteshape16.png'), "Delete Shape '-'")
+        self.buffer_menuitem = self.menu.addAction(QtGui.QIcon('share/buffer16.png'), "Buffer selection 'b'")
+        self.menu.addSeparator()
+
+        self.buffer_menuitem.triggered.connect(self.on_buffer_tool)
+        self.delete_menuitem.triggered.connect(self.on_delete_btn)
+        self.union_menuitem.triggered.connect(self.union)
+        self.intersection_menuitem.triggered.connect(self.intersection)
+        self.cutpath_menuitem.triggered.connect(self.cutpath)
 
         ### Event handlers ###
         # Connection ids for Matplotlib
@@ -790,6 +840,10 @@ class FlatCAMDraw(QtCore.QObject):
         self.drawing_toolbar.setDisabled(False)
         self.snap_toolbar.setDisabled(False)
 
+    def on_buffer_tool(self):
+        buff_tool = BufferSelectionTool(self.app, self)
+        buff_tool.run()
+
     def on_tool_select(self, tool):
         """
         Behavior of the toolbar. Tool initialization.
@@ -976,6 +1030,10 @@ class FlatCAMDraw(QtCore.QObject):
         if event.key == 'k':
             self.corner_snap_btn.trigger()
 
+        ### Buffer
+        if event.key == 'b':
+            self.on_buffer_tool()
+
         ### Propagate to tool
         response = None
         if self.active_tool is not None:
@@ -1263,6 +1321,13 @@ class FlatCAMDraw(QtCore.QObject):
 
         self.replot()
 
+    def buffer(self, buf_distance):
+        pre_buffer = cascaded_union([t.geo for t in self.get_selected()])
+        results = pre_buffer.buffer(buf_distance)
+        self.add_shape(DrawToolShape(results))
+
+        self.replot()
+
 
 def distance(pt1, pt2):
     return sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2)