- some code reformatting in Extract Plugin
This commit is contained in:
@@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta
|
|||||||
|
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
|
18.09.2021
|
||||||
|
|
||||||
|
- some code reformatting in Extract Plugin
|
||||||
|
|
||||||
15.09.2021
|
15.09.2021
|
||||||
|
|
||||||
- updated the Chinese translation by 俊霄 余
|
- updated the Chinese translation by 俊霄 余
|
||||||
|
|||||||
@@ -376,17 +376,6 @@ class ToolExtract(AppTool):
|
|||||||
self.ui.other_cb.setChecked(False)
|
self.ui.other_cb.setChecked(False)
|
||||||
|
|
||||||
def on_extract_drills_click(self):
|
def on_extract_drills_click(self):
|
||||||
drill_dia = self.ui.dia_entry.get_value()
|
|
||||||
circ_r_val = self.ui.circular_ring_entry.get_value()
|
|
||||||
oblong_r_val = self.ui.oblong_ring_entry.get_value()
|
|
||||||
square_r_val = self.ui.square_ring_entry.get_value()
|
|
||||||
rect_r_val = self.ui.rectangular_ring_entry.get_value()
|
|
||||||
other_r_val = self.ui.other_ring_entry.get_value()
|
|
||||||
|
|
||||||
prop_factor = self.ui.factor_entry.get_value() / 100.0
|
|
||||||
|
|
||||||
tools = {}
|
|
||||||
|
|
||||||
selection_index = self.ui.gerber_object_combo.currentIndex()
|
selection_index = self.ui.gerber_object_combo.currentIndex()
|
||||||
model_index = self.app.collection.index(selection_index, 0, self.ui.gerber_object_combo.rootModelIndex())
|
model_index = self.app.collection.index(selection_index, 0, self.ui.gerber_object_combo.rootModelIndex())
|
||||||
|
|
||||||
@@ -395,17 +384,45 @@ class ToolExtract(AppTool):
|
|||||||
except Exception:
|
except Exception:
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s' % _("There is no Gerber object loaded ..."))
|
self.app.inform.emit('[WARNING_NOTCL] %s' % _("There is no Gerber object loaded ..."))
|
||||||
return
|
return
|
||||||
|
outname = "%s_%s" % (fcobj.options['name'].rpartition('.')[0], _("extracted"))
|
||||||
outname = fcobj.options['name'].rpartition('.')[0]
|
|
||||||
|
|
||||||
mode = self.ui.method_radio.get_value()
|
|
||||||
|
|
||||||
# selected codes in the apertures UI table
|
# selected codes in the apertures UI table
|
||||||
sel_apid = []
|
sel_g_tools = [int(it.text()) for it in self.ui.apertures_table.selectedItems()]
|
||||||
for it in self.ui.apertures_table.selectedItems():
|
|
||||||
sel_apid.append(int(it.text()))
|
|
||||||
|
|
||||||
|
mode = self.ui.method_radio.get_value()
|
||||||
if mode == 'fixed':
|
if mode == 'fixed':
|
||||||
|
tools = self.fixed_dia_mode(gerber_tools=fcobj.tools, sel_tools=sel_g_tools)
|
||||||
|
elif mode == 'ring':
|
||||||
|
tools = self.ring_mode(gerber_tools=fcobj.tools, sel_tools=sel_g_tools)
|
||||||
|
else: # proportional
|
||||||
|
tools = self.proportional_mode(gerber_tools=fcobj.tools, sel_tools=sel_g_tools)
|
||||||
|
|
||||||
|
if not tools:
|
||||||
|
self.app.inform.emit('[ERROR_NOTCL] %s' % _("Failed."))
|
||||||
|
return
|
||||||
|
|
||||||
|
def obj_init(obj_inst, app_inst):
|
||||||
|
obj_inst.tools = deepcopy(tools)
|
||||||
|
obj_inst.create_geometry()
|
||||||
|
obj_inst.source_file = app_inst.f_handlers.export_excellon(obj_name=outname, local_use=obj_inst,
|
||||||
|
filename=None,
|
||||||
|
use_thread=False)
|
||||||
|
|
||||||
|
with self.app.proc_container.new('%s...' % _("Working")):
|
||||||
|
try:
|
||||||
|
self.app.app_obj.new_object("excellon", outname, obj_init)
|
||||||
|
except Exception as e:
|
||||||
|
self.app.log.error("Error on Extracted Excellon object creation: %s" % str(e))
|
||||||
|
return
|
||||||
|
|
||||||
|
def fixed_dia_mode(self, gerber_tools, sel_tools):
|
||||||
|
drill_dia = self.ui.dia_entry.get_value()
|
||||||
|
|
||||||
|
allow_circular = self.ui.circular_cb.get_value()
|
||||||
|
allow_oblong = self.ui.oblong_cb.get_value()
|
||||||
|
allow_rectangular = self.ui.rectangular_cb.get_value()
|
||||||
|
allow_other_type = self.ui.other_cb.get_value()
|
||||||
|
|
||||||
tools = {
|
tools = {
|
||||||
1: {
|
1: {
|
||||||
"tooldia": drill_dia,
|
"tooldia": drill_dia,
|
||||||
@@ -414,13 +431,13 @@ class ToolExtract(AppTool):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for apid, apid_value in fcobj.tools.items():
|
for apid, apid_value in gerber_tools.items():
|
||||||
if apid in sel_apid:
|
if apid in sel_tools:
|
||||||
ap_type = apid_value['type']
|
ap_type = apid_value['type']
|
||||||
|
|
||||||
if ap_type == 'C' and self.ui.circular_cb.get_value() is False:
|
if ap_type == 'C' and allow_circular is False:
|
||||||
continue
|
continue
|
||||||
elif ap_type == 'O' and self.ui.oblong_cb.get_value() is False:
|
elif ap_type == 'O' and allow_oblong is False:
|
||||||
continue
|
continue
|
||||||
elif ap_type == 'R':
|
elif ap_type == 'R':
|
||||||
width = float(apid_value['width'])
|
width = float(apid_value['width'])
|
||||||
@@ -430,9 +447,9 @@ class ToolExtract(AppTool):
|
|||||||
if round(width, self.decimals) == round(height, self.decimals):
|
if round(width, self.decimals) == round(height, self.decimals):
|
||||||
if self.ui.square_cb.get_value() is False:
|
if self.ui.square_cb.get_value() is False:
|
||||||
continue
|
continue
|
||||||
elif self.ui.rectangular_cb.get_value() is False:
|
elif allow_rectangular is False:
|
||||||
continue
|
continue
|
||||||
elif ap_type not in ['C', 'R', 'O'] and self.ui.other_cb.get_value() is False:
|
elif ap_type not in ['C', 'R', 'O'] and allow_other_type is False:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for geo_el in apid_value['geometry']:
|
for geo_el in apid_value['geometry']:
|
||||||
@@ -445,16 +462,33 @@ class ToolExtract(AppTool):
|
|||||||
if 'solid_geometry' not in tools[1] or not tools[1]['solid_geometry']:
|
if 'solid_geometry' not in tools[1] or not tools[1]['solid_geometry']:
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s' % _("No drills extracted. Try different parameters."))
|
self.app.inform.emit('[WARNING_NOTCL] %s' % _("No drills extracted. Try different parameters."))
|
||||||
return
|
return
|
||||||
elif mode == 'ring':
|
|
||||||
|
return tools
|
||||||
|
|
||||||
|
def ring_mode(self, gerber_tools, sel_tools):
|
||||||
|
circ_r_val = self.ui.circular_ring_entry.get_value()
|
||||||
|
oblong_r_val = self.ui.oblong_ring_entry.get_value()
|
||||||
|
square_r_val = self.ui.square_ring_entry.get_value()
|
||||||
|
rect_r_val = self.ui.rectangular_ring_entry.get_value()
|
||||||
|
other_r_val = self.ui.other_ring_entry.get_value()
|
||||||
|
|
||||||
|
allow_circular = self.ui.circular_cb.get_value()
|
||||||
|
allow_oblong = self.ui.oblong_cb.get_value()
|
||||||
|
allow_rectangular = self.ui.rectangular_cb.get_value()
|
||||||
|
allow_square = self.ui.square_cb.get_value()
|
||||||
|
allow_others_type = self.ui.other_cb.get_value()
|
||||||
|
|
||||||
drills_found = set()
|
drills_found = set()
|
||||||
for apid, apid_value in fcobj.tools.items():
|
tools = {}
|
||||||
if apid in sel_apid:
|
|
||||||
|
for apid, apid_value in gerber_tools.items():
|
||||||
|
if apid in sel_tools:
|
||||||
ap_type = apid_value['type']
|
ap_type = apid_value['type']
|
||||||
|
|
||||||
dia = None
|
dia = None
|
||||||
if ap_type == 'C' and self.ui.circular_cb.get_value():
|
if ap_type == 'C' and allow_circular:
|
||||||
dia = float(apid_value['size']) - (2 * circ_r_val)
|
dia = float(apid_value['size']) - (2 * circ_r_val)
|
||||||
elif ap_type == 'O' and self.ui.oblong_cb.get_value():
|
elif ap_type == 'O' and allow_oblong:
|
||||||
width = float(apid_value['width'])
|
width = float(apid_value['width'])
|
||||||
height = float(apid_value['height'])
|
height = float(apid_value['height'])
|
||||||
if width > height:
|
if width > height:
|
||||||
@@ -466,16 +500,17 @@ class ToolExtract(AppTool):
|
|||||||
height = float(apid_value['height'])
|
height = float(apid_value['height'])
|
||||||
|
|
||||||
# if the height == width (float numbers so the reason for the following)
|
# if the height == width (float numbers so the reason for the following)
|
||||||
if abs(float('%.*f' % (self.decimals, width)) - float('%.*f' % (self.decimals, height))) < \
|
formatted_width = self.app.dec_format(width, self.decimals)
|
||||||
(10 ** -self.decimals):
|
formatted_height = self.app.dec_format(height, self.decimals)
|
||||||
if self.ui.square_cb.get_value():
|
if abs(formatted_width - formatted_height) < (10 ** -self.decimals):
|
||||||
|
if allow_square:
|
||||||
dia = float(apid_value['height']) - (2 * square_r_val)
|
dia = float(apid_value['height']) - (2 * square_r_val)
|
||||||
elif self.ui.rectangular_cb.get_value():
|
elif allow_rectangular:
|
||||||
if width > height:
|
if width > height:
|
||||||
dia = float(apid_value['height']) - (2 * rect_r_val)
|
dia = float(apid_value['height']) - (2 * rect_r_val)
|
||||||
else:
|
else:
|
||||||
dia = float(apid_value['width']) - (2 * rect_r_val)
|
dia = float(apid_value['width']) - (2 * rect_r_val)
|
||||||
elif self.ui.other_cb.get_value():
|
elif allow_others_type:
|
||||||
try:
|
try:
|
||||||
dia = float(apid_value['size']) - (2 * other_r_val)
|
dia = float(apid_value['size']) - (2 * other_r_val)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -495,9 +530,9 @@ class ToolExtract(AppTool):
|
|||||||
|
|
||||||
tool_in_drills = False
|
tool_in_drills = False
|
||||||
for tool, tool_val in tools.items():
|
for tool, tool_val in tools.items():
|
||||||
if abs(float('%.*f' % (
|
formatted_tooldia = self.app.dec_format(tool_val["tooldia"])
|
||||||
self.decimals,
|
formatted_dia = self.app.dec_format(dia, self.decimals)
|
||||||
tool_val["tooldia"])) - float('%.*f' % (self.decimals, dia))) < (10 ** -self.decimals):
|
if abs(formatted_tooldia - formatted_dia) < (10 ** -self.decimals):
|
||||||
tool_in_drills = tool
|
tool_in_drills = tool
|
||||||
|
|
||||||
if tool_in_drills is False:
|
if tool_in_drills is False:
|
||||||
@@ -532,16 +567,28 @@ class ToolExtract(AppTool):
|
|||||||
if True not in drills_found:
|
if True not in drills_found:
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s' % _("No drills extracted. Try different parameters."))
|
self.app.inform.emit('[WARNING_NOTCL] %s' % _("No drills extracted. Try different parameters."))
|
||||||
return
|
return
|
||||||
else:
|
|
||||||
|
return tools
|
||||||
|
|
||||||
|
def proportional_mode(self, gerber_tools, sel_tools):
|
||||||
|
prop_factor = self.ui.factor_entry.get_value() / 100.0
|
||||||
|
|
||||||
|
allow_circular = self.ui.circular_cb.get_value()
|
||||||
|
allow_oblong = self.ui.oblong_cb.get_value()
|
||||||
|
allow_rectangular = self.ui.rectangular_cb.get_value()
|
||||||
|
allow_square = self.ui.square_cb.get_value()
|
||||||
|
allow_others_type = self.ui.other_cb.get_value()
|
||||||
|
|
||||||
|
tools = {}
|
||||||
drills_found = set()
|
drills_found = set()
|
||||||
for apid, apid_value in fcobj.tools.items():
|
for apid, apid_value in gerber_tools.items():
|
||||||
if apid in sel_apid:
|
if apid in sel_tools:
|
||||||
ap_type = apid_value['type']
|
ap_type = apid_value['type']
|
||||||
|
|
||||||
dia = None
|
dia = None
|
||||||
if ap_type == 'C' and self.ui.circular_cb.get_value():
|
if ap_type == 'C' and allow_circular:
|
||||||
dia = float(apid_value['size']) * prop_factor
|
dia = float(apid_value['size']) * prop_factor
|
||||||
elif ap_type == 'O' and self.ui.oblong_cb.get_value():
|
elif ap_type == 'O' and allow_oblong:
|
||||||
width = float(apid_value['width'])
|
width = float(apid_value['width'])
|
||||||
height = float(apid_value['height'])
|
height = float(apid_value['height'])
|
||||||
if width > height:
|
if width > height:
|
||||||
@@ -553,16 +600,17 @@ class ToolExtract(AppTool):
|
|||||||
height = float(apid_value['height'])
|
height = float(apid_value['height'])
|
||||||
|
|
||||||
# if the height == width (float numbers so the reason for the following)
|
# if the height == width (float numbers so the reason for the following)
|
||||||
if abs(float('%.*f' % (self.decimals, width)) - float('%.*f' % (self.decimals, height))) < \
|
formatted_width = self.app.dec_format(width, self.decimals)
|
||||||
(10 ** -self.decimals):
|
formatted_height = self.app.dec_format(height, self.decimals)
|
||||||
if self.ui.square_cb.get_value():
|
if abs(formatted_width - formatted_height) < (10 ** -self.decimals):
|
||||||
|
if allow_square:
|
||||||
dia = float(apid_value['height']) * prop_factor
|
dia = float(apid_value['height']) * prop_factor
|
||||||
elif self.ui.rectangular_cb.get_value():
|
elif allow_rectangular:
|
||||||
if width > height:
|
if width > height:
|
||||||
dia = float(apid_value['height']) * prop_factor
|
dia = float(apid_value['height']) * prop_factor
|
||||||
else:
|
else:
|
||||||
dia = float(apid_value['width']) * prop_factor
|
dia = float(apid_value['width']) * prop_factor
|
||||||
elif self.ui.other_cb.get_value():
|
elif allow_others_type:
|
||||||
try:
|
try:
|
||||||
dia = float(apid_value['size']) * prop_factor
|
dia = float(apid_value['size']) * prop_factor
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -582,9 +630,9 @@ class ToolExtract(AppTool):
|
|||||||
|
|
||||||
tool_in_drills = False
|
tool_in_drills = False
|
||||||
for tool, tool_val in tools.items():
|
for tool, tool_val in tools.items():
|
||||||
if abs(float('%.*f' % (
|
formatted_tooldia = self.app.dec_format(tool_val["tooldia"])
|
||||||
self.decimals,
|
formatted_dia = self.app.dec_format(dia, self.decimals)
|
||||||
tool_val["tooldia"])) - float('%.*f' % (self.decimals, dia))) < (10 ** -self.decimals):
|
if abs(formatted_tooldia - formatted_dia) < (10 ** -self.decimals):
|
||||||
tool_in_drills = tool
|
tool_in_drills = tool
|
||||||
|
|
||||||
if tool_in_drills is False:
|
if tool_in_drills is False:
|
||||||
@@ -619,23 +667,9 @@ class ToolExtract(AppTool):
|
|||||||
if True not in drills_found:
|
if True not in drills_found:
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s' % _("No drills extracted. Try different parameters."))
|
self.app.inform.emit('[WARNING_NOTCL] %s' % _("No drills extracted. Try different parameters."))
|
||||||
return
|
return
|
||||||
|
return tools
|
||||||
def obj_init(obj_inst, app_inst):
|
|
||||||
obj_inst.tools = deepcopy(tools)
|
|
||||||
obj_inst.create_geometry()
|
|
||||||
obj_inst.source_file = app_inst.f_handlers.export_excellon(obj_name=outname, local_use=obj_inst,
|
|
||||||
filename=None,
|
|
||||||
use_thread=False)
|
|
||||||
|
|
||||||
with self.app.proc_container.new('%s...' % _("Working")):
|
|
||||||
try:
|
|
||||||
self.app.app_obj.new_object("excellon", outname, obj_init)
|
|
||||||
except Exception as e:
|
|
||||||
log.error("Error on Extracted Excellon object creation: %s" % str(e))
|
|
||||||
return
|
|
||||||
|
|
||||||
def on_extract_soldermask_click(self):
|
def on_extract_soldermask_click(self):
|
||||||
|
|
||||||
clearance = self.ui.clearance_entry.get_value()
|
clearance = self.ui.clearance_entry.get_value()
|
||||||
|
|
||||||
circ = self.ui.circular_cb.get_value()
|
circ = self.ui.circular_cb.get_value()
|
||||||
@@ -662,7 +696,6 @@ class ToolExtract(AppTool):
|
|||||||
except Exception:
|
except Exception:
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s' % _("There is no Gerber object loaded ..."))
|
self.app.inform.emit('[WARNING_NOTCL] %s' % _("There is no Gerber object loaded ..."))
|
||||||
return
|
return
|
||||||
|
|
||||||
outname = '%s_esm' % obj.options['name'].rpartition('.')[0]
|
outname = '%s_esm' % obj.options['name'].rpartition('.')[0]
|
||||||
|
|
||||||
new_apertures = deepcopy(obj.tools)
|
new_apertures = deepcopy(obj.tools)
|
||||||
@@ -670,12 +703,12 @@ class ToolExtract(AppTool):
|
|||||||
new_follow_geometry = []
|
new_follow_geometry = []
|
||||||
|
|
||||||
# selected codes in the apertures UI table
|
# selected codes in the apertures UI table
|
||||||
sel_apid = []
|
sel_g_tool = []
|
||||||
for it in self.ui.apertures_table.selectedItems():
|
for it in self.ui.apertures_table.selectedItems():
|
||||||
sel_apid.append(int(it.text()))
|
sel_g_tool.append(int(it.text()))
|
||||||
|
|
||||||
for apid, apid_value in obj.tools.items():
|
for apid, apid_value in obj.tools.items():
|
||||||
if apid in sel_apid:
|
if apid in sel_g_tool:
|
||||||
ap_type = apid_value['type']
|
ap_type = apid_value['type']
|
||||||
|
|
||||||
if ap_type not in allowed_apertures:
|
if ap_type not in allowed_apertures:
|
||||||
@@ -721,7 +754,7 @@ class ToolExtract(AppTool):
|
|||||||
new_apertures.pop(apid, None)
|
new_apertures.pop(apid, None)
|
||||||
|
|
||||||
if not has_geometry:
|
if not has_geometry:
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s %s' % (_("Failed."), _("No soldermask extracted.")))
|
self.app.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed."), _("No soldermask extracted.")))
|
||||||
return
|
return
|
||||||
|
|
||||||
def obj_init(new_obj, app_obj):
|
def obj_init(new_obj, app_obj):
|
||||||
@@ -770,7 +803,7 @@ class ToolExtract(AppTool):
|
|||||||
x0, y0, x1, y1 = cut_solid_geometry.bounds
|
x0, y0, x1, y1 = cut_solid_geometry.bounds
|
||||||
object_geo = box(x0, y0, x1, y1)
|
object_geo = box(x0, y0, x1, y1)
|
||||||
else:
|
else:
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s %s' % (_("Failed."), _("No cutout extracted.")))
|
self.app.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed."), _("No cutout extracted.")))
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -778,12 +811,12 @@ class ToolExtract(AppTool):
|
|||||||
new_geo_follow = geo_buf.exterior
|
new_geo_follow = geo_buf.exterior
|
||||||
new_geo_solid = new_geo_follow.buffer(buff_radius)
|
new_geo_solid = new_geo_follow.buffer(buff_radius)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.error("ToolExtrct.on_extrct_cutout_click() -> %s" % str(e))
|
self.app.log.error("ToolExtrct.on_extrct_cutout_click() -> %s" % str(e))
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s %s' % (_("Failed."), _("No cutout extracted.")))
|
self.app.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed."), _("No cutout extracted.")))
|
||||||
return
|
return
|
||||||
|
|
||||||
if not new_geo_solid.is_valid or new_geo_solid.is_empty:
|
if not new_geo_solid.is_valid or new_geo_solid.is_empty:
|
||||||
self.app.inform.emit('[WARNING_NOTCL] %s %s' % (_("Failed."), _("No cutout extracted.")))
|
self.app.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed."), _("No cutout extracted.")))
|
||||||
return
|
return
|
||||||
|
|
||||||
new_apertures = {
|
new_apertures = {
|
||||||
|
|||||||
Reference in New Issue
Block a user