Jelajahi Sumber

Fixes SVG parser to produce polygons. Fixes #212.

Juan Pablo Caram 9 tahun lalu
induk
melakukan
dbe0105f9b
3 mengubah file dengan 28 tambahan dan 15 penghapusan
  1. 1 1
      FlatCAMObj.py
  2. 18 9
      camlib.py
  3. 9 5
      svgparse.py

+ 1 - 1
FlatCAMObj.py

@@ -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?

+ 18 - 9
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):
         """

+ 9 - 5
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):