From d22592e64cb95635ba9f0e20af966b55c144d879 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 12 Sep 2019 17:28:56 +0300 Subject: [PATCH] - 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 --- FlatCAMApp.py | 154 +++++++++++++++++++++------ README.md | 5 + flatcamGUI/FlatCAMGUI.py | 4 +- tclCommands/TclCommandDrillcncjob.py | 16 +-- tclCommands/TclCommandMillDrills.py | 18 ++-- tclCommands/TclCommandMillSlots.py | 18 ++-- 6 files changed, 160 insertions(+), 55 deletions(-) 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(",")]