- 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
This commit is contained in:
Marius Stanciu 2019-01-26 09:08:41 +02:00 committed by Marius S
parent 34749cae66
commit c0031235cd
3 changed files with 119 additions and 10 deletions

View File

@ -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():

View File

@ -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()

View File

@ -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