- fixed the UI layout in Excellon Editor and made sure that after changing a value in the Notebook side after the mouse is inside the canvas, the canvas takes the focus allowing the key shortcuts to work

- Turkish language strings updated (by Mehmet Kaya)
This commit is contained in:
Marius Stanciu 2020-11-04 21:40:17 +02:00 committed by Marius Stanciu
parent 90e3b26b68
commit 846c0dc59d
6 changed files with 348 additions and 376 deletions

View File

@ -14,6 +14,8 @@ CHANGELOG for FlatCAM beta
- fixed issue in the Excellon Editor where the Space key did not toggle the direction of the array of drills
- combed the application strings all over the app and trimmed them up until those starting with letter 'O'
- updated the translation strings
- fixed the UI layout in Excellon Editor and made sure that after changing a value in the Notebook side after the mouse is inside the canvas, the canvas takes the focus allowing the key shortcuts to work
- Turkish language strings updated (by Mehmet Kaya)
3.11.2020
@ -3080,7 +3082,7 @@ RELEASE 8.993
- added all the tools from Gerber Editor to the the contextual menu
- added the menu entry "Edit" in the Project contextual menu for Gerber objects
- started to work in adding slots and slots array in Excellon Editor
- in FCSlot finished the utility geometry and the GUI for it
- in SlotAdd finished the utility geometry and the GUI for it
12.08.2019

View File

