- added more key shortcuts into the application; they are now displayed in the GUI menu's

- reorganized the Edit -> Preferences -> Global
- redesigned the messagebox that is showed when quiting ot creating a New Project: now it has an option ('Cancel') to abort the process returning to the app
This commit is contained in:
Marius Stanciu 2019-01-27 03:32:09 +02:00 committed by Marius S
parent c0031235cd
commit c4a9c8bd77
22 changed files with 595 additions and 326 deletions

View File

@ -6,6 +6,7 @@ from FlatCAMApp import App
from multiprocessing import freeze_support
import VisPyPatches
if sys.platform == "win32":
# cx_freeze 'module win32' workaround
import OpenGL.platform.win32

View File

@ -104,6 +104,7 @@ class App(QtCore.QObject):
manual_url = "http://flatcam.org/manual/index.html"
video_url = "https://www.youtube.com/playlist?list=PLVvP2SYRpx-AQgNlfoxw93tXUXon7G94_"
should_we_quit = True
##################
## Signals ##
@ -291,25 +292,25 @@ class App(QtCore.QObject):
# when adding entries here read the comments in the method found bellow named:
# def new_object(self, kind, name, initialize, active=True, fit=True, plot=True)
self.defaults_form_fields = {
"units": self.general_defaults_form.general_group.units_radio,
"global_shell_at_startup": self.general_defaults_form.general_group.shell_startup_cb,
"global_version_check": self.general_defaults_form.general_group.version_check_cb,
"global_send_stats": self.general_defaults_form.general_group.send_stats_cb,
"global_gridx": self.general_defaults_form.general_group.gridx_entry,
"global_gridy": self.general_defaults_form.general_group.gridy_entry,
"global_plot_fill": self.general_defaults_form.general_group.pf_color_entry,
"global_plot_line": self.general_defaults_form.general_group.pl_color_entry,
"global_sel_fill": self.general_defaults_form.general_group.sf_color_entry,
"global_sel_line": self.general_defaults_form.general_group.sl_color_entry,
"global_alt_sel_fill": self.general_defaults_form.general_group.alt_sf_color_entry,
"global_alt_sel_line": self.general_defaults_form.general_group.alt_sl_color_entry,
"global_draw_color": self.general_defaults_form.general_group.draw_color_entry,
"global_sel_draw_color": self.general_defaults_form.general_group.sel_draw_color_entry,
"global_pan_button": self.general_defaults_form.general_group.pan_button_radio,
"global_mselect_key": self.general_defaults_form.general_group.mselect_radio,
# "global_pan_with_space_key": self.general_defaults_form.general_group.pan_with_space_cb,
"global_workspace": self.general_defaults_form.general_group.workspace_cb,
"global_workspaceT": self.general_defaults_form.general_group.wk_cb,
"units": self.general_defaults_form.general_app_group.units_radio,
"global_shell_at_startup": self.general_defaults_form.general_app_group.shell_startup_cb,
"global_version_check": self.general_defaults_form.general_app_group.version_check_cb,
"global_send_stats": self.general_defaults_form.general_app_group.send_stats_cb,
"global_gridx": self.general_defaults_form.general_gui_group.gridx_entry,
"global_gridy": self.general_defaults_form.general_gui_group.gridy_entry,
"global_plot_fill": self.general_defaults_form.general_gui_group.pf_color_entry,
"global_plot_line": self.general_defaults_form.general_gui_group.pl_color_entry,
"global_sel_fill": self.general_defaults_form.general_gui_group.sf_color_entry,
"global_sel_line": self.general_defaults_form.general_gui_group.sl_color_entry,
"global_alt_sel_fill": self.general_defaults_form.general_gui_group.alt_sf_color_entry,
"global_alt_sel_line": self.general_defaults_form.general_gui_group.alt_sl_color_entry,
"global_draw_color": self.general_defaults_form.general_gui_group.draw_color_entry,
"global_sel_draw_color": self.general_defaults_form.general_gui_group.sel_draw_color_entry,
"global_pan_button": self.general_defaults_form.general_app_group.pan_button_radio,
"global_mselect_key": self.general_defaults_form.general_app_group.mselect_radio,
# "global_pan_with_space_key": self.general_defaults_form.general_gui_group.pan_with_space_cb,
"global_workspace": self.general_defaults_form.general_gui_group.workspace_cb,
"global_workspaceT": self.general_defaults_form.general_gui_group.wk_cb,
"gerber_plot": self.gerber_defaults_form.gerber_group.plot_cb,
"gerber_solid": self.gerber_defaults_form.gerber_group.solid_cb,
@ -582,9 +583,9 @@ class App(QtCore.QObject):
self.cncjob_options_form = CNCJobPreferencesUI()
self.options_form_fields = {
"units": self.general_options_form.general_group.units_radio,
"global_gridx": self.general_options_form.general_group.gridx_entry,
"global_gridy": self.general_options_form.general_group.gridy_entry,
"units": self.general_options_form.general_app_group.units_radio,
"global_gridx": self.general_options_form.general_gui_group.gridx_entry,
"global_gridy": self.general_options_form.general_gui_group.gridy_entry,
"gerber_plot": self.gerber_options_form.gerber_group.plot_cb,
"gerber_solid": self.gerber_options_form.gerber_group.solid_cb,
"gerber_multicolored": self.gerber_options_form.gerber_group.multicolored_cb,
@ -758,51 +759,51 @@ class App(QtCore.QObject):
### Initialize the color box's color in Preferences -> Global -> Color
# Init Plot Colors
self.general_defaults_form.general_group.pf_color_entry.set_value(self.defaults['global_plot_fill'])
self.general_defaults_form.general_group.pf_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.pf_color_entry.set_value(self.defaults['global_plot_fill'])
self.general_defaults_form.general_gui_group.pf_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_plot_fill'])[:7])
self.general_defaults_form.general_group.pf_color_alpha_spinner.set_value(
self.general_defaults_form.general_gui_group.pf_color_alpha_spinner.set_value(
int(self.defaults['global_plot_fill'][7:9], 16))
self.general_defaults_form.general_group.pf_color_alpha_slider.setValue(
self.general_defaults_form.general_gui_group.pf_color_alpha_slider.setValue(
int(self.defaults['global_plot_fill'][7:9], 16))
self.general_defaults_form.general_group.pl_color_entry.set_value(self.defaults['global_plot_line'])
self.general_defaults_form.general_group.pl_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.pl_color_entry.set_value(self.defaults['global_plot_line'])
self.general_defaults_form.general_gui_group.pl_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_plot_line'])[:7])
# Init Left-Right Selection colors
self.general_defaults_form.general_group.sf_color_entry.set_value(self.defaults['global_sel_fill'])
self.general_defaults_form.general_group.sf_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.sf_color_entry.set_value(self.defaults['global_sel_fill'])
self.general_defaults_form.general_gui_group.sf_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_sel_fill'])[:7])
self.general_defaults_form.general_group.sf_color_alpha_spinner.set_value(
self.general_defaults_form.general_gui_group.sf_color_alpha_spinner.set_value(
int(self.defaults['global_sel_fill'][7:9], 16))
self.general_defaults_form.general_group.sf_color_alpha_slider.setValue(
self.general_defaults_form.general_gui_group.sf_color_alpha_slider.setValue(
int(self.defaults['global_sel_fill'][7:9], 16))
self.general_defaults_form.general_group.sl_color_entry.set_value(self.defaults['global_sel_line'])
self.general_defaults_form.general_group.sl_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.sl_color_entry.set_value(self.defaults['global_sel_line'])
self.general_defaults_form.general_gui_group.sl_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_sel_line'])[:7])
# Init Right-Left Selection colors
self.general_defaults_form.general_group.alt_sf_color_entry.set_value(self.defaults['global_alt_sel_fill'])
self.general_defaults_form.general_group.alt_sf_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.alt_sf_color_entry.set_value(self.defaults['global_alt_sel_fill'])
self.general_defaults_form.general_gui_group.alt_sf_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_alt_sel_fill'])[:7])
self.general_defaults_form.general_group.alt_sf_color_alpha_spinner.set_value(
self.general_defaults_form.general_gui_group.alt_sf_color_alpha_spinner.set_value(
int(self.defaults['global_sel_fill'][7:9], 16))
self.general_defaults_form.general_group.alt_sf_color_alpha_slider.setValue(
self.general_defaults_form.general_gui_group.alt_sf_color_alpha_slider.setValue(
int(self.defaults['global_sel_fill'][7:9], 16))
self.general_defaults_form.general_group.alt_sl_color_entry.set_value(self.defaults['global_alt_sel_line'])
self.general_defaults_form.general_group.alt_sl_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.alt_sl_color_entry.set_value(self.defaults['global_alt_sel_line'])
self.general_defaults_form.general_gui_group.alt_sl_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_alt_sel_line'])[:7])
# Init Draw color and Selection Draw Color
self.general_defaults_form.general_group.draw_color_entry.set_value(self.defaults['global_draw_color'])
self.general_defaults_form.general_group.draw_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.draw_color_entry.set_value(self.defaults['global_draw_color'])
self.general_defaults_form.general_gui_group.draw_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_draw_color'])[:7])
self.general_defaults_form.general_group.sel_draw_color_entry.set_value(self.defaults['global_sel_draw_color'])
self.general_defaults_form.general_group.sel_draw_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.sel_draw_color_entry.set_value(self.defaults['global_sel_draw_color'])
self.general_defaults_form.general_gui_group.sel_draw_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_sel_draw_color'])[:7])
#### End of Data ####
@ -917,6 +918,7 @@ class App(QtCore.QObject):
self.ui.menueditorigin.triggered.connect(self.on_set_origin)
self.ui.menueditjump.triggered.connect(self.on_jump_to)
self.ui.menuedittoggleunits.triggered.connect(self.on_toggle_units_click)
self.ui.menueditselectall.triggered.connect(self.on_selectall)
self.ui.menueditpreferences.triggered.connect(self.on_preferences)
@ -942,6 +944,7 @@ class App(QtCore.QObject):
self.ui.menuview_zoom_fit.triggered.connect(self.on_zoom_fit)
self.ui.menuview_zoom_in.triggered.connect(lambda: self.plotcanvas.zoom(1 / 1.5))
self.ui.menuview_zoom_out.triggered.connect(lambda: self.plotcanvas.zoom(1.5))
self.ui.menuview_toggle_grid.triggered.connect(self.on_toggle_grid)
self.ui.menuview_toggle_axis.triggered.connect(self.on_toggle_axis)
self.ui.menuview_toggle_workspace.triggered.connect(self.on_workspace_menu)
@ -995,6 +998,7 @@ class App(QtCore.QObject):
self.ui.draw_line.triggered.connect(self.geo_editor.draw_tool_path)
self.ui.draw_rect.triggered.connect(self.geo_editor.draw_tool_rectangle)
self.ui.draw_cut.triggered.connect(self.geo_editor.cutpath)
self.ui.draw_move.triggered.connect(self.geo_editor.on_move)
self.ui.drill.triggered.connect(self.exc_editor.exc_add_drill)
self.ui.drill_array.triggered.connect(self.exc_editor.exc_add_drill_array)
self.ui.drill_copy.triggered.connect(self.exc_editor.exc_copy_drills)
@ -1019,39 +1023,48 @@ class App(QtCore.QObject):
self.ui.pref_export_button.clicked.connect(self.on_export_preferences)
self.ui.pref_open_button.clicked.connect(self.on_preferences_open_folder)
self.general_options_form.general_group.units_radio.group_toggle_fn = self.on_toggle_units
###############################
### GUI PREFERENCES SIGNALS ###
###############################
self.general_options_form.general_app_group.units_radio.group_toggle_fn = self.on_toggle_units
self.general_defaults_form.general_app_group.language_apply_btn.clicked.connect(self.on_language_apply)
###############################
### GUI PREFERENCES SIGNALS ###
###############################
# Setting plot colors signals
self.general_defaults_form.general_group.pf_color_entry.editingFinished.connect(self.on_pf_color_entry)
self.general_defaults_form.general_group.pf_color_button.clicked.connect(self.on_pf_color_button)
self.general_defaults_form.general_group.pf_color_alpha_spinner.valueChanged.connect(self.on_pf_color_spinner)
self.general_defaults_form.general_group.pf_color_alpha_slider.valueChanged.connect(self.on_pf_color_slider)
self.general_defaults_form.general_group.pl_color_entry.editingFinished.connect(self.on_pl_color_entry)
self.general_defaults_form.general_group.pl_color_button.clicked.connect(self.on_pl_color_button)
self.general_defaults_form.general_gui_group.pf_color_entry.editingFinished.connect(self.on_pf_color_entry)
self.general_defaults_form.general_gui_group.pf_color_button.clicked.connect(self.on_pf_color_button)
self.general_defaults_form.general_gui_group.pf_color_alpha_spinner.valueChanged.connect(self.on_pf_color_spinner)
self.general_defaults_form.general_gui_group.pf_color_alpha_slider.valueChanged.connect(self.on_pf_color_slider)
self.general_defaults_form.general_gui_group.pl_color_entry.editingFinished.connect(self.on_pl_color_entry)
self.general_defaults_form.general_gui_group.pl_color_button.clicked.connect(self.on_pl_color_button)
# Setting selection (left - right) colors signals
self.general_defaults_form.general_group.sf_color_entry.editingFinished.connect(self.on_sf_color_entry)
self.general_defaults_form.general_group.sf_color_button.clicked.connect(self.on_sf_color_button)
self.general_defaults_form.general_group.sf_color_alpha_spinner.valueChanged.connect(self.on_sf_color_spinner)
self.general_defaults_form.general_group.sf_color_alpha_slider.valueChanged.connect(self.on_sf_color_slider)
self.general_defaults_form.general_group.sl_color_entry.editingFinished.connect(self.on_sl_color_entry)
self.general_defaults_form.general_group.sl_color_button.clicked.connect(self.on_sl_color_button)
self.general_defaults_form.general_gui_group.sf_color_entry.editingFinished.connect(self.on_sf_color_entry)
self.general_defaults_form.general_gui_group.sf_color_button.clicked.connect(self.on_sf_color_button)
self.general_defaults_form.general_gui_group.sf_color_alpha_spinner.valueChanged.connect(self.on_sf_color_spinner)
self.general_defaults_form.general_gui_group.sf_color_alpha_slider.valueChanged.connect(self.on_sf_color_slider)
self.general_defaults_form.general_gui_group.sl_color_entry.editingFinished.connect(self.on_sl_color_entry)
self.general_defaults_form.general_gui_group.sl_color_button.clicked.connect(self.on_sl_color_button)
# Setting selection (right - left) colors signals
self.general_defaults_form.general_group.alt_sf_color_entry.editingFinished.connect(self.on_alt_sf_color_entry)
self.general_defaults_form.general_group.alt_sf_color_button.clicked.connect(self.on_alt_sf_color_button)
self.general_defaults_form.general_group.alt_sf_color_alpha_spinner.valueChanged.connect(
self.general_defaults_form.general_gui_group.alt_sf_color_entry.editingFinished.connect(self.on_alt_sf_color_entry)
self.general_defaults_form.general_gui_group.alt_sf_color_button.clicked.connect(self.on_alt_sf_color_button)
self.general_defaults_form.general_gui_group.alt_sf_color_alpha_spinner.valueChanged.connect(
self.on_alt_sf_color_spinner)
self.general_defaults_form.general_group.alt_sf_color_alpha_slider.valueChanged.connect(
self.general_defaults_form.general_gui_group.alt_sf_color_alpha_slider.valueChanged.connect(
self.on_alt_sf_color_slider)
self.general_defaults_form.general_group.alt_sl_color_entry.editingFinished.connect(self.on_alt_sl_color_entry)
self.general_defaults_form.general_group.alt_sl_color_button.clicked.connect(self.on_alt_sl_color_button)
self.general_defaults_form.general_gui_group.alt_sl_color_entry.editingFinished.connect(self.on_alt_sl_color_entry)
self.general_defaults_form.general_gui_group.alt_sl_color_button.clicked.connect(self.on_alt_sl_color_button)
# Setting Editor Draw colors signals
self.general_defaults_form.general_group.draw_color_entry.editingFinished.connect(self.on_draw_color_entry)
self.general_defaults_form.general_group.draw_color_button.clicked.connect(self.on_draw_color_button)
self.general_defaults_form.general_gui_group.draw_color_entry.editingFinished.connect(self.on_draw_color_entry)
self.general_defaults_form.general_gui_group.draw_color_button.clicked.connect(self.on_draw_color_button)
self.general_defaults_form.general_group.sel_draw_color_entry.editingFinished.connect(self.on_sel_draw_color_entry)
self.general_defaults_form.general_group.sel_draw_color_button.clicked.connect(self.on_sel_draw_color_button)
self.general_defaults_form.general_gui_group.sel_draw_color_entry.editingFinished.connect(self.on_sel_draw_color_entry)
self.general_defaults_form.general_gui_group.sel_draw_color_button.clicked.connect(self.on_sel_draw_color_button)
self.general_defaults_form.general_group.wk_cb.currentIndexChanged.connect(self.on_workspace_modified)
self.general_defaults_form.general_group.workspace_cb.stateChanged.connect(self.on_workspace)
self.general_defaults_form.general_gui_group.wk_cb.currentIndexChanged.connect(self.on_workspace_modified)
self.general_defaults_form.general_gui_group.workspace_cb.stateChanged.connect(self.on_workspace)
# Modify G-CODE Plot Area TAB
@ -1067,7 +1080,7 @@ class App(QtCore.QObject):
self.collection.view.activated.connect(self.on_row_activated)
# Monitor the checkbox from the Application Defaults Tab and show the TCL shell or not depending on it's value
self.general_defaults_form.general_group.shell_startup_cb.clicked.connect(self.on_toggle_shell)
self.general_defaults_form.general_app_group.shell_startup_cb.clicked.connect(self.on_toggle_shell)
# Load the defaults values into the Excellon Format and Excellon Zeros fields
self.excellon_defaults_form.excellon_group.excellon_defaults_button.clicked.connect(
@ -1173,7 +1186,7 @@ class App(QtCore.QObject):
# Separate thread (Not worker)
# Check for updates on startup but only if the user consent and the app is not in Beta version
if (self.beta is False or self.beta is None) and \
self.general_defaults_form.general_group.version_check_cb.get_value() is True:
self.general_defaults_form.general_gui_group.version_check_cb.get_value() is True:
App.log.info("Checking for updates in backgroud (this is version %s)." % str(self.version))
self.thr2 = QtCore.QThread()
@ -2214,13 +2227,16 @@ class App(QtCore.QObject):
"Do you want to Save the project?")
msgbox.setWindowTitle("Save changes")
msgbox.setWindowIcon(QtGui.QIcon('share/save_as.png'))
msgbox.setStandardButtons(QtWidgets.QMessageBox.Cancel | QtWidgets.QMessageBox.Ok)
msgbox.setDefaultButton(QtWidgets.QMessageBox.Ok)
msgbox.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No |
QtWidgets.QMessageBox.Cancel)
msgbox.setDefaultButton(QtWidgets.QMessageBox.Yes)
response = msgbox.exec_()
if response == QtWidgets.QMessageBox.Ok:
if response == QtWidgets.QMessageBox.Yes:
self.on_file_saveprojectas(thread=False)
elif response == QtWidgets.QMessageBox.Cancel:
return
self.save_defaults()
else:
self.save_defaults()
@ -2350,14 +2366,17 @@ class App(QtCore.QObject):
"Do you want to Save the project?")
msgbox.setWindowTitle("Save changes")
msgbox.setWindowIcon(QtGui.QIcon('share/save_as.png'))
msgbox.setStandardButtons(QtWidgets.QMessageBox.Cancel | QtWidgets.QMessageBox.Ok)
msgbox.setDefaultButton(QtWidgets.QMessageBox.Ok)
msgbox.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No |
QtWidgets.QMessageBox.Cancel)
msgbox.setDefaultButton(QtWidgets.QMessageBox.Yes)
response = msgbox.exec_()
if response == QtWidgets.QMessageBox.Ok:
if response == QtWidgets.QMessageBox.Yes:
self.on_file_saveprojectas(thread=False)
elif response == QtWidgets.QMessageBox.Cancel:
self.should_we_quit = False
return
self.save_defaults()
log.debug("Application defaults saved ... Exit event.")
@ -2508,7 +2527,7 @@ class App(QtCore.QObject):
return
# If option is the same, then ignore
if self.general_options_form.general_group.units_radio.get_value().upper() == self.options["units"].upper():
if self.general_options_form.general_app_group.units_radio.get_value().upper() == self.options["units"].upper():
self.log.debug("on_toggle_units(): Same as options, so ignoring.")
return
@ -2542,7 +2561,7 @@ class App(QtCore.QObject):
# The scaling factor depending on choice of units.
factor = 1/25.4
if self.general_options_form.general_group.units_radio.get_value().upper() == 'MM':
if self.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
factor = 25.4
@ -2570,7 +2589,7 @@ class App(QtCore.QObject):
self.ui.grid_gap_y_entry.set_value(float(self.ui.grid_gap_y_entry.get_value()) * factor)
for obj in self.collection.get_list():
units = self.general_options_form.general_group.units_radio.get_value().upper()
units = self.general_options_form.general_app_group.units_radio.get_value().upper()
obj.convert_units(units)
# make that the properties stored in the object are also updated
@ -2587,10 +2606,10 @@ class App(QtCore.QObject):
else:
# Undo toggling
self.toggle_units_ignore = True
if self.general_options_form.general_group.units_radio.get_value().upper() == 'MM':
self.general_options_form.general_group.units_radio.set_value('IN')
if self.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
self.general_options_form.general_app_group.units_radio.set_value('IN')
else:
self.general_options_form.general_group.units_radio.set_value('MM')
self.general_options_form.general_app_group.units_radio.set_value('MM')
self.toggle_units_ignore = False
self.options_read_form()
@ -2598,6 +2617,18 @@ class App(QtCore.QObject):
#self.ui.units_label.setText("[" + self.options["units"] + "]")
self.set_screen_units(self.options["units"])
def on_toggle_units_click(self):
if self.options["units"] == 'MM':
self.general_options_form.general_app_group.units_radio.set_value("IN")
else:
self.general_options_form.general_app_group.units_radio.set_value("MM")
self.on_toggle_units()
def on_language_apply(self):
# TODO: apply the language
# app restart section
pass
def on_toggle_axis(self):
if self.toggle_axis is False:
self.plotcanvas.v_line.set_data(color=(0.70, 0.3, 0.3, 1.0))
@ -2611,6 +2642,9 @@ class App(QtCore.QObject):
self.plotcanvas.redraw()
self.toggle_axis = False
def on_toggle_grid(self):
self.ui.grid_snap_btn.trigger()
def on_options_combo_change(self, sel):
"""
Called when the combo box to choose between application defaults and
@ -2702,9 +2736,9 @@ class App(QtCore.QObject):
# Setting plot colors handlers
def on_pf_color_entry(self):
self.defaults['global_plot_fill'] = self.general_defaults_form.general_group.pf_color_entry.get_value()[:7] + \
self.defaults['global_plot_fill'] = self.general_defaults_form.general_gui_group.pf_color_entry.get_value()[:7] + \
self.defaults['global_plot_fill'][7:9]
self.general_defaults_form.general_group.pf_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.pf_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_plot_fill'])[:7])
def on_pf_color_button(self):
@ -2716,29 +2750,29 @@ class App(QtCore.QObject):
if plot_fill_color.isValid() is False:
return
self.general_defaults_form.general_group.pf_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.pf_color_button.setStyleSheet(
"background-color:%s" % str(plot_fill_color.name()))
new_val = str(plot_fill_color.name()) + str(self.defaults['global_plot_fill'][7:9])
self.general_defaults_form.general_group.pf_color_entry.set_value(new_val)
self.general_defaults_form.general_gui_group.pf_color_entry.set_value(new_val)
self.defaults['global_plot_fill'] = new_val
def on_pf_color_spinner(self):
spinner_value = self.general_defaults_form.general_group.pf_color_alpha_spinner.value()
self.general_defaults_form.general_group.pf_color_alpha_slider.setValue(spinner_value)
spinner_value = self.general_defaults_form.general_gui_group.pf_color_alpha_spinner.value()
self.general_defaults_form.general_gui_group.pf_color_alpha_slider.setValue(spinner_value)
self.defaults['global_plot_fill'] = self.defaults['global_plot_fill'][:7] + \
(hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00')
self.defaults['global_plot_line'] = self.defaults['global_plot_line'][:7] + \
(hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00')
def on_pf_color_slider(self):
slider_value = self.general_defaults_form.general_group.pf_color_alpha_slider.value()
self.general_defaults_form.general_group.pf_color_alpha_spinner.setValue(slider_value)
slider_value = self.general_defaults_form.general_gui_group.pf_color_alpha_slider.value()
self.general_defaults_form.general_gui_group.pf_color_alpha_spinner.setValue(slider_value)
def on_pl_color_entry(self):
self.defaults['global_plot_line'] = self.general_defaults_form.general_group.pl_color_entry.get_value()[:7] + \
self.defaults['global_plot_line'] = self.general_defaults_form.general_gui_group.pl_color_entry.get_value()[:7] + \
self.defaults['global_plot_line'][7:9]
self.general_defaults_form.general_group.pl_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.pl_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_plot_line'])[:7])
def on_pl_color_button(self):
@ -2751,18 +2785,18 @@ class App(QtCore.QObject):
if plot_line_color.isValid() is False:
return
self.general_defaults_form.general_group.pl_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.pl_color_button.setStyleSheet(
"background-color:%s" % str(plot_line_color.name()))
new_val_line = str(plot_line_color.name()) + str(self.defaults['global_plot_line'][7:9])
self.general_defaults_form.general_group.pl_color_entry.set_value(new_val_line)
self.general_defaults_form.general_gui_group.pl_color_entry.set_value(new_val_line)
self.defaults['global_plot_line'] = new_val_line
# Setting selection colors (left - right) handlers
def on_sf_color_entry(self):
self.defaults['global_sel_fill'] = self.general_defaults_form.general_group.sf_color_entry.get_value()[:7] + \
self.defaults['global_sel_fill'] = self.general_defaults_form.general_gui_group.sf_color_entry.get_value()[:7] + \
self.defaults['global_sel_fill'][7:9]
self.general_defaults_form.general_group.sf_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.sf_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_sel_fill'])[:7])
def on_sf_color_button(self):
@ -2774,29 +2808,29 @@ class App(QtCore.QObject):
if plot_fill_color.isValid() is False:
return
self.general_defaults_form.general_group.sf_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.sf_color_button.setStyleSheet(
"background-color:%s" % str(plot_fill_color.name()))
new_val = str(plot_fill_color.name()) + str(self.defaults['global_sel_fill'][7:9])
self.general_defaults_form.general_group.sf_color_entry.set_value(new_val)
self.general_defaults_form.general_gui_group.sf_color_entry.set_value(new_val)
self.defaults['global_sel_fill'] = new_val
def on_sf_color_spinner(self):
spinner_value = self.general_defaults_form.general_group.sf_color_alpha_spinner.value()
self.general_defaults_form.general_group.sf_color_alpha_slider.setValue(spinner_value)
spinner_value = self.general_defaults_form.general_gui_group.sf_color_alpha_spinner.value()
self.general_defaults_form.general_gui_group.sf_color_alpha_slider.setValue(spinner_value)
self.defaults['global_sel_fill'] = self.defaults['global_sel_fill'][:7] + \
(hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00')
self.defaults['global_sel_line'] = self.defaults['global_sel_line'][:7] + \
(hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00')
def on_sf_color_slider(self):
slider_value = self.general_defaults_form.general_group.sf_color_alpha_slider.value()
self.general_defaults_form.general_group.sf_color_alpha_spinner.setValue(slider_value)
slider_value = self.general_defaults_form.general_gui_group.sf_color_alpha_slider.value()
self.general_defaults_form.general_gui_group.sf_color_alpha_spinner.setValue(slider_value)
def on_sl_color_entry(self):
self.defaults['global_sel_line'] = self.general_defaults_form.general_group.sl_color_entry.get_value()[:7] + \
self.defaults['global_sel_line'] = self.general_defaults_form.general_gui_group.sl_color_entry.get_value()[:7] + \
self.defaults['global_sel_line'][7:9]
self.general_defaults_form.general_group.sl_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.sl_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_sel_line'])[:7])
def on_sl_color_button(self):
@ -2808,18 +2842,18 @@ class App(QtCore.QObject):
if plot_line_color.isValid() is False:
return
self.general_defaults_form.general_group.sl_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.sl_color_button.setStyleSheet(
"background-color:%s" % str(plot_line_color.name()))
new_val_line = str(plot_line_color.name()) + str(self.defaults['global_sel_line'][7:9])
self.general_defaults_form.general_group.sl_color_entry.set_value(new_val_line)
self.general_defaults_form.general_gui_group.sl_color_entry.set_value(new_val_line)
self.defaults['global_sel_line'] = new_val_line
# Setting selection colors (right - left) handlers
def on_alt_sf_color_entry(self):
self.defaults['global_alt_sel_fill'] = self.general_defaults_form.general_group \
self.defaults['global_alt_sel_fill'] = self.general_defaults_form.general_gui_group \
.alt_sf_color_entry.get_value()[:7] + self.defaults['global_alt_sel_fill'][7:9]
self.general_defaults_form.general_group.alt_sf_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.alt_sf_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_alt_sel_fill'])[:7])
def on_alt_sf_color_button(self):
@ -2831,29 +2865,29 @@ class App(QtCore.QObject):
if plot_fill_color.isValid() is False:
return
self.general_defaults_form.general_group.alt_sf_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.alt_sf_color_button.setStyleSheet(
"background-color:%s" % str(plot_fill_color.name()))
new_val = str(plot_fill_color.name()) + str(self.defaults['global_alt_sel_fill'][7:9])
self.general_defaults_form.general_group.alt_sf_color_entry.set_value(new_val)
self.general_defaults_form.general_gui_group.alt_sf_color_entry.set_value(new_val)
self.defaults['global_alt_sel_fill'] = new_val
def on_alt_sf_color_spinner(self):
spinner_value = self.general_defaults_form.general_group.alt_sf_color_alpha_spinner.value()
self.general_defaults_form.general_group.alt_sf_color_alpha_slider.setValue(spinner_value)
spinner_value = self.general_defaults_form.general_gui_group.alt_sf_color_alpha_spinner.value()
self.general_defaults_form.general_gui_group.alt_sf_color_alpha_slider.setValue(spinner_value)
self.defaults['global_alt_sel_fill'] = self.defaults['global_alt_sel_fill'][:7] + \
(hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00')
self.defaults['global_alt_sel_line'] = self.defaults['global_alt_sel_line'][:7] + \
(hex(spinner_value)[2:] if int(hex(spinner_value)[2:], 16) > 0 else '00')
def on_alt_sf_color_slider(self):
slider_value = self.general_defaults_form.general_group.alt_sf_color_alpha_slider.value()
self.general_defaults_form.general_group.alt_sf_color_alpha_spinner.setValue(slider_value)
slider_value = self.general_defaults_form.general_gui_group.alt_sf_color_alpha_slider.value()
self.general_defaults_form.general_gui_group.alt_sf_color_alpha_spinner.setValue(slider_value)
def on_alt_sl_color_entry(self):
self.defaults['global_alt_sel_line'] = self.general_defaults_form.general_group \
self.defaults['global_alt_sel_line'] = self.general_defaults_form.general_gui_group \
.alt_sl_color_entry.get_value()[:7] + self.defaults['global_alt_sel_line'][7:9]
self.general_defaults_form.general_group.alt_sl_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.alt_sl_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_alt_sel_line'])[:7])
def on_alt_sl_color_button(self):
@ -2865,18 +2899,18 @@ class App(QtCore.QObject):
if plot_line_color.isValid() is False:
return
self.general_defaults_form.general_group.alt_sl_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.alt_sl_color_button.setStyleSheet(
"background-color:%s" % str(plot_line_color.name()))
new_val_line = str(plot_line_color.name()) + str(self.defaults['global_alt_sel_line'][7:9])
self.general_defaults_form.general_group.alt_sl_color_entry.set_value(new_val_line)
self.general_defaults_form.general_gui_group.alt_sl_color_entry.set_value(new_val_line)
self.defaults['global_alt_sel_line'] = new_val_line
# Setting Editor colors
def on_draw_color_entry(self):
self.defaults['global_draw_color'] = self.general_defaults_form.general_group \
self.defaults['global_draw_color'] = self.general_defaults_form.general_gui_group \
.draw_color_entry.get_value()
self.general_defaults_form.general_group.draw_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.draw_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_draw_color']))
def on_draw_color_button(self):
@ -2888,17 +2922,17 @@ class App(QtCore.QObject):
if draw_color.isValid() is False:
return
self.general_defaults_form.general_group.draw_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.draw_color_button.setStyleSheet(
"background-color:%s" % str(draw_color.name()))
new_val = str(draw_color.name())
self.general_defaults_form.general_group.draw_color_entry.set_value(new_val)
self.general_defaults_form.general_gui_group.draw_color_entry.set_value(new_val)
self.defaults['global_draw_color'] = new_val
def on_sel_draw_color_entry(self):
self.defaults['global_sel_draw_color'] = self.general_defaults_form.general_group \
self.defaults['global_sel_draw_color'] = self.general_defaults_form.general_gui_group \
.sel_draw_color_entry.get_value()
self.general_defaults_form.general_group.sel_draw_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.sel_draw_color_button.setStyleSheet(
"background-color:%s" % str(self.defaults['global_sel_draw_color']))
def on_sel_draw_color_button(self):
@ -2910,11 +2944,11 @@ class App(QtCore.QObject):
if sel_draw_color.isValid() is False:
return
self.general_defaults_form.general_group.sel_draw_color_button.setStyleSheet(
self.general_defaults_form.general_gui_group.sel_draw_color_button.setStyleSheet(
"background-color:%s" % str(sel_draw_color.name()))
new_val_sel = str(sel_draw_color.name())
self.general_defaults_form.general_group.sel_draw_color_entry.set_value(new_val_sel)
self.general_defaults_form.general_gui_group.sel_draw_color_entry.set_value(new_val_sel)
self.defaults['global_sel_draw_color'] = new_val_sel
def on_workspace_modified(self):
@ -2922,7 +2956,7 @@ class App(QtCore.QObject):
self.plotcanvas.draw_workspace()
def on_workspace(self):
if self.general_defaults_form.general_group.workspace_cb.isChecked():
if self.general_defaults_form.general_gui_group.workspace_cb.isChecked():
self.plotcanvas.restore_workspace()
else:
self.plotcanvas.delete_workspace()
@ -2930,10 +2964,10 @@ class App(QtCore.QObject):
self.save_defaults(silent=True)
def on_workspace_menu(self):
if self.general_defaults_form.general_group.workspace_cb.isChecked():
self.general_defaults_form.general_group.workspace_cb.setChecked(False)
if self.general_defaults_form.general_gui_group.workspace_cb.isChecked():
self.general_defaults_form.general_gui_group.workspace_cb.setChecked(False)
else:
self.general_defaults_form.general_group.workspace_cb.setChecked(True)
self.general_defaults_form.general_gui_group.workspace_cb.setChecked(True)
self.on_workspace()
def on_save_button(self):
@ -3573,6 +3607,9 @@ class App(QtCore.QObject):
if event.key == 'G':
self.on_fileopengerber()
if event.key == 'N':
self.on_file_new_click()
if event.key == 'M':
self.measurement_tool.run()
@ -3585,14 +3622,44 @@ class App(QtCore.QObject):
return
elif self.key_modifiers == QtCore.Qt.AltModifier:
# place holder for further shortcut key
return
if event.key == 'C':
self.calculator_tool.run()
if event.key == 'D':
self.dblsidedtool.run()
if event.key == 'L':
self.film_tool.run()
if event.key == 'N':
self.ncclear_tool.run()
if event.key == 'P':
self.paint_tool.run()
if event.key == 'R':
self.transform_tool.run()
if event.key == 'U':
self.cutout_tool.run()
if event.key == 'Z':
self.panelize_tool.run()
elif self.key_modifiers == QtCore.Qt.ShiftModifier:
# place holder for further shortcut key
if event.key == 'C':
self.on_copy_name()
# Toggle axis
if event.key == 'G':
self.on_toggle_axis()
# Open Preferences Window
if event.key == 'P':
self.on_preferences()
# Rotate Object by 90 degree CCW
if event.key == 'R':
self.on_rotate(silent=True, preset=-90)
@ -3601,6 +3668,14 @@ class App(QtCore.QObject):
if event.key == 'W':
self.on_workspace_menu()
# Skew on X axis
if event.key == 'X':
self.on_skewx()
# Skew on Y axis
if event.key == 'Y':
self.on_skewy()
return
else:
if event.key == self.defaults['fit_key']: # 1
@ -3624,9 +3699,6 @@ class App(QtCore.QObject):
self.collection.get_active().ui.plot_cb.toggle()
self.delete_selection_shape()
if event.key == 'C':
self.on_copy_name()
if event.key == 'E':
self.object2editor()
@ -3643,12 +3715,14 @@ class App(QtCore.QObject):
if event.key == 'N':
self.on_new_geometry()
if event.key == 'O':
self.on_set_origin()
if event.key == 'P':
self.properties_tool.run()
if event.key == 'Q':
if self.options["units"] == 'MM':
self.general_options_form.general_group.units_radio.set_value("IN")
else:
self.general_options_form.general_group.units_radio.set_value("MM")
self.on_toggle_units()
self.on_toggle_units_click()
if event.key == 'R':
self.on_rotate(silent=True, preset=90)
@ -3656,9 +3730,6 @@ class App(QtCore.QObject):
if event.key == 'S':
self.on_toggle_shell()
if event.key == 'T':
self.transform_tool.run()
if event.key == 'V':
self.on_zoom_fit(None)
@ -3695,7 +3766,6 @@ class App(QtCore.QObject):
<b>2:</b> Zoom Out<br>
<b>3:</b> Zoom In<br>
<b>A:</b> Draw an Arc (when in Edit Mode)<br>
<b>C:</b> Copy Obj_Name<br>
<b>C:</b> Copy Geo Item (when in Edit Mode)<br>
<b>E:</b> Edit Object (if selected)<br>
<b>G:</b> Grid On/Off<br>
@ -3704,13 +3774,14 @@ class App(QtCore.QObject):
<b>M:</b> Move Geo Item (when in Edit Mode)<br>
<b>N:</b> New Geometry<br>
<b>N:</b> Draw a Polygon (when in Edit Mode)<br>
<b>O:</b> Set Origin<br>
<b>O:</b> Draw a Circle (when in Edit Mode)<br>
<b>Q:</b> Change Units<br>
<b>P:</b> Open Properties Tool<br>
<b>P:</b> Draw a Path (when in Edit Mode)<br>
<b>R:</b> Rotate by 90 degree CW<br>
<b>R:</b> Draw Rectangle (when in Edit Mode)<br>
<b>S:</b> Shell Toggle<br>
<b>T:</b> Transformation<br>
<b>V:</b> View Fit<br>
<b>X:</b> Flip on X_axis<br>
<b>Y:</b> Flip on Y_axis<br>
@ -3720,14 +3791,28 @@ class App(QtCore.QObject):
<b>CTRL+C:</b> Copy Obj<br>
<b>CTRL+E:</b> Open Excellon File<br>
<b>CTRL+G:</b> Open Gerber File<br>
<b>CTRL+N:</b> New Project<br>
<b>CTRL+M:</b> Measurement Tool<br>
<b>CTRL+O:</b> Open Project<br>
<b>CTRL+S:</b> Save Project As<br>
<b>CTRL+S:</b> Save Object and Exit Editor (when in Edit Mode)<br>
<br>
<b>SHIFT+C:</b> Copy Obj_Name<br>
<b>SHIFT+G:</b> Toggle the axis<br>
<b>SHIFT+P:</b> Open Preferences Window<br>
<b>SHIFT+R:</b> Rotate by 90 degree CCW<br>
<b>SHIFT+W:</b> Toggle the workspace<br>
<b>SHIFT+X:</b> Skew on X axis<br>
<b>SHIFT+Y:</b> Skew on Y axis<br>
<br>
<b>ALT+C:</b> Calculators Tool<br>
<b>ALT+D:</b> 2-Sided PCB Tool<br>
<b>ALT+L:</b> Film PCB Tool<br>
<b>ALT+N:</b> Non-Copper Clearing Tool<br>
<b>ALT+P:</b> Paint Area Tool<br>
<b>ALT+R:</b> Transformation Tool<br>
<b>ALT+U:</b> Cutout PCB Tool<br>
<b>ALT+Z:</b> Panelize PCB Tool<br>
<b>Del:</b> Delete Obj'''
helpbox = QtWidgets.QMessageBox()
@ -3740,7 +3825,13 @@ class App(QtCore.QObject):
def on_copy_name(self):
obj = self.collection.get_active()
name = obj.options["name"]
try:
name = obj.options["name"]
except AttributeError:
log.debug("on_copy_name() --> No object selected to copy it's name")
self.inform.emit("[warning_notcl]No object selected to copy it's name")
return
self.clipboard.setText(name)
self.inform.emit("Name copied on clipboard ...")
@ -4093,13 +4184,16 @@ class App(QtCore.QObject):
"Do you want to Save the project?")
msgbox.setWindowTitle("Save changes")
msgbox.setWindowIcon(QtGui.QIcon('share/save_as.png'))
msgbox.setStandardButtons(QtWidgets.QMessageBox.Cancel | QtWidgets.QMessageBox.Ok)
msgbox.setStandardButtons(QtWidgets.QMessageBox.Cancel | QtWidgets.QMessageBox.Yes |
QtWidgets.QMessageBox.No)
msgbox.setDefaultButton(QtWidgets.QMessageBox.Ok)
response = msgbox.exec_()
if response == QtWidgets.QMessageBox.Ok:
if response == QtWidgets.QMessageBox.Yes:
self.on_file_saveprojectas()
elif response == QtWidgets.QMessageBox.Cancel:
return
self.on_file_new()
else:
self.on_file_new()
@ -4963,7 +5057,7 @@ class App(QtCore.QObject):
return "Could not retrieve object: %s" % obj_name
# updated units
units = self.general_options_form.general_group.units_radio.get_value().upper()
units = self.general_options_form.general_app_group.units_radio.get_value().upper()
if units == 'IN' or units == 'INCH':
units = 'INCH'
@ -5056,7 +5150,7 @@ class App(QtCore.QObject):
return "Could not retrieve object: %s" % obj_name
# updated units
units = self.general_options_form.general_group.units_radio.get_value().upper()
units = self.general_options_form.general_app_group.units_radio.get_value().upper()
if units == 'IN' or units == 'INCH':
units = 'INCH'
elif units == 'MM' or units == 'METIRC':
@ -5109,7 +5203,7 @@ class App(QtCore.QObject):
"Only Geometry and Gerber are supported")
return
units = self.general_options_form.general_group.units_radio.get_value().upper()
units = self.general_options_form.general_app_group.units_radio.get_value().upper()
def obj_init(geo_obj, app_obj):
geo_obj.import_svg(filename, obj_type, units=units)
@ -5150,7 +5244,7 @@ class App(QtCore.QObject):
"Only Geometry and Gerber are supported")
return
units = self.general_options_form.general_group.units_radio.get_value().upper()
units = self.general_options_form.general_app_group.units_radio.get_value().upper()
def obj_init(geo_obj, app_obj):
geo_obj.import_dxf(filename, obj_type, units=units)
@ -5197,7 +5291,7 @@ class App(QtCore.QObject):
# Object name
name = outname or filename.split('/')[-1].split('\\')[-1]
units = self.general_options_form.general_group.units_radio.get_value()
units = self.general_options_form.general_app_group.units_radio.get_value()
self.new_object(obj_type, name, obj_init)
self.progress.emit(20)
@ -5886,7 +5980,7 @@ class App(QtCore.QObject):
self.log.debug("version_check()")
if self.general_defaults_form.general_group.send_stats_cb.get_value() is True:
if self.general_defaults_form.general_gui_group.send_stats_cb.get_value() is True:
full_url = App.version_url + \
"?s=" + str(self.defaults['global_serial']) + \
"&v=" + str(self.version) + \

View File

@ -291,7 +291,7 @@ class TextInputTool(FlatCAMTool):
font_name=self.font_name,
font_size=font_to_geo_size,
font_type=font_to_geo_type,
units=self.app.general_options_form.general_group.units_radio.get_value().upper())
units=self.app.general_options_form.general_app_group.units_radio.get_value().upper())
def font_family(self, font):
self.text_input_entry.selectAll()
@ -1143,6 +1143,7 @@ class FCMove(FCShapeTool):
self.start_msg = "Click on reference point."
def set_origin(self, origin):
self.draw_app.app.inform.emit("Click on destination point.")
self.origin = origin
def click(self, point):
@ -1901,6 +1902,9 @@ class FlatCAMGeoEditor(QtCore.QObject):
self.app.ui.geo_cutpath_btn.triggered.connect(self.cutpath)
self.app.ui.geo_delete_btn.triggered.connect(self.on_delete_btn)
self.app.ui.geo_move_menuitem.triggered.connect(self.on_move)
self.app.ui.geo_cornersnap_menuitem.triggered.connect(self.on_corner_snap)
## Toolbar events and properties
self.tools = {
"select": {"button": self.app.ui.geo_select_btn,
@ -2596,14 +2600,11 @@ class FlatCAMGeoEditor(QtCore.QObject):
# Corner Snap
if event.key.name == 'K':
self.app.ui.corner_snap_btn.trigger()
self.on_corner_snap()
# Move
if event.key.name == 'M':
self.app.ui.geo_move_btn.setChecked(True)
self.on_tool_select('move')
self.active_tool.set_origin(self.snap(self.x, self.y))
self.app.inform.emit("Click on target point.")
self.on_move_click()
# Polygon Tool
if event.key.name == 'N':
@ -2718,6 +2719,17 @@ class FlatCAMGeoEditor(QtCore.QObject):
if shape in self.selected:
self.selected.remove(shape) # TODO: Check performance
def on_move(self):
self.app.ui.geo_move_btn.setChecked(True)
self.on_tool_select('move')
def on_move_click(self):
self.on_move()
self.active_tool.set_origin(self.snap(self.x, self.y))
def on_corner_snap(self):
self.app.ui.corner_snap_btn.trigger()
def get_selected(self):
"""
Returns list of shapes that are selected in the editor.
@ -3638,7 +3650,7 @@ class FlatCAMExcEditor(QtCore.QObject):
self.move_timer.setSingleShot(True)
## Current application units in Upper Case
self.units = self.app.general_options_form.general_group.units_radio.get_value().upper()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
self.key = None # Currently pressed key
self.modifiers = None
@ -3712,7 +3724,7 @@ class FlatCAMExcEditor(QtCore.QObject):
def set_ui(self):
# updated units
self.units = self.app.general_options_form.general_group.units_radio.get_value().upper()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
self.olddia_newdia.clear()
self.tool2tooldia.clear()
@ -3752,7 +3764,7 @@ class FlatCAMExcEditor(QtCore.QObject):
pass
# updated units
self.units = self.app.general_options_form.general_group.units_radio.get_value().upper()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
# make a new name for the new Excellon object (the one with edited content)
self.edited_obj_name = self.exc_obj.options['name']

View File

@ -36,22 +36,24 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.menufile = self.menu.addMenu('&File')
# New
self.menufilenew = QtWidgets.QAction(QtGui.QIcon('share/file16.png'), '&New Project', self)
self.menufilenew = QtWidgets.QAction(QtGui.QIcon('share/file16.png'), '&New Project ...\tCTRL+N', self)
self.menufile.addAction(self.menufilenew)
self.menufile_open = self.menufile.addMenu(QtGui.QIcon('share/folder32_bis.png'), 'Open')
# Open gerber ...
self.menufileopengerber = QtWidgets.QAction(QtGui.QIcon('share/flatcam_icon24.png'), 'Open &Gerber ...', self)
self.menufileopengerber = QtWidgets.QAction(QtGui.QIcon('share/flatcam_icon24.png'),
'Open &Gerber ...\tCTRL+G', self)
self.menufile_open.addAction(self.menufileopengerber)
# Open gerber with follow...
self.menufileopengerber_follow = QtWidgets.QAction(QtGui.QIcon('share/flatcam_icon24.png'),
'Open &Gerber (w/ Follow)', self)
'Open &Gerber (w/ Follow) ...', self)
self.menufile_open.addAction(self.menufileopengerber_follow)
self.menufile_open.addSeparator()
# Open Excellon ...
self.menufileopenexcellon = QtWidgets.QAction(QtGui.QIcon('share/open_excellon32.png'), 'Open &Excellon ...',
self.menufileopenexcellon = QtWidgets.QAction(QtGui.QIcon('share/open_excellon32.png'),
'Open &Excellon ...\tCTRL+E',
self)
self.menufile_open.addAction(self.menufileopenexcellon)
@ -70,7 +72,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.menufile.addSeparator()
# Run Scripts
self.menufilerunscript = QtWidgets.QAction(QtGui.QIcon('share/script16.png'), 'Run Script', self)
self.menufilerunscript = QtWidgets.QAction(QtGui.QIcon('share/script16.png'), 'Run Script ...', self)
self.menufile.addAction(self.menufilerunscript)
# Separator
@ -79,18 +81,18 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
# Import ...
self.menufileimport = self.menufile.addMenu(QtGui.QIcon('share/import.png'), 'Import')
self.menufileimportsvg = QtWidgets.QAction(QtGui.QIcon('share/svg16.png'),
'&SVG as Geometry Object', self)
'&SVG as Geometry Object ...', self)
self.menufileimport.addAction(self.menufileimportsvg)
self.menufileimportsvg_as_gerber = QtWidgets.QAction(QtGui.QIcon('share/svg16.png'),
'&SVG as Gerber Object', self)
'&SVG as Gerber Object ...', self)
self.menufileimport.addAction(self.menufileimportsvg_as_gerber)
self.menufileimport.addSeparator()
self.menufileimportdxf = QtWidgets.QAction(QtGui.QIcon('share/dxf16.png'),
'&DXF as Geometry Object', self)
'&DXF as Geometry Object ...', self)
self.menufileimport.addAction(self.menufileimportdxf)
self.menufileimportdxf_as_gerber = QtWidgets.QAction(QtGui.QIcon('share/dxf16.png'),
'&DXF as Gerber Object', self)
'&DXF as Gerber Object ...', self)
self.menufileimport.addAction(self.menufileimportdxf_as_gerber)
self.menufileimport.addSeparator()
@ -128,11 +130,12 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.menufile_save = self.menufile.addMenu(QtGui.QIcon('share/save_as.png'), 'Save')
# Save Project
self.menufilesaveproject = QtWidgets.QAction(QtGui.QIcon('share/floppy16.png'), '&Save Project', self)
self.menufilesaveproject = QtWidgets.QAction(QtGui.QIcon('share/floppy16.png'), '&Save Project ...', self)
self.menufile_save.addAction(self.menufilesaveproject)
# Save Project As ...
self.menufilesaveprojectas = QtWidgets.QAction(QtGui.QIcon('share/save_as.png'), 'Save Project &As ...', self)
self.menufilesaveprojectas = QtWidgets.QAction(QtGui.QIcon('share/save_as.png'),
'Save Project &As ...\tCTRL+S', self)
self.menufile_save.addAction(self.menufilesaveprojectas)
# Save Project Copy ...
@ -151,12 +154,12 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
### Edit ###
self.menuedit = self.menu.addMenu('&Edit')
self.menueditnew = self.menuedit.addAction(QtGui.QIcon('share/new_geo16.png'), '&New Geometry')
self.menueditnewexc = self.menuedit.addAction(QtGui.QIcon('share/new_geo16.png'), 'New Excellon')
self.menueditnew = self.menuedit.addAction(QtGui.QIcon('share/new_geo16.png'), '&New Geometry\tN')
self.menueditnewexc = self.menuedit.addAction(QtGui.QIcon('share/new_geo16.png'), 'New Excellon\tX')
# Separator
self.menuedit.addSeparator()
self.menueditedit = self.menuedit.addAction(QtGui.QIcon('share/edit16.png'), 'Edit Object')
self.menueditok = self.menuedit.addAction(QtGui.QIcon('share/edit_ok16.png'), '&Update Object')
self.menueditedit = self.menuedit.addAction(QtGui.QIcon('share/edit16.png'), 'Edit Object\tE')
self.menueditok = self.menuedit.addAction(QtGui.QIcon('share/edit_ok16.png'), '&Update Object\tCTRL+S')
# Separator
self.menuedit.addSeparator()
self.menuedit_convert = self.menuedit.addMenu(QtGui.QIcon('share/convert24.png'), 'Conversion')
@ -185,29 +188,31 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
"Will convert a Geometry object from multi_geometry type\n"
"to a single_geometry type.")
self.menuedit_convert.setToolTipsVisible(True)
# Separator
self.menuedit.addSeparator()
self.menueditdelete = self.menuedit.addAction(QtGui.QIcon('share/trash16.png'), '&Delete')
# Separator
self.menuedit.addSeparator()
self.menueditcopyobject = self.menuedit.addAction(QtGui.QIcon('share/copy.png'), '&Copy Object')
self.menueditcopyobject = self.menuedit.addAction(QtGui.QIcon('share/copy.png'), '&Copy Object\tCTRL+C')
self.menueditcopyobjectasgeom = self.menuedit.addAction(QtGui.QIcon('share/copy_geo.png'),
'Copy as &Geom')
# Separator
self.menuedit.addSeparator()
self.menueditdelete = self.menuedit.addAction(QtGui.QIcon('share/trash16.png'), '&Delete\tDEL')
# Separator
self.menuedit.addSeparator()
self.menueditorigin = self.menuedit.addAction(QtGui.QIcon('share/origin.png'), 'Se&t Origin')
self.menueditjump = self.menuedit.addAction(QtGui.QIcon('share/jump_to16.png'), 'Jump to Location')
self.menueditorigin = self.menuedit.addAction(QtGui.QIcon('share/origin.png'), 'Se&t Origin\tO')
self.menueditjump = self.menuedit.addAction(QtGui.QIcon('share/jump_to16.png'), 'Jump to Location\tJ')
# Separator
self.menuedit.addSeparator()
self.menuedittoggleunits= self.menuedit.addAction(QtGui.QIcon('share/toggle_units16.png'),
'Toggle Units\tQ')
self.menueditselectall = self.menuedit.addAction(QtGui.QIcon('share/select_all.png'),
'&Select All')
'&Select All\tCTRL+A')
# Separator
self.menuedit.addSeparator()
self.menueditpreferences = self.menuedit.addAction(QtGui.QIcon('share/pref.png'), '&Preferences')
self.menueditpreferences = self.menuedit.addAction(QtGui.QIcon('share/pref.png'), '&Preferences\tSHIFT+P')
### Options ###
self.menuoptions = self.menu.addMenu('&Options')
@ -225,21 +230,21 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
# self.menuoptions_transform = self.menuoptions.addMenu(QtGui.QIcon('share/transform.png'),
# '&Transform Object')
self.menuoptions_transform_rotate = self.menuoptions.addAction(QtGui.QIcon('share/rotate.png'),
"&Rotate Selection")
"&Rotate Selection\tSHIFT+(R)")
# Separator
self.menuoptions.addSeparator()
self.menuoptions_transform_skewx = self.menuoptions.addAction(QtGui.QIcon('share/skewX.png'),
"&Skew on X axis")
"&Skew on X axis\tSHIFT+X")
self.menuoptions_transform_skewy = self.menuoptions.addAction(QtGui.QIcon('share/skewY.png'),
"S&kew on Y axis")
"S&kew on Y axis\tSHIFT+Y")
# Separator
self.menuoptions.addSeparator()
self.menuoptions_transform_flipx = self.menuoptions.addAction(QtGui.QIcon('share/flipx.png'),
"Flip on &X axis")
"Flip on &X axis\tX")
self.menuoptions_transform_flipy = self.menuoptions.addAction(QtGui.QIcon('share/flipy.png'),
"Flip on &Y axis")
"Flip on &Y axis\tY")
# Separator
self.menuoptions.addSeparator()
@ -252,14 +257,15 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
'Disable non-selected')
# Separator
self.menuview.addSeparator()
self.menuview_zoom_fit = self.menuview.addAction(QtGui.QIcon('share/zoom_fit32.png'), "&Zoom Fit")
self.menuview_zoom_in = self.menuview.addAction(QtGui.QIcon('share/zoom_in32.png'), "&Zoom In")
self.menuview_zoom_out = self.menuview.addAction(QtGui.QIcon('share/zoom_out32.png'), "&Zoom Out")
self.menuview_zoom_fit = self.menuview.addAction(QtGui.QIcon('share/zoom_fit32.png'), "&Zoom Fit\t1")
self.menuview_zoom_in = self.menuview.addAction(QtGui.QIcon('share/zoom_in32.png'), "&Zoom In\t2")
self.menuview_zoom_out = self.menuview.addAction(QtGui.QIcon('share/zoom_out32.png'), "&Zoom Out\t3")
self.menuview.addSeparator()
self.menuview_toggle_axis = self.menuview.addAction(QtGui.QIcon('share/axis32.png'), "&Toggle Axis")
self.menuview_toggle_grid = self.menuview.addAction(QtGui.QIcon('share/grid32.png'), "&Toggle Grid\tG")
self.menuview_toggle_axis = self.menuview.addAction(QtGui.QIcon('share/axis32.png'), "&Toggle Axis\tSHIFT+G")
self.menuview_toggle_workspace = self.menuview.addAction(QtGui.QIcon('share/workspace24.png'),
"Toggle Workspace")
"Toggle Workspace\tSHIFT+W")
### FlatCAM Editor menu ###
@ -269,28 +275,46 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.menu.addMenu(self.geo_editor_menu)
# self.select_menuitem = self.menu.addAction(QtGui.QIcon('share/pointer16.png'), "Select 'Esc'")
self.geo_add_circle_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/circle32.png'), 'Add Circle')
self.geo_add_arc_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/arc16.png'), 'Add Arc')
self.geo_add_circle_menuitem = self.geo_editor_menu.addAction(
QtGui.QIcon('share/circle32.png'), 'Add Circle\tO'
)
self.geo_add_arc_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/arc16.png'), 'Add Arc\tA')
self.geo_editor_menu.addSeparator()
self.geo_add_rectangle_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/rectangle32.png'), 'Add Rectangle')
self.geo_add_polygon_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/polygon32.png'), 'Add Polygon')
self.geo_add_path_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/path32.png'), 'Add Path')
self.geo_add_rectangle_menuitem = self.geo_editor_menu.addAction(
QtGui.QIcon('share/rectangle32.png'), 'Add Rectangle\tR'
)
self.geo_add_polygon_menuitem = self.geo_editor_menu.addAction(
QtGui.QIcon('share/polygon32.png'), 'Add Polygon\tN'
)
self.geo_add_path_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/path32.png'), 'Add Path\tP')
self.geo_editor_menu.addSeparator()
self.geo_add_text_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/text32.png'), 'Add Text')
self.geo_add_text_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/text32.png'), 'Add Text\tT')
self.geo_editor_menu.addSeparator()
self.geo_union_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/union16.png'), 'Polygon Union')
self.geo_intersection_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/intersection16.png'),
'Polygon Intersection')
self.geo_subtract_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/subtract16.png'), 'Polygon Subtraction')
self.geo_subtract_menuitem = self.geo_editor_menu.addAction(
QtGui.QIcon('share/subtract16.png'), 'Polygon Subtraction'
)
self.geo_editor_menu.addSeparator()
self.geo_cutpath_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/cutpath16.png'), 'Cut Path')
self.geo_cutpath_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/cutpath16.png'), 'Cut Path\tX')
# self.move_menuitem = self.menu.addAction(QtGui.QIcon('share/move16.png'), "Move Objects 'm'")
self.geo_copy_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/copy16.png'), "Copy Geom")
self.geo_delete_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/deleteshape16.png'), "Delete Shape")
self.geo_copy_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/copy16.png'), "Copy Geom\tC")
self.geo_delete_menuitem = self.geo_editor_menu.addAction(
QtGui.QIcon('share/deleteshape16.png'), "Delete Shape\tDEL"
)
self.geo_editor_menu.addSeparator()
self.geo_buffer_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/buffer16.png'), "Buffer Selection")
self.geo_paint_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/paint16.png'), "Paint Selection")
self.geo_move_menuitem = self.geo_editor_menu.addAction(QtGui.QIcon('share/move32.png'), "Move\tM")
self.geo_buffer_menuitem = self.geo_editor_menu.addAction(
QtGui.QIcon('share/buffer16.png'), "Buffer Selection\tB"
)
self.geo_paint_menuitem = self.geo_editor_menu.addAction(
QtGui.QIcon('share/paint16.png'), "Paint Selection\tI"
)
self.geo_editor_menu.addSeparator()
self.geo_cornersnap_menuitem = self.geo_editor_menu.addAction(
QtGui.QIcon('share/corner32.png'), "Toggle Corner Snap\tK"
)
# self.exc_editor_menu = QtWidgets.QMenu("Excellon Editor")
# self.menu.addMenu(self.exc_editor_menu)
@ -302,7 +326,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
# self.menutool = self.menu.addMenu('&Tool')
self.menutool = QtWidgets.QMenu('&Tool')
self.menutoolaction = self.menu.addMenu(self.menutool)
self.menutoolshell = self.menutool.addAction(QtGui.QIcon('share/shell16.png'), '&Command Line')
self.menutoolshell = self.menutool.addAction(QtGui.QIcon('share/shell16.png'), '&Command Line\tS')
### Help ###
self.menuhelp = self.menu.addMenu('&Help')
@ -655,6 +679,8 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.draw_line = self.g_editor_cmenu.addAction(QtGui.QIcon('share/path32.png'), "Line")
self.draw_rect = self.g_editor_cmenu.addAction(QtGui.QIcon('share/rectangle32.png'), "Rectangle")
self.draw_cut = self.g_editor_cmenu.addAction(QtGui.QIcon('share/cutpath32.png'), "Cut")
self.g_editor_cmenu.addSeparator()
self.draw_move = self.g_editor_cmenu.addAction(QtGui.QIcon('share/move32.png'), "Move")
self.e_editor_cmenu = self.popMenu.addMenu(QtGui.QIcon('share/drill32.png'), "Exc Editor")
self.drill = self.e_editor_cmenu.addAction(QtGui.QIcon('share/drill32.png'), "Add Drill")
@ -844,18 +870,29 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
# self.splitter.sizes()[0] is actually the size of the "notebook"
self.geom_update.emit(grect.x(), grect.y(), grect.width(), grect.height(), self.splitter.sizes()[0])
self.final_save.emit()
QtWidgets.qApp.quit()
if self.app.should_we_quit is True:
QtWidgets.qApp.quit()
else:
self.app.should_we_quit = True
event.ignore()
class GeneralPreferencesUI(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent=parent)
self.layout = QtWidgets.QVBoxLayout()
self.layout = QtWidgets.QHBoxLayout()
self.setLayout(self.layout)
self.general_group = GeneralPrefGroupUI()
self.general_group.setFixedWidth(260)
self.layout.addWidget(self.general_group)
self.general_app_group = GeneralAppPrefGroupUI()
self.general_app_group.setFixedWidth(260)
self.general_gui_group = GeneralGUIPrefGroupUI()
self.general_gui_group.setFixedWidth(260)
self.layout.addWidget(self.general_app_group)
self.layout.addWidget(self.general_gui_group)
self.layout.addStretch()
class GerberPreferencesUI(QtWidgets.QWidget):
@ -922,59 +959,15 @@ class OptionsGroupUI(QtWidgets.QGroupBox):
self.setLayout(self.layout)
class GeneralPrefGroupUI(OptionsGroupUI):
class GeneralGUIPrefGroupUI(OptionsGroupUI):
def __init__(self, parent=None):
super(GeneralPrefGroupUI, self).__init__(self)
super(GeneralGUIPrefGroupUI, self).__init__(self)
self.setTitle(str("Global Preferences"))
self.setTitle(str("GUI Preferences"))
# Create a form layout for the Application general settings
self.form_box = QtWidgets.QFormLayout()
# Units for FlatCAM
self.unitslabel = QtWidgets.QLabel('<b>Units:</b>')
self.unitslabel.setToolTip("Those are units in which FlatCAM works.")
self.units_radio = RadioSet([{'label': 'IN', 'value': 'IN'},
{'label': 'MM', 'value': 'MM'}])
# Shell StartUp CB
self.shell_startup_label = QtWidgets.QLabel('Shell at StartUp:')
self.shell_startup_label.setToolTip(
"Check this box if you want the shell to\n"
"start automatically at startup."
)
self.shell_startup_cb = FCCheckBox(label='')
self.shell_startup_cb.setToolTip(
"Check this box if you want the shell to\n"
"start automatically at startup."
)
# Version Check CB
self.version_check_label = QtWidgets.QLabel('Version Check:')
self.version_check_label.setToolTip(
"Check this box if you want to check\n"
"for a new version automatically at startup."
)
self.version_check_cb = FCCheckBox(label='')
self.version_check_cb.setToolTip(
"Check this box if you want to check\n"
"for a new version automatically at startup."
)
# Send Stats CB
self.send_stats_label = QtWidgets.QLabel('Send Stats:')
self.send_stats_label.setToolTip(
"Check this box if you agree to send anonymous\n"
"stats automatically at startup, to help improve FlatCAM."
)
self.send_stats_cb= FCCheckBox(label='')
self.send_stats_cb.setToolTip(
"Check this box if you agree to send anonymous\n"
"stats automatically at startup, to help improve FlatCAM."
)
self.ois_version_check = OptionalInputSection(self.version_check_cb, [self.send_stats_cb])
# Grid X Entry
self.gridx_label = QtWidgets.QLabel('Grid X value:')
self.gridx_label.setToolTip(
@ -989,30 +982,6 @@ class GeneralPrefGroupUI(OptionsGroupUI):
)
self.gridy_entry = LengthEntry()
# Select mouse pan button
self.panbuttonlabel = QtWidgets.QLabel('<b>Pan Button:</b>')
self.panbuttonlabel.setToolTip("Select the mouse button to use for panning.")
self.pan_button_radio = RadioSet([{'label': 'Middle But.', 'value': '3'},
{'label': 'Right But.', 'value': '2'}])
# Multiple Selection Modifier Key
self.mselectlabel = QtWidgets.QLabel('<b>Multiple Sel:</b>')
self.mselectlabel.setToolTip("Select the key used for multiple selection.")
self.mselect_radio = RadioSet([{'label': 'CTRL', 'value': 'Control'},
{'label': 'SHIFT', 'value': 'Shift'}])
# # Mouse panning with "Space" key, CB
# self.pan_with_space_label = QtWidgets.QLabel('Pan w/ Space:')
# self.pan_with_space_label.setToolTip(
# "Check this box if you want to pan when mouse is moved,\n"
# "and key 'Space' is pressed."
# )
# self.pan_with_space_cb = FCCheckBox(label='')
# self.pan_with_space_cb.setToolTip(
# "Check this box if you want to pan when mouse is moved,\n"
# "and key 'Space' is pressed."
# )
# Workspace
self.workspace_lbl = QtWidgets.QLabel('Workspace:')
self.workspace_lbl.setToolTip(
@ -1214,17 +1183,12 @@ class GeneralPrefGroupUI(OptionsGroupUI):
self.spacelabel = QtWidgets.QLabel('')
# Add (label - input field) pair to the QFormLayout
self.form_box.addRow(self.unitslabel, self.units_radio)
self.form_box.addRow(self.spacelabel, self.spacelabel)
self.form_box.addRow(self.shell_startup_label, self.shell_startup_cb)
self.form_box.addRow(self.version_check_label, self.version_check_cb)
self.form_box.addRow(self.send_stats_label, self.send_stats_cb)
self.form_box.addRow(self.gridx_label, self.gridx_entry)
self.form_box.addRow(self.gridy_label, self.gridy_entry)
self.form_box.addRow(self.panbuttonlabel, self.pan_button_radio)
self.form_box.addRow(self.mselectlabel, self.mselect_radio)
# self.form_box.addRow(self.pan_with_space_label, self.pan_with_space_cb)
self.form_box.addRow(self.workspace_lbl, self.workspace_cb)
self.form_box.addRow(self.workspace_type_lbl, self.wk_cb)
self.form_box.addRow(self.spacelabel, self.spacelabel)
@ -1245,6 +1209,114 @@ class GeneralPrefGroupUI(OptionsGroupUI):
self.layout.addLayout(self.form_box)
class GeneralAppPrefGroupUI(OptionsGroupUI):
def __init__(self, parent=None):
super(GeneralAppPrefGroupUI, self).__init__(self)
self.setTitle(str("App Preferences"))
# Create a form layout for the Application general settings
self.form_box = QtWidgets.QFormLayout()
# Units for FlatCAM
self.unitslabel = QtWidgets.QLabel('<b>Units:</b>')
self.unitslabel.setToolTip("Those are units in which FlatCAM works.")
self.units_radio = RadioSet([{'label': 'IN', 'value': 'IN'},
{'label': 'MM', 'value': 'MM'}])
# Languages for FlatCAM
self.languagelabel = QtWidgets.QLabel('<b>Languages:</b>')
self.languagelabel.setToolTip("Set the language used for FlatCAM texts.")
self.language_cb = FCComboBox()
self.languagespace = QtWidgets.QLabel('')
self.language_apply_btn = FCButton("Apply Language")
# Shell StartUp CB
self.shell_startup_label = QtWidgets.QLabel('Shell at StartUp:')
self.shell_startup_label.setToolTip(
"Check this box if you want the shell to\n"
"start automatically at startup."
)
self.shell_startup_cb = FCCheckBox(label='')
self.shell_startup_cb.setToolTip(
"Check this box if you want the shell to\n"
"start automatically at startup."
)
# Version Check CB
self.version_check_label = QtWidgets.QLabel('Version Check:')
self.version_check_label.setToolTip(
"Check this box if you want to check\n"
"for a new version automatically at startup."
)
self.version_check_cb = FCCheckBox(label='')
self.version_check_cb.setToolTip(
"Check this box if you want to check\n"
"for a new version automatically at startup."
)
# Send Stats CB
self.send_stats_label = QtWidgets.QLabel('Send Stats:')
self.send_stats_label.setToolTip(
"Check this box if you agree to send anonymous\n"
"stats automatically at startup, to help improve FlatCAM."
)
self.send_stats_cb= FCCheckBox(label='')
self.send_stats_cb.setToolTip(
"Check this box if you agree to send anonymous\n"
"stats automatically at startup, to help improve FlatCAM."
)
self.ois_version_check = OptionalInputSection(self.version_check_cb, [self.send_stats_cb])
# Select mouse pan button
self.panbuttonlabel = QtWidgets.QLabel('<b>Pan Button:</b>')
self.panbuttonlabel.setToolTip("Select the mouse button to use for panning.")
self.pan_button_radio = RadioSet([{'label': 'Middle But.', 'value': '3'},
{'label': 'Right But.', 'value': '2'}])
# Multiple Selection Modifier Key
self.mselectlabel = QtWidgets.QLabel('<b>Multiple Sel:</b>')
self.mselectlabel.setToolTip("Select the key used for multiple selection.")
self.mselect_radio = RadioSet([{'label': 'CTRL', 'value': 'Control'},
{'label': 'SHIFT', 'value': 'Shift'}])
# # Mouse panning with "Space" key, CB
# self.pan_with_space_label = QtWidgets.QLabel('Pan w/ Space:')
# self.pan_with_space_label.setToolTip(
# "Check this box if you want to pan when mouse is moved,\n"
# "and key 'Space' is pressed."
# )
# self.pan_with_space_cb = FCCheckBox(label='')
# self.pan_with_space_cb.setToolTip(
# "Check this box if you want to pan when mouse is moved,\n"
# "and key 'Space' is pressed."
# )
# Just to add empty rows
self.spacelabel = QtWidgets.QLabel('')
# Add (label - input field) pair to the QFormLayout
self.form_box.addRow(self.unitslabel, self.units_radio)
self.form_box.addRow(self.languagelabel, self.language_cb)
self.form_box.addRow(self.languagespace, self.language_apply_btn)
self.form_box.addRow(self.spacelabel, self.spacelabel)
self.form_box.addRow(self.shell_startup_label, self.shell_startup_cb)
self.form_box.addRow(self.version_check_label, self.version_check_cb)
self.form_box.addRow(self.send_stats_label, self.send_stats_cb)
self.form_box.addRow(self.panbuttonlabel, self.pan_button_radio)
self.form_box.addRow(self.mselectlabel, self.mselect_radio)
# self.form_box.addRow(self.pan_with_space_label, self.pan_with_space_cb)
self.form_box.addRow(self.spacelabel, self.spacelabel)
# Add the QFormLayout that holds the Application general defaults
# to the main layout of this TAB
self.layout.addLayout(self.form_box)
class GerberPrefGroupUI(OptionsGroupUI):
def __init__(self, parent=None):
# OptionsGroupUI.__init__(self, "Gerber Options", parent=parent)

View File

@ -1295,7 +1295,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
"""
excellon_code = ''
units = self.app.general_options_form.general_group.units_radio.get_value().upper()
units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
# store here if the file has slots, return 1 if any slots, 0 if only drills
has_slots = 0
@ -1355,7 +1355,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
"""
excellon_code = ''
units = self.app.general_options_form.general_group.units_radio.get_value().upper()
units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
# store here if the file has slots, return 1 if any slots, 0 if only drills
has_slots = 0
@ -2862,7 +2862,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
self.ui.geo_tools_table.setCurrentItem(self.ui.geo_tools_table.item(row, 0))
def export_dxf(self):
units = self.app.general_options_form.general_group.units_radio.get_value().upper()
units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
dwg = None
try:
dwg = ezdxf.new('R2010')

View File

@ -33,7 +33,7 @@ class FlatCAMTool(QtWidgets.QWidget):
self.menuAction = None
def install(self, icon=None, separator=None, **kwargs):
def install(self, icon=None, separator=None, shortcut=None, **kwargs):
before = None
# 'pos' is the menu where the Action has to be installed
@ -54,8 +54,13 @@ class FlatCAMTool(QtWidgets.QWidget):
# if provided, add an icon to this Action
if icon is not None:
self.menuAction.setIcon(icon)
# set the text name of the Action, which will be displayed in the menu
self.menuAction.setText(self.toolName)
if shortcut is None:
self.menuAction.setText(self.toolName)
else:
self.menuAction.setText(self.toolName + '\t%s' % shortcut)
# add a ToolTip to the new Action
# self.menuAction.setToolTip(self.toolTip) # currently not available

View File

@ -262,6 +262,9 @@ class ObjectCollection(QtCore.QAbstractItemModel):
if key == QtCore.Qt.Key_G:
self.app.on_fileopengerber()
if key == QtCore.Qt.Key_N:
self.app.on_file_new_click()
if key == QtCore.Qt.Key_M:
self.app.measurement_tool.run()
if key == QtCore.Qt.Key_O:
@ -272,6 +275,11 @@ class ObjectCollection(QtCore.QAbstractItemModel):
return
elif modifiers == QtCore.Qt.ShiftModifier:
# Copy Object Name
# Copy Object Name
if key == QtCore.Qt.Key_C:
self.app.on_copy_name()
# Toggle axis
if key == QtCore.Qt.Key_G:
if self.toggle_axis is False:
@ -286,11 +294,51 @@ class ObjectCollection(QtCore.QAbstractItemModel):
self.appplotcanvas.redraw()
self.app.toggle_axis = False
# Open Preferences Window
if key == QtCore.Qt.Key_P:
self.app.on_preferences()
return
# Rotate Object by 90 degree CCW
if key == QtCore.Qt.Key_R:
self.app.on_rotate(silent=True, preset=-90)
return
# Toggle Workspace
if key == QtCore.Qt.Key_W:
self.app.on_workspace_menu()
return
# Skew on X axis
if key == QtCore.Qt.Key_X:
self.app.on_skewx()
return
# Skew on Y axis
if key == QtCore.Qt.Key_Y:
self.app.on_skewy()
return
elif modifiers == QtCore.Qt.AltModifier:
# 2-Sided PCB Tool
if key == QtCore.Qt.Key_D:
self.app.dblsidedtool.run()
return
# Non-Copper Clear Tool
if key == QtCore.Qt.Key_N:
self.app.ncclear_tool.run()
return
# Transformation Tool
if key == QtCore.Qt.Key_R:
self.app.measurement_tool.run()
return
# Cutout Tool
if key == QtCore.Qt.Key_U:
self.app.cutout_tool.run()
return
else:
# Zoom Fit
if key == QtCore.Qt.Key_1:
@ -316,10 +364,6 @@ class ObjectCollection(QtCore.QAbstractItemModel):
select.ui.plot_cb.toggle()
self.app.delete_selection_shape()
# Copy Object Name
if key == QtCore.Qt.Key_C:
self.app.on_copy_name()
# Copy Object Name
if key == QtCore.Qt.Key_E:
self.app.object2editor()
@ -340,12 +384,22 @@ class ObjectCollection(QtCore.QAbstractItemModel):
if key == QtCore.Qt.Key_N:
self.app.on_new_geometry()
# Set Origin
if key == QtCore.Qt.Key_O:
self.app.on_set_origin()
return
# Set Origin
if key == QtCore.Qt.Key_P:
self.app.properties_tool.run()
return
# Change Units
if key == QtCore.Qt.Key_Q:
if self.app.options["units"] == 'MM':
self.app.general_options_form.general_group.units_radio.set_value("IN")
self.app.general_options_form.general_app_group.units_radio.set_value("IN")
else:
self.app.general_options_form.general_group.units_radio.set_value("MM")
self.app.general_options_form.general_app_group.units_radio.set_value("MM")
self.app.on_toggle_units()
# Rotate Object by 90 degree CW

View File

@ -65,7 +65,7 @@ class PlotCanvas(QtCore.QObject):
self.draw_workspace()
# if self.app.defaults['global_workspace'] is True:
# if self.app.general_options_form.general_group.units_radio.get_value().upper() == 'MM':
# if self.app.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
# self.wkspace_t = Line(pos=)
self.shape_collections = []
@ -92,7 +92,7 @@ class PlotCanvas(QtCore.QObject):
a3p_mm = np.array([(0, 0), (297, 0), (297, 420), (0, 420)])
a3l_mm = np.array([(0, 0), (420, 0), (420, 297), (0, 297)])
if self.app.general_options_form.general_group.units_radio.get_value().upper() == 'MM':
if self.app.general_options_form.general_app_group.units_radio.get_value().upper() == 'MM':
if self.app.defaults['global_workspaceT'] == 'A4P':
a = a4p_mm
elif self.app.defaults['global_workspaceT'] == 'A4L':

View File

@ -9,6 +9,13 @@ CAD program, and create G-Code for Isolation routing.
=================================================
27.01.2018
- added more key shortcuts into the application; they are now displayed in the GUI menu's
- reorganized the Edit -> Preferences -> Global
- redesigned the messagebox that is showed when quiting ot creating a New Project: now it has an option ('Cancel') to abort the process returning to the app
26.01.2019
- fixed grbl_11 postprocessor in linear_code() function

View File

@ -141,6 +141,9 @@ class ToolCalculator(FlatCAMTool):
FlatCAMTool.run(self)
self.app.ui.notebook.setTabText(2, "Calc. Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+C', **kwargs)
def on_calculate_tool_dia(self):
# Calculation:
# Manufacturer gives total angle of the the tip but we need only half of it

View File

@ -9,7 +9,7 @@ from FlatCAMObj import FlatCAMGeometry, FlatCAMExcellon, FlatCAMGerber
class ToolCutout(FlatCAMTool):
toolName = "Cutout PCB Tool"
toolName = "Cutout PCB"
def __init__(self, app):
FlatCAMTool.__init__(self, app)
@ -188,6 +188,9 @@ class ToolCutout(FlatCAMTool):
FlatCAMTool.run(self)
self.app.ui.notebook.setTabText(2, "Cutout Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+U', **kwargs)
def on_freeform_cutout(self):
def subtract_rectangle(obj_, x0, y0, x1, y1):

View File

@ -8,7 +8,7 @@ from PyQt5 import QtCore
class DblSidedTool(FlatCAMTool):
toolName = "Double-Sided PCB Tool"
toolName = "2-Sided PCB"
def __init__(self, app):
FlatCAMTool.__init__(self, app)
@ -254,6 +254,9 @@ class DblSidedTool(FlatCAMTool):
self.axis_location.set_value('point')
self.drill_dia.set_value(1)
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+D', **kwargs)
def on_combo_box_type(self):
obj_type = self.box_combo_type.currentIndex()
self.box_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex()))

View File

@ -6,7 +6,7 @@ from PyQt5 import QtGui, QtCore, QtWidgets
class Film(FlatCAMTool):
toolName = "Film PCB Tool"
toolName = "Film PCB"
def __init__(self, app):
FlatCAMTool.__init__(self, app)
@ -154,6 +154,9 @@ class Film(FlatCAMTool):
FlatCAMTool.run(self)
self.app.ui.notebook.setTabText(2, "Film Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+L', **kwargs)
def on_film_creation(self):
try:
name = self.tf_object_combo.currentText()

View File

@ -7,12 +7,12 @@ from math import sqrt
class Measurement(FlatCAMTool):
toolName = "Measurement Tool"
toolName = "Measurement"
def __init__(self, app):
FlatCAMTool.__init__(self, app)
self.units = self.app.general_options_form.general_group.units_radio.get_value().lower()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().lower()
## Title
title_label = QtWidgets.QLabel("<font size=4><b>%s</b></font><br>" % self.toolName)
@ -165,10 +165,13 @@ class Measurement(FlatCAMTool):
# Switch notebook to tool page
self.app.ui.notebook.setCurrentWidget(self.app.ui.tool_tab)
self.units = self.app.general_options_form.general_group.units_radio.get_value().lower()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().lower()
self.show()
self.app.ui.notebook.setTabText(2, "Meas. Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='CTRL+M', **kwargs)
def on_key_release_meas(self, event):
if event.key == 'escape':
# abort the measurement action
@ -217,7 +220,7 @@ class Measurement(FlatCAMTool):
else:
# ENABLE the Measuring TOOL
self.active = True
self.units = self.app.general_options_form.general_group.units_radio.get_value().lower()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().lower()
# we disconnect the mouse/key handlers from wherever the measurement tool was called
if self.app.call_source == 'app':

View File

@ -31,7 +31,7 @@ class ToolMove(FlatCAMTool):
self.sel_shapes = ShapeCollection(parent=self.app.plotcanvas.vispy_canvas.view.scene, layers=1)
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, **kwargs)
FlatCAMTool.install(self, icon, separator, shortcut='M', **kwargs)
def run(self):
if self.app.tool_tab_locked is True:

View File

@ -7,7 +7,7 @@ import time
class NonCopperClear(FlatCAMTool, Gerber):
toolName = "Non-Copper Clearing Tool"
toolName = "Non-Copper Clearing"
def __init__(self, app):
self.app = app
@ -234,7 +234,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
self.generate_ncc_button.clicked.connect(self.on_ncc)
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, **kwargs)
FlatCAMTool.install(self, icon, separator, shortcut='ALT+N', **kwargs)
def run(self):
FlatCAMTool.run(self)
@ -322,13 +322,13 @@ class NonCopperClear(FlatCAMTool, Gerber):
self.obj_name = ""
self.ncc_obj = None
self.tool_type_item_options = ["C1", "C2", "C3", "C4", "B", "V"]
self.units = self.app.general_options_form.general_group.units_radio.get_value().upper()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
def build_ui(self):
self.ui_disconnect()
# updated units
self.units = self.app.general_options_form.general_group.units_radio.get_value().upper()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
if self.units == "IN":
self.addtool_entry.set_value(0.039)

View File

@ -5,7 +5,7 @@ from ObjectCollection import *
class ToolPaint(FlatCAMTool, Gerber):
toolName = "Paint Area Tool"
toolName = "Paint Area"
def __init__(self, app):
self.app = app
@ -290,7 +290,7 @@ class ToolPaint(FlatCAMTool, Gerber):
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, **kwargs)
FlatCAMTool.install(self, icon, separator, shortcut='ALT+P', **kwargs)
def run(self):
FlatCAMTool.run(self)
@ -327,7 +327,7 @@ class ToolPaint(FlatCAMTool, Gerber):
self.paintoverlap_entry.set_value(self.default_data["paintoverlap"])
# updated units
self.units = self.app.general_options_form.general_group.units_radio.get_value().upper()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
if self.units == "IN":
self.addtool_entry.set_value(0.039)
@ -390,7 +390,7 @@ class ToolPaint(FlatCAMTool, Gerber):
pass
# updated units
self.units = self.app.general_options_form.general_group.units_radio.get_value().upper()
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().upper()
sorted_tools = []
for k, v in self.paint_tools.items():

