- added ability to see the verbose log when importing SVG's (if set in preferences)

- added some more logs to the SVG import
This commit is contained in:
Marius Stanciu
2021-01-22 12:33:14 +02:00
committed by Marius
parent 5bb3c18693
commit bd64a34ab8
5 changed files with 56 additions and 12 deletions

View File

@@ -73,15 +73,17 @@ class Gerber(Geometry):
def __init__(self, steps_per_circle=None):
"""
The constructor takes no parameters. Use ``gerber.parse_files()``
or ``gerber.parse_lines()`` to populate the object from Gerber source.
Use ``gerber.parse_files()`` or ``gerber.parse_lines()`` to populate the object from Gerber source.
:return: Gerber object
:rtype: Gerber
"""
# How to approximate a circle with lines.
self.steps_per_circle = int(self.app.defaults["gerber_circle_steps"])
if steps_per_circle is None:
self.steps_per_circle = int(self.app.defaults["gerber_circle_steps"])
else:
self.steps_per_circle = steps_per_circle
self.decimals = self.app.decimals
# Initialize parent
@@ -1905,9 +1907,13 @@ class Gerber(Geometry):
units = self.app.defaults['units'] if units is None else units
res = self.app.defaults['gerber_circle_steps']
factor = svgparse_viewbox(svg_root)
geos = getsvggeo(svg_root, 'gerber', units=units, res=res, factor=factor)
geos = getsvggeo(svg_root, 'gerber', units=units, res=res, factor=factor, app=self.app)
self.app.log.debug("appParsers.ParseGerber.Gerber.import_svg(). Finished parsing the SVG geometry.")
if flip:
geos = [translate(scale(g, 1.0, -1.0, origin=(0, 0)), yoff=h) for g in geos]
self.app.log.debug("appParsers.ParseGerber.Gerber.import_svg(). SVG geometry was flipped.")
# Add to object
if self.solid_geometry is None:

View File

@@ -393,7 +393,7 @@ def svgpolygon2shapely(polygon, n_points=64, factor=1.0):
# return LinearRing(points)
def getsvggeo(node, object_type, root=None, units='MM', res=64, factor=1.0):
def getsvggeo(node, object_type, root=None, units='MM', res=64, factor=1.0, app=None):
"""
Extracts and flattens all geometry from an SVG node
into a list of Shapely geometry.
@@ -405,19 +405,26 @@ def getsvggeo(node, object_type, root=None, units='MM', res=64, factor=1.0):
:param res: resolution to be used for circles buffering
:param factor: correction factor due of virtual units
:type factor: float
:param app: Application reference
:return: List of Shapely geometry
:rtype: list
"""
if root is None:
root = node
if app is not None:
log = app.log
else:
log = logging.getLogger('base2')
kind = re.search('(?:\{.*\})?(.*)$', node.tag).group(1)
geo = []
# Recurse
if len(node) > 0:
for child in node:
subgeo = getsvggeo(child, object_type, root=root, units=units, res=res, factor=factor)
subgeo = getsvggeo(child, object_type, root=root, units=units, res=res, factor=factor, app=app)
if subgeo is not None:
geo += subgeo
# Parse
@@ -465,7 +472,10 @@ def getsvggeo(node, object_type, root=None, units='MM', res=64, factor=1.0):
href = node.attrib['href'] if 'href' in node.attrib else node.attrib['{http://www.w3.org/1999/xlink}href']
ref = root.find(".//*[@id='%s']" % href.replace('#', ''))
if ref is not None:
geo = getsvggeo(ref, object_type, root=root, units=units, res=res, factor=factor)
geo = getsvggeo(ref, object_type, root=root, units=units, res=res, factor=factor, app=app)
elif kind in ['defs', 'namedview', 'format', 'type', 'title']:
log.warning('SVG Element not supported: %s. Skipping to next.' % kind)
else:
log.warning("Unknown kind: " + kind)
@@ -568,11 +578,12 @@ def getsvgtext(node, object_type, app, units='MM'):
geo = [(scale(g, 1.0, -1.0)) for g in geo]
except Exception as e:
log.error(str(e))
geo = None
else:
geo = None
# ignore transformation for unknown kind
if geo is not None:
if geo and geo is not None:
# Transformations
if 'transform' in node.attrib:
trstr = node.get('transform')
@@ -597,6 +608,9 @@ def getsvgtext(node, object_type, app, units='MM'):
else:
raise Exception('Unknown transformation: %s', tr)
if not geo:
geo = None
return geo