From 839baea4b8e26cd30284eca02ecb1a47d6340589 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 18 Apr 2019 16:35:50 +0300 Subject: [PATCH] - Gerber Editor: added custom mouse cursors for each mode in Add Track Tool - Gerber Editor: Poligonize Tool will first fuse polygons that touch each other and at a second try will create a polygon. The polygon will be automatically moved to Aperture '0' (regions). --- FlatCAMProcess.py | 4 +- README.md | 4 ++ flatcamEditors/FlatCAMGrbEditor.py | 85 +++++++++++++++++++---------- share/aero_path.png | Bin 2712 -> 0 bytes share/aero_path1.png | Bin 0 -> 6749 bytes share/aero_path2.png | Bin 0 -> 6749 bytes share/aero_path3.png | Bin 0 -> 6750 bytes share/aero_path4.png | Bin 0 -> 6749 bytes share/aero_path5.png | Bin 0 -> 6748 bytes 9 files changed, 61 insertions(+), 32 deletions(-) delete mode 100644 share/aero_path.png create mode 100644 share/aero_path1.png create mode 100644 share/aero_path2.png create mode 100644 share/aero_path3.png create mode 100644 share/aero_path4.png create mode 100644 share/aero_path5.png diff --git a/FlatCAMProcess.py b/FlatCAMProcess.py index d71e62d8..1556ab4a 100644 --- a/FlatCAMProcess.py +++ b/FlatCAMProcess.py @@ -134,13 +134,13 @@ class FCVisibleProcessContainer(QtCore.QObject, FCProcessContainer): self.something_changed.connect(self.update_view) def on_done(self, proc): - self.app.log.debug("FCVisibleProcessContainer.on_done()") + # self.app.log.debug("FCVisibleProcessContainer.on_done()") super(FCVisibleProcessContainer, self).on_done(proc) self.something_changed.emit() def on_change(self, proc): - self.app.log.debug("FCVisibleProcessContainer.on_change()") + # self.app.log.debug("FCVisibleProcessContainer.on_change()") super(FCVisibleProcessContainer, self).on_change(proc) self.something_changed.emit() diff --git a/README.md b/README.md index 302b830f..ceb4c452 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +18.04.2019 +- Gerber Editor: added custom mouse cursors for each mode in Add Track Tool +- Gerber Editor: Poligonize Tool will first fuse polygons that touch each other and at a second try will create a polygon. The polygon will be automatically moved to Aperture '0' (regions). + 17.04.2019 - Gerber Editor: added some messages to warn user if no selection exists when trying to do aperture deletion or aperture geometry deletion diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 9d23a39c..67177756 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -540,7 +540,6 @@ class FCPoligonize(FCShapeTool): return "" def make(self): - if not self.draw_app.selected: self.draw_app.in_action = False self.complete = True @@ -548,20 +547,22 @@ class FCPoligonize(FCShapeTool): self.draw_app.select_tool("select") return - try: - current_storage = self.draw_app.storage_dict['0']['solid_geometry'] - except KeyError: - self.draw_app.on_aperture_add(apid='0') - current_storage = self.draw_app.storage_dict['0']['solid_geometry'] - fused_geo = [Polygon(sh.geo.exterior) for sh in self.draw_app.selected] - fused_geo = MultiPolygon(fused_geo) fused_geo = fused_geo.buffer(0.0000001) + + current_storage = self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['solid_geometry'] if isinstance(fused_geo, MultiPolygon): for geo in fused_geo: self.draw_app.on_grb_shape_complete(current_storage, specific_shape=DrawToolShape(geo)) else: + if len(fused_geo.interiors) == 0: + try: + current_storage = self.draw_app.storage_dict['0']['solid_geometry'] + except KeyError: + self.draw_app.on_aperture_add(apid='0') + current_storage = self.draw_app.storage_dict['0']['solid_geometry'] + self.draw_app.on_grb_shape_complete(current_storage, specific_shape=DrawToolShape(fused_geo)) self.draw_app.delete_selected() @@ -694,9 +695,9 @@ class FCRegion(FCShapeTool): else: self.inter_point = (x, old_y + self.gridy_size * mx) elif self.mode == 3: - self.inter_point = (old_x, y) - elif self.mode == 4: self.inter_point = (x, old_y) + elif self.mode == 4: + self.inter_point = (old_x, y) if self.inter_point is not None: self.temp_points.append(self.inter_point) @@ -761,9 +762,9 @@ class FCRegion(FCShapeTool): else: self.inter_point = (x, old_y + self.gridy_size * mx) elif self.mode == 3: - self.inter_point = (old_x, y) - elif self.mode == 4: self.inter_point = (x, old_y) + elif self.mode == 4: + self.inter_point = (old_x, y) self.temp_points.append(self.inter_point) self.temp_points.append(data) @@ -861,7 +862,7 @@ class FCTrack(FCRegion): QtGui.QGuiApplication.restoreOverrideCursor() except: pass - self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path.png')) + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path1.png')) QtGui.QGuiApplication.setOverrideCursor(self.cursor) self.draw_app.app.inform.emit(_('Track Mode 1: 45 degrees ...')) @@ -950,9 +951,9 @@ class FCTrack(FCRegion): else: self.temp_points.append((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)) + elif self.mode == 4: + self.temp_points.append((old_x, y)) else: pass @@ -973,20 +974,34 @@ class FCTrack(FCRegion): return _("Backtracked one point ...") if key == 'T' or key == QtCore.Qt.Key_T: + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass if self.mode == 1: self.mode = 2 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path2.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 2: Reverse 45 degrees ...') elif self.mode == 2: self.mode = 3 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path3.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 3: 90 degrees ...') elif self.mode == 3: self.mode = 4 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path4.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 4: Reverse 90 degrees ...') elif self.mode == 4: self.mode = 5 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path5.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 5: Free angle ...') else: self.mode = 1 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path1.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 1: 45 degrees ...') # Remove any previous utility shape @@ -997,20 +1012,34 @@ class FCTrack(FCRegion): return msg if key == 'R' or key == QtCore.Qt.Key_R: + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass if self.mode == 1: self.mode = 5 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path5.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 5: Free angle ...') elif self.mode == 5: self.mode = 4 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path4.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 4: Reverse 90 degrees ...') elif self.mode == 4: self.mode = 3 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path3.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 3: 90 degrees ...') elif self.mode == 3: self.mode = 2 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path2.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 2: Reverse 45 degrees ...') else: self.mode = 1 + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path1.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) msg = _('Track Mode 1: 45 degrees ...') # Remove any previous utility shape @@ -1477,30 +1506,26 @@ class FlatCAMGrbEditor(QtCore.QObject): self.apdim_entry = EvalEntry2() grid1.addWidget(self.apdim_entry, 4, 1) - apadd_lbl = QtWidgets.QLabel('%s' % _('Add Aperture:')) - apadd_lbl.setToolTip( - _("Add an aperture to the aperture list") + apadd_del_lbl = QtWidgets.QLabel('%s' % _('Add/Delete Aperture:')) + apadd_del_lbl.setToolTip( + _("Add/Delete an aperture in the aperture table") ) - grid1.addWidget(apadd_lbl, 5, 0) + self.apertures_box.addWidget(apadd_del_lbl) - self.addaperture_btn = QtWidgets.QPushButton(_('Go')) + hlay_ad = QtWidgets.QHBoxLayout() + self.apertures_box.addLayout(hlay_ad) + + self.addaperture_btn = QtWidgets.QPushButton(_('Add')) self.addaperture_btn.setToolTip( _( "Add a new aperture to the aperture list.") ) - grid1.addWidget(self.addaperture_btn, 5, 1) - apdelete_lbl = QtWidgets.QLabel('%s' % _('Del Aperture:')) - apdelete_lbl.setToolTip( - _( "Delete a aperture in the aperture list.\n" - "It will delete also the associated geometry.") - ) - grid1.addWidget(apdelete_lbl, 6, 0) - - self.delaperture_btn = QtWidgets.QPushButton(_('Go')) + self.delaperture_btn = QtWidgets.QPushButton(_('Delete')) self.delaperture_btn.setToolTip( _( "Delete a aperture in the aperture list") ) - grid1.addWidget(self.delaperture_btn, 6, 1) + hlay_ad.addWidget(self.addaperture_btn) + hlay_ad.addWidget(self.delaperture_btn) ### BUFFER TOOL ### diff --git a/share/aero_path.png b/share/aero_path.png deleted file mode 100644 index 10e4a6dfc6e8a98f3a3c4d4d85d76037bcc7ecb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2712 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 JtI=`2@K67)Xd(ar literal 0 HcmV?d00001 diff --git a/share/aero_path2.png b/share/aero_path2.png new file mode 100644 index 0000000000000000000000000000000000000000..d528c860446cd97d7c2424d3c62246860fce83ca GIT binary patch literal 6749 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 K4pU@&GV)&~&wTFy literal 0 HcmV?d00001 diff --git a/share/aero_path3.png b/share/aero_path3.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d7bac4fae427e26fc924ef87194e35ecd06a6c GIT binary patch literal 6750 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 literal 0 HcmV?d00001 diff --git a/share/aero_path4.png b/share/aero_path4.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc7b9ab68bab53b31f71b6fffac24f6f7c663d7 GIT binary patch literal 6749 zcmeH}XH*ke8-OPvp$9@oYWNUEq$wRj=xynUG@}7Tno^~g2nZMvSp=mh9fN?l$lmGz0v@}(X zh(~$iu1-!u>^04A3;+P>lAp1ehmn;x!qwfy*5SrAgom%|HN-U^2U`H}`S``uDTe(O zY`6WwBsoM8XmHyK%l(9C(!Y7K;7cjyN=htu&O`j=R@`_Hq7o$jZo6ruco!yOvVhO= zrYepwy~m7n?OIs)T506eKC>3Hw|~EeTcmYZK{R}_Eg-OTEk!{zAH%)8!Ie7lGYiH= zZqEsaqOL`jpB>rx<@BDD=9Yxs(h}b=E%lDA+|sQpF2ybrskKrXqGhjBT*r7%e*L;_ zp*0#7N{wbmX~~Yz`7SQuGMvs1oY)?Eq%34WS=hO~(1|SX#Ci!bKJsZLJ6Sd&b#~fhCREKJ+A&(p zthv;ppV^D6Q@RN)kgK7mYy9KeNov3Cw;4?1WemR*NCz`7-xIku)~L3KwPps=1DcFe zw~Tx*&(HKhO@h);R*U_k*=yIV1p=qykkZ;cAvt+9t6>4PFodevr7>y>c(!_mjdAk8 zU3e2s04dVW0T~Q97!EJTJi&oDY)E<=#q`?ICRkWz6+q6!Kqjt<2l2CHeX7fOiU zvb0=%IFP0H1ho?>!#rF3@x!%urkJ9}X(4vLv>SspJ5lm9oCb3xnN3lt*zrh6pV3Qv z7T&JCc_o;wx@$wO8^ya>V3;Z8xC?mBY@2qAe%>cQhTJn)#1M`5gUT@wMf;kB9=*I3 zwMA=_+jt!R8|~`R8l0Fi?&kgI8B)?n#pjtS+)zEYSyIPr*O3~cR8l3`n+hi)Ieg+BrsrgT58lKp-P1|)k_}hPebWVRQp~xep z+HU0fbeku7BZ2>%7QBZ)bQZ|I!2dLh;6gC6kVrBpGVoO0NXpZl=`_UaHB<IN9M#YicaplH(1f zg!83+hH_b`Sy-97pue+f#}XrF;B`rrZT%@RH@8R?b zJGS^2vL2<;Jv$8pIl|Qu^_@GdCXy{Rk2w9x?8shrG|i561xP^V-aqgh&=HBiroh;w z(L&F*APa+O)v}(qTm2jW<*rKgE2AIIdRqh{I{o_vFwWSoek)ZSaYC|k={zLKdNI!k zEi`ry{3EnOOf)lagj1S&Pk7p$A$*zos=A};7fyi2c`vdoS@{cQKR!_eJMY2UoR+tN zMI^Zv)=iMnHBA_h55*JAv|H(>O*mG)vz5_;YL@UVwq{Z2Q2Lvo_DqK8W}(fBl1Uju zjp%mSM{kS^X~1yry{xRDvX0@ zwItGva7b-i`6-pkkYU44&(W3>T(i1Q?}kUDghWm4pc%?mA~Tuz+FFaFlOiS?1MJLY$5C#b3WOH>&V;<~X-f!leCS=r$ z)7dGxJlax2EU=)-pkAd9Jq?dJ#=Z2$m;IjE=@XsM_m42<;EwRF^o zKfI*C2lAS46gdc(E=RmE1(=2SdZDK`8hfnew=B)wH+ z=IQFz+f#oL4pC4a6LXVDH=LQEN8zXX7xvi=T@6-hJ^Ywvar3b%g1L~X z`9jKWSbb7i%(!f;RYPH@G(DUrGlKqYAw2yeFF`eCBU5;vrzsT?uai&DD#L6LOxdz> z`=EZwxplYOM(hkLwDQW0ovV=LCGh>nPPe!Ry(S>bC=yePK}-%waq82)j}}|xvxB6< z`Gb$E$k23t-h~&qK*U)Cvi!lZJ=YUcGJ9p7y=*~Fq9bth64Z%u?It#Kp)!yV*%p004fV zrK)6XMgdxfQ!NoIj@z+;V*|$qjtv|eI5u!>;12`fKf)tKV8{`m-w`nUpWtBlKf#Ig zKfn*^qvOBQN5=n09~J+NraPMX-)K1fk?{Z1aE7DczteEWBjATL6Y-fHw%=dC9}b8# z6O{Sr&Y7S9Ih>LFhv)lqA(#jQ6fAIxKPP`Uh7e%@poFs?ZSr5|pahj}eEJ=J_= H%aH#9^_F;W literal 0 HcmV?d00001 diff --git a/share/aero_path5.png b/share/aero_path5.png new file mode 100644 index 0000000000000000000000000000000000000000..76e580d74d845840f4af9fa9fb1787bad3518cf2 GIT binary patch literal 6748 zcmeI#c{o&i9{}((!`O#0F?ME9NTQ6g4YCwBS;p>KvSi;TvV<_9NpxFe&6X=9qA3Z5 z5Rz;l!2Q8005|# zraG2##!&WybX1h1rkPt80MNWYX=v($wedrG9rtu_b~}dj3Gh0GJm&B000924-kG>x z;wghJH5-i3QL6woI8wxo9%P-axA3iZcde~bFAL88m^H4ytsZUuda^zW1@ZFhIWvK#df$4evwEjOh ztUVPzyAza{Dilk^`^oo2KD%p@WOSycw)e3xksTDKLaaQAp2KMs`wvMKKT7o)6cV1B zTQt`ihzMu0;8D_&?`N&TC=VYQsUuw>yN@?hk#GxQr{>N%ew5)IW$#*`CbMNP$iB|T zEt*DF%n(R+$Cf)YFAJ!XP^S{h98+JsKS;!Tbp;w&7k})r8B&+EZj~zMTZsw`=?n9_ zmAN~;xTwSIO-(%V;LXe2?%c6Hsgu_r96SQP7Kt2<(w((({+RSTj5l{SZI`5Ei! zBNwYVPIktW@gpWp1GYKrt>PR!JJmNjQ+exQg>-CyvyLHITqhl}G<4Xk1b4A4Edin; z+P|km6d${&M@4K7jc)$aR=2+i|yeMWntJ5FT}wid&eW(&b1p zs$X6d9Tm0DNan;lZh7sSiAjmw`3BXs$$80Tek=l(CnsO!2Tox=(J>$3YKJ5EF@ldP zuVq4CawjNDNd-J{Gsr%Y7W|l(an{WJ_3hETTc&n1aWQbcV)y>wI{q`vIX3PVqMtwHlpJQNhPMwnat;sc9HxdrTN{=KM ziMD>~lHExX^xKnHg;kFo%(C*@XIT?^RG}tmHmuiVWEpl3Ke24oLvpOY!q^)^b^mw< zndZI#j!f?os5olOAL@Y+yq33w@F$y-cllUw|J_p{1NHI6J9e=Zx!D% zCMpVPJHuBbUxux=USS^|?Z4`8$=RWAeceQk_$*@I+p|g7Z71Hd4K+zS&JZW=V9@hV z60!rHn#wo#5vOFl$K`hiYR4uB6I|F-eSqg;Y}odpd$wZv+&Vd?Ir4&m&pNNqOypoi zhI-=69}v|}@+H$+r9T?SUur1jOFGwBDZ}$AUsWLA0zOfGMto<=h@nE9p0+9bJlbz! zM|`4a&|bBocxE%SKI(VX64l@3;xPLKC;Xz$Ka@$%Sjs-aIOpz@H^wbh;BDKi70mbH zw<3?vlDU7f24^&|5DHzRGCMg=g$$Z6yQy9&!g)J%%NmhVVd)amFUL{OJ<(5Z$lvZU z&mZE>`CU%2kw5od|DCRxo6y)SkQULmfMi17 z9_KBYUGu2QJ8b6#EKLX3sYgz{P)-Jg%(*_}KkU@bUjvz#pEi9=us}X@*5kadI3R`$ z6_;NyzUlhgOtf^&VPn2h^ZGZzLvIb^t!f7*K0Amf+xI_V#&i>@%qHw+r=1^i<9){J zOWm$>Xec++KzR$|41(};?k!d+rBx0O&_IT>rI4i8>njTRN*5+DZdWAtSDbv{Z{^g8 zNJ(kA5T+y2&^}~;hFFiO-F`q^Sii=0n{am11;_pPORXZ;c1*YAMgt!%-Z-~Vh(Q=O zMZcusDrL2AF%DFQ>ByQ6d^k-Q#)*c%Z?wIcHAd$x&b+8#h}s<|C`A_pwNJpmZ?UNy zZ>859i6dK>f4rI_RPUJbgfEJ=4l!~B6vAeHL$%z0V5#knfZdh%(5RCQBl@1JZCv$n z@lLFO?a@~y;3?CzH}y(Vy1IvJywi2gL#B6#LLSA0Y16AS-InkyM9o+FE$i;A_m)sz z3{z-1+ql1iiyjwae#W9h?I_eqh(C_zl-LqWNjaY3FiVo_JS6TZ|Kpsxcknt5le)oe z)KRVr2z+5wX%fIa&~xz8(T*$GkwW3=PCkbuKs@qj9Gc+v5z_d|%i=~`D<+lZHcE!8 z=FoDLQX5A{3@XaKKv0KDUkz{VXmJ^3d0;AMLVkLLiDh<2o4T5Y?t!|G!3Ff){*POu z;NxRvnmQWC?UY`ewhZVQdQ+-jPge^L7^_ZCx3g^su56$;w{xUgDi`sr%NTlV8-Chn zAl<7p=5?9PT=56q%&rzFghhT__kctNVV-j98$^oYqQOr_)0$|9S7OwJbpZer;jE^n zr=_Nb)Whl?)Y8_V{N7y+zKGGRR^hF+Zg0JxnA?K~OJMOI%f;aE! zEhOwGIPQ~3nNh+K*tbWJuKM?+Gs2aRTY7xt8OK+Ho0+&?k0{~@rn`I!d#Y|a<t$o_4E`tCdoZSpxbwtdRmFf#Jt-& zmx`G7=Zjb7B)W-in%xE6N#(Q_?}5|0rS_WVN3z65W-7^C!3GG<5(wC}sn47&8w|8P z@AwGy@}i4Ihz9nK_F_^Vd=9+c(a)kAa6D042E|8tA~~$5ZK#omdrb)e5HlEp0D)lu zz)U%Uso6mw77&;fpd43UFe(Tq2n+{9I966xNQ>m@>6wX%H-m%2v$G4tJLQiaHFS2q zOf6HOSzXEpt78DDjJ>2h(EuRZ!-v!X0)$VKGNAX;H1h_4-9oE7$UjTjmoiD~qjf}s zc96eVM8+v>np2evw})q$-JY;|C(1M3|CuZNq6 zz|@;SYXl7Y6%K~|3a98_;H!G`{4c#}{#*=-jVM| zYiKR_zFEsyH|x>b#qS0i%!cs0?C*q)Vq^Sc{44R*;2ZwSP4#vD*Q4+Auk*jG`3?8w z(klEK|L^!q?!TNV^cOVnFK_g}m;0BZYg0dyyN13Q@SmsQlQudLyPBk>p`%`)dKCX3 D_e*m5 literal 0 HcmV?d00001