@ -9,7 +9,7 @@ from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtCore import Qt
from camlib import distance, arc, FlatCAMRTreeStorage
from appGUI.GUIElements import FCEntry, FCComboBox2, FCTable, FCDoubleSpinner, RadioSet, FCSpinner, FCButton
from appGUI.GUIElements import FCEntry, FCComboBox2, FCTable, FCDoubleSpinner, RadioSet, FCSpinner, FCButton, FCLabel
from appEditors.AppGeoEditor import FCShapeTool, DrawTool, DrawToolShape, DrawToolUtilityShape, AppGeoEditor
from shapely.geometry import LineString, LinearRing, MultiLineString, Polygon, MultiPolygon, Point
@ -35,7 +35,7 @@ if '_' not in builtins.__dict__:
log = logging.getLogger('base')
class FCDrillSelect(FCShapeTool):
class SelectEditorExc(FCShapeTool):
def __init__(self, draw_app):
DrawTool.__init__(self, draw_app)
self.name = 'drill_select'
@ -219,7 +219,7 @@ class FCDrillSelect(FCShapeTool):
pass
class FCDrillAdd(FCShapeTool):
class DrillAdd(FCShapeTool):
"""
Resulting type: MultiLineString
"""
@ -317,7 +317,7 @@ class FCDrillAdd(FCShapeTool):
pass
class FCDrillArray(FCShapeTool):
class DrillArray(FCShapeTool):
"""
Resulting type: MultiLineString
"""
@ -404,7 +404,7 @@ class FCDrillArray(FCShapeTool):
def utility_geometry(self, data=None, static=None):
self.drill_axis = self.draw_app.ui.drill_axis_radio.get_value()
self.drill_direction = self.draw_app.ui.drill_direction_radio.get_value()
self.drill_direction = self.draw_app.ui.drill_array_dir_radio.get_value()
self.drill_array = self.draw_app.ui.array_type_combo.get_value()
try:
self.drill_array_size = int(self.draw_app.ui.drill_array_size_entry.get_value())
@ -577,7 +577,7 @@ class FCDrillArray(FCShapeTool):
pass
class FCSlot(FCShapeTool):
class SlotAdd(FCShapeTool):
"""
Resulting type: Polygon
"""
@ -751,7 +751,7 @@ class FCSlot(FCShapeTool):
try:
self.geometry = DrawToolShape(self.util_shape(self.points))
except Exception as e:
log.debug("FCSlot.make() --> %s" % str(e))
log.debug("SlotAdd.make() --> %s" % str(e))
# add the point to drills/slots if the diameter is a key in the dict, if not, create it add the drill location
# to the value, as a list of itself
@ -791,7 +791,7 @@ class FCSlot(FCShapeTool):
pass
class FCSlotArray(FCShapeTool):
class SlotArray(FCShapeTool):
"""
Resulting type: MultiPolygon
"""
@ -1150,7 +1150,7 @@ class FCSlotArray(FCShapeTool):
pass
class FCDrillResize(FCShapeTool):
class ResizeEditorExc(FCShapeTool):
def __init__(self, draw_app):
DrawTool.__init__(self, draw_app)
self.name = 'drill_resize'
@ -1386,7 +1386,7 @@ class FCDrillResize(FCShapeTool):
pass
class FCDrillMove(FCShapeTool):
class MoveEditorExc(FCShapeTool):
def __init__(self, draw_app):
DrawTool.__init__(self, draw_app)
self.name = 'drill_move'
@ -1535,9 +1535,9 @@ class FCDrillMove(FCShapeTool):
pass
class FCDrillCopy(FCDrillMove):
class CopyEditorExc(MoveEditorExc):
def __init__(self, draw_app):
FCDrillMove.__init__(self, draw_app)
MoveEditorExc.__init__(self, draw_app)
self.name = 'drill_copy'
def make(self):
@ -1777,14 +1777,14 @@ class AppExcEditor(QtCore.QObject):
def connect_exc_toolbar_signals(self):
self.tools_exc.update({
"drill_select": {"button": self.app.ui.select_drill_btn, "constructor": FCDrillSelect},
"drill_add": {"button": self.app.ui.add_drill_btn, "constructor": FCDrillAdd},
"drill_array": {"button": self.app.ui.add_drill_array_btn, "constructor": FCDrillArray},
"slot_add": {"button": self.app.ui.add_slot_btn, "constructor": FCSlot},
"slot_array": {"button": self.app.ui.add_slot_array_btn, "constructor": FCSlotArray},
"drill_resize": {"button": self.app.ui.resize_drill_btn, "constructor": FCDrillResize},
"drill_copy": {"button": self.app.ui.copy_drill_btn, "constructor": FCDrillCopy},
"drill_move": {"button": self.app.ui.move_drill_btn, "constructor": FCDrillMove},
"drill_select": {"button": self.app.ui.select_drill_btn, "constructor": SelectEditorExc},
"drill_add": {"button": self.app.ui.add_drill_btn, "constructor": DrillAdd},
"drill_array": {"button": self.app.ui.add_drill_array_btn, "constructor": DrillArray},
"slot_add": {"button": self.app.ui.add_slot_btn, "constructor": SlotAdd},
"slot_array": {"button": self.app.ui.add_slot_array_btn, "constructor": SlotArray},
"drill_resize": {"button": self.app.ui.resize_drill_btn, "constructor": ResizeEditorExc},
"drill_copy": {"button": self.app.ui.copy_drill_btn, "constructor": CopyEditorExc},
"drill_move": {"button": self.app.ui.move_drill_btn, "constructor": MoveEditorExc},
})
for tool in self.tools_exc:
@ -1842,7 +1842,7 @@ class AppExcEditor(QtCore.QObject):
self.ui.drill_axis_radio.set_value(self.app.defaults['excellon_editor_lin_dir'])
self.ui.drill_pitch_entry.set_value(float(self.app.defaults['excellon_editor_lin_pitch']))
self.ui.linear_angle_spinner.set_value(float(self.app.defaults['excellon_editor_lin_angle']))
self.ui.drill_direction_radio.set_value(self.app.defaults['excellon_editor_circ_dir'])
self.ui.drill_array_dir_radio.set_value(self.app.defaults['excellon_editor_circ_dir'])
self.ui.drill_angle_entry.set_value(float(self.app.defaults['excellon_editor_circ_angle']))
self.ui.slot_length_entry.set_value(float(self.app.defaults['excellon_editor_slot_length']))
@ -1856,8 +1856,14 @@ class AppExcEditor(QtCore.QObject):
self.ui.slot_array_direction_radio.set_value(self.app.defaults['excellon_editor_slot_circ_dir'])
self.ui.slot_array_angle_entry.set_value(float(self.app.defaults['excellon_editor_slot_circ_angle']))
self.ui.slot_array_circular_frame.hide()
self.ui.slot_array_linear_frame.show()
# make sure that th visibility of the various UI frame are updated
# according to the set Preferences already loaded
self.on_slot_angle_radio()
self.on_array_type_combo()
self.on_slot_array_type_combo()
self.on_linear_angle_radio()
self.on_slot_array_linear_angle_radio()
def build_ui(self, first_run=None):
@ -2989,7 +2995,7 @@ class AppExcEditor(QtCore.QObject):
self.tools_exc[t]["button"].setChecked(False)
self.select_tool('drill_select')
self.active_tool = FCDrillSelect(self)
self.active_tool = SelectEditorExc(self)
def on_row_selected(self, row, col):
if col == 0:
@ -3067,14 +3073,14 @@ class AppExcEditor(QtCore.QObject):
if key_modifier == modifier_to_use:
self.select_tool(self.active_tool.name)
else:
# return to Select tool but not for FCDrillAdd or FCSlot
if isinstance(self.active_tool, FCDrillAdd) or isinstance(self.active_tool, FCSlot):
# return to Select tool but not for FCDrillAdd or SlotAdd
if isinstance(self.active_tool, DrillAdd) or isinstance(self.active_tool, SlotAdd):
self.select_tool(self.active_tool.name)
else:
self.select_tool("drill_select")
return
if isinstance(self.active_tool, FCDrillSelect):
if isinstance(self.active_tool, SelectEditorExc):
# self.app.log.debug("Replotting after click.")
self.replot()
else:
@ -3192,14 +3198,14 @@ class AppExcEditor(QtCore.QObject):
QtGui.QGuiApplication.restoreOverrideCursor()
except Exception:
pass
if self.active_tool.complete is False and not isinstance(self.active_tool, FCDrillSelect):
if self.active_tool.complete is False and not isinstance(self.active_tool, SelectEditorExc):
self.active_tool.complete = True
self.in_action = False
self.delete_utility_geometry()
self.app.inform.emit('[success] %s' % _("Done."))
self.select_tool('drill_select')
else:
if isinstance(self.active_tool, FCDrillAdd):
if isinstance(self.active_tool, DrillAdd):
self.active_tool.complete = True
self.in_action = False
self.delete_utility_geometry()
@ -3222,7 +3228,7 @@ class AppExcEditor(QtCore.QObject):
self.draw_selection_area_handler(self.pos, pos, self.app.selection_type)
self.app.selection_type = None
elif isinstance(self.active_tool, FCDrillSelect):
elif isinstance(self.active_tool, SelectEditorExc):
self.active_tool.click_release((self.pos[0], self.pos[1]))
# if there are selected objects then plot them
@ -3333,6 +3339,9 @@ class AppExcEditor(QtCore.QObject):
:return: None
"""
if not self.app.plotcanvas.native.hasFocus():
self.app.plotcanvas.native.setFocus()
if self.app.is_legacy is False:
event_pos = event.pos
event_is_dragging = event.is_dragging
@ -3398,10 +3407,10 @@ class AppExcEditor(QtCore.QObject):
# ## Selection area on canvas section # ##
if event_is_dragging == 1 and event.button == 1:
# I make an exception for FCDrillAdd and FCDrillArray because clicking and dragging while making regions
# can create strange issues. Also for FCSlot and FCSlotArray
if isinstance(self.active_tool, FCDrillAdd) or isinstance(self.active_tool, FCDrillArray) or \
isinstance(self.active_tool, FCSlot) or isinstance(self.active_tool, FCSlotArray):
# I make an exception for FCDrillAdd and DrillArray because clicking and dragging while making regions
# can create strange issues. Also for SlotAdd and SlotArray
if isinstance(self.active_tool, DrillAdd) or isinstance(self.active_tool, DrillArray) or \
isinstance(self.active_tool, SlotAdd) or isinstance(self.active_tool, SlotArray):
self.app.selection_type = None
else:
dx = pos[0] - self.pos[0]
@ -3764,144 +3773,155 @@ class AppExcEditorUI:
self.drills_frame = QtWidgets.QFrame()
self.drills_frame.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self.drills_frame)
self.tools_box = QtWidgets.QVBoxLayout()
self.tools_box.setContentsMargins(0, 0, 0, 0)
self.drills_frame.setLayout(self.tools_box)
# #############################################################################################################
# ######################## MAIN Grid ##########################################################################
# #############################################################################################################
self.ui_vertical_lay = QtWidgets.QVBoxLayout()
self.ui_vertical_lay.setContentsMargins(0, 0, 0, 0)
self.drills_frame.setLayout(self.ui_vertical_lay)
# ## Page Title box (spacing between children)
self.title_box = QtWidgets.QHBoxLayout()
self.tools_box.addLayout(self.title_box)
self.ui_vertical_lay.addLayout(self.title_box)
# ## Page Title icon
# ## Page Title
pixmap = QtGui.QPixmap(self.app.resource_location + '/flatcam_icon32.png')
self.icon = QtWidgets.QLabel()
self.icon = FCLabel()
self.icon.setPixmap(pixmap)
self.title_box.addWidget(self.icon, stretch=0)
# ## Title label
self.title_label = QtWidgets.QLabel("<font size=5><b>%s</b></font>" % _('Excellon Editor'))
self.title_label = FCLabel("<font size=5><b>%s</b></font>" % _('Excellon Editor'))
self.title_label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
self.title_box.addWidget(self.icon, stretch=0)
self.title_box.addWidget(self.title_label, stretch=1)
# ## Object name
self.name_box = QtWidgets.QHBoxLayout()
self.tools_box.addLayout(self.name_box)
name_label = QtWidgets.QLabel(_("Name:"))
self.name_box.addWidget(name_label)
self.ui_vertical_lay.addLayout(self.name_box)
name_label = FCLabel(_("Name:"))
self.name_entry = FCEntry()
self.name_box.addWidget(name_label)
self.name_box.addWidget(self.name_entry)
# ### Tools Drills ## ##
self.tools_table_label = QtWidgets.QLabel("<b>%s</b>" % _('Tools Table'))
self.tools_table_label = FCLabel("<b>%s</b>" % _('Tools Table'))
self.tools_table_label.setToolTip(
_("Tools in this Excellon object\n"
"when are used for drilling.")
)
self.tools_box.addWidget(self.tools_table_label)
self.ui_vertical_lay.addWidget(self.tools_table_label)
# Drills TABLE
self.tools_table_exc = FCTable()
# delegate = SpinBoxDelegate(units=self.units)
# self.ui.tools_table_exc.setItemDelegateForColumn(1, delegate)
self.tools_box.addWidget(self.tools_table_exc)
self.tools_table_exc.setColumnCount(4)
self.tools_table_exc.setHorizontalHeaderLabels(['#', _('Diameter'), 'D', 'S'])
self.tools_table_exc.setSortingEnabled(False)
self.tools_table_exc.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.ui_vertical_lay.addWidget(self.tools_table_exc)
separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.tools_box.addWidget(separator_line)
self.ui_vertical_lay.addWidget(separator_line)
self.convert_slots_btn = FCButton('%s' % _("Convert Slots"))
self.convert_slots_btn.setToolTip(
_("Convert the slots in the selected tools to drills.")
)
self.tools_box.addWidget(self.convert_slots_btn)
self.ui_vertical_lay.addWidget(self.convert_slots_btn)
separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.tools_box.addWidget(separator_line)
self.ui_vertical_lay.addWidget(separator_line)
# ### Add a new Tool ## ##
self.addtool_label = QtWidgets.QLabel('<b>%s</b>' % _('Add/Delete Tool'))
self.addtool_label = FCLabel('<b>%s</b>' % _('Add/Delete Tool'))
self.addtool_label.setToolTip(
_("Add/Delete a tool to the tool list\n"
"for this Excellon object.")
)
self.tools_box.addWidget(self.addtool_label)
self.ui_vertical_lay.addWidget(self.addtool_label)
# #############################################################################################################
# ######################## ADD New Tool Grid ##################################################################
# #############################################################################################################
grid1 = QtWidgets.QGridLayout()
self.tools_box.addLayout(grid1)
grid1.setColumnStretch(0, 0)
grid1.setColumnStretch(1, 1)
self.ui_vertical_lay.addLayout(grid1)
addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('Tool Dia'))
# Tool Diameter Label
addtool_entry_lbl = FCLabel('%s:' % _('Tool Dia'))
addtool_entry_lbl.setToolTip(
_("Diameter for the new tool")
)
hlay = QtWidgets.QHBoxLayout()
self.addtool_entry = FCDoubleSpinner()
# Tool Diameter Entry
self.addtool_entry = FCDoubleSpinner(policy=False)
self.addtool_entry.set_precision(self.decimals)
self.addtool_entry.set_range(0.0000, 10000.0000)
hlay.addWidget(self.addtool_entry)
self.addtool_btn = QtWidgets.QPushButton(_('Add Tool'))
# Tool Diameter Button
self.addtool_btn = QtWidgets.QPushButton(_('Add'))
self.addtool_btn.setToolTip(
_("Add a new tool to the tool list\n"
"with the diameter specified above.")
)
self.addtool_btn.setFixedWidth(80)
hlay.addWidget(self.addtool_btn)
grid1.addWidget(addtool_entry_lbl, 0, 0)
grid1.addLayout(hlay, 0, 1)
grid2 = QtWidgets.QGridLayout()
self.tools_box.addLayout(grid2)
# Delete Tool
self.deltool_btn = QtWidgets.QPushButton(_('Delete Tool'))
self.deltool_btn.setToolTip(
_("Delete a tool in the tool list\n"
"by selecting a row in the tool table.")
)
grid2.addWidget(self.deltool_btn, 0, 1)
grid1.addWidget(self.deltool_btn, 2, 0, 1, 2)
# add a frame and inside add a vertical box layout. Inside this vbox layout I add all the Drills widgets
separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
grid1.addWidget(separator_line, 4, 0, 1, 2)
# #############################################################################################################
# ############################## Resize Tool Grid #############################################################
# #############################################################################################################
# add a frame and inside add a grid box layout. Inside this layout I add all the Drills widgets
# this way I can hide/show the frame
self.resize_frame = QtWidgets.QFrame()
self.resize_frame.setContentsMargins(0, 0, 0, 0)
self.tools_box.addWidget(self.resize_frame)
self.resize_box = QtWidgets.QVBoxLayout()
self.resize_box.setContentsMargins(0, 0, 0, 0)
self.resize_frame.setLayout(self.resize_box)
self.ui_vertical_lay.addWidget(self.resize_frame)
# ### Resize a drill ## ##
self.emptyresize_label = QtWidgets.QLabel('')
self.resize_box.addWidget(self.emptyresize_label)
self.resize_grid = QtWidgets.QGridLayout()
self.resize_grid.setColumnStretch(0, 0)
self.resize_grid.setColumnStretch(1, 1)
self.resize_grid.setContentsMargins(0, 0, 0, 0)
self.resize_frame.setLayout(self.resize_grid)
self.drillresize_label = QtWidgets.QLabel('<b>%s</b>' % _("Resize Drill(s)"))
self.drillresize_label = FCLabel('<b>%s</b>' % _("Resize Tool"))
self.drillresize_label.setToolTip(
_("Resize a drill or a selection of drills.")
)
self.resize_box.addWidget(self.drillresize_label)
self.resize_grid.addWidget(self.drillresize_label, 0, 0, 1, 2)
grid3 = QtWidgets.QGridLayout()
self.resize_box.addLayout(grid3)
res_entry_lbl = QtWidgets.QLabel('%s:' % _('Resize Dia'))
# Resize Diameter
res_entry_lbl = FCLabel('%s:' % _('Resize Dia'))
res_entry_lbl.setToolTip(
_("Diameter to resize to.")
)
grid3.addWidget(res_entry_lbl, 0, 0)
hlay2 = QtWidgets.QHBoxLayout()
self.resdrill_entry = FCDoubleSpinner()
self.resdrill_entry = FCDoubleSpinner(policy=False)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
self.resdrill_entry.setSizePolicy(sizePolicy)
self.resdrill_entry.set_precision(self.decimals)
@ -3909,369 +3929,384 @@ class AppExcEditorUI:
hlay2.addWidget(self.resdrill_entry)
# Resize Button
self.resize_btn = QtWidgets.QPushButton(_('Resize'))
self.resize_btn.setToolTip(
_("Resize drill(s)")
)
self.resize_btn.setFixedWidth(80)
hlay2.addWidget(self.resize_btn)
grid3.addLayout(hlay2, 0, 1)
self.resize_grid.addWidget(res_entry_lbl, 2, 0)
self.resize_grid.addLayout(hlay2, 2, 1)
separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.resize_grid.addWidget(separator_line, 6, 0, 1, 2)
self.resize_frame.hide()
# ####################################
# ### Add DRILL Array ################
# ####################################
# add a frame and inside add a vertical box layout. Inside this vbox layout I add
# #############################################################################################################
# ################################## Add DRILL Array ##########################################################
# #############################################################################################################
# add a frame and inside add a grid box layout. Inside this grid layout I add
# all the add drill array widgets
# this way I can hide/show the frame
self.array_frame = QtWidgets.QFrame()
self.array_frame.setContentsMargins(0, 0, 0, 0)
self.tools_box.addWidget(self.array_frame)
self.array_box = QtWidgets.QVBoxLayout()
self.array_box.setContentsMargins(0, 0, 0, 0)
self.array_frame.setLayout(self.array_box)
self.ui_vertical_lay.addWidget(self.array_frame)
self.emptyarray_label = QtWidgets.QLabel('')
self.array_box.addWidget(self.emptyarray_label)
self.array_grid = QtWidgets.QGridLayout()
self.array_grid.setColumnStretch(0, 0)
self.array_grid.setColumnStretch(1, 1)
self.array_grid.setContentsMargins(0, 0, 0, 0)
self.array_frame.setLayout(self.array_grid)
self.drill_array_label = QtWidgets.QLabel('<b>%s</b>' % _("Add Drill Array"))
# Type of Drill Array
self.drill_array_label = FCLabel('<b>%s</b>' % _("Add Drill Array"))
self.drill_array_label.setToolTip(
_("Add an array of drills (linear or circular array)")
)
self.array_box.addWidget(self.drill_array_label)
# Special Combo - it works by indexes as opposed to the items Text
self.array_type_combo = FCComboBox2()
self.array_type_combo.setToolTip(
_("Select the type of drills array to create.\n"
"It can be Linear X(Y) or Circular")
)
self.array_type_combo.addItem(_("Linear"))
self.array_type_combo.addItem(_("Circular"))
self.array_type_combo.addItems([_("Linear"), _("Circular")])
self.array_box.addWidget(self.array_type_combo)
self.array_form = QtWidgets.QFormLayout()
self.array_box.addLayout(self.array_form)
self.array_grid.addWidget(self.drill_array_label, 0, 0, 1, 2)
self.array_grid.addWidget(self.array_type_combo, 2, 0, 1, 2)
# Set the number of drill holes in the drill array
self.drill_array_size_label = QtWidgets.QLabel('%s:' % _('Nr of drills'))
self.drill_array_size_label = FCLabel('%s:' % _('Number'))
self.drill_array_size_label.setToolTip(_("Specify how many drills to be in the array."))
self.drill_array_size_label.setMinimumWidth(100)
self.drill_array_size_entry = FCSpinner()
self.drill_array_size_entry.set_range(1, 9999)
self.array_form.addRow(self.drill_array_size_label, self.drill_array_size_entry)
self.drill_array_size_entry = FCSpinner(policy=False)
self.drill_array_size_entry.set_range(1, 10000)
self.array_grid.addWidget(self.drill_array_size_label, 4, 0)
self.array_grid.addWidget(self.drill_array_size_entry, 4, 1)
# #############################################################################################################
# ###################### LINEAR Drill Array ###################################################################
# #############################################################################################################
self.array_linear_frame = QtWidgets.QFrame()
self.array_linear_frame.setContentsMargins(0, 0, 0, 0)
self.array_box.addWidget(self.array_linear_frame)
self.linear_box = QtWidgets.QVBoxLayout()
self.linear_box.setContentsMargins(0, 0, 0, 0)
self.array_linear_frame.setLayout(self.linear_box)
self.linear_form = QtWidgets.QFormLayout()
self.linear_box.addLayout(self.linear_form)
self.array_grid.addWidget(self.array_linear_frame, 6, 0, 1, 2)
self.lin_grid = QtWidgets.QGridLayout()
self.lin_grid.setColumnStretch(0, 0)
self.lin_grid.setColumnStretch(1, 1)
self.lin_grid.setContentsMargins(0, 0, 0, 0)
self.array_linear_frame.setLayout(self.lin_grid)
# Linear Drill Array direction
self.drill_axis_label = QtWidgets.QLabel('%s:' % _('Direction'))
self.drill_axis_label = FCLabel('%s:' % _('Direction'))
self.drill_axis_label.setToolTip(
_("Direction on which the linear array is oriented:\n"
"- 'X' - horizontal axis \n"
"- 'Y' - vertical axis or \n"
"- 'Angle' - a custom angle for the array inclination")
)
self.drill_axis_label.setMinimumWidth(100)
self.drill_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'},
{'label': _('Y'), 'value': 'Y'},
{'label': _('Angle'), 'value': 'A'}])
self.linear_form.addRow(self.drill_axis_label, self.drill_axis_radio)
self.lin_grid.addWidget(self.drill_axis_label, 0, 0)
self.lin_grid.addWidget(self.drill_axis_radio, 0, 1)
# Linear Drill Array pitch distance
self.drill_pitch_label = QtWidgets.QLabel('%s:' % _('Pitch'))
self.drill_pitch_label = FCLabel('%s:' % _('Pitch'))
self.drill_pitch_label.setToolTip(
_("Pitch = Distance between elements of the array.")
)
self.drill_pitch_label.setMinimumWidth(100)
self.drill_pitch_entry = FCDoubleSpinner()
self.drill_pitch_entry = FCDoubleSpinner(policy=False)
self.drill_pitch_entry.set_precision(self.decimals)
self.drill_pitch_entry.set_range(0.0000, 10000.0000)
self.linear_form.addRow(self.drill_pitch_label, self.drill_pitch_entry)
self.lin_grid.addWidget(self.drill_pitch_label, 2, 0)
self.lin_grid.addWidget(self.drill_pitch_entry, 2, 1)
# Linear Drill Array angle
self.linear_angle_label = QtWidgets.QLabel('%s:' % _('Angle'))
self.linear_angle_label = FCLabel('%s:' % _('Angle'))
self.linear_angle_label.setToolTip(
_("Angle at which the linear array is placed.\n"
"The precision is of max 2 decimals.\n"
"Min value is: -360.00 degrees.\n"
"Max value is: 360.00 degrees.")
)
self.linear_angle_label.setMinimumWidth(100)
self.linear_angle_spinner = FCDoubleSpinner()
self.linear_angle_spinner = FCDoubleSpinner(policy=False)
self.linear_angle_spinner.set_precision(self.decimals)
self.linear_angle_spinner.setSingleStep(1.0)
self.linear_angle_spinner.setRange(-360.00, 360.00)
self.linear_form.addRow(self.linear_angle_label, self.linear_angle_spinner)
self.lin_grid.addWidget(self.linear_angle_label, 4, 0)
self.lin_grid.addWidget(self.linear_angle_spinner, 4, 1)
# #############################################################################################################
# ###################### CIRCULAR Drill Array #################################################################
# #############################################################################################################
self.array_circular_frame = QtWidgets.QFrame()
self.array_circular_frame.setContentsMargins(0, 0, 0, 0)
self.array_box.addWidget(self.array_circular_frame)
self.circular_box = QtWidgets.QVBoxLayout()
self.circular_box.setContentsMargins(0, 0, 0, 0)
self.array_circular_frame.setLayout(self.circular_box)
self.array_grid.addWidget(self.array_circular_frame, 8, 0, 1, 2)
self.drill_direction_label = QtWidgets.QLabel('%s:' % _('Direction'))
self.drill_direction_label.setToolTip(_("Direction for circular array.\n"
self.circ_grid = QtWidgets.QGridLayout()
self.circ_grid.setColumnStretch(0, 0)
self.circ_grid.setColumnStretch(1, 1)
self.circ_grid.setContentsMargins(0, 0, 0, 0)
self.array_circular_frame.setLayout(self.circ_grid)
# Array Direction
self.drill_array_dir_lbl = FCLabel('%s:' % _('Direction'))
self.drill_array_dir_lbl.setToolTip(_("Direction for circular array.\n"
"Can be CW = clockwise or CCW = counter clockwise."))
self.drill_direction_label.setMinimumWidth(100)
self.circular_form = QtWidgets.QFormLayout()
self.circular_box.addLayout(self.circular_form)
self.drill_direction_radio = RadioSet([{'label': _('CW'), 'value': 'CW'},
self.drill_array_dir_radio = RadioSet([{'label': _('CW'), 'value': 'CW'},
{'label': _('CCW'), 'value': 'CCW'}])
self.circular_form.addRow(self.drill_direction_label, self.drill_direction_radio)
self.drill_angle_label = QtWidgets.QLabel('%s:' % _('Angle'))
self.drill_angle_label.setToolTip(_("Angle at which each element in circular array is placed."))
self.drill_angle_label.setMinimumWidth(100)
self.circ_grid.addWidget(self.drill_array_dir_lbl, 0, 0)
self.circ_grid.addWidget(self.drill_array_dir_radio, 0, 1)
self.drill_angle_entry = FCDoubleSpinner()
# Array Angle
self.drill_array_angle_lbl = FCLabel('%s:' % _('Angle'))
self.drill_array_angle_lbl.setToolTip(_("Angle at which each element in circular array is placed."))
self.drill_angle_entry = FCDoubleSpinner(policy=False)
self.drill_angle_entry.set_precision(self.decimals)
self.drill_angle_entry.setSingleStep(1.0)
self.drill_angle_entry.setRange(-360.00, 360.00)
self.circular_form.addRow(self.drill_angle_label, self.drill_angle_entry)
self.circ_grid.addWidget(self.drill_array_angle_lbl, 2, 0)
self.circ_grid.addWidget(self.drill_angle_entry, 2, 1)
self.array_circular_frame.hide()
separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.array_grid.addWidget(separator_line, 10, 0, 1, 2)
self.linear_angle_spinner.hide()
self.linear_angle_label.hide()
self.array_frame.hide()
# ######################################################
# ##### ADDING SLOTS ###################################
# ######################################################
# add a frame and inside add a vertical box layout. Inside this vbox layout I add
# #############################################################################################################
# ################################### ADDING SLOTS ############################################################
# #############################################################################################################
# add a frame and inside add a grid box layout. Inside this grid layout I add
# all the add slot widgets
# this way I can hide/show the frame
self.slot_frame = QtWidgets.QFrame()
self.slot_frame.setContentsMargins(0, 0, 0, 0)
self.tools_box.addWidget(self.slot_frame)
self.slot_box = QtWidgets.QVBoxLayout()
self.slot_box.setContentsMargins(0, 0, 0, 0)
self.slot_frame.setLayout(self.slot_box)
self.ui_vertical_lay.addWidget(self.slot_frame)
self.emptyarray_label = QtWidgets.QLabel('')
self.slot_box.addWidget(self.emptyarray_label)
self.slot_grid = QtWidgets.QGridLayout()
self.slot_grid.setColumnStretch(0, 0)
self.slot_grid.setColumnStretch(1, 1)
self.slot_grid.setContentsMargins(0, 0, 0, 0)
self.slot_frame.setLayout(self.slot_grid)
self.slot_label = QtWidgets.QLabel('<b>%s</b>' % _("Slot Parameters"))
# Slot Tile Label
self.slot_label = FCLabel('<b>%s</b>' % _("Slot Parameters"))
self.slot_label.setToolTip(
_("Parameters for adding a slot (hole with oval shape)\n"
"either single or as an part of an array.")
)
self.slot_box.addWidget(self.slot_label)
self.slot_form = QtWidgets.QFormLayout()
self.slot_box.addLayout(self.slot_form)
self.slot_grid.addWidget(self.slot_label, 0, 0, 1, 2)
# Slot length
self.slot_length_label = QtWidgets.QLabel('%s:' % _('Length'))
self.slot_length_label = FCLabel('%s:' % _('Length'))
self.slot_length_label.setToolTip(
_("Length. The length of the slot.")
)
self.slot_length_label.setMinimumWidth(100)
self.slot_length_entry = FCDoubleSpinner()
self.slot_length_entry = FCDoubleSpinner(policy=False)
self.slot_length_entry.set_precision(self.decimals)
self.slot_length_entry.setSingleStep(0.1)
self.slot_length_entry.setRange(0.0000, 10000.0000)
self.slot_form.addRow(self.slot_length_label, self.slot_length_entry)
self.slot_grid.addWidget(self.slot_length_label, 2, 0)
self.slot_grid.addWidget(self.slot_length_entry, 2, 1)
# Slot direction
self.slot_axis_label = QtWidgets.QLabel('%s:' % _('Direction'))
self.slot_axis_label = FCLabel('%s:' % _('Direction'))
self.slot_axis_label.setToolTip(
_("Direction on which the slot is oriented:\n"
"- 'X' - horizontal axis \n"
"- 'Y' - vertical axis or \n"
"- 'Angle' - a custom angle for the slot inclination")
)
self.slot_axis_label.setMinimumWidth(100)
self.slot_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'},
{'label': _('Y'), 'value': 'Y'},
{'label': _('Angle'), 'value': 'A'}])
self.slot_form.addRow(self.slot_axis_label, self.slot_axis_radio)
self.slot_grid.addWidget(self.slot_axis_label, 4, 0)
self.slot_grid.addWidget(self.slot_axis_radio, 4, 1)
# Slot custom angle
self.slot_angle_label = QtWidgets.QLabel('%s:' % _('Angle'))
self.slot_angle_label = FCLabel('%s:' % _('Angle'))
self.slot_angle_label.setToolTip(
_("Angle at which the slot is placed.\n"
"The precision is of max 2 decimals.\n"
"Min value is: -360.00 degrees.\n"
"Max value is: 360.00 degrees.")
)
self.slot_angle_label.setMinimumWidth(100)
self.slot_angle_spinner = FCDoubleSpinner()
self.slot_angle_spinner = FCDoubleSpinner(policy=False)
self.slot_angle_spinner.set_precision(self.decimals)
self.slot_angle_spinner.setWrapping(True)
self.slot_angle_spinner.setRange(-360.00, 360.00)
self.slot_angle_spinner.setSingleStep(1.0)
self.slot_form.addRow(self.slot_angle_label, self.slot_angle_spinner)
self.slot_frame.hide()
self.slot_grid.addWidget(self.slot_angle_label, 6, 0)
self.slot_grid.addWidget(self.slot_angle_spinner, 6, 1)
# ######################################################
# ##### ADDING SLOT ARRAY #############################
# ######################################################
separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.slot_grid.addWidget(separator_line, 8, 0, 1, 2)
# #############################################################################################################
# ##################################### ADDING SLOT ARRAY ####################################################
# #############################################################################################################
# add a frame and inside add a vertical box layout. Inside this vbox layout I add
# all the add slot widgets
# this way I can hide/show the frame
self.slot_array_frame = QtWidgets.QFrame()
self.slot_array_frame.setContentsMargins(0, 0, 0, 0)
self.tools_box.addWidget(self.slot_array_frame)
self.slot_array_box = QtWidgets.QVBoxLayout()
self.slot_array_box.setContentsMargins(0, 0, 0, 0)
self.slot_array_frame.setLayout(self.slot_array_box)
self.ui_vertical_lay.addWidget(self.slot_array_frame)
self.emptyarray_label = QtWidgets.QLabel('')
self.slot_array_box.addWidget(self.emptyarray_label)
self.slot_array_grid = QtWidgets.QGridLayout()
self.slot_array_grid.setColumnStretch(0, 0)
self.slot_array_grid.setColumnStretch(1, 1)
self.slot_array_grid.setContentsMargins(0, 0, 0, 0)
self.slot_array_frame.setLayout(self.slot_array_grid)
self.slot_array_label = QtWidgets.QLabel('<b>%s</b>' % _("Slot Array Parameters"))
# Slot Array Title
self.slot_array_label = FCLabel('<b>%s</b>' % _("Slot Array Parameters"))
self.slot_array_label.setToolTip(
_("Parameters for the array of slots (linear or circular array)")
)
self.slot_array_box.addWidget(self.slot_array_label)
self.l_form = QtWidgets.QFormLayout()
self.slot_array_box.addLayout(self.l_form)
self.slot_array_grid.addWidget(self.slot_array_label, 0, 0, 1, 2)
# Special type of Combobox that get_value() by indexes and not by items text
self.slot_array_type_combo = FCComboBox2()
self.slot_array_type_combo.setToolTip(
_("Select the type of slot array to create.\n"
"It can be Linear X(Y) or Circular")
)
self.slot_array_type_combo.addItem(_("Linear"))
self.slot_array_type_combo.addItem(_("Circular"))
self.slot_array_type_combo.addItems([_("Linear"), _("Circular")])
self.slot_array_box.addWidget(self.slot_array_type_combo)
self.slot_array_form = QtWidgets.QFormLayout()
self.slot_array_box.addLayout(self.slot_array_form)
self.slot_array_grid.addWidget(self.slot_array_type_combo, 2, 0, 1, 2)
# Set the number of slot holes in the slot array
self.slot_array_size_label = QtWidgets.QLabel('%s:' % _('Nr of slots'))
self.slot_array_size_label = FCLabel('%s:' % _('Number'))
self.slot_array_size_label.setToolTip(_("Specify how many slots to be in the array."))
self.slot_array_size_label.setMinimumWidth(100)
self.slot_array_size_entry = FCSpinner()
self.slot_array_size_entry.set_range(0, 9999)
self.slot_array_size_entry = FCSpinner(policy=False)
self.slot_array_size_entry.set_range(0, 10000)
self.slot_array_form.addRow(self.slot_array_size_label, self.slot_array_size_entry)
self.slot_array_grid.addWidget(self.slot_array_size_label, 4, 0)
self.slot_array_grid.addWidget(self.slot_array_size_entry, 4, 1)
# #############################################################################################################
# ##################################### Linear SLOT ARRAY ####################################################
# #############################################################################################################
self.slot_array_linear_frame = QtWidgets.QFrame()
self.slot_array_linear_frame.setContentsMargins(0, 0, 0, 0)
self.slot_array_box.addWidget(self.slot_array_linear_frame)
self.slot_array_linear_box = QtWidgets.QVBoxLayout()
self.slot_array_linear_box.setContentsMargins(0, 0, 0, 0)
self.slot_array_linear_frame.setLayout(self.slot_array_linear_box)
self.slot_array_grid.addWidget(self.slot_array_linear_frame, 6, 0, 1, 2)
self.slot_array_linear_form = QtWidgets.QFormLayout()
self.slot_array_linear_box.addLayout(self.slot_array_linear_form)
self.slot_array_lin_grid = QtWidgets.QGridLayout()
self.slot_array_lin_grid.setColumnStretch(0, 0)
self.slot_array_lin_grid.setColumnStretch(1, 1)
self.slot_array_lin_grid.setContentsMargins(0, 0, 0, 0)
self.slot_array_linear_frame.setLayout(self.slot_array_lin_grid)
# Linear Slot Array direction
self.slot_array_axis_label = QtWidgets.QLabel('%s:' % _('Direction'))
self.slot_array_axis_label = FCLabel('%s:' % _('Direction'))
self.slot_array_axis_label.setToolTip(
_("Direction on which the linear array is oriented:\n"
"- 'X' - horizontal axis \n"
"- 'Y' - vertical axis or \n"
"- 'Angle' - a custom angle for the array inclination")
)
self.slot_array_axis_label.setMinimumWidth(100)
self.slot_array_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'},
{'label': _('Y'), 'value': 'Y'},
{'label': _('Angle'), 'value': 'A'}])
self.slot_array_linear_form.addRow(self.slot_array_axis_label, self.slot_array_axis_radio)
self.slot_array_lin_grid.addWidget(self.slot_array_axis_label, 0, 0)
self.slot_array_lin_grid.addWidget(self.slot_array_axis_radio, 0, 1)
# Linear Slot Array pitch distance
self.slot_array_pitch_label = QtWidgets.QLabel('%s:' % _('Pitch'))
self.slot_array_pitch_label = FCLabel('%s:' % _('Pitch'))
self.slot_array_pitch_label.setToolTip(
_("Pitch = Distance between elements of the array.")
)
self.slot_array_pitch_label.setMinimumWidth(100)
self.slot_array_pitch_entry = FCDoubleSpinner()
self.slot_array_pitch_entry = FCDoubleSpinner(policy=False)
self.slot_array_pitch_entry.set_precision(self.decimals)
self.slot_array_pitch_entry.setSingleStep(0.1)
self.slot_array_pitch_entry.setRange(0.0000, 10000.0000)
self.slot_array_linear_form.addRow(self.slot_array_pitch_label, self.slot_array_pitch_entry)
self.slot_array_lin_grid.addWidget(self.slot_array_pitch_label, 2, 0)
self.slot_array_lin_grid.addWidget(self.slot_array_pitch_entry, 2, 1)
# Linear Slot Array angle
self.slot_array_linear_angle_label = QtWidgets.QLabel('%s:' % _('Angle'))
self.slot_array_linear_angle_label = FCLabel('%s:' % _('Angle'))
self.slot_array_linear_angle_label.setToolTip(
_("Angle at which the linear array is placed.\n"
"The precision is of max 2 decimals.\n"
"Min value is: -360.00 degrees.\n"
"Max value is: 360.00 degrees.")
)
self.slot_array_linear_angle_label.setMinimumWidth(100)
self.slot_array_linear_angle_spinner = FCDoubleSpinner()
self.slot_array_linear_angle_spinner = FCDoubleSpinner(policy=False)
self.slot_array_linear_angle_spinner.set_precision(self.decimals)
self.slot_array_linear_angle_spinner.setSingleStep(1.0)
self.slot_array_linear_angle_spinner.setRange(-360.00, 360.00)
self.slot_array_linear_form.addRow(self.slot_array_linear_angle_label, self.slot_array_linear_angle_spinner)
self.slot_array_lin_grid.addWidget(self.slot_array_linear_angle_label, 4, 0)
self.slot_array_lin_grid.addWidget(self.slot_array_linear_angle_spinner, 4, 1)
# #############################################################################################################
# ##################################### Circular SLOT ARRAY ##################################################
# #############################################################################################################
self.slot_array_circular_frame = QtWidgets.QFrame()
self.slot_array_circular_frame.setContentsMargins(0, 0, 0, 0)
self.slot_array_box.addWidget(self.slot_array_circular_frame)
self.slot_array_circular_box = QtWidgets.QVBoxLayout()
self.slot_array_circular_box.setContentsMargins(0, 0, 0, 0)
self.slot_array_circular_frame.setLayout(self.slot_array_circular_box)
self.slot_array_grid.addWidget(self.slot_array_circular_frame, 8, 0, 1, 2)
self.slot_array_direction_label = QtWidgets.QLabel('%s:' % _('Direction'))
self.slot_array_circ_grid = QtWidgets.QGridLayout()
self.slot_array_circ_grid.setColumnStretch(0, 0)
self.slot_array_circ_grid.setColumnStretch(1, 1)
self.slot_array_circ_grid.setContentsMargins(0, 0, 0, 0)
self.slot_array_circular_frame.setLayout(self.slot_array_circ_grid)
# Slot Circular Array Direction
self.slot_array_direction_label = FCLabel('%s:' % _('Direction'))
self.slot_array_direction_label.setToolTip(_("Direction for circular array.\n"
"Can be CW = clockwise or CCW = counter clockwise."))
self.slot_array_direction_label.setMinimumWidth(100)
self.slot_array_circular_form = QtWidgets.QFormLayout()
self.slot_array_circular_box.addLayout(self.slot_array_circular_form)
self.slot_array_direction_radio = RadioSet([{'label': _('CW'), 'value': 'CW'},
{'label': _('CCW'), 'value': 'CCW'}])
self.slot_array_circular_form.addRow(self.slot_array_direction_label, self.slot_array_direction_radio)
self.slot_array_angle_label = QtWidgets.QLabel('%s:' % _('Angle'))
self.slot_array_circ_grid.addWidget(self.slot_array_direction_label, 0, 0)
self.slot_array_circ_grid.addWidget(self.slot_array_direction_radio, 0, 1)
# Slot Circular Array Angle
self.slot_array_angle_label = FCLabel('%s:' % _('Angle'))
self.slot_array_angle_label.setToolTip(_("Angle at which each element in circular array is placed."))
self.slot_array_angle_label.setMinimumWidth(100)
self.slot_array_angle_entry = FCDoubleSpinner()
self.slot_array_angle_entry = FCDoubleSpinner(policy=False)
self.slot_array_angle_entry.set_precision(self.decimals)
self.slot_array_angle_entry.setSingleStep(1)
self.slot_array_angle_entry.setRange(-360.00, 360.00)
self.slot_array_circular_form.addRow(self.slot_array_angle_label, self.slot_array_angle_entry)
self.slot_array_circ_grid.addWidget(self.slot_array_angle_label, 2, 0)
self.slot_array_circ_grid.addWidget(self.slot_array_angle_entry, 2, 1)
self.slot_array_linear_angle_spinner.hide()
self.slot_array_linear_angle_label.hide()
self.slot_array_frame.hide()
self.tools_box.addStretch()
layout.addStretch()
self.ui_vertical_lay.addStretch()
layout.addStretch(1)
# Editor
self.exit_editor_button = QtWidgets.QPushButton(_('Exit Editor'))
@ -4286,6 +4321,21 @@ class AppExcEditorUI:
}
""")
layout.addWidget(self.exit_editor_button)
# #############################################################################################################
# ###################### INIT Excellon Editor UI ##############################################################
# #############################################################################################################
self.linear_angle_spinner.hide()
self.linear_angle_label.hide()
self.array_linear_frame.hide()
self.array_circular_frame.hide()
self.array_frame.hide()
self.slot_frame.hide()
self.slot_array_linear_angle_spinner.hide()
self.slot_array_linear_angle_label.hide()
self.slot_array_frame.hide()
# ############################ FINSIHED GUI ###################################
# #############################################################################

