- improvements in Importing SVG as Gerber - added an automatic source generation (it is not infallible)

- a hack to import correctly the QRCode exported as SVG from FlatCAM
This commit is contained in:
Marius Stanciu
2019-12-02 20:03:27 +02:00
committed by Marius
parent 462e9b4bd8
commit 80dcd3805a
5 changed files with 99 additions and 13 deletions

View File

@@ -9,13 +9,15 @@ import traceback
from copy import deepcopy
import sys
from shapely.ops import cascaded_union
from shapely.ops import cascaded_union, unary_union
from shapely.geometry import Polygon, MultiPolygon, LineString, Point
import shapely.affinity as affinity
from shapely.geometry import box as shply_box
import FlatCAMTranslation as fcTranslate
from lxml import etree as ET
from flatcamParsers.ParseSVG import *
import FlatCAMTranslation as fcTranslate
import gettext
import builtins
@@ -784,7 +786,7 @@ class Gerber(Geometry):
self.apertures['0'] = {}
self.apertures['0']['type'] = 'REG'
self.apertures['0']['size'] = 0.0
self.apertures['0']['geometry'] = []
self.apertures['0']['geometry'] = list()
# if D02 happened before G37 we now have a path with 1 element only; we have to add the current
# geo to the poly_buffer otherwise we loose it
@@ -1635,6 +1637,87 @@ class Gerber(Geometry):
self.scale(factor, factor)
return factor
def import_svg(self, filename, object_type='gerber', flip=True, units='MM'):
"""
Imports shapes from an SVG file into the object's geometry.
:param filename: Path to the SVG file.
:type filename: str
:param object_type: parameter passed further along
:param flip: Flip the vertically.
:type flip: bool
:param units: FlatCAM units
:return: None
"""
log.debug("flatcamParsers.ParseGerber.Gerber.import_svg()")
# Parse into list of shapely objects
svg_tree = ET.parse(filename)
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, 'gerber')
if flip:
geos = [translate(scale(g, 1.0, -1.0, origin=(0, 0)), yoff=h) for g in geos]
# Add to object
if self.solid_geometry is None:
self.solid_geometry = list()
# if type(self.solid_geometry) == list:
# if type(geos) == list:
# self.solid_geometry += geos
# else:
# self.solid_geometry.append(geos)
# else: # It's shapely geometry
# self.solid_geometry = [self.solid_geometry, geos]
if type(geos) == list:
# HACK for importing QRCODE exported by FlatCAM
if len(geos) == 1:
geo_qrcode = list()
geo_qrcode.append(Polygon(geos[0].exterior))
for i_el in geos[0].interiors:
geo_qrcode.append(Polygon(i_el).buffer(0))
for poly in geo_qrcode:
geos.append(poly)
if type(self.solid_geometry) == list:
self.solid_geometry += geos
else:
geos.append(self.solid_geometry)
self.solid_geometry = geos
else:
if type(self.solid_geometry) == list:
self.solid_geometry.append(geos)
else:
self.solid_geometry = [self.solid_geometry, geos]
# flatten the self.solid_geometry list for import_svg() to import SVG as Gerber
self.solid_geometry = list(self.flatten_list(self.solid_geometry))
try:
__ = iter(self.solid_geometry)
except TypeError:
self.solid_geometry = [self.solid_geometry]
if '0' not in self.apertures:
self.apertures['0'] = dict()
self.apertures['0']['type'] = 'REG'
self.apertures['0']['size'] = 0.0
self.apertures['0']['geometry'] = list()
for pol in self.solid_geometry:
new_el = dict()
new_el['solid'] = pol
new_el['follow'] = pol.exterior
self.apertures['0']['geometry'].append(deepcopy(new_el))
def scale(self, xfactor, yfactor=None, point=None):
"""
Scales the objects' geometry on the XY plane by a given factor.

View File

@@ -141,7 +141,6 @@ def path2shapely(path, object_type, res=1.0):
coords.append(line.coords[1])
geo_element = Polygon(coords)
geometry.append(geo_element)
return geometry
@@ -306,7 +305,7 @@ def getsvggeo(node, object_type, root=None):
root = node
kind = re.search('(?:\{.*\})?(.*)$', node.tag).group(1)
geo = []
geo = list()
# Recurse
if len(node) > 0: