From b749a47652ce8d34377d42e92be40f74820cff3a Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 17 Apr 2019 21:30:43 +0300 Subject: [PATCH] - Excellon Editor: fixed issue not remembering last tool after adding a new tool - added custom mouse cursors for Excellon and Geometry Editors in some of their tools --- README.md | 2 ++ flatcamEditors/FlatCAMExcEditor.py | 30 ++++++++++++++++ flatcamEditors/FlatCAMGeoEditor.py | 55 +++++++++++++++++++++++++++++ share/aero_array.png | Bin 2713 -> 4563 bytes share/aero_drill.png | Bin 0 -> 4538 bytes share/aero_drill_array.png | Bin 0 -> 4996 bytes 6 files changed, 87 insertions(+) create mode 100644 share/aero_drill.png create mode 100644 share/aero_drill_array.png diff --git a/README.md b/README.md index aecb636c..302b830f 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ CAD program, and create G-Code for Isolation routing. - fixed version check - added custom mouse cursors for some tools in Gerber Editor - Gerber Editor: added multiple modes to lay a Region: 45-degrees, reverse 45-degrees, 90-degrees, reverse 90-degrees and free-angle. Added also key shortcuts 'T' and 'R' to cycle forward, respectively in reverse through the modes. +- Excellon Editor: fixed issue not remembering last tool after adding a new tool +- added custom mouse cursors for Excellon and Geometry Editors in some of their tools 16.04.2019 diff --git a/flatcamEditors/FlatCAMExcEditor.py b/flatcamEditors/FlatCAMExcEditor.py index c75ea1a2..25d44fc9 100644 --- a/flatcamEditors/FlatCAMExcEditor.py +++ b/flatcamEditors/FlatCAMExcEditor.py @@ -47,6 +47,13 @@ class FCDrillAdd(FCShapeTool): self.draw_app.select_tool("select") return + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_drill.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y)) if isinstance(geo, DrawToolShape) and geo.geo is not None: @@ -82,6 +89,11 @@ class FCDrillAdd(FCShapeTool): def make(self): + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + # add the point to drills if the diameter is a key in the dict, if not, create it add the drill location # to the value, as a list of itself if self.selected_dia in self.draw_app.points_edit: @@ -137,6 +149,13 @@ class FCDrillArray(FCShapeTool): self.draw_app.app.inform.emit(_("[WARNING_NOTCL] To add an Drill Array first select a tool in Tool Table")) return + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_drill_array.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + geo = self.utility_geometry(data=(self.draw_app.snap_x, self.draw_app.snap_y), static=True) if isinstance(geo, DrawToolShape) and geo.geo is not None: @@ -252,6 +271,11 @@ class FCDrillArray(FCShapeTool): self.geometry = [] geo = None + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + # add the point to drills if the diameter is a key in the dict, if not, create it add the drill location # to the value, as a list of itself if self.selected_dia not in self.draw_app.points_edit: @@ -537,6 +561,11 @@ class FCDrillSelect(DrawTool): DrawTool.__init__(self, exc_editor_app) self.name = 'drill_select' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.exc_editor_app = exc_editor_app self.storage = self.exc_editor_app.storage_dict # self.selected = self.exc_editor_app.selected @@ -1433,6 +1462,7 @@ class FlatCAMExcEditor(QtCore.QObject): for key in sorted(self.tool2tooldia): if self.tool2tooldia[key] == tool_dia: row_to_be_selected = int(key) - 1 + self.last_tool_selected = int(key) break self.tools_table_exc.selectRow(row_to_be_selected) diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py index 5067abf3..4af68b11 100644 --- a/flatcamEditors/FlatCAMGeoEditor.py +++ b/flatcamEditors/FlatCAMGeoEditor.py @@ -1932,6 +1932,13 @@ class FCCircle(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'circle' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_circle.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.start_msg = _("Click on CENTER ...") self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] @@ -1958,6 +1965,11 @@ class FCCircle(FCShapeTool): return None def make(self): + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + p1 = self.points[0] p2 = self.points[1] radius = distance(p1, p2) @@ -2173,6 +2185,13 @@ class FCRectangle(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'rectangle' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.start_msg = _("Click on 1st corner ...") def click(self, point): @@ -2196,6 +2215,11 @@ class FCRectangle(FCShapeTool): return None def make(self): + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + p1 = self.points[0] p2 = self.points[1] # self.geometry = LinearRing([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])]) @@ -2213,6 +2237,13 @@ class FCPolygon(FCShapeTool): DrawTool.__init__(self, draw_app) self.name = 'polygon' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) + self.start_msg = _("Click on 1st point ...") def click(self, point): @@ -2239,6 +2270,11 @@ class FCPolygon(FCShapeTool): return None def make(self): + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + # self.geometry = LinearRing(self.points) self.geometry = DrawToolShape(Polygon(self.points)) self.draw_app.in_action = False @@ -2260,11 +2296,25 @@ class FCPath(FCPolygon): """ Resulting type: LineString """ + def __init__(self, draw_app): + FCPolygon.__init__(self, draw_app) + + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.cursor = QtGui.QCursor(QtGui.QPixmap('share/aero_path.png')) + QtGui.QGuiApplication.setOverrideCursor(self.cursor) def make(self): self.geometry = DrawToolShape(LineString(self.points)) self.name = 'path' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.draw_app.in_action = False self.complete = True self.draw_app.app.inform.emit(_("[success] Done. Path completed.")) @@ -2293,6 +2343,11 @@ class FCSelect(DrawTool): DrawTool.__init__(self, draw_app) self.name = 'select' + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except: + pass + self.storage = self.draw_app.storage # self.shape_buffer = self.draw_app.shape_buffer # self.selected = self.draw_app.selected diff --git a/share/aero_array.png b/share/aero_array.png index e8a4a4f48fb579f1c07086d433bd52cb134ba5e8..655351ade3be98971c2e112212b74e90dd2ef572 100644 GIT binary patch delta 4425 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 P00000NkvXXu0mjf&?cG) delta 2580 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%0A@-RS&Ko)s9hBCl; zfj3Ac^)Ap2E{s^tg|p>7twA@=f+>KF9c*#Rc}T~;P_gC?25zKMu|I)fkeHEIpTxCu zqdQOZ*}_G{QVw_qnx`GUCRy^ZjDfqUgOAys<_cniBmS%>{_ZvWsSCZ!gh3|OwWbDT zcoM{j!lSiJ6|%w{AirsNqwe^L*Bi&8c0HKNjejzp+?_X=9(23jhR8E4{>gqs03=D zk~?g!kb0B=&rP#;BYZMT$V`@A2~jRME-i6GL}CM(-*~RpHgZ1;j_AU)1{&8BC-Hru zBlLNSa>xh(4Gfd2>Ee(T|62j(@hek5VT z&_zImbK*d&dqWWT;H4`CjUPZ3-?(YVp0ep{LIs!x4zvxiRV1j@A)Beu&DWF?aFy*p z>s4=9{WoE^47|s3z*zbC7EZa=kt*m=)Bv`x*;+i?@fB2_a25 zfKzu8My+KGDb3Pj2wFl%L;b_sUk?%V?%P|m%lb%DdP>Qjb{#A}VnIU?YaQ6#S?Oaj z$#gv?YtV$0$y9L)k1c^T$c5l&!07G0I zW*B_4oa=pyji$dpKTxkkw;v*DcP%7jC_@@pm<1+lbC2#jX;56GuF)`{es_8CI~p*b ztm=ioVDbQy!6)j6^ zTY0;R3-h4r@OG`|EyLxr>A=a(0Y{17+R>xp zsG>0-eZ!|{iwk`Fl^B@+-tWmnUpL)|*NZFPV}Y7uuKK3g7ZUYb(3^P6ihR&cE#E&* zn~wwY4OdQu>?dAr-!VQkHqHS**X4kq!Mo?uNt`bAaZT9mLX1-_of;N= z8|{5O#oGxq2`XRROXpI1ICCm2uRuT7b?H{mQgj)ERK4|Z{@bW#b8bP_G5<6u18>DJ z;`^S=d-+xw{ZXRvJLiw*_(O{6&61m5E`3`bm5NkE>>%Qhp*potRK!uLSOg2Dt2Y(i;4ld5RI=Bjg;17t4tCOOOl=xjzXc6Nb$349Fy)Sp)0YbCJR5K6< zRLwFn$%L3Mtcbx^1TaW5j;O>;J(XR^!E=1w!^ii#7|-&q`*ZXwMUw$Ok$9HrhDE$i zJiTe@ocD>ttRgAI=fqKiE=c^yb=l=N&Si%Mo*6cBnK|Mxu~_b6xrH9ABZ{g~ zzL0lW;k?CJt<_okp8SQOqPCpnI;~M8v4|AX5Fw+EDr&G0qg^A#M25~29{v%>pC*?~ zt|}Ng=CJ`4lH&*egWtV1OOq3BQYZoRyx8`~7!ceAS`FL&KDO=F3E+PQuC$JSqY2D> zlHTZOkt1MW8@RacX!0I#xdRM8>5?HilAo4PDgp0j^i2g|=oaW(b^F#n$LRx*qh2lD z00)P_c$u=-Jl@^g-M4>h+Wq?h%uRC3`8l*y0000^P)t-sEopB2V{HHc0003F0tFTU z0uTTI4gmrX0t6KS0S^HJ5dZ-X0RayI0T2TP7y$wj0tFZU|Nr>;`|$Ad=;-R<;p6o5 z_p`LT!otbc*4U+h9qj-B00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF-;q5fL>Q?U=?90001eNklVgc9os+oV;9AV8Y2kEXcJta`D(bhQc#=^l=&ev#@qJVS9gyF(-e! Y08JqVqWFQ;1poj507*qoM6N<$f@6cHLI3~& literal 0 HcmV?d00001 diff --git a/share/aero_drill_array.png b/share/aero_drill_array.png new file mode 100644 index 0000000000000000000000000000000000000000..7136f86db0863666e29ae42ef120ff6896db2198 GIT binary patch literal 4996 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 O0000