From c0031235cd67686fb5685d88fb84a1d5c498b9a3 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 26 Jan 2019 09:08:41 +0200 Subject: [PATCH] - fixed grbl_laser postprocessor file - updated function for copy of an Excellon object for the case when the object has slots - updated FlatCAMExcellon.merge() function to work in case some (or all) of the merged objects have slots --- FlatCAMApp.py | 4 ++ FlatCAMObj.py | 123 ++++++++++++++++++++++++++++++++++++++++++++++---- README.md | 2 + 3 files changed, 119 insertions(+), 10 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 4879282c..fed5f39c 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -3126,6 +3126,8 @@ class App(QtCore.QObject): # drills are offset, so they need to be deep copied obj_init.drills = deepcopy(obj.drills) + # slots are offset, so they need to be deep copied + obj_init.slots = deepcopy(obj.slots) obj_init.create_geometry() for obj in self.collection.get_selected(): @@ -3161,6 +3163,8 @@ class App(QtCore.QObject): obj_init.tools = obj.tools # drills are offset, so they need to be deep copied obj_init.drills = deepcopy(obj.drills) + # slots are offset, so they need to be deep copied + obj_init.slots = deepcopy(obj.slots) obj_init.create_geometry() for obj in self.collection.get_selected(): diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 6590e54d..a82ee97e 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -899,14 +899,21 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): :return: None """ + # flag to signal that we need to reorder the tools dictionary and drills and slots lists + flag_order = False + try: flattened_list = list(itertools.chain(*exc_list)) except TypeError: flattened_list = exc_list # this dict will hold the unique tool diameters found in the exc_list objects as the dict keys and the dict - # values will be list of Shapely Points - custom_dict = {} + # values will be list of Shapely Points; for drills + custom_dict_drills = {} + + # this dict will hold the unique tool diameters found in the exc_list objects as the dict keys and the dict + # values will be list of Shapely Points; for slots + custom_dict_slots = {} for exc in flattened_list: # copy options of the current excellon obj to the final excellon obj @@ -920,21 +927,29 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): for drill in exc.drills: exc_tool_dia = float('%.3f' % exc.tools[drill['tool']]['C']) - if exc_tool_dia not in custom_dict: - custom_dict[exc_tool_dia] = [drill['point']] + if exc_tool_dia not in custom_dict_drills: + custom_dict_drills[exc_tool_dia] = [drill['point']] else: - custom_dict[exc_tool_dia].append(drill['point']) + custom_dict_drills[exc_tool_dia].append(drill['point']) - # add the zeros and units to the exc_final object + for slot in exc.slots: + exc_tool_dia = float('%.3f' % exc.tools[slot['tool']]['C']) + + if exc_tool_dia not in custom_dict_slots: + custom_dict_slots[exc_tool_dia] = [[slot['start'], slot['stop']]] + else: + custom_dict_slots[exc_tool_dia].append([slot['start'], slot['stop']]) + + # add the zeros and units to the exc_final object exc_final.zeros = exc.zeros exc_final.units = exc.units # variable to make tool_name for the tools current_tool = 0 - # Here we add data to the exc_final object - # the tools diameter are now the keys in the drill_dia dict and the values are the Shapely Points - for tool_dia in custom_dict: + # the tools diameter are now the keys in the drill_dia dict and the values are the Shapely Points in case of + # drills + for tool_dia in custom_dict_drills: # we create a tool name for each key in the drill_dia dict (the key is a unique drill diameter) current_tool += 1 @@ -943,7 +958,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): exc_final.tools[tool_name] = spec # rebuild the drills list of dict's that belong to the exc_final object - for point in custom_dict[tool_dia]: + for point in custom_dict_drills[tool_dia]: exc_final.drills.append( { "point": point, @@ -951,6 +966,94 @@ class FlatCAMExcellon(FlatCAMObj, Excellon): } ) + # Here we add data to the exc_final object + # the tools diameter are now the keys in the drill_dia dict and the values are a list ([start, stop]) + # of two Shapely Points in case of slots + for tool_dia in custom_dict_slots: + # we create a tool name for each key in the slot_dia dict (the key is a unique slot diameter) + # but only if there are no drills + if not exc_final.tools: + current_tool += 1 + tool_name = str(current_tool) + spec = {"C": float(tool_dia)} + exc_final.tools[tool_name] = spec + else: + dia_list = [] + for v in exc_final.tools.values(): + dia_list.append(float(v["C"])) + + if tool_dia not in dia_list: + flag_order = True + + current_tool = len(dia_list) + 1 + tool_name = str(current_tool) + spec = {"C": float(tool_dia)} + exc_final.tools[tool_name] = spec + + else: + for k, v in exc_final.tools.items(): + if v["C"] == tool_dia: + current_tool = int(k) + break + + # rebuild the slots list of dict's that belong to the exc_final object + for point in custom_dict_slots[tool_dia]: + exc_final.slots.append( + { + "start": point[0], + "stop": point[1], + "tool": str(current_tool) + } + ) + + # flag_order == True means that there was an slot diameter not in the tools and we also have drills + # and the new tool was added to self.tools therefore we need to reorder the tools and drills and slots + current_tool = 0 + if flag_order is True: + dia_list = [] + temp_drills = [] + temp_slots = [] + temp_tools = {} + for v in exc_final.tools.values(): + dia_list.append(float(v["C"])) + dia_list.sort() + for ordered_dia in dia_list: + current_tool += 1 + tool_name_temp = str(current_tool) + spec_temp = {"C": float(ordered_dia)} + temp_tools[tool_name_temp] = spec_temp + + for drill in exc_final.drills: + exc_tool_dia = float('%.3f' % exc_final.tools[drill['tool']]['C']) + if exc_tool_dia == ordered_dia: + temp_drills.append( + { + "point": drill["point"], + "tool": str(current_tool) + } + ) + + for slot in exc_final.slots: + slot_tool_dia = float('%.3f' % exc_final.tools[slot['tool']]['C']) + if slot_tool_dia == ordered_dia: + temp_slots.append( + { + "start": slot["start"], + "stop": slot["stop"], + "tool": str(current_tool) + } + ) + + # delete the exc_final tools, drills and slots + exc_final.tools = dict() + exc_final.drills[:] = [] + exc_final.slots[:] = [] + + # update the exc_final tools, drills and slots with the ordered values + exc_final.tools = temp_tools + exc_final.drills[:] = temp_drills + exc_final.slots[:] = temp_slots + # create the geometry for the exc_final object exc_final.create_geometry() diff --git a/README.md b/README.md index 34ffe01b..1e9d5413 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ CAD program, and create G-Code for Isolation routing. - added icons to the Project Tab context menu - added new entries to the Canvas context menu (Copy, Delete, Edit/Save, Move, New Excellon, New Geometry, New Project) - fixed grbl_laser postprocessor file +- updated function for copy of an Excellon object for the case when the object has slots +- updated FlatCAMExcellon.merge() function to work in case some (or all) of the merged objects have slots 25.01.2019