SVG: Accept but ignore units in length.
This commit is contained in:
@@ -40,14 +40,14 @@ class FlatCAMGUI(QtGui.QMainWindow):
|
|||||||
self.menufileopengcode = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Open G-&Code ...', self)
|
self.menufileopengcode = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Open G-&Code ...', self)
|
||||||
self.menufile.addAction(self.menufileopengcode)
|
self.menufile.addAction(self.menufileopengcode)
|
||||||
|
|
||||||
# Import SVG ...
|
|
||||||
self.menufileimportsvg = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Import &SVG ...', self)
|
|
||||||
self.menufile.addAction(self.menufileimportsvg)
|
|
||||||
|
|
||||||
# Open Project ...
|
# Open Project ...
|
||||||
self.menufileopenproject = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Open &Project ...', self)
|
self.menufileopenproject = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Open &Project ...', self)
|
||||||
self.menufile.addAction(self.menufileopenproject)
|
self.menufile.addAction(self.menufileopenproject)
|
||||||
|
|
||||||
|
# Import SVG ...
|
||||||
|
self.menufileimportsvg = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Import &SVG ...', self)
|
||||||
|
self.menufile.addAction(self.menufileimportsvg)
|
||||||
|
|
||||||
# Save Project
|
# Save Project
|
||||||
self.menufilesaveproject = QtGui.QAction(QtGui.QIcon('share/floppy16.png'), '&Save Project', self)
|
self.menufilesaveproject = QtGui.QAction(QtGui.QIcon('share/floppy16.png'), '&Save Project', self)
|
||||||
self.menufile.addAction(self.menufilesaveproject)
|
self.menufile.addAction(self.menufilesaveproject)
|
||||||
|
|||||||
13
camlib.py
13
camlib.py
@@ -353,7 +353,7 @@ class Geometry(object):
|
|||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def import_svg(self, filename):
|
def import_svg(self, filename, flip=True):
|
||||||
"""
|
"""
|
||||||
Imports shapes from an SVG file into the object's geometry.
|
Imports shapes from an SVG file into the object's geometry.
|
||||||
|
|
||||||
@@ -367,20 +367,23 @@ 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'))
|
# h = float(svg_root.get('height'))
|
||||||
# w = float(svg_root.get('width'))
|
# w = float(svg_root.get('width'))
|
||||||
|
h = svgparselength(svg_root.get('height'))[0] # TODO: No units support yet
|
||||||
geos = getsvggeo(svg_root)
|
geos = getsvggeo(svg_root)
|
||||||
geo_flip = [translate(scale(g, 1.0, -1.0, origin=(0, 0)), yoff=h) for g in geos]
|
|
||||||
|
if flip:
|
||||||
|
geos = [translate(scale(g, 1.0, -1.0, origin=(0, 0)), yoff=h) for g in geos]
|
||||||
|
|
||||||
# Add to object
|
# Add to object
|
||||||
if self.solid_geometry is None:
|
if self.solid_geometry is None:
|
||||||
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(geo_flip))
|
self.solid_geometry.append(cascaded_union(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(geo_flip)])
|
cascaded_union(geos)])
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
23
svgparse.py
23
svgparse.py
@@ -23,6 +23,20 @@ from shapely.geometry import LinearRing, LineString, Point
|
|||||||
from shapely.affinity import translate, rotate, scale, skew, affine_transform
|
from shapely.affinity import translate, rotate, scale, skew, affine_transform
|
||||||
|
|
||||||
|
|
||||||
|
def svgparselength(lengthstr):
|
||||||
|
|
||||||
|
integer_re_str = r'[+-]?[0-9]+'
|
||||||
|
number_re_str = r'(?:' + integer_re_str + r'(?:[Ee]' + integer_re_str + r')?' + r')|' + \
|
||||||
|
r'(?: [+-]?[0-9]*\.[0-9]+(?:[Ee]' + integer_re_str + ')?)'
|
||||||
|
length_re_str = r'(' + number_re_str + r')(em|ex|px|in|cm|mm|pt|pc|%)?'
|
||||||
|
|
||||||
|
match = re.search(length_re_str, lengthstr)
|
||||||
|
if match:
|
||||||
|
return float(match.group(1)), match.group(2)
|
||||||
|
|
||||||
|
raise Exception('Cannot parse SVG length: %s' % lengthstr)
|
||||||
|
|
||||||
|
|
||||||
def path2shapely(path, res=1.0):
|
def path2shapely(path, res=1.0):
|
||||||
"""
|
"""
|
||||||
Converts an svg.path.Path into a Shapely
|
Converts an svg.path.Path into a Shapely
|
||||||
@@ -106,9 +120,12 @@ def svgcircle2shapely(circle):
|
|||||||
:type circle: xml.etree.ElementTree.Element
|
:type circle: xml.etree.ElementTree.Element
|
||||||
:return: shapely.geometry.polygon.LinearRing
|
:return: shapely.geometry.polygon.LinearRing
|
||||||
"""
|
"""
|
||||||
cx = float(circle.get('cx'))
|
# cx = float(circle.get('cx'))
|
||||||
cy = float(circle.get('cy'))
|
# cy = float(circle.get('cy'))
|
||||||
r = float(circle.get('r'))
|
# r = float(circle.get('r'))
|
||||||
|
cx = svgparselength(circle.get('cx'))[0] # TODO: No units support yet
|
||||||
|
cy = svgparselength(circle.get('cy'))[1] # TODO: No units support yet
|
||||||
|
r = svgparselength(circle.get('r'))[0] # TODO: No units support yet
|
||||||
|
|
||||||
# TODO: No resolution specified.
|
# TODO: No resolution specified.
|
||||||
return Point(cx, cy).buffer(r)
|
return Point(cx, cy).buffer(r)
|
||||||
|
|||||||
Reference in New Issue
Block a user