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 tooldia: Diameter of the painting tool
|
||||
:param overlap: Overlap of the tool between passes.
|
||||
:param outname: Name of the resulting Geometry Object.
|
||||
:return: None
|
||||
"""
|
||||
|
||||
# Which polygon.
|
||||
#poly = find_polygon(self.solid_geometry, inside_pt)
|
||||
poly = self.find_polygon(inside_pt)
|
||||
|
||||
# No polygon?
|
||||
|
27
camlib.py
27
camlib.py
@ -223,10 +223,16 @@ class Geometry(object):
|
||||
def find_polygon(self, point, geoset=None):
|
||||
"""
|
||||
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().
|
||||
|
||||
: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.
|
||||
"""
|
||||
|
||||
@ -416,6 +422,8 @@ class Geometry(object):
|
||||
|
||||
:param filename: Path to the SVG file.
|
||||
:type filename: str
|
||||
:param flip: Flip the vertically.
|
||||
:type flip: bool
|
||||
:return: None
|
||||
"""
|
||||
|
||||
@ -424,8 +432,6 @@ class Geometry(object):
|
||||
svg_root = svg_tree.getroot()
|
||||
|
||||
# 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
|
||||
geos = getsvggeo(svg_root)
|
||||
|
||||
@ -437,12 +443,15 @@ class Geometry(object):
|
||||
self.solid_geometry = []
|
||||
|
||||
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
|
||||
self.solid_geometry = cascaded_union([self.solid_geometry,
|
||||
cascaded_union(geos)])
|
||||
|
||||
return
|
||||
# self.solid_geometry = cascaded_union([self.solid_geometry,
|
||||
# cascaded_union(geos)])
|
||||
self.solid_geometry = [self.solid_geometry, geos]
|
||||
|
||||
def size(self):
|
||||
"""
|
||||
|
14
svgparse.py
14
svgparse.py
@ -23,7 +23,7 @@ import xml.etree.ElementTree as ET
|
||||
import re
|
||||
import itertools
|
||||
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
|
||||
import numpy as np
|
||||
import logging
|
||||
@ -109,7 +109,8 @@ def path2shapely(path, res=1.0):
|
||||
continue
|
||||
|
||||
if path.closed:
|
||||
return LinearRing(points)
|
||||
return Polygon(points).buffer(0)
|
||||
# return LinearRing(points)
|
||||
else:
|
||||
return LineString(points)
|
||||
|
||||
@ -178,7 +179,8 @@ def svgrect2shapely(rect, n_points=32):
|
||||
[(x, y + h - ry), (x, y + ry)] + \
|
||||
lower_left
|
||||
|
||||
return LinearRing(pts)
|
||||
return Polygon(pts).buffer(0)
|
||||
# return LinearRing(pts)
|
||||
|
||||
|
||||
def svgcircle2shapely(circle):
|
||||
@ -223,7 +225,8 @@ def svgellipse2shapely(ellipse, n_points=64):
|
||||
y = cy + ry * np.sin(2 * np.pi * t)
|
||||
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):
|
||||
@ -256,7 +259,8 @@ def svgpolygon2shapely(polygon):
|
||||
ptliststr = polygon.get('points')
|
||||
points = parse_svg_point_list(ptliststr)
|
||||
|
||||
return LinearRing(points)
|
||||
return Polygon(points).buffer(0)
|
||||
# return LinearRing(points)
|
||||
|
||||
|
||||
def getsvggeo(node):
|
||||
|
Loading…
Reference in New Issue
Block a user