diff --git a/CHANGELOG.md b/CHANGELOG.md index d1fc1e00..ef6cd38f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ CHANGELOG for FlatCAM beta - improved the quit application process; now the `quit_flatcam` Tcl command works properly - another fix for Shapely 2.0 deprecation warning - yet another fix for Shapely 2.0 deprecation warnings +- updated the `join_geometry` and `join_excellon` Tcl commands format to follow the format of other commands 30.01.2022 diff --git a/appObjects/FlatCAMExcellon.py b/appObjects/FlatCAMExcellon.py index f2f3dd7e..c3ddc61f 100644 --- a/appObjects/FlatCAMExcellon.py +++ b/appObjects/FlatCAMExcellon.py @@ -1285,7 +1285,7 @@ class ExcellonObject(FlatCAMObj, Excellon): self.build_ui() @staticmethod - def merge(exc_list, exc_final, decimals=None, fuse_tools=True): + def merge(exc_list, exc_final, decimals=None, fuse_tools=True, log=None): """ Merge Excellon objects found in exc_list parameter into exc_final object. Options are always copied from source . @@ -1330,7 +1330,8 @@ class ExcellonObject(FlatCAMObj, Excellon): try: exc_final.options[option] = deepcopy(exc.options[option]) except Exception: - exc.app.log.warning("Failed to copy option.", option) + if log: + log.warning("Failed to copy option.", option) for tool in exc.tools: toolid += 1 diff --git a/appObjects/FlatCAMGeometry.py b/appObjects/FlatCAMGeometry.py index 85091cd7..3484b13f 100644 --- a/appObjects/FlatCAMGeometry.py +++ b/appObjects/FlatCAMGeometry.py @@ -1557,7 +1557,8 @@ class GeometryObject(FlatCAMObj, Geometry): self.read_form_item('multicolored') self.plot() - def merge(self, geo_list, geo_final, multi_geo=None, fuse_tools=None): + @staticmethod + def merge(geo_list, geo_final, multi_geo=None, fuse_tools=None, log=None): """ Merges the geometry of objects in grb_list into the geometry of geo_final. @@ -1582,11 +1583,12 @@ class GeometryObject(FlatCAMObj, Geometry): try: new_options[option] = deepcopy(geo_obj.options[option]) except Exception as e: - self.app.log.error("Failed to copy option %s. Error: %s" % (str(option), str(e))) + if log: + log.error("Failed to copy option %s. Error: %s" % (str(option), str(e))) # Expand lists if type(geo_obj) is list: - GeometryObject.merge(geo_list=geo_obj, geo_final=geo_final) + GeometryObject.merge(geo_list=geo_obj, geo_final=geo_final, log=log) # If not list, just append else: if multi_geo is None or multi_geo is False: @@ -1598,7 +1600,8 @@ class GeometryObject(FlatCAMObj, Geometry): new_solid_geometry += deepcopy(geo_obj.solid_geometry.geoms) except Exception as e: new_solid_geometry.append(geo_obj.solid_geometry) - self.app.log.error("GeometryObject.merge() --> %s" % str(e)) + if log: + log.error("GeometryObject.merge() --> %s" % str(e)) # find the tool_uid maximum value in the geo_final try: diff --git a/app_Main.py b/app_Main.py index aa484c3b..823f8d85 100644 --- a/app_Main.py +++ b/app_Main.py @@ -4568,7 +4568,8 @@ class App(QtCore.QObject): # if at least one True object is in the list then due of the previous check, all list elements are True objects if True in geo_type_set: def initialize(geo_obj, app): - GeometryObject.merge(geo_list=objs, geo_final=geo_obj, multi_geo=True, fuse_tools=fuse_tools) + GeometryObject.merge(geo_list=objs, geo_final=geo_obj, multi_geo=True, fuse_tools=fuse_tools, + log=app.log) app.inform.emit('[success] %s.' % _("Geometry merging finished")) # rename all the ['name] key in obj.tools[tooluid]['data'] to the obj_name_multi @@ -4578,7 +4579,8 @@ class App(QtCore.QObject): self.app_obj.new_object("geometry", obj_name_multi, initialize) else: def initialize(geo_obj, app): - GeometryObject.merge(geo_list=objs, geo_final=geo_obj, multi_geo=False, fuse_tools=fuse_tools) + GeometryObject.merge(geo_list=objs, geo_final=geo_obj, multi_geo=False, fuse_tools=fuse_tools, + log=app.log) app.inform.emit('[success] %s.' % _("Geometry merging finished")) # rename all the ['name] key in obj.tools[tooluid]['data'] to the obj_name_multi @@ -4613,7 +4615,8 @@ class App(QtCore.QObject): fuse_tools = self.defaults["excellon_merge_fuse_tools"] def initialize(exc_obj, app): - ExcellonObject.merge(exc_list=objs, exc_final=exc_obj, decimals=self.decimals, fuse_tools=fuse_tools) + ExcellonObject.merge(exc_list=objs, exc_final=exc_obj, decimals=self.decimals, fuse_tools=fuse_tools, + log=app.log) app.inform.emit('[success] %s.' % _("Excellon merging finished")) self.app_obj.new_object("excellon", 'Combo_Excellon', initialize) diff --git a/tclCommands/TclCommandJoinExcellon.py b/tclCommands/TclCommandJoinExcellon.py index ba473b06..96ab7512 100644 --- a/tclCommands/TclCommandJoinExcellon.py +++ b/tclCommands/TclCommandJoinExcellon.py @@ -20,26 +20,29 @@ class TclCommandJoinExcellon(TclCommand): # Dictionary of types from Tcl command, needs to be ordered arg_names = collections.OrderedDict([ - ('outname', str), + ]) # Dictionary of types from Tcl command, needs to be ordered , this is for options like -optionname value option_types = collections.OrderedDict([ + ('outname', str), ]) # array of mandatory options for current Tcl command: required = {'name','outname'} - required = ['outname'] + required = [] # structured help for current command, args needs to be ordered help = { 'main': "Runs a merge operation (join) on the Excellon objects.\n" - "The names of the Excellon objects to be merged will be entered after the outname,\n" + "The names of the Excellon objects to be merged will be entered after the command,\n" "separated by spaces. See the example below.\n" "WARNING: if the name of an Excellon objects has spaces, enclose the name with quotes.", 'args': collections.OrderedDict([ - ('outname', 'Name of the new Excellon Object made by joining of other Excellon objects. Required'), + ('outname', 'Name of the new Excellon Object made by joining of other Excellon objects.\n' + 'If not used then it will be used a generic name: "joined_exc"'), ]), - 'examples': ['join_excellons merged_new_excellon exc_name_1 "exc name_2"'] + 'examples': ['join_excellons exc_name_1 "exc name_2" -outname merged_new_excellon', + 'join_excellon exc_name_1 "exc name_2"'] } def execute(self, args, unnamed_args): @@ -49,22 +52,26 @@ class TclCommandJoinExcellon(TclCommand): :param unnamed_args: :return: """ + self.app.log.debug("TclCommandJoinExcellon.execute()") - outname = args['outname'] + outname = args['outname'] if 'outname' in args else "joined_exc" obj_names = unnamed_args objs = [] for obj_n in obj_names: obj = self.app.collection.get_by_name(str(obj_n)) if obj is None: - return "Object not found: %s" % obj_n + self.app.log.error("Object not found: %s" % obj_n) + return "fail" else: objs.append(obj) def initialize(obj_, app): - ExcellonObject.merge(objs, obj_, decimals=self.app.decimals) + ExcellonObject.merge(objs, obj_, decimals=self.app.decimals, log=app.log) if objs and len(objs) >= 2: self.app.app_obj.new_object("excellon", outname, initialize, plot=False) else: - return "No Excellon objects to be joined or less than two Excellon objects specified for merging." + self.app.log.error( + "No Excellon objects to be joined or less than two Excellon objects specified for merging.") + return "fail" diff --git a/tclCommands/TclCommandJoinGeometry.py b/tclCommands/TclCommandJoinGeometry.py index 5703f8b3..55f5100f 100644 --- a/tclCommands/TclCommandJoinGeometry.py +++ b/tclCommands/TclCommandJoinGeometry.py @@ -19,27 +19,27 @@ class TclCommandJoinGeometry(TclCommand): # Dictionary of types from Tcl command, needs to be ordered arg_names = collections.OrderedDict([ - ('outname', str), ]) # Dictionary of types from Tcl command, needs to be ordered , this is for options like -optionname value option_types = collections.OrderedDict([ - + ('outname', str) ]) # array of mandatory options for current Tcl command: required = {'name','outname'} - required = ['outname'] + required = [] # structured help for current command, args needs to be ordered help = { 'main': "Runs a merge operation (join) on the Geometry objects.\n" - "The names of the Geometry objects to be merged will be entered after the outname,\n" + "The names of the Geometry objects to be merged will be entered after the command,\n" "separated by spaces. See the example below.\n" "WARNING: if the name of an Geometry objects has spaces, enclose the name with quotes.", 'args': collections.OrderedDict([ - ('outname', 'Name of the new Geometry Object made by joining of other Geometry objects. Required'), + ('outname', 'Name of the new Geometry Object made by joining of other Geometry objects.\n' + 'If no outname is provided then will be used a generic "joined_geo" name.'), ]), - 'examples': ['join_geometry merged_new_geo geo_name_1 "geo name_2"'] + 'examples': ['join_geometry geo_name_1 "geo name_2" -outname merged_new_geo'] } def execute(self, args, unnamed_args): @@ -49,22 +49,25 @@ class TclCommandJoinGeometry(TclCommand): :param unnamed_args: :return: """ + self.app.log.debug("TclCommandJoinGeometry.execute()") - outname = args['outname'] + outname = args['outname'] if 'outname' in args else "joined_geo" obj_names = unnamed_args objs = [] for obj_n in obj_names: obj = self.app.collection.get_by_name(str(obj_n)) - if obj is None: - return "Object not found: %s" % obj_n - else: - objs.append(obj) + if obj is None or obj == '': + self.app.log.error("Object not found: %s" % obj_n) + return "fail" + objs.append(obj) def initialize(obj_, app): - GeometryObject.merge(objs, obj_) + GeometryObject.merge(objs, obj_, log=app.log) if objs and len(objs) >= 2: self.app.app_obj.new_object("geometry", outname, initialize, plot=False) else: - return "No Geometry objects to be joined or less than two Geometry objects specified for merging." + self.app.log.error( + "No Geometry objects to be joined or less than two Geometry objects specified for merging.") + return "fail"