diff --git a/FlatCAMApp.py b/FlatCAMApp.py
index 6ccbba24..85bfa9f2 100644
--- a/FlatCAMApp.py
+++ b/FlatCAMApp.py
@@ -1854,7 +1854,7 @@ class App(QtCore.QObject):
]
self.ordinary_keywords = ['all', 'angle_x', 'angle_y', 'axis', 'axisoffset', 'box', 'center_x', 'center_y',
- 'columns', 'combine', 'connect', 'contour', 'depthperpass', 'dia', 'dist',
+ 'columns', 'combine', 'connect', 'contour', 'depthperpass', 'dia', 'diatol', 'dist',
'drilled_dias', 'drillz',
'endz', 'extracut', 'factor', 'False', 'false', 'feedrate', 'feedrate_rapid',
'filename', 'follow', 'gaps', 'gapsize', 'grid', 'gridoffset', 'gridoffsetx',
@@ -3757,7 +3757,8 @@ class App(QtCore.QObject):
# Icon and title
self.setWindowIcon(parent.app_icon)
- self.setWindowTitle("FlatCAM")
+ self.setWindowTitle(_("About FlatCAM"))
+ self.resize(600, 200)
# self.setStyleSheet("background-image: url(share/flatcam_icon256.png); background-attachment: fixed")
# self.setStyleSheet(
# "border-image: url(share/flatcam_icon256.png) 0 0 0 0 stretch stretch; "
@@ -3770,58 +3771,151 @@ class App(QtCore.QObject):
# palette.setBrush(10, QtGui.QBrush(bgimage)) # 10 = Windowrole
# self.setPalette(palette)
- layout1 = QtWidgets.QVBoxLayout()
- self.setLayout(layout1)
-
- layout2 = QtWidgets.QHBoxLayout()
- layout1.addLayout(layout2)
logo = QtWidgets.QLabel()
logo.setPixmap(QtGui.QPixmap('share/flatcam_icon256.png'))
- layout2.addWidget(logo, stretch=0)
title = QtWidgets.QLabel(
_(
"FlatCAM
"
- "Version {version} {beta} ({date}) - {arch}
"
- "
"
"2D Computer-Aided Printed Circuit Board
"
"Manufacturing.
"
"
"
- " License:
"
- "Licensed under MIT license (2014 - 2019)"
"
"
- "by (c)Juan Pablo Caram
"
- "
"
- " Programmers:
"
- "Denis Hayrullin
"
- "Kamil Sopko
"
- "Marius Stanciu
"
- "Matthieu Berthomé
"
- "and many others found "
- "here.
"
- "
"
- "Development is done "
+ "Development "
"here.
"
"DOWNLOAD area "
"here.
"
""
+ )
+ )
+ title.setOpenExternalLinks(True)
+
+ closebtn = QtWidgets.QPushButton(_("Close"))
+
+ tab_widget = QtWidgets.QTabWidget()
+ description_label = QtWidgets.QLabel(
+ _(
+ "FlatCAM {version} {beta} ({date}) - {arch}
"
+ "http://flatcam.org
"
).format(version=version,
beta=('BETA' if beta else ''),
date=version_date,
arch=platform.architecture()[0])
)
- title.setOpenExternalLinks(True)
+ description_label.setOpenExternalLinks(True)
- layout2.addWidget(title, stretch=1)
+ programmers_label = QtWidgets.QLabel(
+ _(
+ "Juan Pablo Caram
"
+ "
"
+ "Denis Hayrullin
"
+ "Kamil Sopko
"
+ "Marius Stanciu
"
+ "Matthieu Berthomé
"
+ "and many others found "
+ "here.
"
+ "
"
+ )
+ )
+ programmers_label.setOpenExternalLinks(True)
+ translators_label = QtWidgets.QLabel(
+ _(
+ "Brasilian - Portuguese: \t\t Carlos Stein\n"
+ "German: \t\t Marius Stanciu (Google-Translation)\n"
+ "Romanian: \t\t Marius Stanciu\n"
+ "Russian: \t\t Andrey Kultyapov \n"
+ "Spanish: \t\t Marius Stanciu (Google-Translation)\n"
+ )
+ )
+ translators_label.setOpenExternalLinks(True)
+
+ license_label = QtWidgets.QLabel(
+ _(
+ '(c) Copyright 2014 Juan Pablo Caram.\n\n'
+ 'Licensed under the MIT license:\n'
+ 'http://www.opensource.org/licenses/mit-license.php\n\n'
+ 'Permission is hereby granted, free of charge, to any person obtaining a copy\n'
+ 'of this software and associated documentation files (the "Software"), to deal\n'
+ 'in the Software without restriction, including without limitation the rights\n'
+ 'to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n'
+ 'copies of the Software, and to permit persons to whom the Software is\n'
+ ' furnished to do so, subject to the following conditions:\n\n'
+
+ 'The above copyright notice and this permission notice shall be included in\n'
+ 'all copies or substantial portions of the Software.\n\n'
+
+ 'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n'
+ 'IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n'
+ 'FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n'
+ 'AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n'
+ 'LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n'
+ 'OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n'
+ 'THE SOFTWARE.'
+ )
+ )
+ license_label.setOpenExternalLinks(True)
+
+ # layouts
+ layout1 = QtWidgets.QVBoxLayout()
+ layout1_1 = QtWidgets.QHBoxLayout()
+ layout1_2 = QtWidgets.QHBoxLayout()
+
+ layout2 = QtWidgets.QHBoxLayout()
layout3 = QtWidgets.QHBoxLayout()
- layout1.addLayout(layout3)
- layout3.addStretch()
- okbtn = QtWidgets.QPushButton(_("Close"))
- layout3.addWidget(okbtn)
- okbtn.clicked.connect(self.accept)
+ self.setLayout(layout1)
+ layout1.addLayout(layout1_1)
+ layout1.addLayout(layout1_2)
+
+ layout1.addLayout(layout2)
+ layout1.addLayout(layout3)
+
+ layout1_1.addStretch()
+ layout1_1.addWidget(description_label)
+ layout1_2.addWidget(tab_widget)
+
+ self.splash_tab = QtWidgets.QWidget()
+ self.splash_tab.setObjectName("splash_about")
+ self.splash_tab_layout = QtWidgets.QHBoxLayout(self.splash_tab)
+ self.splash_tab_layout.setContentsMargins(2, 2, 2, 2)
+ tab_widget.addTab(self.splash_tab, _("Splash"))
+
+ self.programmmers_tab = QtWidgets.QWidget()
+ self.programmmers_tab.setObjectName("programmers_about")
+ self.programmmers_tab_layout = QtWidgets.QVBoxLayout(self.programmmers_tab)
+ self.programmmers_tab_layout.setContentsMargins(2, 2, 2, 2)
+ tab_widget.addTab(self.programmmers_tab, _("Programmers"))
+
+ self.translators_tab = QtWidgets.QWidget()
+ self.translators_tab.setObjectName("translators_about")
+ self.translators_tab_layout = QtWidgets.QVBoxLayout(self.translators_tab)
+ self.translators_tab_layout.setContentsMargins(2, 2, 2, 2)
+ tab_widget.addTab(self.translators_tab, _("Translators"))
+
+ self.license_tab = QtWidgets.QWidget()
+ self.license_tab.setObjectName("license_about")
+ self.license_tab_layout = QtWidgets.QVBoxLayout(self.license_tab)
+ self.license_tab_layout.setContentsMargins(2, 2, 2, 2)
+ tab_widget.addTab(self.license_tab, _("License"))
+
+ self.splash_tab_layout.addWidget(logo, stretch=0)
+ self.splash_tab_layout.addWidget(title, stretch=1)
+
+ self.programmmers_tab_layout.addWidget(programmers_label)
+ self.programmmers_tab_layout.addStretch()
+
+ self.translators_tab_layout.addWidget(translators_label)
+ self.translators_tab_layout.addStretch()
+
+ self.license_tab_layout.addWidget(license_label)
+ self.license_tab_layout.addStretch()
+
+ layout3.addStretch()
+ layout3.addWidget(closebtn)
+
+ closebtn.clicked.connect(self.accept)
AboutDialog(self.ui).exec_()
diff --git a/README.md b/README.md
index b3c397c2..f48a50aa 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,11 @@ CAD program, and create G-Code for Isolation routing.
=================================================
+12.09.2019
+
+- small changes in the TclCommands: MillDrills, MillSlots, DrillCNCJob: the new parameter for tolerance is now named: tooldia
+- cleaned up the 'About FlatCAM' window, started to give credits for the translation team
+
11.09.2019
- added the Gerber code as source for the panelized object in Panelize Tool
diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py
index f5183ac9..d14c6fda 100644
--- a/flatcamGUI/FlatCAMGUI.py
+++ b/flatcamGUI/FlatCAMGUI.py
@@ -397,14 +397,14 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
# ## Help ###
self.menuhelp = self.menu.addMenu(_('&Help'))
- self.menuhelp_manual = self.menuhelp.addAction(QtGui.QIcon('share/globe16.png'), _('Help\tF1'))
+ self.menuhelp_manual = self.menuhelp.addAction(QtGui.QIcon('share/globe16.png'), _('Online Help\tF1'))
self.menuhelp_home = self.menuhelp.addAction(QtGui.QIcon('share/home16.png'), _('FlatCAM.org'))
self.menuhelp.addSeparator()
self.menuhelp_shortcut_list = self.menuhelp.addAction(QtGui.QIcon('share/shortcuts24.png'),
_('Shortcuts List\tF3'))
self.menuhelp_videohelp = self.menuhelp.addAction(QtGui.QIcon('share/youtube32.png'), _('YouTube Channel\tF4')
)
- self.menuhelp_about = self.menuhelp.addAction(QtGui.QIcon('share/about32.png'), _('About'))
+ self.menuhelp_about = self.menuhelp.addAction(QtGui.QIcon('share/about32.png'), _('About FlatCAM'))
# ## FlatCAM Editor menu ###
self.geo_editor_menu = QtWidgets.QMenu(">Geo Editor<")
diff --git a/tclCommands/TclCommandDrillcncjob.py b/tclCommands/TclCommandDrillcncjob.py
index 2c5e62bf..f1b8256d 100644
--- a/tclCommands/TclCommandDrillcncjob.py
+++ b/tclCommands/TclCommandDrillcncjob.py
@@ -30,7 +30,7 @@ class TclCommandDrillcncjob(TclCommandSignaled):
('ppname_e', str),
('outname', str),
('opt_type', str),
- ('tol', float)
+ ('diatol', float)
])
# array of mandatory options for current Tcl command: required = {'name','outname'}
@@ -57,10 +57,11 @@ class TclCommandDrillcncjob(TclCommandSignaled):
('opt_type', 'Name of move optimization type. B by default for Basic OR-Tools, M for Metaheuristic OR-Tools'
'T from Travelling Salesman Algorithm. B and M works only for 64bit version of FlatCAM and '
'T works only for 32bit version of FlatCAM'),
- ('tol', 'Tolerance. Percentange (0.0 ... 100.0) within which dias in drilled_dias will be judged to be the'
- 'same as the ones in the tools from the Excellon object. E.g: if in drill_dias we have a diameter'
- 'with value 1.0, in the Excellon we have a tool with dia = 1.05 and we set a tolerance tol = 5.0'
- 'then the drills with the dia 1.05 in Excellon will be processed. Float number.')
+ ('diatol', 'Tolerance. Percentange (0.0 ... 100.0) within which dias in drilled_dias will be judged to be '
+ 'the same as the ones in the tools from the Excellon object. E.g: if in drill_dias we have a '
+ 'diameter with value 1.0, in the Excellon we have a tool with dia = 1.05 and we set a tolerance '
+ 'diatol = 5.0 then the drills with the dia = (0.95 ... 1.05) '
+ 'in Excellon will be processed. Float number.')
]),
'examples': ['drillcncjob test.TXT -drillz -1.5 -travelz 14 -feedrate 222 -feedrate_rapid 456 -spindlespeed 777'
' -toolchange True -toolchangez 33 -endz 22 -ppname_e default\n'
@@ -111,8 +112,8 @@ class TclCommandDrillcncjob(TclCommandSignaled):
req_dia_form = float('%.2f' % float(req_dia)) if units == 'MM' else \
float('%.4f' % float(req_dia))
- if 'tol' in args:
- tolerance = args['tol'] / 100
+ if 'diatol' in args:
+ tolerance = args['diatol'] / 100
tolerance = 0.0 if tolerance < 0.0 else tolerance
tolerance = 1.0 if tolerance > 1.0 else tolerance
@@ -134,6 +135,7 @@ class TclCommandDrillcncjob(TclCommandSignaled):
# no longer needed
del args['drilled_dias']
+ del args['diatol']
# Split and put back. We are passing the whole dictionary later.
# args['milled_dias'] = [x.strip() for x in args['tools'].split(",")]
diff --git a/tclCommands/TclCommandMillDrills.py b/tclCommands/TclCommandMillDrills.py
index 8e84d19b..2919ab89 100644
--- a/tclCommands/TclCommandMillDrills.py
+++ b/tclCommands/TclCommandMillDrills.py
@@ -25,7 +25,7 @@ class TclCommandMillDrills(TclCommandSignaled):
('outname', str),
('tooldia', float),
('use_threads', bool),
- ('tol', float)
+ ('diatol', float)
])
# array of mandatory options for current Tcl command: required = {'name','outname'}
@@ -40,12 +40,13 @@ class TclCommandMillDrills(TclCommandSignaled):
('tooldia', 'Diameter of the milling tool (example: 0.1).'),
('outname', 'Name of object to create.'),
('use_thread', 'If to use multithreading: True or False.'),
- ('tol', 'Tolerance. Percentange (0.0 ... 100.0) within which dias in milled_dias will be judged to be the'
- 'same as the ones in the tools from the Excellon object. E.g: if in milled_dias we have a diameter'
- 'with value 1.0, in the Excellon we have a tool with dia = 1.05 and we set a tolerance tol = 5.0'
- 'then the drills with the dia 1.05 in Excellon will be processed. Float number.')
+ ('diatol', 'Tolerance. Percentange (0.0 ... 100.0) within which dias in milled_dias will be judged to be '
+ 'the same as the ones in the tools from the Excellon object. E.g: if in milled_dias we have a '
+ 'diameter with value 1.0, in the Excellon we have a tool with dia = 1.05 and we set a tolerance '
+ 'diatol = 5.0 then the drills with the dia = (0.95 ... 1.05) '
+ 'in Excellon will be processed. Float number.')
]),
- 'examples': ['milldrills mydrills']
+ 'examples': ['milldrills mydrills', 'milld my_excellon.drl']
}
def execute(self, args, unnamed_args):
@@ -86,8 +87,8 @@ class TclCommandMillDrills(TclCommandSignaled):
req_dia_form = float('%.2f' % float(req_dia)) if units == 'MM' else \
float('%.4f' % float(req_dia))
- if 'tol' in args:
- tolerance = args['tol'] / 100
+ if 'diatol' in args:
+ tolerance = args['diatol'] / 100
tolerance = 0.0 if tolerance < 0.0 else tolerance
tolerance = 1.0 if tolerance > 1.0 else tolerance
@@ -107,6 +108,7 @@ class TclCommandMillDrills(TclCommandSignaled):
# no longer needed
del args['milled_dias']
+ del args['diatol']
# Split and put back. We are passing the whole dictionary later.
# args['milled_dias'] = [x.strip() for x in args['tools'].split(",")]
diff --git a/tclCommands/TclCommandMillSlots.py b/tclCommands/TclCommandMillSlots.py
index 5d9500c8..22159e4b 100644
--- a/tclCommands/TclCommandMillSlots.py
+++ b/tclCommands/TclCommandMillSlots.py
@@ -25,7 +25,7 @@ class TclCommandMillSlots(TclCommandSignaled):
('outname', str),
('tooldia', float),
('use_threads', bool),
- ('tol', float)
+ ('diatol', float)
])
# array of mandatory options for current Tcl command: required = {'name','outname'}
@@ -40,12 +40,13 @@ class TclCommandMillSlots(TclCommandSignaled):
('tooldia', 'Diameter of the milling tool (example: 0.1).'),
('outname', 'Name of object to create.'),
('use_thread', 'If to use multithreading: True or False.'),
- ('tol', 'Tolerance. Percentange (0.0 ... 100.0) within which dias in milled_dias will be judged to be the'
- 'same as the ones in the tools from the Excellon object. E.g: if in milled_dias we have a diameter'
- 'with value 1.0, in the Excellon we have a tool with dia = 1.05 and we set a tolerance tol = 5.0'
- 'then the slots with the dia 1.05 in Excellon will be processed. Float number.')
+ ('diatol', 'Tolerance. Percentange (0.0 ... 100.0) within which dias in milled_dias will be judged to be '
+ 'the same as the ones in the tools from the Excellon object. E.g: if in milled_dias we have a '
+ 'diameter with value 1.0, in the Excellon we have a tool with dia = 1.05 and we set a tolerance '
+ 'diatol = 5.0 then the slots with the dia = (0.95 ... 1.05) '
+ 'in Excellon will be processed. Float number.')
]),
- 'examples': ['millholes mydrills']
+ 'examples': ['millslots mydrills', 'mills my_excellon.drl']
}
def execute(self, args, unnamed_args):
@@ -85,8 +86,8 @@ class TclCommandMillSlots(TclCommandSignaled):
req_dia_form = float('%.2f' % float(req_dia)) if units == 'MM' else \
float('%.4f' % float(req_dia))
- if 'tol' in args:
- tolerance = args['tol'] / 100
+ if 'diatol' in args:
+ tolerance = args['diatol'] / 100
tolerance = 0.0 if tolerance < 0.0 else tolerance
tolerance = 1.0 if tolerance > 1.0 else tolerance
@@ -106,6 +107,7 @@ class TclCommandMillSlots(TclCommandSignaled):
# no longer needed
del args['milled_dias']
+ del args['diatol']
# Split and put back. We are passing the whole dictionary later.
# args['milled_dias'] = [x.strip() for x in args['tools'].split(",")]