Fixes SVG parser to produce polygons. Fixes #212.
This commit is contained in:
parent
03c49f3afd
commit
dbe0105f9b
|
@ -1276,11 +1276,11 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
|
||||||
:param inside_pt: [x, y]
|
:param inside_pt: [x, y]
|
||||||
:param tooldia: Diameter of the painting tool
|
:param tooldia: Diameter of the painting tool
|
||||||
:param overlap: Overlap of the tool between passes.
|
:param overlap: Overlap of the tool between passes.
|
||||||
|
:param outname: Name of the resulting Geometry Object.
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Which polygon.
|
# Which polygon.
|
||||||
#poly = find_polygon(self.solid_geometry, inside_pt)
|
|
||||||
poly = self.find_polygon(inside_pt)
|
poly = self.find_polygon(inside_pt)
|
||||||
|
|
||||||
# No polygon?
|
# No polygon?
|
||||||
|
|
27
camlib.py
27
camlib.py
|
@ -223,10 +223,16 @@ class Geometry(object):
|
||||||
def find_polygon(self, point, geoset=None):
|
def find_polygon(self, point, geoset=None):
|
||||||
"""
|
"""
|
||||||
Find an object that object.contains(Point(point)) in
|
Find an object that object.contains(Point(point)) in
|
||||||
poly, which can can be iterable, contain iterable of, or
|
geoset, which can can be iterable, contain iterables of, or
|
||||||
be itself an implementer of .contains().
|
be itself an implementer of .contains().
|
||||||
|
|
||||||
:param poly: See description
|
Note:
|
||||||
|
* Shapely Polygons will work as expected here. Linearrings
|
||||||
|
will only yield true if the point is in the perimeter.
|
||||||
|
|
||||||
|
:param point: See description
|
||||||
|
:param geoset: Set to search. If none, the defaults to
|
||||||
|
self.solid_geometry.
|
||||||
:return: Polygon containing point or None.
|
:return: Polygon containing point or None.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -416,6 +422,8 @@ class Geometry(object):
|
||||||
|
|
||||||
:param filename: Path to the SVG file.
|
:param filename: Path to the SVG file.
|
||||||
:type filename: str
|
:type filename: str
|
||||||
|
:param flip: Flip the vertically.
|
||||||
|
:type flip: bool
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -424,8 +432,6 @@ class Geometry(object):
|
||||||
svg_root = svg_tree.getroot()
|
svg_root = svg_tree.getroot()
|
||||||
|
|
||||||
# Change origin to bottom left
|
# Change origin to bottom left
|
||||||
# h = float(svg_root.get('height'))
|
|
||||||
# w = float(svg_root.get('width'))
|
|
||||||
h = svgparselength(svg_root.get('height'))[0] # TODO: No units support yet
|
h = svgparselength(svg_root.get('height'))[0] # TODO: No units support yet
|
||||||
geos = getsvggeo(svg_root)
|
geos = getsvggeo(svg_root)
|
||||||
|
|
||||||
|
@ -437,12 +443,15 @@ class Geometry(object):
|
||||||
self.solid_geometry = []
|
self.solid_geometry = []
|
||||||
|
|
||||||
if type(self.solid_geometry) is list:
|
if type(self.solid_geometry) is list:
|
||||||
self.solid_geometry.append(cascaded_union(geos))
|
# self.solid_geometry.append(cascaded_union(geos))
|
||||||
|
if type(geos) is list:
|
||||||
|
self.solid_geometry += geos
|
||||||
|
else:
|
||||||
|
self.solid_geometry.append(geos)
|
||||||
else: # It's shapely geometry
|
else: # It's shapely geometry
|
||||||
self.solid_geometry = cascaded_union([self.solid_geometry,
|
# self.solid_geometry = cascaded_union([self.solid_geometry,
|
||||||
cascaded_union(geos)])
|
# cascaded_union(geos)])
|
||||||
|
self.solid_geometry = [self.solid_geometry, geos]
|
||||||
return
|
|
||||||
|
|
||||||
def size(self):
|
def size(self):
|
||||||
"""
|
"""
|
||||||
|
|
14
svgparse.py
14
svgparse.py
|
@ -23,7 +23,7 @@ import xml.etree.ElementTree as ET
|
||||||
import re
|
import re
|
||||||
import itertools
|
import itertools
|
||||||
from svg.path import Path, Line, Arc, CubicBezier, QuadraticBezier, parse_path
|
from svg.path import Path, Line, Arc, CubicBezier, QuadraticBezier, parse_path
|
||||||
from shapely.geometry import LinearRing, LineString, Point
|
from shapely.geometry import LinearRing, LineString, Point, Polygon
|
||||||
from shapely.affinity import translate, rotate, scale, skew, affine_transform
|
from shapely.affinity import translate, rotate, scale, skew, affine_transform
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import logging
|
import logging
|
||||||
|
@ -109,7 +109,8 @@ def path2shapely(path, res=1.0):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if path.closed:
|
if path.closed:
|
||||||
return LinearRing(points)
|
return Polygon(points).buffer(0)
|
||||||
|
# return LinearRing(points)
|
||||||
else:
|
else:
|
||||||
return LineString(points)
|
return LineString(points)
|
||||||
|
|
||||||
|
@ -178,7 +179,8 @@ def svgrect2shapely(rect, n_points=32):
|
||||||
[(x, y + h - ry), (x, y + ry)] + \
|
[(x, y + h - ry), (x, y + ry)] + \
|
||||||
lower_left
|
lower_left
|
||||||
|
|
||||||
return LinearRing(pts)
|
return Polygon(pts).buffer(0)
|
||||||
|
# return LinearRing(pts)
|
||||||
|
|
||||||
|
|
||||||
def svgcircle2shapely(circle):
|
def svgcircle2shapely(circle):
|
||||||
|
@ -223,7 +225,8 @@ def svgellipse2shapely(ellipse, n_points=64):
|
||||||
y = cy + ry * np.sin(2 * np.pi * t)
|
y = cy + ry * np.sin(2 * np.pi * t)
|
||||||
pts = [(x[i], y[i]) for i in range(n_points)]
|
pts = [(x[i], y[i]) for i in range(n_points)]
|
||||||
|
|
||||||
return LinearRing(pts)
|
return Polygon(pts).buffer(0)
|
||||||
|
# return LinearRing(pts)
|
||||||
|
|
||||||
|
|
||||||
def svgline2shapely(line):
|
def svgline2shapely(line):
|
||||||
|
@ -256,7 +259,8 @@ def svgpolygon2shapely(polygon):
|
||||||
ptliststr = polygon.get('points')
|
ptliststr = polygon.get('points')
|
||||||
points = parse_svg_point_list(ptliststr)
|
points = parse_svg_point_list(ptliststr)
|
||||||
|
|
||||||
return LinearRing(points)
|
return Polygon(points).buffer(0)
|
||||||
|
# return LinearRing(points)
|
||||||
|
|
||||||
|
|
||||||
def getsvggeo(node):
|
def getsvggeo(node):
|
||||||
|
|
Loading…
Reference in New Issue