From 0d055ee235f04747bb0a4b9843ba36a7132f4a5a Mon Sep 17 00:00:00 2001 From: jpcaram Date: Thu, 25 Dec 2014 20:04:41 -0500 Subject: [PATCH] Polygon subtract feature functional. Added some missing icons. --- FlatCAMDraw.py | 28 +++++++++++++++++++++------- doc/source/planning.rst | 2 ++ share/arc16.png | Bin 0 -> 492 bytes share/arc24.png | Bin 0 -> 652 bytes share/arc32.png | Bin 0 -> 854 bytes share/subtract16.png | Bin 0 -> 517 bytes share/subtract24.png | Bin 0 -> 620 bytes share/subtract32.png | Bin 0 -> 703 bytes 8 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 share/arc16.png create mode 100644 share/arc24.png create mode 100644 share/arc32.png create mode 100644 share/subtract16.png create mode 100644 share/subtract24.png create mode 100644 share/subtract32.png diff --git a/FlatCAMDraw.py b/FlatCAMDraw.py index 6964d6a..5728c88 100644 --- a/FlatCAMDraw.py +++ b/FlatCAMDraw.py @@ -505,6 +505,7 @@ class FlatCAMDraw(QtCore.QObject): self.add_polygon_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), 'Add Polygon') self.add_path_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/path32.png'), 'Add Path') self.union_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/union32.png'), 'Polygon Union') + self.subtract_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/subtract32.png'), 'Polygon Subtraction') self.move_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/move32.png'), 'Move Objects') self.copy_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/copy32.png'), 'Copy Objects') @@ -537,6 +538,7 @@ class FlatCAMDraw(QtCore.QObject): self.canvas.mpl_connect('key_release_event', self.on_canvas_key_release) self.union_btn.triggered.connect(self.union) + self.subtract_btn.triggered.connect(self.subtract) ## Toolbar events and properties self.tools = { @@ -1010,6 +1012,13 @@ class FlatCAMDraw(QtCore.QObject): self.shape_buffer.append(shape) self.add2index(len(self.shape_buffer) - 1, shape.geo) + def delete_shape(self, shape): + if shape in self.shape_buffer: + self.shape_buffer.remove(shape) + + if shape in self.selected: + self.selected.remove(shape) + def replot(self): #self.canvas.clear() self.axes = self.canvas.new_axes("draw") @@ -1088,7 +1097,6 @@ class FlatCAMDraw(QtCore.QObject): :return: None. """ - #targets = [shape for shape in self.selected] results = cascaded_union([t.geo for t in self.get_selected()]) @@ -1099,16 +1107,22 @@ class FlatCAMDraw(QtCore.QObject): # Selected geometry is now gone! self.selected = [] - # try: - # for geo in results: - # self.shape_buffer.append(DrawToolShape(geo)) - # except TypeError: - # self.shape_buffer.append(DrawToolShape(geo)) - self.add_shape(DrawToolShape(results)) self.replot() + def subtract(self): + selected = self.get_selected() + tools = selected[1:] + toolgeo = cascaded_union([shp.geo for shp in tools]) + result = selected[0].geo.difference(toolgeo) + + self.delete_shape(selected[0]) + self.add_shape(DrawToolShape(result)) + + self.replot() + + def distance(pt1, pt2): return sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2) diff --git a/doc/source/planning.rst b/doc/source/planning.rst index f05f3d4..a4f148b 100644 --- a/doc/source/planning.rst +++ b/doc/source/planning.rst @@ -9,6 +9,8 @@ Drawing * Selected objects must be kept onlist to preserve order. * Polygon to outline * Force perpendicular +* Un-group (Union creates group) +* Group (But not union) Algorithms diff --git a/share/arc16.png b/share/arc16.png new file mode 100644 index 0000000000000000000000000000000000000000..f61e25b5fb2fb584460547be7495057bacb270e9 GIT binary patch literal 492 zcmVnw#Wuf|QeB+1bnYhDp>%0L8iX#T*|LPR#CwlR#E+XBu;hia9L{;Z z^B&G8Gh-QfOLe;dNgI;BNvcZnB|Z2rf|)V1@eVNH7PtZiKp)rxHviTo!v(CDN~NFW za(TzeJqEUcAHZi|H3`T#lYH-VI`4s@le-2EBpm{~z^SAyGaJn9V5SS;S&Gfr%sv3G zfg?#zQvts3_tO9l=&PhBlFlUM=K!@@Z3H|_Ywq=WVYl1;n9Jo1xC5dz3jk5G*>v-2 zx7)AcIQ}B((|9~yiQ_nLW+UL=5*__27Kd7k%H(s2+3&nuNmlq^>AlnaHz z`D8K)8jZ$D7>3?-I(<{G*KZc>W$rLCnanVo&Hk=dt1lNFj~jCn_`d(b%pOHiv~On9 ig)c9%a9=I`8~*@2aLz18es6dH0000k8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10trb(K~zYI?Ug-fQ(+W_pZ6w8NJH#3i-=_DP)j9rb98WYaj+ml zz~RPBf~x^np-UIH8^IwcLKla262(DOER=#x1vTKHAs`qWiYfUyE;r>GbCX-7P98YR zIp=$y?>pb0%#5Qn=SbE61t2*ZkaP{m0y}2*@^1kO?}4NOun7zTzYDm)Ebsw%4s4m( zAU46w4jfnl_5cg~E3gB+27UywHt+nK(eSf1`tzL;71OmKZHQ#`%QMF@Fk(t$j#R+XSGrJEg055=tk}i#_jXI`vGdmXr z2!UE=whTN59!Xk=1(>#iG3EjLz?P&9N$H7zbUOVWm|I(0J03^f%zjEb0i=M7Kz<^i zSS;=V&33yzKTW(=tIbra)s;QRivq*dTmE||)g;dV0000mXB;`4?>Vg9_|&(a z=llJ9zMt3g`Fy@V9+?>vDc*#7{|^96%GD`p2CyJ{O`F-%aU(FZUmDN@SkyiOu?Ti1 zun4HiWmim7u2mrE4KO3C>jO}p%?;cIE=TREnGF>a09SxFz-!=b^jrfh2NaEe1#SX+ z%yo6|(F z9vFx~UIPs-b~%@!nT_=H^gOAksCZUgU0vfC$qT>|;Aj+`vyx6r(x2?|?E`&gw#)?} zg23oLa7$O7pG)&OZ>ucU^e0DwM8^V-|nrxXG40@w(A22M%Z zA*r??05j_aO3KR078VK+*!_c`9$0U(R_{n5)x9|H?|D@+~8um#lC<4i3ac%5Y3U+Y=irb6GkYlM zb5sYn#`-%tI_7wuci8j12H>)!O+gUccXd1_c~c;1MSXq!#lgYBhh1G=XIffXQn6TU zrmQ1i`sN9Tx)7FKNCc!Z1{GbMruLZS8DH$3{j*_BS;(Wr}qU4k-Y9Gy4uY zJUsjkSQi9A-`_a?E)M7X6Moze4OsiH?t^CL6oI29B_-R<%)&5y1>E>2Umi)`8W?Yx g@E?=^022=I4OU$d!q5JZd;kCd07*qoM6N<$g41q$NdN!< literal 0 HcmV?d00001 diff --git a/share/subtract16.png b/share/subtract16.png new file mode 100644 index 0000000000000000000000000000000000000000..106734460245fb7a1e9aa0feb5f6a8afe0f92b6a GIT binary patch literal 517 zcmV+g0{Z=lP)Q$2pgG84=+SaRwff22R9tYo#*p;b2gjFnx;vbreQc70sykvEK;e|j?=9nhC(5$ zUay~)%jFYUmW4v0fLtyIMNxdvPwmVg5{W>TWe9?RWHJc=uq+F2&((IF8`D?#Et0I-SO3GC{Fe+$TY4&KIZ6&9k8u==un00000NkvXX Hu0mjf4vyEm literal 0 HcmV?d00001 diff --git a/share/subtract24.png b/share/subtract24.png new file mode 100644 index 0000000000000000000000000000000000000000..209cd9869f1bc042275b9ea1d36a44c70b811ee2 GIT binary patch literal 620 zcmV-y0+aoTP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10qIFZK~zYI)s-=;+E5h7e~Ecf5ksLuhh|VZRWd2v`~=ww4qb#6 zL<+@C&=1g6(8+e`SI}m0aVzu_2rdtV>Z2e;F<4{U;O)>F)V^q>ywd*R4ENmsJ^yp= zIhQL5A-GG(cN+a~2q$>q%97&S4^?Lo&fiFxCn$6}DA;ia!3B9b2!K=1wJ%Q!!Qiu@t>2KPNy*p!{2uthuLg)R^Z=x zXt!ar+0g6t{I%mazr_nJP%f8=#bS7#hv#{?uFGb#5vr~6kp6 z=g$fx5{ZNH++np^5sgN7FE=nw;Kq8rKKXhViv_am58-73^Z6Xhval>GP~exyS0KuX zD>`oSGtM{kHhU4a$?t)8!2Oe{AL0fGEH%`J^C$TKKm8xUy64Rz0N;@S0000cnmf++4oOQG54JRIltVQdy^r? z815;_0f^`mfcT-j!{OMZQYoF-$E6uSM0Nmm0B;W& zWLZYNUWd=;`#S&t-W?mhl_W_}6a~FrPm^;xov_(#R{^NZ|fJQ9fn%x3fT09LEj>T&Znx?oq6HB>UJUT(Eh-2CGMUVa^_@;f&StY;d7fWC`-katy00l@jO_$~ z4*(bd77PY|7K=r;RUi;x+uWJq*zdm|x?Vx8RztJd1Y-b{pk#8KNj|Ehqcy z0`I5bx( zm9qc`~ru`D1`2py6gY|002ovPDHLkV1k;*H%0&e literal 0 HcmV?d00001