From e5dab6f9c3e73f1c2b69f4344d935c42cb6b5141 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 5 Jun 2018 00:12:09 +0300 Subject: [PATCH] - added flipx and flipy functions --- FlatCAMApp.py | 84 ++++++++++++++++++++++++++++++++++++++++++++ FlatCAMGUI.py | 9 ++++- share/flipx.png | Bin 0 -> 522 bytes share/flipy.png | Bin 0 -> 514 bytes share/transfer.png | Bin 0 -> 684 bytes share/transform.png | Bin 0 -> 551 bytes 6 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 share/flipx.png create mode 100644 share/flipy.png create mode 100644 share/transfer.png create mode 100644 share/transform.png diff --git a/FlatCAMApp.py b/FlatCAMApp.py index fa2dce9c..8c58d2d2 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -536,6 +536,8 @@ class App(QtCore.QObject): self.ui.menuoptions_transfer_p2a.triggered.connect(self.on_options_project2app) self.ui.menuoptions_transfer_o2p.triggered.connect(self.on_options_object2project) self.ui.menuoptions_transfer_p2o.triggered.connect(self.on_options_project2object) + self.ui.menuoptions_transform_flipx.triggered.connect(self.on_flipx) + self.ui.menuoptions_transform_flipy.triggered.connect(self.on_flipy) self.ui.menuviewdisableall.triggered.connect(self.disable_plots) self.ui.menuviewdisableother.triggered.connect(lambda: self.disable_plots(except_current=True)) self.ui.menuviewenable.triggered.connect(self.enable_all_plots) @@ -1485,6 +1487,88 @@ class App(QtCore.QObject): # self.options2form() + def on_flipx(self): + obj_list = self.collection.get_selected() + xminlist = [] + yminlist = [] + xmaxlist = [] + ymaxlist = [] + + if not obj_list: + self.inform.emit("WARNING: No object selected.") + msg = "Please Select an object to flip!" + warningbox = QtGui.QMessageBox() + warningbox.setText(msg) + warningbox.setWindowTitle("Warning ...") + warningbox.setWindowIcon(QtGui.QIcon('share/warning.png')) + warningbox.setStandardButtons(QtGUi.QMessageBox.Ok) + warningbox.setDefaultButton(QtGui.QMessageBox.Ok) + warningbox.exec_() + else: + # first get a bounding box to fit all + for obj in obj_list: + xmin, ymin, xmax, ymax = obj.bounds() + xminlist.append(xmin) + yminlist.append(ymin) + xmaxlist.append(xmax) + ymaxlist.append(ymax) + + # get the minimum x,y and maximum x,y for all objects selected + xminimal = min(xminlist) + yminimal = min(yminlist) + xmaximal = max(xmaxlist) + ymaximal = max(ymaxlist) + + px = 0.5 * (xminimal + xmaximal) + py = 0.5 * (yminimal + ymaximal) + + # execute mirroring + for obj in obj_list: + obj.mirror('X', [px, py]) + obj.plot() + self.info('Flipped on the X axis ...') + + def on_flipy(self): + obj_list = self.collection.get_selected() + xminlist = [] + yminlist = [] + xmaxlist = [] + ymaxlist = [] + + if not obj_list: + self.inform.emit("WARNING: No object selected.") + msg = "Please Select an object to flip!" + warningbox = QtGui.QMessageBox() + warningbox.setText(msg) + warningbox.setWindowTitle("Warning ...") + warningbox.setWindowIcon(QtGui.QIcon('share/warning.png')) + warningbox.setStandardButtons(QtGui.QMessageBox.Ok) + warningbox.setDefaultButton(QtGui.QMessageBox.Ok) + warningbox.exec_() + else: + # first get a bounding box to fit all + for obj in obj_list: + xmin, ymin, xmax, ymax = obj.bounds() + xminlist.append(xmin) + yminlist.append(ymin) + xmaxlist.append(xmax) + ymaxlist.append(ymax) + + # get the minimum x,y and maximum x,y for all objects selected + xminimal = min(xminlist) + yminimal = min(yminlist) + xmaximal = max(xmaxlist) + ymaximal = max(ymaxlist) + + px = 0.5 * (xminimal + xmaximal) + py = 0.5 * (yminimal + ymaximal) + + # execute mirroring + for obj in obj_list: + obj.mirror('Y', [px, py]) + obj.plot() + self.info('Flipped on the Y axis ...') + def on_delete(self): """ Delete the currently selected FlatCAMObjs. diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index cff4eb12..9f5486ee 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -105,7 +105,7 @@ class FlatCAMGUI(QtGui.QMainWindow): ### Options ### self.menuoptions = self.menu.addMenu('&Options') - self.menuoptions_transfer = self.menuoptions.addMenu('Transfer options') + self.menuoptions_transfer = self.menuoptions.addMenu(QtGui.QIcon('share/transfer.png'), 'Transfer options') self.menuoptions_transfer_a2p = self.menuoptions_transfer.addAction("Application to Project") self.menuoptions_transfer_p2a = self.menuoptions_transfer.addAction("Project to Application") self.menuoptions_transfer_p2o = self.menuoptions_transfer.addAction("Project to Object") @@ -113,6 +113,13 @@ class FlatCAMGUI(QtGui.QMainWindow): self.menuoptions_transfer_a2o = self.menuoptions_transfer.addAction("Application to Object") self.menuoptions_transfer_o2a = self.menuoptions_transfer.addAction("Object to Application") + ### Transform Object ### + self.menuoptions_transform = self.menuoptions.addMenu(QtGui.QIcon('share/transform.png'), '&Transform Object') + self.menuoptions_transform_flipx = self.menuoptions_transform.addAction(QtGui.QIcon('share/flipx.png'), + "Flip Selection on &X axis") + self.menuoptions_transform_flipy = self.menuoptions_transform.addAction(QtGui.QIcon('share/flipy.png'), + "Flip Selection on &Y axis") + ### View ### self.menuview = self.menu.addMenu('&View') self.menuviewdisableall = self.menuview.addAction(QtGui.QIcon('share/clear_plot16.png'), 'Disable all plots') diff --git a/share/flipx.png b/share/flipx.png new file mode 100644 index 0000000000000000000000000000000000000000..84d6a0a6207a7e234f671023c296b0e19c2eb2c7 GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L914Ee%2s17}Q~@%cy~NYkmHiQ`D383t@xb@TfI>GsT^vI+&bMCN=;c%>bM)i+ zw{e<_GCCY?xwIE_v~_4iJF!fhcW9~li`c3LxkZK@3p90BsK!VsdE`#$Q25WQRe6PWSj%mmQX5#JgUfnV$H_By7!- z1GA!+v%S<133;ozK^`gYP2MWX_vR~Yr8_FwvZ!c%o#rdhRnNOL6 zOY51h8JbPkckH+b^rLEtYeY#(Vo9o1a#1RfVlXl=w9qv$)ip8*@ zE`7n}Lc?aq!rjs;Hyq5(g=W{Un<@E@&BUy!$4PK@K2D?NY%?PN}v7CMhd8i!PC{x JWt~$(6957Jvfuy! literal 0 HcmV?d00001 diff --git a/share/transfer.png b/share/transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba13e89dfe94ba280119152935d09a771394128 GIT binary patch literal 684 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpv2MupAc6d&CJL$n9=|L z|La8076BbZa{rm4H4;K8MesDv~X`lg&N#5=*X72ktE&@561s;*b3=DTmL6~t(`{8Dw zAbW|YuPgf_R#6^h-jB7Xe1Jloo-U3d8t0P}7DyNv85$=|Pe@EnKB9K?#JPhfkMd4= z=*YaM=Fc*wCZ`^rLm3V(A!n|H#5helD55=K(y_J7%VjNMS)ZLaVU+ZdU3u}GJxoqa z?~2`ARZ~Snb<$R?%$|{zmATlu$NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^> z;_2(k{)knSN0Ili_lk2242=4oE{-7n?-P#BHU}Zr>03I)7?*RX zpO6grRbq07+4UilOrx_4Q?f@u5Cc<8&NaM8wG7N2XFGKKN0*25;bWHB9y%g#SI8Gp~2@ZpT6ZqwIBp$R4vHH=ug)Z;Rh zyF2`!rRXg@*}>7f+N0Nx1Z$!nStaBsv_C}dP?vl=lJ5{bbAM2TU^^@&pNv5OS zlE-;}d=9#qExm42j@t=U$?Ho(KRwrowe|Ly5FwtqN3RtanyMwP5hW>!C8<`)MX5lF z!N|bSLf61l*T^u$(8$Wz*vimY*TBTez+jEEP$-Iq-29Zxv`X9>?z*jd3Dm&g>FVdQ I&MBb@07UfCs{jB1 literal 0 HcmV?d00001