View File

@ -4365,6 +4365,10 @@ class AppGerberEditor(QtCore.QObject):
:param event: Event object dispatched by VisPy SceneCavas
:return: None
"""
if not self.app.plotcanvas.native.hasFocus():
self.app.plotcanvas.native.setFocus()
if self.app.is_legacy is False:
event_pos = event.pos
event_is_dragging = event.is_dragging

View File

@ -899,7 +899,7 @@ class FCSpinner(QtWidgets.QSpinBox):
returnPressed = QtCore.pyqtSignal()
confirmation_signal = QtCore.pyqtSignal(bool, float, float)
def __init__(self, suffix=None, alignment=None, parent=None, callback=None):
def __init__(self, suffix=None, alignment=None, parent=None, callback=None, policy=True):
super(FCSpinner, self).__init__(parent)
self.readyToEdit = True
@ -924,8 +924,9 @@ class FCSpinner(QtWidgets.QSpinBox):
self.prev_readyToEdit = True
self.menu = None
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred)
self.setSizePolicy(sizePolicy)
if policy:
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred)
self.setSizePolicy(sizePolicy)
def eventFilter(self, object, event):
if event.type() == QtCore.QEvent.MouseButtonPress and self.prev_readyToEdit is True:
@ -1277,7 +1278,7 @@ class FCDoubleSpinner(QtWidgets.QDoubleSpinBox):
returnPressed = QtCore.pyqtSignal()
confirmation_signal = QtCore.pyqtSignal(bool, float, float)
def __init__(self, suffix=None, alignment=None, parent=None, callback=None):
def __init__(self, suffix=None, alignment=None, parent=None, callback=None, policy=True):
"""
:param suffix: a char added to the end of the value in the LineEdit; like a '%' or '$' etc
@ -1314,8 +1315,9 @@ class FCDoubleSpinner(QtWidgets.QDoubleSpinBox):
self.prev_readyToEdit = True
self.menu = None
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred)
self.setSizePolicy(sizePolicy)
if policy:
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred)
self.setSizePolicy(sizePolicy)
def on_edit_finished(self):
self.clearFocus()