View File

@ -6,7 +6,7 @@ import time
class Panelize(FlatCAMTool):
toolName = "Panelize PCB Tool"
toolName = "Panelize PCB"
def __init__(self, app):
super(Panelize, self).__init__(self)
@ -197,6 +197,9 @@ class Panelize(FlatCAMTool):
FlatCAMTool.run(self)
self.app.ui.notebook.setTabText(2, "Panel. Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+Z', **kwargs)
def on_panelize(self):
name = self.object_combo.currentText()

View File

@ -53,6 +53,9 @@ class Properties(FlatCAMTool):
FlatCAMTool.run(self)
self.properties()
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='P', **kwargs)
def properties(self):
obj_list = self.app.collection.get_selected()
if not obj_list:
@ -86,10 +89,10 @@ class Properties(FlatCAMTool):
width = abs(ymax - ymin)
self.addChild(dims, ['Length:', '%.4f %s' % (
length, self.app.general_options_form.general_group.units_radio.get_value().lower())], True)
length, self.app.general_options_form.general_app_group.units_radio.get_value().lower())], True)
self.addChild(dims, ['Width:', '%.4f %s' % (
width, self.app.general_options_form.general_group.units_radio.get_value().lower())], True)
if self.app.general_options_form.general_group.units_radio.get_value().lower() == 'mm':
width, self.app.general_options_form.general_app_group.units_radio.get_value().lower())], True)
if self.app.general_options_form.general_app_group.units_radio.get_value().lower() == 'mm':
area = (length * width) / 100
self.addChild(dims, ['Box Area:', '%.4f %s' % (area, 'cm2')], True)
else:

View File

@ -370,6 +370,9 @@ class ToolTransform(FlatCAMTool):
FlatCAMTool.run(self)
self.app.ui.notebook.setTabText(2, "Transform Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+R', **kwargs)
def on_rotate(self):
try:
value = float(self.rotate_entry.get_value())

BIN
share/toggle_units16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 B

BIN
share/toggle_units32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B