commit
8fb7469d32
|
@ -265,6 +265,7 @@ class App(QtCore.QObject):
|
||||||
"point_clipboard_format": "(%.4f, %.4f)",
|
"point_clipboard_format": "(%.4f, %.4f)",
|
||||||
"zdownrate": None,
|
"zdownrate": None,
|
||||||
"excellon_zeros": "L",
|
"excellon_zeros": "L",
|
||||||
|
"gerber_use_buffer_for_union": True,
|
||||||
"cncjob_coordinate_format": "X%.4fY%.4f"
|
"cncjob_coordinate_format": "X%.4fY%.4f"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -1807,6 +1808,7 @@ class App(QtCore.QObject):
|
||||||
routes = {
|
routes = {
|
||||||
"zdownrate": CNCjob,
|
"zdownrate": CNCjob,
|
||||||
"excellon_zeros": Excellon,
|
"excellon_zeros": Excellon,
|
||||||
|
"gerber_use_buffer_for_union": Gerber,
|
||||||
"cncjob_coordinate_format": CNCjob
|
"cncjob_coordinate_format": CNCjob
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
16
camlib.py
16
camlib.py
|
@ -1159,7 +1159,8 @@ class Gerber (Geometry):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
defaults = {
|
defaults = {
|
||||||
"steps_per_circle": 40
|
"steps_per_circle": 40,
|
||||||
|
"use_buffer_for_union": True
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, steps_per_circle=None):
|
def __init__(self, steps_per_circle=None):
|
||||||
|
@ -1277,6 +1278,8 @@ class Gerber (Geometry):
|
||||||
# How to discretize a circle.
|
# How to discretize a circle.
|
||||||
self.steps_per_circ = steps_per_circle or Gerber.defaults['steps_per_circle']
|
self.steps_per_circ = steps_per_circle or Gerber.defaults['steps_per_circle']
|
||||||
|
|
||||||
|
self.use_buffer_for_union = self.defaults["use_buffer_for_union"]
|
||||||
|
|
||||||
def scale(self, factor):
|
def scale(self, factor):
|
||||||
"""
|
"""
|
||||||
Scales the objects' geometry on the XY plane by a given factor.
|
Scales the objects' geometry on the XY plane by a given factor.
|
||||||
|
@ -1964,8 +1967,15 @@ class Gerber (Geometry):
|
||||||
|
|
||||||
# --- Apply buffer ---
|
# --- Apply buffer ---
|
||||||
log.warn("Joining %d polygons." % len(poly_buffer))
|
log.warn("Joining %d polygons." % len(poly_buffer))
|
||||||
new_poly = cascaded_union(poly_buffer)
|
if (self.use_buffer_for_union):
|
||||||
new_poly = new_poly.buffer(0)
|
new_poly = MultiPolygon(poly_buffer)
|
||||||
|
new_poly = new_poly.buffer(0.00000001)
|
||||||
|
new_poly = new_poly.buffer(-0.00000001)
|
||||||
|
log.warn("Union(buffer) done.")
|
||||||
|
else:
|
||||||
|
new_poly = cascaded_union(poly_buffer)
|
||||||
|
new_poly = new_poly = new_poly.buffer(0)
|
||||||
|
log.warn("Union done.")
|
||||||
if current_polarity == 'D':
|
if current_polarity == 'D':
|
||||||
self.solid_geometry = self.solid_geometry.union(new_poly)
|
self.solid_geometry = self.solid_geometry.union(new_poly)
|
||||||
else:
|
else:
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,44 @@
|
||||||
|
import unittest
|
||||||
|
import camlib
|
||||||
|
from shapely.geometry import Polygon, LineString, Point, LinearRing
|
||||||
|
from shapely.geometry import MultiPoint, MultiPolygon
|
||||||
|
from shapely.geometry import box as shply_box
|
||||||
|
from shapely.ops import cascaded_union
|
||||||
|
import shapely.affinity as affinity
|
||||||
|
from shapely.wkt import loads as sloads
|
||||||
|
from shapely.wkt import dumps as sdumps
|
||||||
|
from shapely.geometry.base import BaseGeometry
|
||||||
|
|
||||||
|
class GerberBuffer(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.gerber1 = camlib.Gerber()
|
||||||
|
self.gerber1.use_buffer_for_union = True
|
||||||
|
self.gerber1.parse_file ("./gerber_files/STM32F4-spindle.cmp")
|
||||||
|
geometry1 = self.gerber1.solid_geometry
|
||||||
|
self.geometry1_area = self.compute_area (geometry1)
|
||||||
|
self.gerber2 = camlib.Gerber()
|
||||||
|
self.gerber2.use_buffer_for_union = False
|
||||||
|
self.gerber2.parse_file ("./gerber_files/STM32F4-spindle.cmp")
|
||||||
|
geometry2 = self.gerber2.solid_geometry
|
||||||
|
self.geometry2_area = self.compute_area (geometry2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def compute_area (self, geometry):
|
||||||
|
area = 0
|
||||||
|
try:
|
||||||
|
for geo in geometry:
|
||||||
|
area += geo.area
|
||||||
|
|
||||||
|
## Not iterable, do the actual indexing and add.
|
||||||
|
except TypeError:
|
||||||
|
area = geometry.area
|
||||||
|
return area
|
||||||
|
|
||||||
|
|
||||||
|
def test_buffer(self):
|
||||||
|
self.assertLessEqual (abs(self.geometry2_area - self.geometry1_area), 0.000001)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
Loading…
Reference in New Issue