Support for parallel-line painting.

This commit is contained in:
Juan Pablo Caram 2016-10-27 16:57:36 -04:00
parent deed138867
commit 0b26a90175
3 changed files with 80 additions and 3 deletions

View File

@ -1312,6 +1312,10 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
cp = self.clear_polygon2(poly.buffer(-self.options["paintmargin"]), cp = self.clear_polygon2(poly.buffer(-self.options["paintmargin"]),
tooldia, overlap=overlap) tooldia, overlap=overlap)
elif self.options["paintmethod"] == "lines":
# Type(cp) == FlatCAMRTreeStorage | None
cp = self.clear_polygon3(poly.buffer(-self.options["paintmargin"]),
tooldia, overlap=overlap)
else: else:
# Type(cp) == FlatCAMRTreeStorage | None # Type(cp) == FlatCAMRTreeStorage | None
cp = self.clear_polygon(poly.buffer(-self.options["paintmargin"]), cp = self.clear_polygon(poly.buffer(-self.options["paintmargin"]),
@ -1387,6 +1391,11 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
cp = self.clear_polygon2(poly.buffer(-self.options["paintmargin"]), cp = self.clear_polygon2(poly.buffer(-self.options["paintmargin"]),
tooldia, overlap=overlap) tooldia, overlap=overlap)
elif self.options["paintmethod"] == "lines":
# Type(cp) == FlatCAMRTreeStorage | None
cp = self.clear_polygon3(poly.buffer(-self.options["paintmargin"]),
tooldia, overlap=overlap)
else: else:
# Type(cp) == FlatCAMRTreeStorage | None # Type(cp) == FlatCAMRTreeStorage | None
cp = self.clear_polygon(poly.buffer(-self.options["paintmargin"]), cp = self.clear_polygon(poly.buffer(-self.options["paintmargin"]),

View File

@ -393,7 +393,8 @@ class GeometryObjectUI(ObjectUI):
grid2.addWidget(methodlabel, 3, 0) grid2.addWidget(methodlabel, 3, 0)
self.paintmethod_combo = RadioSet([ self.paintmethod_combo = RadioSet([
{"label": "Standard", "value": "standard"}, {"label": "Standard", "value": "standard"},
{"label": "Seed-based", "value": "seed"} {"label": "Seed-based", "value": "seed"},
{"label": "Straight lines", "value": "lines"}
]) ])
grid2.addWidget(self.paintmethod_combo, 3, 1) grid2.addWidget(self.paintmethod_combo, 3, 1)

View File

@ -31,7 +31,7 @@ from rtree import index as rtindex
from shapely.geometry import Polygon, LineString, Point, LinearRing from shapely.geometry import Polygon, LineString, Point, LinearRing
from shapely.geometry import MultiPoint, MultiPolygon from shapely.geometry import MultiPoint, MultiPolygon
from shapely.geometry import box as shply_box from shapely.geometry import box as shply_box
from shapely.ops import cascaded_union from shapely.ops import cascaded_union, unary_union
import shapely.affinity as affinity import shapely.affinity as affinity
from shapely.wkt import loads as sloads from shapely.wkt import loads as sloads
from shapely.wkt import dumps as sdumps from shapely.wkt import dumps as sdumps
@ -627,6 +627,72 @@ class Geometry(object):
return geoms return geoms
@staticmethod
def clear_polygon3(polygon, tooldia, overlap=0.15, connect=True):
"""
Creates geometry inside a polygon for a tool to cover
the whole area.
This algorithm draws horizontal lines inside the polygon.
:param polygon: The polygon being painted.
:type polygon: shapely.geometry.Polygon
:param tooldia: Tool diameter.
:param overlap: Tool path overlap percentage.
:param connect: Connect lines to avoid tool lifts.
:return:
"""
log.debug("camlib.clear_polygon3()")
## The toolpaths
# Index first and last points in paths
def get_pts(o):
return [o.coords[0], o.coords[-1]]
geoms = FlatCAMRTreeStorage()
geoms.get_points = get_pts
lines = []
# Bounding box
left, bot, right, top = polygon.bounds
# First line
y = top - tooldia / 2
while y > bot + tooldia / 2:
line = LineString([(left, y), (right, y)])
lines.append(line)
y -= tooldia * (1 - overlap)
# Last line
y = bot + tooldia / 2
line = LineString([(left, y), (right, y)])
lines.append(line)
# Combine
linesgeo = unary_union(lines)
# Trim to the polygon
margin_poly = polygon.buffer(-tooldia / 2)
lines_trimmed = linesgeo.intersection(margin_poly)
# Add lines to storage
for line in lines_trimmed:
geoms.insert(line)
# Add margin to storage
# geoms.insert(margin_poly.exterior)
# for ints in margin_poly.interiors:
# geoms.insert(ints)
# Optimization: Reduce lifts
if connect:
log.debug("Reducing tool lifts...")
geoms = Geometry.paint_connect(geoms, polygon, tooldia)
return geoms
def scale(self, factor): def scale(self, factor):
""" """
Scales all of the object's geometry by a given factor. Override Scales all of the object's geometry by a given factor. Override
@ -967,10 +1033,11 @@ class Geometry(object):
new_obj.append(mirror_geom(g)) new_obj.append(mirror_geom(g))
return new_obj return new_obj
else: else:
return affinity.scale(obj,xscale,yscale,origin=(px,py)) return affinity.scale(obj, xscale, yscale, origin=(px,py))
self.solid_geometry = mirror_geom(self.solid_geometry) self.solid_geometry = mirror_geom(self.solid_geometry)
class ApertureMacro: class ApertureMacro:
""" """
Syntax of aperture macros. Syntax of aperture macros.