- added control for simplification when loading a Gerber file in Preferences -> Gerber -> Gerber General -> Simplify
This commit is contained in:
parent
7ad03f9f0a
commit
67808466d6
@ -447,6 +447,8 @@ class App(QtCore.QObject):
|
|||||||
"gerber_multicolored": self.ui.gerber_defaults_form.gerber_gen_group.multicolored_cb,
|
"gerber_multicolored": self.ui.gerber_defaults_form.gerber_gen_group.multicolored_cb,
|
||||||
"gerber_circle_steps": self.ui.gerber_defaults_form.gerber_gen_group.circle_steps_entry,
|
"gerber_circle_steps": self.ui.gerber_defaults_form.gerber_gen_group.circle_steps_entry,
|
||||||
"gerber_buffering": self.ui.gerber_defaults_form.gerber_gen_group.buffering_radio,
|
"gerber_buffering": self.ui.gerber_defaults_form.gerber_gen_group.buffering_radio,
|
||||||
|
"gerber_simplification": self.ui.gerber_defaults_form.gerber_gen_group.simplify_cb,
|
||||||
|
"gerber_simp_tolerance": self.ui.gerber_defaults_form.gerber_gen_group.simplification_tol_spinner,
|
||||||
|
|
||||||
# Gerber Options
|
# Gerber Options
|
||||||
"gerber_isotooldia": self.ui.gerber_defaults_form.gerber_opt_group.iso_tool_dia_entry,
|
"gerber_isotooldia": self.ui.gerber_defaults_form.gerber_opt_group.iso_tool_dia_entry,
|
||||||
@ -853,6 +855,8 @@ class App(QtCore.QObject):
|
|||||||
"gerber_circle_steps": 128,
|
"gerber_circle_steps": 128,
|
||||||
"gerber_use_buffer_for_union": True,
|
"gerber_use_buffer_for_union": True,
|
||||||
"gerber_buffering": "full",
|
"gerber_buffering": "full",
|
||||||
|
"gerber_simplification": False,
|
||||||
|
"gerber_simp_tolerance": 0.0005,
|
||||||
|
|
||||||
# Gerber Options
|
# Gerber Options
|
||||||
"gerber_isotooldia": 0.00787402,
|
"gerber_isotooldia": 0.00787402,
|
||||||
|
@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing.
|
|||||||
|
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
|
13.09.2019
|
||||||
|
|
||||||
|
- added control for simplification when loading a Gerber file in Preferences -> Gerber -> Gerber General -> Simplify
|
||||||
|
|
||||||
12.09.2019
|
12.09.2019
|
||||||
|
|
||||||
- small changes in the TclCommands: MillDrills, MillSlots, DrillCNCJob: the new parameter for tolerance is now named: tooldia
|
- small changes in the TclCommands: MillDrills, MillSlots, DrillCNCJob: the new parameter for tolerance is now named: tooldia
|
||||||
|
80
camlib.py
80
camlib.py
@ -2457,6 +2457,8 @@ class Gerber (Geometry):
|
|||||||
line_num = 0
|
line_num = 0
|
||||||
gline = ""
|
gline = ""
|
||||||
|
|
||||||
|
s_tol = float(self.app.defaults["gerber_simp_tolerance"])
|
||||||
|
|
||||||
self.app.inform.emit('%s %d %s.' % (_("Gerber processing. Parsing"), len(glines), _("lines")))
|
self.app.inform.emit('%s %d %s.' % (_("Gerber processing. Parsing"), len(glines), _("lines")))
|
||||||
try:
|
try:
|
||||||
for gline in glines:
|
for gline in glines:
|
||||||
@ -2502,7 +2504,10 @@ class Gerber (Geometry):
|
|||||||
|
|
||||||
geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4))
|
geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4))
|
||||||
if not geo_s.is_empty:
|
if not geo_s.is_empty:
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
@ -2692,7 +2697,10 @@ class Gerber (Geometry):
|
|||||||
geo_dict['follow'] = Point([current_x, current_y])
|
geo_dict['follow'] = Point([current_x, current_y])
|
||||||
|
|
||||||
if not flash.is_empty:
|
if not flash.is_empty:
|
||||||
poly_buffer.append(flash)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(flash.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(flash)
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = flash
|
geo_dict['clear'] = flash
|
||||||
else:
|
else:
|
||||||
@ -2743,7 +2751,10 @@ class Gerber (Geometry):
|
|||||||
width = self.apertures[last_path_aperture]["size"]
|
width = self.apertures[last_path_aperture]["size"]
|
||||||
geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4))
|
geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4))
|
||||||
if not geo_s.is_empty:
|
if not geo_s.is_empty:
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
@ -2776,7 +2787,10 @@ class Gerber (Geometry):
|
|||||||
width = self.apertures[last_path_aperture]["size"]
|
width = self.apertures[last_path_aperture]["size"]
|
||||||
geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4))
|
geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4))
|
||||||
if not geo_s.is_empty:
|
if not geo_s.is_empty:
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
@ -2817,7 +2831,10 @@ class Gerber (Geometry):
|
|||||||
geo_dict['follow'] = geo_f
|
geo_dict['follow'] = geo_f
|
||||||
if geo_s:
|
if geo_s:
|
||||||
if not geo_s.is_empty:
|
if not geo_s.is_empty:
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
@ -2850,7 +2867,10 @@ class Gerber (Geometry):
|
|||||||
region_s = region_s.buffer(0, int(self.steps_per_circle / 4))
|
region_s = region_s.buffer(0, int(self.steps_per_circle / 4))
|
||||||
|
|
||||||
if not region_s.is_empty:
|
if not region_s.is_empty:
|
||||||
poly_buffer.append(region_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(region_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(region_s)
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = region_s
|
geo_dict['clear'] = region_s
|
||||||
else:
|
else:
|
||||||
@ -2932,7 +2952,11 @@ class Gerber (Geometry):
|
|||||||
geo_dict['follow'] = geo_f
|
geo_dict['follow'] = geo_f
|
||||||
|
|
||||||
geo_s = shply_box(minx, miny, maxx, maxy)
|
geo_s = shply_box(minx, miny, maxx, maxy)
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
|
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
@ -3020,14 +3044,22 @@ class Gerber (Geometry):
|
|||||||
try:
|
try:
|
||||||
if self.apertures[last_path_aperture]["type"] != 'R':
|
if self.apertures[last_path_aperture]["type"] != 'R':
|
||||||
if not geo_s.is_empty:
|
if not geo_s.is_empty:
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
|
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
geo_dict['solid'] = geo_s
|
geo_dict['solid'] = geo_s
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.debug("camlib.Gerber.parse_lines() --> %s" % str(e))
|
log.debug("camlib.Gerber.parse_lines() --> %s" % str(e))
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
|
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
@ -3075,13 +3107,21 @@ class Gerber (Geometry):
|
|||||||
if not geo_s.is_empty:
|
if not geo_s.is_empty:
|
||||||
try:
|
try:
|
||||||
if self.apertures[last_path_aperture]["type"] != 'R':
|
if self.apertures[last_path_aperture]["type"] != 'R':
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
|
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
geo_dict['solid'] = geo_s
|
geo_dict['solid'] = geo_s
|
||||||
except:
|
except:
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
|
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
@ -3111,7 +3151,11 @@ class Gerber (Geometry):
|
|||||||
self.steps_per_circle
|
self.steps_per_circle
|
||||||
)
|
)
|
||||||
if not flash.is_empty:
|
if not flash.is_empty:
|
||||||
poly_buffer.append(flash)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(flash.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(flash)
|
||||||
|
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = flash
|
geo_dict['clear'] = flash
|
||||||
else:
|
else:
|
||||||
@ -3210,7 +3254,11 @@ class Gerber (Geometry):
|
|||||||
# this treats the case when we are storing geometry as solids
|
# this treats the case when we are storing geometry as solids
|
||||||
buffered = LineString(path).buffer(width / 1.999, int(self.steps_per_circle))
|
buffered = LineString(path).buffer(width / 1.999, int(self.steps_per_circle))
|
||||||
if not buffered.is_empty:
|
if not buffered.is_empty:
|
||||||
poly_buffer.append(buffered)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(buffered.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(buffered)
|
||||||
|
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = buffered
|
geo_dict['clear'] = buffered
|
||||||
else:
|
else:
|
||||||
@ -3348,7 +3396,11 @@ class Gerber (Geometry):
|
|||||||
width = self.apertures[last_path_aperture]["size"]
|
width = self.apertures[last_path_aperture]["size"]
|
||||||
geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4))
|
geo_s = LineString(path).buffer(width / 1.999, int(self.steps_per_circle / 4))
|
||||||
if not geo_s.is_empty:
|
if not geo_s.is_empty:
|
||||||
poly_buffer.append(geo_s)
|
if self.app.defaults['gerber_simplification']:
|
||||||
|
poly_buffer.append(geo_s.simplify(s_tol))
|
||||||
|
else:
|
||||||
|
poly_buffer.append(geo_s)
|
||||||
|
|
||||||
if self.is_lpc is True:
|
if self.is_lpc is True:
|
||||||
geo_dict['clear'] = geo_s
|
geo_dict['clear'] = geo_s
|
||||||
else:
|
else:
|
||||||
|
@ -4300,6 +4300,7 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
|
|||||||
self.portability_label.hide()
|
self.portability_label.hide()
|
||||||
self.portability_cb.hide()
|
self.portability_cb.hide()
|
||||||
|
|
||||||
|
|
||||||
class GerberGenPrefGroupUI(OptionsGroupUI):
|
class GerberGenPrefGroupUI(OptionsGroupUI):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
# OptionsGroupUI.__init__(self, "Gerber General Preferences", parent=parent)
|
# OptionsGroupUI.__init__(self, "Gerber General Preferences", parent=parent)
|
||||||
@ -4358,6 +4359,27 @@ class GerberGenPrefGroupUI(OptionsGroupUI):
|
|||||||
grid0.addWidget(buffering_label, 2, 0)
|
grid0.addWidget(buffering_label, 2, 0)
|
||||||
grid0.addWidget(self.buffering_radio, 2, 1)
|
grid0.addWidget(self.buffering_radio, 2, 1)
|
||||||
|
|
||||||
|
# Simplification
|
||||||
|
self.simplify_cb = FCCheckBox(label=_('Simplify'))
|
||||||
|
self.simplify_cb.setToolTip(_("When checked all the Gerber polygons will be\n"
|
||||||
|
"loaded with simplification having a set tolerance."))
|
||||||
|
grid0.addWidget(self.simplify_cb, 3, 0)
|
||||||
|
|
||||||
|
# Simplification tolerance
|
||||||
|
self.simplification_tol_label = QtWidgets.QLabel(_('Tolerance'))
|
||||||
|
self.simplification_tol_label.setToolTip(_("Tolerance for poligon simplification."))
|
||||||
|
|
||||||
|
self.simplification_tol_spinner = FCDoubleSpinner()
|
||||||
|
self.simplification_tol_spinner.set_precision(5)
|
||||||
|
self.simplification_tol_spinner.setWrapping(True)
|
||||||
|
self.simplification_tol_spinner.setRange(0.00000, 0.01000)
|
||||||
|
self.simplification_tol_spinner.setSingleStep(0.0001)
|
||||||
|
|
||||||
|
grid0.addWidget(self.simplification_tol_label, 4, 0)
|
||||||
|
grid0.addWidget(self.simplification_tol_spinner, 4, 1)
|
||||||
|
self.ois_simplif = OptionalInputSection(self.simplify_cb,
|
||||||
|
[self.simplification_tol_label, self.simplification_tol_spinner],
|
||||||
|
logic=True)
|
||||||
self.layout.addStretch()
|
self.layout.addStretch()
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user