Path optimization: Connect adjacent paths.

This commit is contained in:
jpcaram
2015-01-22 18:11:09 -05:00
parent e5185dd66f
commit a7dc9bcc09

View File

@@ -77,10 +77,6 @@ class Geometry(object):
# Flattened geometry (list of paths only)
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):
"""
Adds a circle to the object.
@@ -362,7 +358,14 @@ class Geometry(object):
inner_edges.append(y)
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):
"""
@@ -391,9 +394,66 @@ class Geometry(object):
: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):
"""