added some descriptions

This commit is contained in:
Mario Voigt 2021-10-26 10:39:15 +02:00
parent 70aa196e93
commit 6c69939b0f

View File

@ -63,6 +63,11 @@ class LaserCheck(inkex.EffectExtension):
pagecolor = namedView.get('pagecolor') pagecolor = namedView.get('pagecolor')
inkex.utils.debug("---------- Default checks") inkex.utils.debug("---------- Default checks")
inkex.utils.debug("Document units: {}".format(doc_units)) inkex.utils.debug("Document units: {}".format(doc_units))
'''
The SVG format is highly complex and offers a lot of possibilities. Most things of SVG we do not
need for a laser cutter. Usually we need svg:path and maybe svg:image; we can drop a lot of stuff
like svg:defs, svg:desc, gradients, etc.
'''
nonShapes = [] nonShapes = []
shapes = [] shapes = []
for element in selected: for element in selected:
@ -98,7 +103,9 @@ class LaserCheck(inkex.EffectExtension):
if len(layer) == 0: if len(layer) == 0:
inkex.utils.debug("id={} is empty layer".format(layer.get('id'))) inkex.utils.debug("id={} is empty layer".format(layer.get('id')))
'''
Clones should be unlinked because they cause similar issues like transformations
'''
if so.checks == "check_all" or so.clones is True: if so.checks == "check_all" or so.clones is True:
inkex.utils.debug("\n---------- Clones (svg:use) - maybe unlink") inkex.utils.debug("\n---------- Clones (svg:use) - maybe unlink")
uses = [] uses = []
@ -110,6 +117,10 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("id={}".format(use.get('id'))) inkex.utils.debug("id={}".format(use.get('id')))
'''
Clip paths are neat to visualize things, but they do not perform a real path cutting.
Please perform real intersections to have an intact target geometry.
'''
if so.checks == "check_all" or so.clippaths is True: if so.checks == "check_all" or so.clippaths is True:
inkex.utils.debug("\n---------- Clippings (svg:clipPath) - please replace with real cut paths") inkex.utils.debug("\n---------- Clippings (svg:clipPath) - please replace with real cut paths")
clipPaths = [] clipPaths = []
@ -121,6 +132,10 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("id={}".format(clipPath.get('id'))) inkex.utils.debug("id={}".format(clipPath.get('id')))
'''
Sometimes images look like vector but they are'nt. In case you dont want to perform engraving, either
check to drop or trace to vector paths
'''
if so.checks == "check_all" or so.images is True: if so.checks == "check_all" or so.images is True:
inkex.utils.debug("\n---------- Images (svg:image) - maybe trace to svg") inkex.utils.debug("\n---------- Images (svg:image) - maybe trace to svg")
images = [] images = []
@ -132,6 +147,9 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("image id={}".format(image.get('id'))) inkex.utils.debug("image id={}".format(image.get('id')))
'''
Low level strokes cannot be properly edited in Inkscape (no node handles). Converting helps
'''
if so.checks == "check_all" or so.lowlevelstrokes is True: if so.checks == "check_all" or so.lowlevelstrokes is True:
inkex.utils.debug("\n---------- Low level strokes (svg:line/polyline/polygon) - maybe convert to path") inkex.utils.debug("\n---------- Low level strokes (svg:line/polyline/polygon) - maybe convert to path")
lowlevels = [] lowlevels = []
@ -143,6 +161,11 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("id={}".format(lowlevel.get('id'))) inkex.utils.debug("id={}".format(lowlevel.get('id')))
'''
Texts cause problems when sharing with other people. You must ensure that everyone has the
font files installed you used. Convert to paths avoids this issue and guarantees same result
everywhere.
'''
if so.checks == "check_all" or so.texts is True: if so.checks == "check_all" or so.texts is True:
inkex.utils.debug("\n---------- Texts (should be converted to paths)") inkex.utils.debug("\n---------- Texts (should be converted to paths)")
texts = [] texts = []
@ -154,6 +177,11 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("id={}".format(text.get('id'))) inkex.utils.debug("id={}".format(text.get('id')))
'''
The more stroke colors the more laser job configuration is required. Reduce the SVG file
to a minimum of stroke colors to be quicker
'''
if so.checks == "check_all" or so.stroke_colors is True: if so.checks == "check_all" or so.stroke_colors is True:
inkex.utils.debug("\n---------- Stroke colors") inkex.utils.debug("\n---------- Stroke colors")
strokeColors = [] strokeColors = []
@ -170,6 +198,11 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("stroke color {}".format(strokeColor)) inkex.utils.debug("stroke color {}".format(strokeColor))
'''
Nearly each laser job needs a bit of border to place the material inside the laser. Often
we have to fixate on vector grid, pin grid or task plate. Thus we need tapes or pins. So we
leave some borders off the actual part geometries.
'''
if so.checks == "check_all" or so.bbox is True: if so.checks == "check_all" or so.bbox is True:
inkex.utils.debug("\n---------- Borders around all elements - minimum offset {} mm from each side".format(so.bbox_offset)) inkex.utils.debug("\n---------- Borders around all elements - minimum offset {} mm from each side".format(so.bbox_offset))
bbox = inkex.BoundingBox() bbox = inkex.BoundingBox()
@ -215,6 +248,10 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("bottom border... fail: {:0.3f} mm".format(self.svg.uutounit(bbox.bottom, "mm"))) inkex.utils.debug("bottom border... fail: {:0.3f} mm".format(self.svg.uutounit(bbox.bottom, "mm")))
'''
Different stroke widths might behave the same like different stroke colors. Reduce to a minimum set.
Ideally all stroke widths are set to 1 pixel.
'''
if so.checks == "check_all" or so.stroke_widths is True: if so.checks == "check_all" or so.stroke_widths is True:
inkex.utils.debug("\n---------- Stroke widths") inkex.utils.debug("\n---------- Stroke widths")
strokeWidths = [] strokeWidths = []
@ -231,6 +268,10 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("stroke width {}".format(strokeWidth)) inkex.utils.debug("stroke width {}".format(strokeWidth))
'''
Cosmetic dashes cause simulation issues and are no real cut paths. It's similar to the thing
with clip paths. Please convert lines to real dash segments if you want to laser them.
'''
if so.checks == "check_all" or so.cosmestic_dashes is True: if so.checks == "check_all" or so.cosmestic_dashes is True:
inkex.utils.debug("\n---------- Cosmetic dashes - should be converted to paths") inkex.utils.debug("\n---------- Cosmetic dashes - should be converted to paths")
strokeDasharrays = [] strokeDasharrays = []
@ -247,6 +288,11 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("stroke dash array {}".format(strokeDasharray)) inkex.utils.debug("stroke dash array {}".format(strokeDasharray))
'''
Shapes/paths with the same color like the background, 0% opacity, etc. lead to strange
laser cutting results, like duplicated edges, enlarged laser times and more. Please double
check for such occurences.
'''
if so.checks == "check_all" or so.invisible_shapes is True: if so.checks == "check_all" or so.invisible_shapes is True:
inkex.utils.debug("\n---------- Invisible shapes") inkex.utils.debug("\n---------- Invisible shapes")
invisibles = [] invisibles = []
@ -311,6 +357,10 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("id={}".format(invisible.get('id'))) inkex.utils.debug("id={}".format(invisible.get('id')))
'''
Additionally, stroke opacities less than 1.0 cause problems in most laser softwares. Please
adjust all strokes to use full opacity.
'''
if so.checks == "check_all" or so.stroke_opacities is True: if so.checks == "check_all" or so.stroke_opacities is True:
inkex.utils.debug("\n---------- Objects with stroke transparencies < 1.0 - should be set to 1.0") inkex.utils.debug("\n---------- Objects with stroke transparencies < 1.0 - should be set to 1.0")
transparencies = [] transparencies = []
@ -326,7 +376,10 @@ class LaserCheck(inkex.EffectExtension):
for transparency in transparencies: for transparency in transparencies:
inkex.utils.debug("id={}".format(transparency.get('id'))) inkex.utils.debug("id={}".format(transparency.get('id')))
'''
We look for paths which are just points. Those are useless in case of lasercutting.
Note: this scan only works for paths, not for subpaths. If so, you need to break apart before
'''
if so.checks == "check_all" or so.pointy_paths is True: if so.checks == "check_all" or so.pointy_paths is True:
inkex.utils.debug("\n---------- Pointy paths - should be deleted") inkex.utils.debug("\n---------- Pointy paths - should be deleted")
pointyPaths = [] pointyPaths = []
@ -344,6 +397,11 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("id={}".format(pointyPath.get('id'))) inkex.utils.debug("id={}".format(pointyPath.get('id')))
'''
Transformations often lead to wrong stroke widths or mis-rendering in end software. The best we
can do with a final SVG is to remove all relative translations, rotations and scalings. We should
apply absolute coordinates only.
'''
if so.checks == "check_all" or so.transformations is True: if so.checks == "check_all" or so.transformations is True:
inkex.utils.debug("\n---------- Transformations - should be applied to absolute") inkex.utils.debug("\n---------- Transformations - should be applied to absolute")
transformations = [] transformations = []
@ -354,7 +412,10 @@ class LaserCheck(inkex.EffectExtension):
for transformation in transformations: for transformation in transformations:
inkex.utils.debug("transformation in id={}".format(transformation.get('id'))) inkex.utils.debug("transformation in id={}".format(transformation.get('id')))
'''
Really short paths can cause issues with laser cutter mechanics and should be avoided to
have healthier stepper motor belts, etc.
'''
if so.checks == "check_all" or so.short_paths is True: if so.checks == "check_all" or so.short_paths is True:
inkex.utils.debug("\n---------- Short paths (< {} mm)".format(so.short_paths_min)) inkex.utils.debug("\n---------- Short paths (< {} mm)".format(so.short_paths_min))
shortPaths = [] shortPaths = []
@ -374,6 +435,10 @@ class LaserCheck(inkex.EffectExtension):
inkex.utils.debug("id={}".format(shortPath.get('id'))) inkex.utils.debug("id={}".format(shortPath.get('id')))
'''
Shapes like rectangles, ellipses, arcs, spirals should be converted to svg:path to have more
convenience in the file
'''
if so.checks == "check_all" or so.non_path_shapes is True: if so.checks == "check_all" or so.non_path_shapes is True:
inkex.utils.debug("\n---------- Non-path shapes - should be converted to paths") inkex.utils.debug("\n---------- Non-path shapes - should be converted to paths")
nonPathShapes = [] nonPathShapes = []