- added a new parameter to the New Tcl command named -reset. If set False (or 0) the TCL instance will not be recreated, allowing to keep the TCL variable content on the new project.

- included the modifications from PR #336 from Andre Spahlinger
This commit is contained in:
Marius Stanciu
2021-01-04 00:44:57 +02:00
committed by Marius
parent f9b3cb0794
commit e726899167
4 changed files with 49 additions and 8 deletions

View File

@@ -12,6 +12,8 @@ CHANGELOG for FlatCAM beta
- fixed the Tcl Commands: new_geometry, new_gerber and new_excellon to create correct objects. New Geometry object created with the new_geometry Tcl command accept now the usage of add_circle/polygon/polyline/rectangle Tcl commands
- updated the autocompleter list for the Tcl commands with missing Tcl commands names
- added three new Tcl Commands: add_aperture (adds an aperture to a Gerber object), add_drill and add_slot (add a drill/slot to an Excellon object)
- added a new parameter to the New Tcl command named -reset. If set False (or 0) the TCL instance will not be recreated, allowing to keep the TCL variable content on the new project.
- included the modifications from PR #336 from Andre Spahlinger
2.01.2021

View File

@@ -54,6 +54,7 @@ class ScriptObject(FlatCAMObj):
self.ser_attrs = ['options', 'kind', 'source_file']
self.source_file = ''
self.script_code = ''
self.script_filename = ''
self.units_found = self.app.defaults['units']
@@ -168,6 +169,7 @@ class ScriptObject(FlatCAMObj):
script_content = ''.join(script_content)
self.source_file = script_content
self.script_filename = filename
def handle_run_code(self):
# trying to run a Tcl command without having the Shell open will create some warnings because the Tcl Shell
@@ -184,10 +186,31 @@ class ScriptObject(FlatCAMObj):
self.script_code = self.script_editor_tab.code_editor.toPlainText()
old_line = ''
for tcl_command_line in self.script_code.splitlines():
# set tcl info script to actual scriptfile
set_tcl_script_name = '''proc procExists p {{
return uplevel 1 [expr {{[llength [info command $p]] > 0}}]
}}
if {{[procExists "info_original"]==0}} {{
rename info info_original
}}
proc info args {{
switch [lindex $args 0] {{
script {{
return "{0}"
}}
default {{
return [uplevel info_original $args]
}}
}}
}}'''.format(self.script_filename)
for tcl_command_line in set_tcl_script_name.splitlines()+self.script_code.splitlines():
# do not process lines starting with '#' = comment and empty lines
if not tcl_command_line.startswith('#') and tcl_command_line != '':
# id FlatCAM is run in Windows then replace all the slashes with
# if FlatCAM is run in Windows then replace all the slashes with
# the UNIX style slash that TCL understands
if sys.platform == 'win32':
if "open" in tcl_command_line:

View File

@@ -1842,6 +1842,7 @@ class App(QtCore.QObject):
if init_tcl:
# shell tool has to be initialized always first because other tools print messages in the Shell Dock
self.shell = FCShell(app=self, version=self.version)
self.log.debug("TCL was re-instantiated. TCL variables are reset.")
self.distance_tool = Distance(self)
self.distance_tool.install(icon=QtGui.QIcon(self.resource_location + '/distance16.png'), pos=self.ui.menuedit,
@@ -9396,11 +9397,13 @@ class MenuFileHandlers(QtCore.QObject):
else:
self.on_file_new_project(threaded=True)
def on_file_new_project(self, cli=None, threaded=None):
def on_file_new_project(self, cli=None, reset_tcl=True, threaded=None):
"""
Returns the application to its startup state. This method is thread-safe.
:param cli: Boolean. If True this method was run from command line
:param reset_tcl: Boolean. If False, on new project creation the Tcl instance is not recreated, therefore it
will remember all the previous variables. If True then the Tcl is re-instantiated.
:param threaded: Bool. If True some part of the initialization are done threaded
:return: None
"""
@@ -9468,7 +9471,10 @@ class MenuFileHandlers(QtCore.QObject):
self.app.clear_pool()
# Init FlatCAMTools
self.app.init_tools(init_tcl=True)
if reset_tcl is True:
self.app.init_tools(init_tcl=True)
else:
self.app.init_tools(init_tcl=False)
# tcl needs to be reinitialized, otherwise old shell variables etc remains
# self.app.shell.init_tcl()

View File

@@ -17,7 +17,9 @@ class TclCommandNew(TclCommand):
arg_names = collections.OrderedDict()
# dictionary of types from Tcl command, needs to be ordered , this is for options like -optionname value
option_types = collections.OrderedDict()
option_types = collections.OrderedDict([
('reset', str),
])
# array of mandatory options for current Tcl command: required = {'name','outname'}
required = []
@@ -25,8 +27,11 @@ class TclCommandNew(TclCommand):
# structured help for current command, args needs to be ordered
help = {
'main': "Starts a new project. Clears objects from memory.",
'args': collections.OrderedDict(),
'examples': ['new']
'args': collections.OrderedDict([
('reset', 'If True/0 or missing (default value) or no value provided then the Tcl is re-instantiated '
'thus resetting all its variables.'),
]),
'examples': ['new', 'new -reset False']
}
def execute(self, args, unnamed_args):
@@ -39,4 +44,9 @@ class TclCommandNew(TclCommand):
:return: None or exception
"""
self.app.f_handlers.on_file_new_project(cli=True)
reset_tcl = True
if 'reset' in args:
if args['reset'] and (args['reset'] == '0' or args['reset'].lower() == 'false'):
reset_tcl = False
self.app.f_handlers.on_file_new_project(cli=True, reset_tcl=reset_tcl)