Binary file not shown.

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2020-11-04 18:02+0200\n"
"PO-Revision-Date: 2020-11-04 18:02+0200\n"
"PO-Revision-Date: 2020-11-04 21:22+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: tr_TR\n"
@ -753,15 +753,6 @@ msgstr "Üst Üste Gelme"
#: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:184
#: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:163
#: appTools/ToolNCC.py:4206 appTools/ToolPaint.py:2975
#, fuzzy
#| msgid ""
#| "How much (percentage) of the tool width to overlap each tool pass.\n"
#| "Adjust the value starting with lower values\n"
#| "and increasing it if areas that should be cleared are still \n"
#| "not cleared.\n"
#| "Lower values = faster processing, faster execution on CNC.\n"
#| "Higher values = slow processing and slow execution on CNC\n"
#| "due of too many paths."
msgid ""
"How much (percentage) of the tool width to overlap each tool pass.\n"
"Adjust the value starting with lower values\n"
@ -773,11 +764,11 @@ msgid ""
msgstr ""
"Ucun her geçişinde uç genişliğinin ne kadarlık kısmının (yüzde) üst üste "
"geleceğini belirler.\n"
"Daha düşük değerlerden başlayarak ve temizlenecek alanlar hala \n"
"temizlenmemişse değeri artırın.\n"
"Değeri daha düşük değerlerden başlayarak ayarlayın ve işlenmesi gereken "
"alanlar hâlâ işlenmiyorsa değeri artırın.\n"
"Düşük değerler = Daha hızlı işleme, CNC'de daha hızlı yürütme sağlar.\n"
"Daha yüksek değerler = Çok sayıda yol nedeniyle CNC'de yavaş\n"
"işleme ve yavaş yürütmeye sebep olur."
"Daha yüksek değerler = Çok sayıda yol nedeniyle CNC'de yavaş işleme \n"
"ve yavaş yürütmeye sebep olur."
#: appDatabase.py:649 appDatabase.py:1156 appEditors/AppGeoEditor.py:473
#: appGUI/ObjectUI.py:1679
@ -930,12 +921,6 @@ msgstr "Hizala"
#: appDatabase.py:704 appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:257
#: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:267 appTools/ToolNCC.py:4285
#: appTools/ToolNCC.py:4381
#, fuzzy
#| msgid ""
#| "If used, it will add an offset to the copper features.\n"
#| "The copper clearing will finish to a distance\n"
#| "from the copper features.\n"
#| "The value can be between 0 and 10 FlatCAM units."
msgid ""
"If used, it will add an offset to the copper features.\n"
"The copper clearing will finish to a distance\n"
@ -943,8 +928,7 @@ msgid ""
msgstr ""
"İşaretlendiğinde, bakır alanlara bir hiza ekleyecektir.\n"
"Bakır temizliği, bakır alanların belirli bir mesafesine\n"
"kadar olacaktır.\n"
"Değer, 0 ile 10 arasında FlatCAM birimi olabilir."
"kadar olacaktır."
#: appDatabase.py:759 appEditors/AppGeoEditor.py:475
#: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:183
@ -2101,10 +2085,8 @@ msgstr "Uzunluk"
#: appEditors/AppExcEditor.py:4085
#: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:164
#, fuzzy
#| msgid "Length = The length of the slot."
msgid "Length. The length of the slot."
msgstr "Uzunluk = Yuvanın uzunluğu."
msgstr "Uzunluk. Yuvanın uzunluğu."
#: appEditors/AppExcEditor.py:4099
#: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:180
@ -2535,7 +2517,7 @@ msgstr ""
#: appEditors/AppGeoEditor.py:741 appEditors/AppGerberEditor.py:5555
#: appTools/ToolTransform.py:667
msgid "Skew X"
msgstr "X Eğrilt"
msgstr "Eğrilt"
#: appEditors/AppGeoEditor.py:743 appEditors/AppGeoEditor.py:764
#: appEditors/AppGerberEditor.py:5557 appEditors/AppGerberEditor.py:5578
@ -2559,7 +2541,7 @@ msgstr "Y Eğim Açısı"
#: appEditors/AppGeoEditor.py:762 appEditors/AppGerberEditor.py:5576
#: appTools/ToolTransform.py:688
msgid "Skew Y"
msgstr "Y Eğrilt"
msgstr "Eğrilt"
#: appEditors/AppGeoEditor.py:793 appEditors/AppGerberEditor.py:5607
#: appGUI/preferences/tools/ToolsFilmPrefGroupUI.py:120
@ -2900,10 +2882,8 @@ msgid "Rotate done"
msgstr "Döndürme işlemi tamamlandı"
#: appEditors/AppGeoEditor.py:1461 appEditors/AppGerberEditor.py:6327
#, fuzzy
#| msgid "Rotate Angle"
msgid "Rotate cancelled"
msgstr "Rotate Angle"
msgstr "Döndürme işlemi iptal edildi"
#: appEditors/AppGeoEditor.py:1466 appEditors/AppGerberEditor.py:6332
msgid "Offset on X axis ..."
@ -2915,58 +2895,44 @@ msgid "Enter a distance Value"
msgstr "Bir mesafe değeri girin"
#: appEditors/AppGeoEditor.py:1479 appEditors/AppGerberEditor.py:6345
#, fuzzy
#| msgid "Open DXF cancelled."
msgid "Offset X cancelled"
msgstr "Open DXF cancelled."
msgstr "X hizalama işlemi iptal edildi"
#: appEditors/AppGeoEditor.py:1484 appEditors/AppGerberEditor.py:6350
msgid "Offset on Y axis ..."
msgstr "Y ekseninde hiza ..."
#: appEditors/AppGeoEditor.py:1494 appEditors/AppGerberEditor.py:6360
#, fuzzy
#| msgid "Offset on the Y axis done"
msgid "Offset on Y axis done"
msgstr "Y eksenindeki hizalama işlemi yapıldı"
msgstr "Y ekseninde hizalama işlemi yapıldı"
#: appEditors/AppGeoEditor.py:1497
#, fuzzy
#| msgid "Offset on the Y axis done"
msgid "Offset on the Y axis canceled"
msgstr "Y eksenindeki hizalama işlemi yapıldı"
msgstr "Y ekseninde hizalama işlemi iptal edildi"
#: appEditors/AppGeoEditor.py:1500 appEditors/AppGerberEditor.py:6366
msgid "Skew on X axis ..."
msgstr "X ekseninde eğrilt ..."
#: appEditors/AppGeoEditor.py:1510 appEditors/AppGerberEditor.py:6376
#, fuzzy
#| msgid "Skew on X axis done."
msgid "Skew on X axis done"
msgstr "X ekseninde eğme işlemi tamamlandı."
msgstr "X ekseninde eğritlme işlemi yapıldı"
#: appEditors/AppGeoEditor.py:1513
#, fuzzy
#| msgid "Skew on X axis done."
msgid "Skew on X axis canceled"
msgstr "X ekseninde eğme işlemi tamamlandı."
msgstr "X eksenindeki eğriltme işlemi iptal edildi"
#: appEditors/AppGeoEditor.py:1516 appEditors/AppGerberEditor.py:6382
msgid "Skew on Y axis ..."
msgstr "Y Ekseninde Eğrilt ..."
#: appEditors/AppGeoEditor.py:1526 appEditors/AppGerberEditor.py:6392
#, fuzzy
#| msgid "Skew on Y axis done."
msgid "Skew on Y axis done"
msgstr "Y ekseninde eğme işlemi tamamlandı."
msgstr "Y ekseninde eğriltme işlemi yapıldı"
#: appEditors/AppGeoEditor.py:1529
#, fuzzy
#| msgid "Skew on Y axis done."
msgid "Skew on Y axis canceled"
msgstr "Y ekseninde eğme işlemi tamamlandı."
msgstr "Y ekseninde eğrilme işlemi iptal edildi"
#: appEditors/AppGeoEditor.py:1960 appEditors/AppGeoEditor.py:2031
#: appEditors/AppGerberEditor.py:1500 appEditors/AppGerberEditor.py:1583
@ -3161,17 +3127,13 @@ msgstr ""
#: appEditors/AppGeoEditor.py:4936 appEditors/AppGeoEditor.py:4988
#: appEditors/AppGeoEditor.py:5037 appEditors/AppGeoEditor.py:5084
#, fuzzy
#| msgid "Failed. Nothing selected."
msgid "Nothing selected."
msgstr "Hata. Hiçbir şey seçilmedi."
msgstr "Hiçbir şey seçilmedi."
#: appEditors/AppGeoEditor.py:4940 appEditors/AppGeoEditor.py:4992
#: appEditors/AppGeoEditor.py:5041
#, fuzzy
#| msgid "Invalid distance for buffering."
msgid "Invalid distance."
msgstr "Tampon oluşturmak için geçersiz mesafe."
msgstr "Geçersiz mesafe."
#: appEditors/AppGeoEditor.py:4964 appEditors/AppGeoEditor.py:5012
#: appEditors/AppGeoEditor.py:5061
@ -3341,10 +3303,8 @@ msgid "Added new aperture with code"
msgstr "Şu kodlu yeni şekil eklendi"
#: appEditors/AppGerberEditor.py:3095
#, fuzzy
#| msgid " Select an aperture in Aperture Table"
msgid "Select an aperture in Aperture Table"
msgstr " Şekil Tablosundan bir şekil seçin"
msgstr "Şekil Tablosundan bir şekil seçin"
#: appEditors/AppGerberEditor.py:3103
msgid "Select an aperture in Aperture Table -->"
@ -3701,22 +3661,16 @@ msgid "Specify how many pads to be in the array."
msgstr "Dizide kaç tane ped olması gerektiğini belirtin."
#: appEditors/AppGerberEditor.py:6363
#, fuzzy
#| msgid "Open cancelled."
msgid "Offset Y cancelled"
msgstr "Open cancelled."
msgstr "Y hizalama işlemi iptal edildi"
#: appEditors/AppGerberEditor.py:6379
#, fuzzy
#| msgid "Open DXF cancelled."
msgid "Skew X cancelled"
msgstr "Open DXF cancelled."
msgstr "X eğriltme işlemi iptal edildi"
#: appEditors/AppGerberEditor.py:6395
#, fuzzy
#| msgid "Skew_Y angle"
msgid "Skew Y cancelled"
msgstr "Skew_Y angle"
msgstr "Y eğriltme işlemi iptal edildi"
#: appEditors/AppTextEditor.py:84
msgid "Find"
@ -5093,8 +5047,6 @@ msgstr "Varsayılan"
#: appGUI/MainGUI.py:863
#: appGUI/preferences/excellon/ExcellonOptPrefGroupUI.py:33
#: appGUI/preferences/geometry/GeometryOptPrefGroupUI.py:35
#, fuzzy
#| msgid "Create CNC Job"
msgid "Create CNCJob"
msgstr "CNC İşi Oluştur"
@ -6549,10 +6501,8 @@ msgstr ""
"sağlar."
#: appGUI/ObjectUI.py:724
#, fuzzy
#| msgid "Generate GCode out of drill holes in an Excellon object."
msgid "Generate GCode from the drill holes in an Excellon object."
msgstr "Bir Excellon nesnesindeki matkap deliklerinden G Kod oluşturun."
msgstr "Bir Excellon nesnesindeki deliklerinden G Kodu oluşturun."
#: appGUI/ObjectUI.py:735 appGUI/ObjectUI.py:1790
msgid "Milling Tool"
@ -9206,8 +9156,6 @@ msgstr ""
"başlatılmasını gerektirir."
#: appGUI/preferences/general/GeneralAppPrefGroupUI.py:64
#, fuzzy
#| msgid "Precision INCH"
msgid "Precision Inch"
msgstr "İNÇ Hassasiyet"
@ -12105,15 +12053,6 @@ msgstr "Kalan Parça İşleme"
#: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:245
#: appTools/ToolIsolation.py:3394 appTools/ToolNCC.py:4338
#: appTools/ToolPaint.py:3079
#, fuzzy
#| msgid ""
#| "If checked, use 'rest machining'.\n"
#| "Basically it will isolate outside PCB features,\n"
#| "using the biggest tool and continue with the next tools,\n"
#| "from bigger to smaller, to isolate the copper features that\n"
#| "could not be cleared by previous tool, until there is\n"
#| "no more copper features to isolate or there are no more tools.\n"
#| "If not checked, use the standard algorithm."
msgid ""
"If checked, use 'rest machining'.\n"
"Basically it will process copper outside PCB features,\n"
@ -12124,12 +12063,12 @@ msgid ""
"\n"
"If not checked, use the standard algorithm."
msgstr ""
"Bu onay kutusu işaretlenirse, 'Kalan Parça İşleme' kullanılır.\n"
"Bu, en büyük ucu kullanarak PCB'nin ana bakırını \n"
"temizler ve temizlenecek daha fazla bakır kalmayana veya \n"
"daha fazla uç kalmayana kadar önceki uçla temizlenemeyen\n"
"bakır alanlarını temizlemek için bir sonraki uçla, daha büyükten\n"
"daha küçüğe doğru ilerler.\n"
"İşaretlenirse, 'Kalan Parça İşleme' kullanılır.\n"
"Temel olarak, PCB özelliklerinin dışında kalan bakırları işleyecek.\n"
"En büyük uçtan başlayarak ve büyükten küçüğe doğru kullanarak işlenecek "
"hiçbir şey kalmayıncaya kadar veya önceki uçla temizlenemeyen bakırları "
"işlemeye devam edecektir.\n"
"\n"
"Onay kutusu seçilmezse, standart algoritma kullanılır."
#: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:258
@ -13827,8 +13766,6 @@ msgstr "İptal edildi. G Kod üretimi için dört nokta gereklidir."
#: app_Main.py:8652 app_Main.py:8694 app_Main.py:8736 app_Main.py:8777
#: app_Main.py:8822 app_Main.py:8867 app_Main.py:9330 app_Main.py:9334
#: camlib.py:2403 camlib.py:2471 camlib.py:2539 camlib.py:2617
#, fuzzy
#| msgid "No object selected."
msgid "No object is selected."
msgstr "Hiçbir nesne seçilmedi."
@ -15134,10 +15071,8 @@ msgid "Starting G-Code"
msgstr "G-Kodu başlatılıyor"
#: appTools/ToolDrilling.py:1673 appTools/ToolMilling.py:1355
#, fuzzy
#| msgid "Generating Excellon CNCJob..."
msgid "Generating CNCJob..."
msgstr "Excellon CNC İşi oluşturuluyor ..."
msgstr "CNC İşi oluşturuluyor ..."
#: appTools/ToolDrilling.py:1791 camlib.py:3214 camlib.py:3644 camlib.py:5730
msgid "The Toolchange X,Y format has to be (x, y)."
@ -15406,20 +15341,12 @@ msgstr ""
"Genişlik, her zaman bakır kaynağının genişliğinin iki katıdır."
#: appTools/ToolFilm.py:160
#, fuzzy
#| msgid "No FlatCAM object selected. Load an object for Film and retry."
msgid "Load an object for Film and retry."
msgstr ""
"Hiçbir FlatCAM nesnesi seçilmedi. Film için bir nesne yükleyin ve tekrar "
"deneyin."
msgstr "Film için bir nesne yükleyin ve tekrar deneyin."
#: appTools/ToolFilm.py:167
#, fuzzy
#| msgid "No FlatCAM object selected. Load an object for Box and retry."
msgid "Load an object for Box and retry."
msgstr ""
"Hiçbir FlatCAM nesnesi seçilmedi. Çerçeve için bir nesne yükleyin ve tekrar "
"deneyin."
msgstr "Çerçeve için bir nesne yükleyin ve tekrar deneyin."
#: appTools/ToolFilm.py:182
msgid "Generating Film ..."
@ -15785,10 +15712,8 @@ msgid "Tool(s) deleted from Tool Table."
msgstr "Uç(lar) Araçlar Tablosundan silindi."
#: appTools/ToolIsolation.py:1479
#, fuzzy
#| msgid "Isolation"
msgid "Isolating"
msgstr "Yalıtım"
msgstr "Yalıtılıyor"
#: appTools/ToolIsolation.py:1499
msgid "Following geometry was generated"
@ -16022,7 +15947,7 @@ msgstr "TAŞIMA işlemi iptal edildi. Taşınacak nesne (ler) yok."
#: appTools/ToolMove.py:211
msgid "object was moved"
msgstr "nesne taşındı"
msgstr "nesnesi taşındı"
#: appTools/ToolMove.py:221
msgid "Error when mouse left click."
@ -16820,21 +16745,16 @@ msgid "Import Excellon"
msgstr "Excellon'u İçe Aktar"
#: appTools/ToolPcbWizard.py:466
#, fuzzy
#| msgid ""
#| "Import in FlatCAM an Excellon file\n"
#| "that store it's information's in 2 files.\n"
#| "One usually has .DRL extension while\n"
#| "the other has .INF extension."
msgid ""
"Import an Excellon file\n"
"that store it's information's in 2 files.\n"
"One usually has .DRL extension while\n"
"the other has .INF extension."
msgstr ""
"FlatCAM'de, bilgileri 2 dosyada bulunan\n"
"Excellon dosyasını içe aktarın. \n"
"Birinde genellikle .DRL, diğerinde .INF uzantısı vardır."
"Bilgilerinin 2 dosyada saklandığı \n"
"bir Excellon dosyasını içe aktarın.\n"
"Biri genellikle .DRL uzantısına sahipken\n"
"diğeri .INF uzantısına sahiptir."
#: appTools/ToolProperties.py:127
msgid "Object Properties are displayed."
@ -18196,10 +18116,8 @@ msgid "Adding New Grid cancelled"
msgstr "Yeni ızgara ekleme işlemi iptal edildi"
#: app_Main.py:6351
#, fuzzy
#| msgid " Grid Value does not exist"
msgid "Grid Value does not exist"
msgstr " Izgara değeri mevcut değil"
msgstr "Izgara değeri mevcut değil"
#: app_Main.py:6353
msgid "Grid Value deleted"
@ -18214,8 +18132,6 @@ msgid "Key Shortcut List"
msgstr "Klavye Kısayol Listesi"
#: app_Main.py:6401
#, fuzzy
#| msgid "Name copied on clipboard ..."
msgid "Name copied to clipboard ..."
msgstr "İsim panoya kopyalandı ..."
@ -18631,10 +18547,8 @@ msgstr ""
"ediliyor."
#: app_Main.py:10387
#, fuzzy
#| msgid " Open HPGL2 failed. Probable not a HPGL2 file."
msgid "Failed. Probable not a HPGL2 file."
msgstr " HPGL2 açılamadı. Muhtemelen bir HPGL2 dosyası değil."
msgstr "Başarısız oldu. Muhtemelen bir HPGL2 dosyası değil."
#: app_Main.py:10413
msgid "TCL script file opened in Code Editor."