Path optimization: Connect adjacent paths.
This commit is contained in:
72
camlib.py
72
camlib.py
@@ -77,10 +77,6 @@ class Geometry(object):
|
|||||||
# Flattened geometry (list of paths only)
|
# Flattened geometry (list of paths only)
|
||||||
self.flat_geometry = []
|
self.flat_geometry = []
|
||||||
|
|
||||||
# Flat geometry rtree index
|
|
||||||
# When geometry gets flattened it is indexed here.
|
|
||||||
self.flat_geometry_rtree = rtindex.Index()
|
|
||||||
|
|
||||||
def add_circle(self, origin, radius):
|
def add_circle(self, origin, radius):
|
||||||
"""
|
"""
|
||||||
Adds a circle to the object.
|
Adds a circle to the object.
|
||||||
@@ -362,7 +358,14 @@ class Geometry(object):
|
|||||||
inner_edges.append(y)
|
inner_edges.append(y)
|
||||||
geoms += outer_edges + inner_edges
|
geoms += outer_edges + inner_edges
|
||||||
|
|
||||||
return geoms
|
# Optimization
|
||||||
|
# TODO: Re-architecture?
|
||||||
|
g = Geometry()
|
||||||
|
g.solid_geometry = geoms
|
||||||
|
g.path_connect()
|
||||||
|
return g.flat_geometry
|
||||||
|
|
||||||
|
#return geoms
|
||||||
|
|
||||||
def scale(self, factor):
|
def scale(self, factor):
|
||||||
"""
|
"""
|
||||||
@@ -391,9 +394,66 @@ class Geometry(object):
|
|||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.flatten(pathonly=True)
|
flat_geometry = self.flatten(pathonly=True)
|
||||||
|
|
||||||
|
## Index first and last points in paths
|
||||||
|
def get_pts(o):
|
||||||
|
return [o.coords[0], o.coords[-1]]
|
||||||
|
|
||||||
|
storage = FlatCAMRTreeStorage()
|
||||||
|
storage.get_points = get_pts
|
||||||
|
|
||||||
|
for shape in flat_geometry:
|
||||||
|
if shape is not None: # TODO: This shouldn't have happened.
|
||||||
|
storage.insert(shape)
|
||||||
|
|
||||||
|
optimized_geometry = []
|
||||||
|
path_count = 0
|
||||||
|
current_pt = (0, 0)
|
||||||
|
pt, geo = storage.nearest(current_pt)
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
path_count += 1
|
||||||
|
try:
|
||||||
|
storage.remove(geo)
|
||||||
|
except Exception, e:
|
||||||
|
log.debug('path_connect(), geo not in storage:')
|
||||||
|
log.debug(str(e))
|
||||||
|
|
||||||
|
left = storage.nearest(geo.coords[0])
|
||||||
|
|
||||||
|
if left.coords[0] == geo.coords[0]:
|
||||||
|
storage.remove(left)
|
||||||
|
geo = geo.union(left)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if left.coords[-1] == geo.coords[0]:
|
||||||
|
storage.remove(left)
|
||||||
|
geo.union(left)
|
||||||
|
continue
|
||||||
|
|
||||||
|
right = storage.nearest(geo.coords[-1])
|
||||||
|
|
||||||
|
if right.coords[0] == geo.coords[-1]:
|
||||||
|
storage.remove(right)
|
||||||
|
geo = geo.union(right)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if right.coords[-1] == geo.coords[-1]:
|
||||||
|
storage.remove(right)
|
||||||
|
geo.union(right)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# No matches on either end
|
||||||
|
optimized_geometry.append[geo]
|
||||||
|
|
||||||
|
# Next
|
||||||
|
geo = storage.nearest(geo.coords[0])
|
||||||
|
|
||||||
|
except StopIteration: # Nothing found in storage.
|
||||||
|
pass
|
||||||
|
|
||||||
|
self.flat_geometry = optimized_geometry
|
||||||
|
|
||||||
def convert_units(self, units):
|
def convert_units(self, units):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user