From 2a2d8d75ccee9e00fc083ed63de7db44a7c6f3c8 Mon Sep 17 00:00:00 2001 From: Idechix Date: Sat, 19 May 2018 12:21:27 +0200 Subject: [PATCH 1/5] adding GUI interface for mirror and auto offset functions --- FlatCAMObj.py | 28 ++++++++++++++++++++++++++++ ObjectUI.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index f37ff471..e94482b8 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -92,7 +92,9 @@ class FlatCAMObj(QtCore.QObject): assert isinstance(self.ui, ObjectUI) self.ui.name_entry.returnPressed.connect(self.on_name_activate) self.ui.offset_button.clicked.connect(self.on_offset_button_click) + self.ui.auto_offset_button.clicked.connect(self.on_auto_offset_button_click) self.ui.scale_button.clicked.connect(self.on_scale_button_click) + self.ui.mirror_button.clicked.connect(self.on_mirror_button_click) def __str__(self): return "".format(self.kind, self.options["name"]) @@ -110,6 +112,15 @@ class FlatCAMObj(QtCore.QObject): vect = self.ui.offsetvector_entry.get_value() self.offset(vect) self.plot() + + def on_auto_offset_button_click(self): + self.app.report_usage("obj_on_auto_offset_button") + self.read_form() + minx, miny, maxx, maxy = self.bounds() + vect = (-minx, -miny) + self.ui.offsetvector_entry.set_value(vect) + self.offset(vect) + self.plot() def on_scale_button_click(self): self.app.report_usage("obj_on_scale_button") @@ -118,6 +129,23 @@ class FlatCAMObj(QtCore.QObject): self.scale(factor) self.plot() + def on_mirror_button_click(self): + self.app.report_usage("obj_on_mirror_button") + self.read_form() + minx, miny, maxx, maxy = self.bounds() + + axis = self.ui.mirror_axis_radio.get_value() + + if not self.ui.mirror_auto_center_cb.get_value(): + vect = (0, 0) + elif axis == 'X': + vect = (0, (maxy + miny)/2) + else: + vect = ((maxx + minx)/2, 0) + + self.mirror(axis, vect) + self.plot() + def setup_axes(self, figure): """ 1) Creates axes if they don't exist. 2) Clears axes. 3) Attaches diff --git a/ObjectUI.py b/ObjectUI.py index 1bf20bf7..474a48f5 100644 --- a/ObjectUI.py +++ b/ObjectUI.py @@ -103,6 +103,46 @@ class ObjectUI(QtGui.QWidget): ) layout.addWidget(self.offset_button) + self.auto_offset_button = QtGui.QPushButton('Offset auto') + self.auto_offset_button.setToolTip( + "Align the object with the x and y axes." + ) + layout.addWidget(self.auto_offset_button) + + #### Mirror #### + self.mirror_label = QtGui.QLabel('Mirror:') + self.mirror_label.setToolTip( + "Flip the object along an axis." + ) + layout.addWidget(self.mirror_label) + + self.mirror_axis_grid = QtGui.QGridLayout() + layout.addLayout(self.mirror_axis_grid) + + axislabel = QtGui.QLabel('Axis:') + axislabel.setToolTip( + "Mirror axis parallel to the x or y axis." + ) + self.mirror_axis_grid.addWidget(axislabel, 0, 0) + + self.mirror_axis_radio = RadioSet([{'label': 'X', 'value': 'X'}, + {'label': 'Y', 'value': 'Y'}]) + self.mirror_axis_radio.set_value('Y') + self.mirror_axis_grid.addWidget(self.mirror_axis_radio, 0, 1) + + self.mirror_auto_center_cb = FCCheckBox(label='Center axis automatically') + self.mirror_auto_center_cb.setToolTip( + "Place the mirror axis on the middle of the object." + ) + self.mirror_auto_center_cb.set_value(True) + layout.addWidget(self.mirror_auto_center_cb) + + self.mirror_button = QtGui.QPushButton('Mirror') + self.mirror_button.setToolTip( + "Perform the mirror operation." + ) + layout.addWidget(self.mirror_button) + layout.addStretch() @@ -130,6 +170,13 @@ class CNCObjectUI(ObjectUI): self.offset_grid.itemAt(i).widget().hide() self.offset_label.hide() self.offset_button.hide() + self.auto_offset_button.hide() + + self.mirror_label.hide() + for i in range(0, self.mirror_axis_grid.count()): + self.mirror_axis_grid.itemAt(i).widget().hide() + self.mirror_auto_center_cb.hide() + self.mirror_button.hide() ## Plot options self.plot_options_label = QtGui.QLabel("Plot Options:") @@ -801,7 +848,7 @@ class GerberObjectUI(ObjectUI): self.generate_bb_button = QtGui.QPushButton('Generate Geometry') self.generate_bb_button.setToolTip( - "Genrate the Geometry object." + "Generate the Geometry object." ) self.custom_box.addWidget(self.generate_bb_button) From e1c8eaafa9cfd36d17eb59dda6f5119db6d018c1 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 29 May 2018 16:48:06 +0300 Subject: [PATCH 2/5] - in TCL Shell removed the line that setFocus after the item is disabled (this is pointless) - added separators between groups of menu items - added icons for the Drawing -> Paint and for the Drawing - > Buffer - added ability to add icons for the Tools - added icons to the current tools (Dblsided Tool, Measurement Tool) - added buttons in the toolbar for: Open Gerber, Open Excellon, Open Gcode and Save Project As - added button in Tools toolbar for Measurement tool - added separators in the toolbar - organized the toolbar buttons in multiple toolbars that can be disabled with right click on the toolbar - added names for the toolbars where they were not present --- FlatCAMApp.py | 10 ++++-- FlatCAMDraw.py | 15 +++++++-- FlatCAMGUI.py | 68 +++++++++++++++++++++++++++++------------ FlatCAMTool.py | 7 +++-- MeasurementTool.py | 4 +-- share/buffer16.png | Bin 0 -> 574 bytes share/doubleside16.png | Bin 0 -> 364 bytes share/doubleside32.png | Bin 0 -> 655 bytes share/floppy32.png | Bin 0 -> 373 bytes share/paint16.png | Bin 0 -> 339 bytes termwidget.py | 1 - 11 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 share/buffer16.png create mode 100644 share/doubleside16.png create mode 100644 share/doubleside32.png create mode 100644 share/floppy32.png create mode 100644 share/paint16.png diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 04048a5b..2c0d8635 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -539,6 +539,10 @@ class App(QtCore.QObject): self.ui.menuhelp_home.triggered.connect(lambda: webbrowser.open(self.app_url)) self.ui.menuhelp_manual.triggered.connect(lambda: webbrowser.open(self.manual_url)) # Toolbar + self.ui.open_gerber_btn.triggered.connect(self.on_fileopengerber) + self.ui.open_exc_btn.triggered.connect(self.on_fileopenexcellon) + self.ui.open_gcode_btn.triggered.connect(self.on_fileopengcode) + self.ui.save_btn.triggered.connect(self.on_file_saveprojectas) self.ui.zoom_fit_btn.triggered.connect(self.on_zoom_fit) self.ui.zoom_in_btn.triggered.connect(lambda: self.plotcanvas.zoom(1.5)) self.ui.zoom_out_btn.triggered.connect(lambda: self.plotcanvas.zoom(1 / 1.5)) @@ -569,10 +573,12 @@ class App(QtCore.QObject): ### Tools and Plugins ### ######################### self.dblsidedtool = DblSidedTool(self) - self.dblsidedtool.install() + self.dblsidedtool.install(icon=QtGui.QIcon('share:doubleside16.png')) self.measeurement_tool = Measurement(self) - self.measeurement_tool.install() + self.measeurement_tool.install(icon=QtGui.QIcon('share:measure16.png')) + + self.ui.measure_btn.triggered.connect(self.measeurement_tool.run) self.draw = FlatCAMDraw(self, disabled=True) diff --git a/FlatCAMDraw.py b/FlatCAMDraw.py index 57c1fdb6..0c2dffd2 100644 --- a/FlatCAMDraw.py +++ b/FlatCAMDraw.py @@ -690,25 +690,34 @@ class FlatCAMDraw(QtCore.QObject): self.axes = self.canvas.new_axes("draw") ### Drawing Toolbar ### - self.drawing_toolbar = QtGui.QToolBar() + self.drawing_toolbar = QtGui.QToolBar("Draw Toolbar") self.drawing_toolbar.setDisabled(disabled) self.app.ui.addToolBar(self.drawing_toolbar) + self.select_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:pointer32.png'), "Select 'Esc'") + # Separator + self.drawing_toolbar.addSeparator() self.add_circle_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:circle32.png'), 'Add Circle') self.add_arc_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:arc32.png'), 'Add Arc') self.add_rectangle_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:rectangle32.png'), 'Add Rectangle') 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') + + # Separator + self.drawing_toolbar.addSeparator() self.union_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:union32.png'), 'Polygon Union') self.intersection_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:intersection32.png'), 'Polygon Intersection') self.subtract_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:subtract32.png'), 'Polygon Subtraction') self.cutpath_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:cutpath32.png'), 'Cut Path') + + # Separator + self.drawing_toolbar.addSeparator() self.move_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:move32.png'), "Move Objects 'm'") self.copy_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:copy32.png'), "Copy Objects 'c'") self.delete_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:deleteshape32.png'), "Delete Shape '-'") ### Snap Toolbar ### - self.snap_toolbar = QtGui.QToolBar() + self.snap_toolbar = QtGui.QToolBar("Grid Toolbar") self.grid_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share:grid32.png'), 'Snap to grid') self.grid_gap_x_entry = QtGui.QLineEdit() self.grid_gap_x_entry.setMaximumWidth(70) @@ -741,6 +750,8 @@ class FlatCAMDraw(QtCore.QObject): 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') + # Add Separator + self.menu.addSeparator() # 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 '-'") diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index bba9875b..0bebba02 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -28,13 +28,15 @@ class FlatCAMGUI(QtGui.QMainWindow): self.menufile = self.menu.addMenu('&File') # New - self.menufilenew = QtGui.QAction(QtGui.QIcon('share:file16.png'), '&New', self) + self.menufilenew = QtGui.QAction(QtGui.QIcon('share:file16.png'), '&New project', self) self.menufile.addAction(self.menufilenew) - # Open recent # Recent self.recent = self.menufile.addMenu(QtGui.QIcon('share:folder16.png'), "Open recent ...") + # Separator + self.menufile.addSeparator() + # Open gerber ... self.menufileopengerber = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Open &Gerber ...', self) self.menufile.addAction(self.menufileopengerber) @@ -51,6 +53,9 @@ class FlatCAMGUI(QtGui.QMainWindow): self.menufileopenproject = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Open &Project ...', self) self.menufile.addAction(self.menufileopenproject) + # Separator + self.menufile.addSeparator() + # Import SVG ... self.menufileimportsvg = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Import &SVG ...', self) self.menufile.addAction(self.menufileimportsvg) @@ -59,6 +64,9 @@ class FlatCAMGUI(QtGui.QMainWindow): self.menufileexportsvg = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Export &SVG ...', self) self.menufile.addAction(self.menufileexportsvg) + # Separator + self.menufile.addSeparator() + # Save Project self.menufilesaveproject = QtGui.QAction(QtGui.QIcon('share:floppy16.png'), '&Save Project', self) self.menufile.addAction(self.menufilesaveproject) @@ -75,21 +83,26 @@ class FlatCAMGUI(QtGui.QMainWindow): self.menufilesavedefaults = QtGui.QAction(QtGui.QIcon('share:floppy16.png'), 'Save &Defaults', self) self.menufile.addAction(self.menufilesavedefaults) + # Separator + self.menufile.addSeparator() + # Quit self.exit_action = QtGui.QAction(QtGui.QIcon('share:power16.png'), '&Exit', self) + self.menufile.addAction(self.exit_action) # exitAction.setShortcut('Ctrl+Q') # exitAction.setStatusTip('Exit application') #self.exit_action.triggered.connect(QtGui.qApp.quit) - self.menufile.addAction(self.exit_action) ### Edit ### self.menuedit = self.menu.addMenu('&Edit') self.menueditnew = self.menuedit.addAction(QtGui.QIcon('share:new_geo16.png'), 'New Geometry') self.menueditedit = self.menuedit.addAction(QtGui.QIcon('share:edit16.png'), 'Edit Geometry') self.menueditok = self.menuedit.addAction(QtGui.QIcon('share:edit_ok16.png'), 'Update Geometry') - #self.menueditok. - #self.menueditcancel = self.menuedit.addAction(QtGui.QIcon('share:cancel_edit16.png'), "Cancel Edit") + + # Separator + self.menuedit.addSeparator() + self.menueditjoin = self.menuedit.addAction(QtGui.QIcon('share:join16.png'), 'Join Geometry') self.menueditdelete = self.menuedit.addAction(QtGui.QIcon('share:trash16.png'), 'Delete') @@ -111,7 +124,7 @@ class FlatCAMGUI(QtGui.QMainWindow): self.menuviewenable = self.menuview.addAction(QtGui.QIcon('share:replot16.png'), 'Enable all plots') ### Tool ### - #self.menutool = self.menu.addMenu('&Tool') + self.menutool = QtGui.QMenu('&Tool') self.menutoolaction = self.menu.addMenu(self.menutool) self.menutoolshell = self.menutool.addAction(QtGui.QIcon('share:shell16.png'), '&Command Line') @@ -125,21 +138,38 @@ class FlatCAMGUI(QtGui.QMainWindow): ############### ### Toolbar ### ############### - self.toolbar = QtGui.QToolBar() - self.addToolBar(self.toolbar) + self.toolbarfile = QtGui.QToolBar('File Toolbar') + self.addToolBar(self.toolbarfile) + self.open_gerber_btn = self.toolbarfile.addAction(QtGui.QIcon('share:flatcam_icon32.png'), "Open &Gerber") + self.open_exc_btn = self.toolbarfile.addAction(QtGui.QIcon('share:drill32.png'), "Open &Excellon") + self.open_gcode_btn = self.toolbarfile.addAction(QtGui.QIcon('share:cnc32.png'), "Open Gco&de") + self.save_btn = self.toolbarfile.addAction(QtGui.QIcon('share:floppy32.png'), 'Save Project &As ...') - self.zoom_fit_btn = self.toolbar.addAction(QtGui.QIcon('share:zoom_fit32.png'), "&Zoom Fit") - self.zoom_out_btn = self.toolbar.addAction(QtGui.QIcon('share:zoom_out32.png'), "&Zoom Out") - self.zoom_in_btn = self.toolbar.addAction(QtGui.QIcon('share:zoom_in32.png'), "&Zoom In") - self.clear_plot_btn = self.toolbar.addAction(QtGui.QIcon('share:clear_plot32.png'), "&Clear Plot") - self.replot_btn = self.toolbar.addAction(QtGui.QIcon('share:replot32.png'), "&Replot") - self.newgeo_btn = self.toolbar.addAction(QtGui.QIcon('share:new_geo32.png'), "New Blank Geometry") - self.editgeo_btn = self.toolbar.addAction(QtGui.QIcon('share:edit32.png'), "Edit Geometry") - self.updategeo_btn = self.toolbar.addAction(QtGui.QIcon('share:edit_ok32.png'), "Update Geometry") + self.toolbarview= QtGui.QToolBar('View Toolbar') + self.addToolBar(self.toolbarview) + self.zoom_fit_btn = self.toolbarview.addAction(QtGui.QIcon('share:zoom_fit32.png'), "&Zoom Fit") + self.zoom_out_btn = self.toolbarview.addAction(QtGui.QIcon('share:zoom_out32.png'), "&Zoom Out") + self.zoom_in_btn = self.toolbarview.addAction(QtGui.QIcon('share:zoom_in32.png'), "&Zoom In") + # Separator + self.toolbarview.addSeparator() + self.clear_plot_btn = self.toolbarview.addAction(QtGui.QIcon('share:clear_plot32.png'), "&Clear Plot") + self.replot_btn = self.toolbarview.addAction(QtGui.QIcon('share:replot32.png'), "&Replot") + + self.toolbareditobj = QtGui.QToolBar('Obj.Editor Toolbar') + self.addToolBar(self.toolbareditobj) + self.newgeo_btn = self.toolbareditobj.addAction(QtGui.QIcon('share:new_geo32.png'), "New Blank Geometry") + self.editgeo_btn = self.toolbareditobj.addAction(QtGui.QIcon('share:edit32.png'), "Edit Geometry") + self.updategeo_btn = self.toolbareditobj.addAction(QtGui.QIcon('share:edit_ok32.png'), "Update Geometry") self.updategeo_btn.setEnabled(False) - #self.canceledit_btn = self.toolbar.addAction(QtGui.QIcon('share:cancel_edit32.png'), "Cancel Edit") - self.delete_btn = self.toolbar.addAction(QtGui.QIcon('share:delete32.png'), "&Delete") - self.shell_btn = self.toolbar.addAction(QtGui.QIcon('share:shell32.png'), "&Command Line") + + self.toolbaredit = QtGui.QToolBar('Edit Toolbar') + self.addToolBar(self.toolbaredit) + self.delete_btn = self.toolbaredit.addAction(QtGui.QIcon('share:delete32.png'), "&Delete") + + self.toolbartools = QtGui.QToolBar('Tools Toolbar') + self.addToolBar(self.toolbartools) + self.shell_btn = self.toolbartools.addAction(QtGui.QIcon('share:shell32.png'), "&Command Line") + self.measure_btn = self.toolbartools.addAction(QtGui.QIcon('share:measure32.png'), "&Measurement Tool") ################ ### Splitter ### diff --git a/FlatCAMTool.py b/FlatCAMTool.py index 3bd856f7..9de65625 100644 --- a/FlatCAMTool.py +++ b/FlatCAMTool.py @@ -32,8 +32,11 @@ class FlatCAMTool(QtGui.QWidget): self.menuAction = None - def install(self): - self.menuAction = self.app.ui.menutool.addAction(self.toolName) + def install(self, icon=None): + if icon is None: + self.menuAction = self.app.ui.menutool.addAction(self.toolName) + else: + self.menuAction = self.app.ui.menutool.addAction(icon, self.toolName) self.menuAction.triggered.connect(self.run) def run(self): diff --git a/MeasurementTool.py b/MeasurementTool.py index f8396d0f..19e540ff 100644 --- a/MeasurementTool.py +++ b/MeasurementTool.py @@ -29,8 +29,8 @@ class Measurement(FlatCAMTool): self.click_subscription = None self.move_subscription = None - def install(self): - FlatCAMTool.install(self) + def install(self, icon=None): + FlatCAMTool.install(self, icon) self.app.ui.right_layout.addWidget(self) self.app.plotcanvas.mpl_connect('key_press_event', self.on_key_press) diff --git a/share/buffer16.png b/share/buffer16.png new file mode 100644 index 0000000000000000000000000000000000000000..02bae3cbf764d1f811f4e8456397b66a9d6cfc3b GIT binary patch literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{XiaP zfk$L90|Vb-5N14{zaj-F$X?><>&pI!RhCo1#7*mWGXn#op{I*uh{pNYiyOVA86{Xh z#J@YI+I1}A>j4jersgGl{}|VntlfI$kqRGQU+mo&mfb)2OZZFPM7((RM5TjQmdn@m zV8T(2%$18K#))xJSLS`VwL|zh)5b~f?J`mm zL#@SlQ}!erjZTfMIzFepA}zWx;M^?d-7h|$m~cYZA}H*mrODIIS=Kh&Qg0PcT>qe5 zoR2B=cwHkS@9cZC#T$)tr+U1x**j~-#&uceYftI-uNo$` z_u7ft!0=Qpag8WRNi0dVN-jzTQVd20h8DU8rn*L!AqJLK#zt1AM!E(jRt5$chI>J= eg3yqgpOTqYiCcqY4l6TI1B0ilpUXO@geCy~bKs5u literal 0 HcmV?d00001 diff --git a/share/doubleside16.png b/share/doubleside16.png new file mode 100644 index 0000000000000000000000000000000000000000..5dcc3b4a8cb611a50b796b58bc779b4d1765fb0b GIT binary patch literal 364 zcmV-y0h9iTP)DP%%!!KoFcU&^Q#n>^*{- z5`?gl!V*HEffO$9HA+emaEAv$_=HdJo7TPjB+Ijn=Jc4y~iXAek3Va%(D zOxO9XRD;oI^sK;Lp68EU*S+;T`@&kg?^S0*CJG!PgoBKnG)=PrfUF;S)frXG)I>eD zS2mD!>)drrC?cf-7tFF#=iH*_vzRyrAHofRbLZUr*91fOXxqIQzcirgCjd<~{5Ooq zl@YnzNU#PDq}l!1YA;fp!Z(@LI8G#HY!;M@*z4Dk;z!(y|DH;^@NzobS(0es{aOOSWl#=gK+@>0000< KMNUMnLSTZDi<55v literal 0 HcmV?d00001 diff --git a/share/doubleside32.png b/share/doubleside32.png new file mode 100644 index 0000000000000000000000000000000000000000..001be1e7004aabdb4627b130e667d947fff5a867 GIT binary patch literal 655 zcmV;A0&x9_P)Cif;vF`6F<$&njb|X)+lqQI>}J=*qZSG*jT~IszIxesaUdu|jo)o%zRdgO z&C8ny7?zasq^8uFl=99teliWfLO2ApIM4fyM&owj0O|GhD*&H}=wX^=1JCn&IjP`Uy+>1cLbo=vQ)#^a=*vX=CX&-5~HvNiqP?X68#0qC20@$2&5lTLS=q@B7VF zmJJAK0T`_ur?YOZ+eK^BJDE(z4pEnxF95VlNz$uSDylF50EnU}w1~Pn^Jf4@PO0>! pPyhg!&1PSP5FG~20DLzM@Dtc+#ZB`6)tdkS002ovPDHLkV1ncz9~%Gw literal 0 HcmV?d00001 diff --git a/share/floppy32.png b/share/floppy32.png new file mode 100644 index 0000000000000000000000000000000000000000..643f82281320994aa8ddc5b64939a981f7042ab7 GIT binary patch literal 373 zcmV-*0gC>KP)K*1bx^P!NXUM|VXOf5FDa zS`e%R5wx+^PJ2NcvGOJa?_jZX6}$p_OG^vO^{2A2Py}62)M8H&mTWegs07Ie2WB#p zd54q9;ZUknkLqjl=WvE+OoV4kILBm%8p|O*7W{pzVjYL5CpEBuBUI7AR{%c-J8n(k zDdKP7B-kI=i~{;&po`eXbW&$2RlzCNl7RE5Vdw{dFo3Nj;IFEhGOv!&4zVVVF&zBc zyue-DC&YJf6Y*Ctn+JH1A}6)}{2LZ(Xg=|fqxJ~KdjZz4mjgH>X4sOp^iAtnYGznh zc#SLCZAvQ`?2;3wj_>^cDJ_8|u=v3CAO8gx!ER_>o-Q-gy~BH?)^(QVN)=Pzw6!}T TlGo|m00000NkvXXu0mjf4nJ za0`PlBg3pY5~J2Sbu>M1;n{L-&)?4{I17mXr8a^lqlHak_rxo5UvXH_u!`4<N>M$_C?ceNi^$iihfnyzHpqXy zSJ>LW(}CykchUQab016E@8E9p&F5vlW72nX0+&SKxdo!Lc=A5BO`rC=%EB{lrD~eL zpY6g!X-)5wMbiyuN Date: Tue, 29 May 2018 17:23:06 +0300 Subject: [PATCH 3/5] - added ability to add a menu-entry separator after the tool, on install --- FlatCAMApp.py | 3 ++- FlatCAMTool.py | 4 +++- MeasurementTool.py | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 2c0d8635..123dd082 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -573,7 +573,7 @@ class App(QtCore.QObject): ### Tools and Plugins ### ######################### self.dblsidedtool = DblSidedTool(self) - self.dblsidedtool.install(icon=QtGui.QIcon('share:doubleside16.png')) + self.dblsidedtool.install(icon=QtGui.QIcon('share:doubleside16.png'), separator=True) self.measeurement_tool = Measurement(self) self.measeurement_tool.install(icon=QtGui.QIcon('share:measure16.png')) @@ -607,6 +607,7 @@ class App(QtCore.QObject): QtGui.QDockWidget.DockWidgetFloatable | QtGui.QDockWidget.DockWidgetClosable) self.ui.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.ui.shell_dock) + if self.defaults["shell_at_startup"]: self.ui.shell_dock.show() else: diff --git a/FlatCAMTool.py b/FlatCAMTool.py index 9de65625..45c6a0e8 100644 --- a/FlatCAMTool.py +++ b/FlatCAMTool.py @@ -32,11 +32,13 @@ class FlatCAMTool(QtGui.QWidget): self.menuAction = None - def install(self, icon=None): + def install(self, icon=None, separator=None): if icon is None: self.menuAction = self.app.ui.menutool.addAction(self.toolName) else: self.menuAction = self.app.ui.menutool.addAction(icon, self.toolName) + if separator is True: + self.app.ui.menutool.addSeparator() self.menuAction.triggered.connect(self.run) def run(self): diff --git a/MeasurementTool.py b/MeasurementTool.py index 19e540ff..3f70c6e6 100644 --- a/MeasurementTool.py +++ b/MeasurementTool.py @@ -29,8 +29,8 @@ class Measurement(FlatCAMTool): self.click_subscription = None self.move_subscription = None - def install(self, icon=None): - FlatCAMTool.install(self, icon) + def install(self, icon=None, separator=None): + FlatCAMTool.install(self, icon, separator) self.app.ui.right_layout.addWidget(self) self.app.plotcanvas.mpl_connect('key_press_event', self.on_key_press) From c67d2f00288b2c1c09f78f98a1943d3a41000009 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 31 May 2018 02:09:15 +0300 Subject: [PATCH 4/5] - modified the TCL comamand follow to the new architecture. Tested it and it works without crashes. It can be safely pulled in. --- FlatCAMApp.py | 56 ++++++++++++++--------------- tclCommands/TclCommandFollow.py | 62 +++++++++++++++++++++++++++++++++ tclCommands/__init__.py | 1 + 3 files changed, 91 insertions(+), 28 deletions(-) create mode 100644 tclCommands/TclCommandFollow.py diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 84aa5dea..e9e710ac 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -3632,27 +3632,27 @@ class App(QtCore.QObject): return output - def follow(obj_name, *args): - a, kwa = h(*args) - - types = {'outname': str} - - for key in kwa: - if key not in types: - return 'Unknown parameter: %s' % key - kwa[key] = types[key](kwa[key]) - - try: - obj = self.collection.get_by_name(str(obj_name)) - except: - return "Could not retrieve object: %s" % obj_name - if obj is None: - return "Object not found: %s" % obj_name - - try: - obj.follow(**kwa) - except Exception, e: - return "ERROR: %s" % str(e) + # def follow(obj_name, *args): + # a, kwa = h(*args) + # + # types = {'outname': str} + # + # for key in kwa: + # if key not in types: + # return 'Unknown parameter: %s' % key + # kwa[key] = types[key](kwa[key]) + # + # try: + # obj = self.collection.get_by_name(str(obj_name)) + # except: + # return "Could not retrieve object: %s" % obj_name + # if obj is None: + # return "Object not found: %s" % obj_name + # + # try: + # obj.follow(**kwa) + # except Exception, e: + # return "ERROR: %s" % str(e) # def get_sys(param): # if param in self.defaults: @@ -4096,13 +4096,13 @@ class App(QtCore.QObject): 'fcn': make_docs, 'help': 'Prints command rererence in reStructuredText format.' }, - 'follow': { - 'fcn': follow, - 'help': 'Creates a geometry object following gerber paths.\n' + - '> follow [-outname ]\n' + - ' name: Name of the gerber object.\n' + - ' outname: Name of the output geometry object.' - }, + # 'follow': { + # 'fcn': follow, + # 'help': 'Creates a geometry object following gerber paths.\n' + + # '> follow [-outname ]\n' + + # ' name: Name of the gerber object.\n' + + # ' outname: Name of the output geometry object.' + # }, # 'get_sys': { # 'fcn': get_sys, diff --git a/tclCommands/TclCommandFollow.py b/tclCommands/TclCommandFollow.py new file mode 100644 index 00000000..46bc4cb3 --- /dev/null +++ b/tclCommands/TclCommandFollow.py @@ -0,0 +1,62 @@ +from ObjectCollection import * +import TclCommand + + +class TclCommandFollow(TclCommand.TclCommandSignaled): + """ + Tcl shell command to follow a Gerber file + """ + + # array of all command aliases, to be able use old names for backward compatibility (add_poly, add_polygon) + aliases = ['follow'] + + # dictionary of types from Tcl command, needs to be ordered + arg_names = collections.OrderedDict([ + ('name', str) + ]) + + # dictionary of types from Tcl command, needs to be ordered , this is for options like -optionname value + option_types = collections.OrderedDict([ + ('outname', str) + ]) + + # array of mandatory options for current Tcl command: required = {'name','outname'} + required = ['name'] + + # structured help for current command, args needs to be ordered + help = { + 'main': "Creates a geometry object following gerber paths.", + 'args': collections.OrderedDict([ + ('name', 'Object name to follow.'), + ('outname', 'Name of the resulting Geometry object.') + ]), + 'examples': ['follow name -outname name_follow'] + } + + def execute(self, args, unnamed_args): + """ + execute current TCL shell command + + :param args: array of known named arguments and options + :param unnamed_args: array of other values which were passed into command + without -somename and we do not have them in known arg_names + :return: None or exception + """ + + name = args['name'] + + if 'outname' not in args: + follow_name = name + "_follow" + + obj = self.app.collection.get_by_name(name) + + if obj is None: + self.raise_tcl_error("Object not found: %s" % name) + + if not isinstance(obj, FlatCAMGerber): + self.raise_tcl_error('Expected FlatCAMGerber, got %s %s.' % (name, type(obj))) + + del args['name'] + obj.follow(**args) + + diff --git a/tclCommands/__init__.py b/tclCommands/__init__.py index eaa2c327..37c59131 100644 --- a/tclCommands/__init__.py +++ b/tclCommands/__init__.py @@ -16,6 +16,7 @@ import tclCommands.TclCommandDrillcncjob import tclCommands.TclCommandExportGcode import tclCommands.TclCommandExportSVG import tclCommands.TclCommandExteriors +import tclCommands.TclCommandFollow import tclCommands.TclCommandGeoCutout import tclCommands.TclCommandGeoUnion import tclCommands.TclCommandGetNames From b005058586d1b8a9fc43a19abd544d89ebdbc23a Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 31 May 2018 18:31:35 +0300 Subject: [PATCH 5/5] Merge https://bitbucket.org/jpcgt/flatcam/src/master into Menu_clening_icons_adding # Conflicts: # FlatCAMDraw.py # FlatCAMGUI.py --- FlatCAMApp.py | 4 ++-- FlatCAMDraw.py | 30 ++++++++++++++++++++---------- FlatCAMGUI.py | 45 +++++++++++++++++++++++++++++++-------------- 3 files changed, 53 insertions(+), 26 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 7c949045..bc890e46 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -575,10 +575,10 @@ class App(QtCore.QObject): ### Tools and Plugins ### ######################### self.dblsidedtool = DblSidedTool(self) - self.dblsidedtool.install(icon=QtGui.QIcon('share:doubleside16.png'), separator=True) + self.dblsidedtool.install(icon=QtGui.QIcon('share/doubleside16.png'), separator=True) self.measeurement_tool = Measurement(self) - self.measeurement_tool.install(icon=QtGui.QIcon('share:measure16.png')) + self.measeurement_tool.install(icon=QtGui.QIcon('share/measure16.png')) self.ui.measure_btn.triggered.connect(self.measeurement_tool.run) diff --git a/FlatCAMDraw.py b/FlatCAMDraw.py index cc0cda86..d9a9dae4 100644 --- a/FlatCAMDraw.py +++ b/FlatCAMDraw.py @@ -695,21 +695,29 @@ class FlatCAMDraw(QtCore.QObject): self.app.ui.addToolBar(self.drawing_toolbar) self.select_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), "Select 'Esc'") + # Separator + self.drawing_toolbar.addSeparator() self.add_circle_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/circle32.png'), 'Add Circle') self.add_arc_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/arc32.png'), 'Add Arc') self.add_rectangle_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/rectangle32.png'), 'Add Rectangle') 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') + + # Separator + self.drawing_toolbar.addSeparator() self.union_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/union32.png'), 'Polygon Union') self.intersection_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/intersection32.png'), 'Polygon Intersection') self.subtract_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/subtract32.png'), 'Polygon Subtraction') self.cutpath_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/cutpath32.png'), 'Cut Path') + + # Separator + self.drawing_toolbar.addSeparator() self.move_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/move32.png'), "Move Objects 'm'") self.copy_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/copy32.png'), "Copy Objects 'c'") self.delete_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), "Delete Shape '-'") ### Snap Toolbar ### - self.snap_toolbar = QtGui.QToolBar() + self.snap_toolbar = QtGui.QToolBar("Grid Toolbar") self.grid_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/grid32.png'), 'Snap to grid') self.grid_gap_x_entry = QtGui.QLineEdit() self.grid_gap_x_entry.setMaximumWidth(70) @@ -732,18 +740,20 @@ class FlatCAMDraw(QtCore.QObject): ### Application 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.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.subtract_menuitem = self.menu.addAction(QtGui.QIcon('share/subtract16.png'), 'Polygon Subtraction') + # 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.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'") + # Add Separator + self.menu.addSeparator() + # 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.buffer_menuitem = self.menu.addAction(QtGui.QIcon('share/buffer16.png'), "Buffer selection 'b'") self.paint_menuitem = self.menu.addAction(QtGui.QIcon('share/paint16.png'), "Paint selection") diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index 3314a42a..cff4eb12 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -88,6 +88,7 @@ class FlatCAMGUI(QtGui.QMainWindow): # Quit self.exit_action = QtGui.QAction(QtGui.QIcon('share/power16.png'), '&Exit', self) + self.menufile.addAction(self.exit_action) # exitAction.setShortcut('Ctrl+Q') # exitAction.setStatusTip('Exit application') #self.exit_action.triggered.connect(QtGui.qApp.quit) @@ -134,22 +135,38 @@ class FlatCAMGUI(QtGui.QMainWindow): ############### ### Toolbar ### ############### + self.toolbarfile = QtGui.QToolBar('File Toolbar') + self.addToolBar(self.toolbarfile) + self.open_gerber_btn = self.toolbarfile.addAction(QtGui.QIcon('share/flatcam_icon32.png'), "Open &Gerber") + self.open_exc_btn = self.toolbarfile.addAction(QtGui.QIcon('share/drill32.png'), "Open &Excellon") + self.open_gcode_btn = self.toolbarfile.addAction(QtGui.QIcon('share/cnc32.png'), "Open Gco&de") + self.save_btn = self.toolbarfile.addAction(QtGui.QIcon('share/floppy32.png'), 'Save Project &As ...') - self.toolbar = QtGui.QToolBar() - self.addToolBar(self.toolbar) + self.toolbarview= QtGui.QToolBar('View Toolbar') + self.addToolBar(self.toolbarview) + self.zoom_fit_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_fit32.png'), "&Zoom Fit") + self.zoom_out_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_out32.png'), "&Zoom Out") + self.zoom_in_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_in32.png'), "&Zoom In") + # Separator + self.toolbarview.addSeparator() + self.clear_plot_btn = self.toolbarview.addAction(QtGui.QIcon('share/clear_plot32.png'), "&Clear Plot") + self.replot_btn = self.toolbarview.addAction(QtGui.QIcon('share/replot32.png'), "&Replot") - self.zoom_fit_btn = self.toolbar.addAction(QtGui.QIcon('share/zoom_fit32.png'), "&Zoom Fit") - self.zoom_out_btn = self.toolbar.addAction(QtGui.QIcon('share/zoom_out32.png'), "&Zoom Out") - self.zoom_in_btn = self.toolbar.addAction(QtGui.QIcon('share/zoom_in32.png'), "&Zoom In") - self.clear_plot_btn = self.toolbar.addAction(QtGui.QIcon('share/clear_plot32.png'), "&Clear Plot") - self.replot_btn = self.toolbar.addAction(QtGui.QIcon('share/replot32.png'), "&Replot") - self.newgeo_btn = self.toolbar.addAction(QtGui.QIcon('share/new_geo32.png'), "New Blank Geometry") - self.editgeo_btn = self.toolbar.addAction(QtGui.QIcon('share/edit32.png'), "Edit Geometry") - self.updategeo_btn = self.toolbar.addAction(QtGui.QIcon('share/edit_ok32.png'), "Update Geometry") + self.toolbareditobj = QtGui.QToolBar('Obj.Editor Toolbar') + self.addToolBar(self.toolbareditobj) + self.newgeo_btn = self.toolbareditobj.addAction(QtGui.QIcon('share/new_geo32.png'), "New Blank Geometry") + self.editgeo_btn = self.toolbareditobj.addAction(QtGui.QIcon('share/edit32.png'), "Edit Geometry") + self.updategeo_btn = self.toolbareditobj.addAction(QtGui.QIcon('share/edit_ok32.png'), "Update Geometry") self.updategeo_btn.setEnabled(False) - #self.canceledit_btn = self.toolbar.addAction(QtGui.QIcon('share/cancel_edit32.png'), "Cancel Edit") - self.delete_btn = self.toolbar.addAction(QtGui.QIcon('share/delete32.png'), "&Delete") - self.shell_btn = self.toolbar.addAction(QtGui.QIcon('share/shell32.png'), "&Command Line") + + self.toolbaredit = QtGui.QToolBar('Edit Toolbar') + self.addToolBar(self.toolbaredit) + self.delete_btn = self.toolbaredit.addAction(QtGui.QIcon('share/delete32.png'), "&Delete") + + self.toolbartools = QtGui.QToolBar('Tools Toolbar') + self.addToolBar(self.toolbartools) + self.shell_btn = self.toolbartools.addAction(QtGui.QIcon('share/shell32.png'), "&Command Line") + self.measure_btn = self.toolbartools.addAction(QtGui.QIcon('share/measure32.png'), "&Measurement Tool") ################ ### Splitter ### @@ -164,7 +181,7 @@ class FlatCAMGUI(QtGui.QMainWindow): # self.notebook.setMinimumWidth(250) - ### Projet ### + ### Project ### project_tab = QtGui.QWidget() project_tab.setMinimumWidth(250) # Hack self.project_tab_layout = QtGui.QVBoxLayout(project_tab)