- 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:
parent
34749cae66
commit
c0031235cd
@ -3126,6 +3126,8 @@ class App(QtCore.QObject):
|
|||||||
|
|
||||||
# drills are offset, so they need to be deep copied
|
# drills are offset, so they need to be deep copied
|
||||||
obj_init.drills = deepcopy(obj.drills)
|
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()
|
obj_init.create_geometry()
|
||||||
|
|
||||||
for obj in self.collection.get_selected():
|
for obj in self.collection.get_selected():
|
||||||
@ -3161,6 +3163,8 @@ class App(QtCore.QObject):
|
|||||||
obj_init.tools = obj.tools
|
obj_init.tools = obj.tools
|
||||||
# drills are offset, so they need to be deep copied
|
# drills are offset, so they need to be deep copied
|
||||||
obj_init.drills = deepcopy(obj.drills)
|
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()
|
obj_init.create_geometry()
|
||||||
|
|
||||||
for obj in self.collection.get_selected():
|
for obj in self.collection.get_selected():
|
||||||
|
123
FlatCAMObj.py
123
FlatCAMObj.py
@ -899,14 +899,21 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
|
|||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# flag to signal that we need to reorder the tools dictionary and drills and slots lists
|
||||||
|
flag_order = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
flattened_list = list(itertools.chain(*exc_list))
|
flattened_list = list(itertools.chain(*exc_list))
|
||||||
except TypeError:
|
except TypeError:
|
||||||
flattened_list = exc_list
|
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
|
# 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
|
# values will be list of Shapely Points; for drills
|
||||||
custom_dict = {}
|
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:
|
for exc in flattened_list:
|
||||||
# copy options of the current excellon obj to the final excellon obj
|
# 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:
|
for drill in exc.drills:
|
||||||
exc_tool_dia = float('%.3f' % exc.tools[drill['tool']]['C'])
|
exc_tool_dia = float('%.3f' % exc.tools[drill['tool']]['C'])
|
||||||
|
|
||||||
if exc_tool_dia not in custom_dict:
|
if exc_tool_dia not in custom_dict_drills:
|
||||||
custom_dict[exc_tool_dia] = [drill['point']]
|
custom_dict_drills[exc_tool_dia] = [drill['point']]
|
||||||
else:
|
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.zeros = exc.zeros
|
||||||
exc_final.units = exc.units
|
exc_final.units = exc.units
|
||||||
|
|
||||||
# variable to make tool_name for the tools
|
# variable to make tool_name for the tools
|
||||||
current_tool = 0
|
current_tool = 0
|
||||||
|
|
||||||
# Here we add data to the exc_final object
|
# 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
|
# the tools diameter are now the keys in the drill_dia dict and the values are the Shapely Points in case of
|
||||||
for tool_dia in custom_dict:
|
# 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)
|
# we create a tool name for each key in the drill_dia dict (the key is a unique drill diameter)
|
||||||
current_tool += 1
|
current_tool += 1
|
||||||
|
|
||||||
@ -943,7 +958,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
|
|||||||
exc_final.tools[tool_name] = spec
|
exc_final.tools[tool_name] = spec
|
||||||
|
|
||||||
# rebuild the drills list of dict's that belong to the exc_final object
|
# 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(
|
exc_final.drills.append(
|
||||||
{
|
{
|
||||||
"point": point,
|
"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
|
# create the geometry for the exc_final object
|
||||||
exc_final.create_geometry()
|
exc_final.create_geometry()
|
||||||
|
|
||||||
|
@ -15,6 +15,8 @@ CAD program, and create G-Code for Isolation routing.
|
|||||||
- added icons to the Project Tab context menu
|
- 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)
|
- added new entries to the Canvas context menu (Copy, Delete, Edit/Save, Move, New Excellon, New Geometry, New Project)
|
||||||
- fixed grbl_laser postprocessor file
|
- 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
|
25.01.2019
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user