summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--images/examples/InkStitch Multi Color.svg699
-rw-r--r--lib/extensions/base.py8
-rw-r--r--lib/extensions/print_pdf.py85
-rw-r--r--lib/svg/realistic_rendering.py129
-rw-r--r--lib/svg/svg.py41
-rw-r--r--lib/threads/color.py15
-rw-r--r--lib/utils/geometry.py6
-rw-r--r--print/resources/inkstitch.js100
-rw-r--r--print/resources/style.css22
-rw-r--r--print/templates/operator_overview.html4
-rw-r--r--print/templates/print_detail.html7
-rw-r--r--print/templates/print_overview.html12
-rw-r--r--print/templates/ui.html8
13 files changed, 739 insertions, 397 deletions
diff --git a/images/examples/InkStitch Multi Color.svg b/images/examples/InkStitch Multi Color.svg
index ba8364f0..9d4b11e0 100644
--- a/images/examples/InkStitch Multi Color.svg
+++ b/images/examples/InkStitch Multi Color.svg
@@ -2,6 +2,7 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
+ xmlns:inkstitch="http://inkstitch.org/namespace"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@@ -14,7 +15,7 @@
viewBox="0 0 101.6 101.6"
version="1.1"
id="svg8"
- inkscape:version="0.91+devel r"
+ inkscape:version="0.92.2 (unknown)"
enable-background="new"
sodipodi:docname="InkStitch Multi Color.svg">
<sodipodi:namedview
@@ -25,10 +26,10 @@
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
- inkscape:cx="186.52413"
+ inkscape:cx="55.709376"
inkscape:cy="107.28777"
inkscape:document-units="mm"
- inkscape:current-layer="g4828"
+ inkscape:current-layer="layer3"
showgrid="false"
inkscape:snap-global="false"
units="in"
@@ -47,356 +48,127 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
+ <dc:title />
</cc:Work>
</rdf:RDF>
+ <inkstitch:thread-palette />
+ <inkstitch:client-overview-transform>&quot;matrix(2.23777, 0, 0, 2.23777, -204, -268)&quot;</inkstitch:client-overview-transform>
</metadata>
<g
- id="g4808">
- <path
- inkscape:connector-curvature="0"
- id="path4334"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 34.811856,55.028284 V 41.664807 m -3.140416,13.29666 v -13.29666"
- embroider_satin_column="True"
- embroider_trim_after="True"
- embroider_zigzag_spacing_mm="0.32"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2" />
- <path
- inkscape:connector-curvature="0"
- embroider_zigzag_spacing_mm="0.33"
- embroider_zigzag_underlay_spacing_mm="1.2"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay="True"
- embroider_satin_column="True"
- d="M 44.233107,54.961467 44.099472,44.872042 M 41.35996,54.961467 41.293142,44.938859"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path4357" />
- <path
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
- d="M 42.829942,44.938859 41.694047,41.798443"
- id="path4380"
- inkscape:connector-curvature="0"
- embroider_running_stitch_length_mm="2.5" />
- <path
- inkscape:connector-curvature="0"
- embroider_zigzag_underlay_spacing_mm="1.2"
- embroider_zigzag_underlay_inset_mm=".4"
- embroider_zigzag_underlay="True"
- embroider_zigzag_spacing_mm="0.33"
- embroider_satin_column="True"
- d="m 50.246671,55.362371 4.944486,-1.069078 m -6.61492,0 6.481284,-3.407688 m -10.089422,-0.334086 4.744032,-4.744032 m -9.354434,1.403164 5.345393,-5.612661 m -5.412208,2.605878 3.608139,-3.474503 m -2.071341,0.46772 11.02487,10.690783 0.133633,3.474503 m -11.759859,-14.098468 0.06682,4.944486 3.34087,1.870887 7.884451,7.349913"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path4416" />
- <path
- embroider_trim_after="True"
- inkscape:connector-curvature="0"
- id="path4451"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 48.576237,45.874302 5.746295,-0.06681 m -5.87993,7.617174 6.614919,-2.605876 m -4.209494,4.877668 3.474505,-1.937705 m -1.336349,1.5368 -0.133633,-13.49711 m -0.400905,13.563928 -2.605879,-2.204974 0.133636,-11.425772"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm="0.33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_spacing_mm="1.2"
- embroider_zigzag_underlay_inset_mm=".04" />
- <path
- inkscape:connector-curvature="0"
- id="path4508"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 62.035343,54.91994 -0.0945,-6.945313 m -3.023805,6.945313 0.09449,-6.992559"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm="0.33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2" />
- <path
- embroider_running_stitch_length_mm="2.5"
- inkscape:connector-curvature="0"
- id="path4539"
- d="m 60.334448,47.785639 0.04725,-5.811383"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- id="path4573"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 61.988093,41.59628 -0.04725,6.992559 m -2.929312,-7.039808 v 7.65402"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2" />
- <path
- embroider_running_stitch_length_mm="2.5"
- inkscape:connector-curvature="0"
- id="path4608"
- d="m 62.366072,48.25811 2.787573,-2.504093 2.787573,-3.638021"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- inkscape:connector-curvature="0"
- embroider_trim_after="True"
- id="path4652"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 64.019718,42.257739 7.417781,0.14174 m -11.150298,5.953125 7.654017,-0.33073 m -3.307291,6.283854 7.039808,-0.141739 m -1.511906,-12.473215 -4.960937,6.3311 5.480655,6.992559 m -4.299479,-13.465402 -5.008184,6.898066 5.480653,6.567336"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm="0.33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2" />
- <path
- id="path4343"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 33.072916,68.10186 -0.09449,-3.401788 m -0.921322,3.000188 -1.275667,-2.976563 m 0.944938,3.071056 -3.071056,-1.086681 m 3.638021,1.299292 -3.000184,2.055246 m 3.968749,-1.346538 c -0.0945,0.09449 -2.267857,2.740326 -2.267857,2.740326 m 4.441219,-1.322916 -3.567149,1.677267 m 3.449031,1.417413 -3.09468,-1.063059 m 0.212614,3.260045 -1.252048,-3.472656 m -1.063057,3.449032 -0.188989,-3.96875 m -0.614211,0.637836 c 0,0 1.252045,0.779576 2.173364,0.897692 0,0 1.086681,0.02363 1.393786,-0.566963 0,0 0.4016,-0.496093 -0.614211,-1.228422 0,0 -1.204799,-0.614211 -1.606399,-0.897694 0,0 -1.34654,-0.87407 -1.41741,-1.960751 0,0 -0.259859,-1.937128 1.559151,-2.504092 0,0 1.063058,-0.685082 3.449033,0.188988 m -4.77195,8.409968 c 0,0 2.409598,0.803201 3.96875,-0.02363 0,0 1.441035,-0.637826 1.441035,-2.055237 0,0 0.236235,-1.511905 -0.826823,-2.291481 0,0 -1.559152,-0.968564 -2.102493,-1.228422 0,0 -0.94494,-0.283482 -0.755952,-1.110305 0,0 0.07087,-0.755953 1.630022,-0.354353 0,0 0.826823,0.236235 1.441035,0.685082"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm="0.33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2"
- inkscape:connector-curvature="0" />
- <path
- embroider_running_stitch_length_mm="2.5"
- inkscape:connector-curvature="0"
- id="path4394"
- d="m 35.71875,66.849812 3.425409,-0.236233 -0.04725,3.307291 0.07087,3.071056 0.02363,0.944941"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path4448"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 40.23084,74.503832 0.02363,-7.65402 m -2.078876,7.677642 0.02363,-7.630393"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2"
- inkscape:connector-curvature="0" />
- <path
- embroider_running_stitch_length_mm="2.5"
- inkscape:connector-curvature="0"
- id="path4503"
- d="m 39.262277,66.471836 c 0,0 -2.645833,0 -2.763951,-0.02363 -0.118118,-0.02363 -0.73233,0.165364 -0.73233,0.165364"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path4561"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 35.435267,67.629388 7.535899,0.02363 m -7.535899,-1.795393 h 7.535899"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm="0.33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2"
- inkscape:connector-curvature="0" />
- <path
- embroider_running_stitch_length_mm="2.5"
- inkscape:connector-curvature="0"
- id="path4620"
- d="m 44.624812,66.684447 0.519719,2.291483 c 0,0 0.259858,3.212798 0.212611,3.354538 -0.04725,0.14174 -0.118118,1.748139 -0.118118,1.748139"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path4682"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 46.278458,74.503832 0.04725,-8.669829 m -2.102494,8.646204 0.02363,-8.575333"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm="0.33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.25"
- inkscape:connector-curvature="0" />
- <path
- embroider_running_stitch_length_mm="2.5"
- sodipodi:nodetypes="ccccc"
- inkscape:connector-curvature="0"
- id="path4745"
- d="m 47.861235,66.778943 3.118303,-0.07087 0.259858,1.228423 0.118117,2.83482 0.02363,3.472657"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path4811"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 52.420572,74.527454 v -7.677642 m -2.078868,7.630395 v -7.724888"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2"
- inkscape:connector-curvature="0" />
- <path
- embroider_running_stitch_length_mm="2.5"
- inkscape:connector-curvature="0"
- id="path4878"
- d="m 51.357513,66.613579 -3.378162,0.04725"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path4948"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 47.601375,67.653013 h 7.512277 m -7.535899,-1.771764 7.583146,-0.02363"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2"
- inkscape:connector-curvature="0" />
- <path
- embroider_running_stitch_length_mm="2.5"
- inkscape:connector-curvature="0"
- id="path5019"
- d="m 57.357885,67.322284 -0.425222,1.464656 -0.165365,1.984375 0.590587,1.700893 2.220611,1.370166 h 1.653646 l 1.228423,-0.708708"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path5109"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 61.657364,71.031176 0.02363,4.890066 m -1.630029,-4.417597 c 0,0 -0.566962,4.582962 -0.566962,4.51209 m -0.425225,-4.937313 c 0,0 -3.02381,3.543525 -3.000185,3.42541 m 2.409597,-4.181364 -3.874256,0.685083 m 3.945128,-1.913503 -3.28367,-0.661459 m 4.228611,0.02362 -1.795389,-3.165549 m 2.763951,3.047431 -0.212611,-3.992372 m 1.393788,4.370351 0.236233,-4.086868 m 0.803201,9.402156 c 0,0 -1.630024,1.039434 -3.23642,0.708705 0,0 -2.14974,-0.188986 -3.260045,-2.315102 0,0 -0.87407,-1.511905 -0.448847,-3.260045 0,0 0.4016,-2.196986 2.291481,-3.09468 0,0 2.456845,-1.34654 4.724702,0.330729 m 0.02362,5.315289 c 0,0 -1.488282,1.299295 -2.763952,1.063059 0,0 -1.677267,0.188989 -2.267855,-2.078868 0,0 -0.236235,-1.771764 0.921317,-2.740328 0,0 0.897693,-0.779576 2.409598,-0.425223 0,0 0.992187,0.496094 1.488281,1.063058"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2"
- inkscape:connector-curvature="0" />
- <path
- embroider_running_stitch_length_mm="2.5"
- inkscape:connector-curvature="0"
- id="path5184"
- d="m 64.515809,67.275037 0.685083,0.614212 0.04725,3.567149 -0.14174,2.527716"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path5262"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 66.193079,74.480207 -0.02363,-4.51209 m -2.007991,4.51209 v -4.630208"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2"
- inkscape:connector-curvature="0" />
- <path
- embroider_running_stitch_length_mm="2.4"
- inkscape:connector-curvature="0"
- id="path5341"
- d="m 65.082774,69.613763 0.02363,-3.449031"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- id="path5423"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 66.169454,65.857625 0.02363,5.008186 m -2.031626,-5.031808 -10e-7,5.008183"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_zigzag_underlay="True"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay_spacing_mm="1.2"
- inkscape:connector-curvature="0" />
- <path
- embroider_zigzag_underlay_spacing_mm="1.2"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_satin_column="True"
- d="m 66.074961,69.070423 4.03962,-6e-6 m -4.346724,1.748145 4.417597,0.04725"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path5508"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
- d="m 70.256322,70.157104 0.401601,-2.007997 -0.09449,-1.984375"
- id="path5593"
- inkscape:connector-curvature="0"
- embroider_running_stitch_length_mm="2.5" />
- <path
- embroider_zigzag_underlay_spacing_mm="1.2"
- embroider_zigzag_underlay_inset_mm=".04"
- embroider_zigzag_underlay="True"
- embroider_trim_after="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_satin_column="True"
- d="m 71.50837,65.857625 0.04725,8.646207 m -2.055249,-8.622583 0.04725,8.622583"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path5681"
- inkscape:connector-curvature="0" />
- </g>
- <g
- id="layer1"
- inkscape:label="Ink Stitch - Black"
- style="display:inline"
- inkscape:groupmode="layer" />
- <g
- id="g4815">
- <path
- embroider_zigzag_spacing_mm="0.33"
- embroider_satin_column="True"
- d="m 67.051242,59.672092 -3.274052,0.03341 m 3.240643,-0.56795 c 0,0 -2.271792,-0.267269 -3.240643,-0.03341"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path4730"
- inkscape:connector-curvature="0" />
- <path
- style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
- d="M 63.576739,59.505048 61.505398,59.97277 57.329313,60.00618 49.945993,60.073 43.297662,60.173227 36.114794,60.073 30.669177,60.00618 h -0.768398"
- id="path4771"
- inkscape:connector-curvature="0"
- embroider_running_stitch_length_mm="2.5" />
- <path
- embroider_center_walk_underlay_stitch_length_mm="2.5"
- embroider_center_walk_underlay="True"
- embroider_zigzag_spacing_mm=".33"
- embroider_satin_column="True"
- d="m 29.633508,60.874806 0.902036,0.534538 13.898014,-0.06682 c 0,0 2.639287,-0.400903 4.109269,-0.634765 l 12.595078,-0.16704 c 0,0 2.372017,0.334087 3.274051,0.334087 m -34.845264,-1.737254 0.935443,-0.534538 c 0,0 13.129614,-0.200453 13.630745,-0.06682 0,0 3.842,0.60136 4.744035,0.701586 l 12.194172,0.167043 c 0,0 2.639287,-0.400904 3.173826,-0.367496"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path4815"
- inkscape:connector-curvature="0" />
- <path
- id="path4862"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="m 63.9016,60.84944 c 0,0 1.842632,0.165365 3.165549,-0.07087 m -3.212796,-0.519717 3.212796,-0.09449"
- embroider_satin_column="True"
- embroider_zigzag_spacing_mm="0.33"
- inkscape:connector-curvature="0" />
- <path
- embroider_trim_after="True"
- embroider_center_walk_underlay_stitch_length_mm="2.5"
- embroider_center_walk_underlay="True"
- embroider_zigzag_spacing_mm="0.33"
- embroider_satin_column="True"
- d="m 66.26395,59.054055 c 0,0 2.787574,0.283482 4.29948,0.732329 m -4.370351,1.133928 c 0,0 4.015997,-0.614212 4.488468,-0.897694"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path4911"
- inkscape:connector-curvature="0" />
- </g>
- <g
inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="Needle - Grey"
- style="display:inline" />
- <g
style="display:inline"
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Hoop - Green">
+ inkscape:label="Ink Stitch - Black"
+ id="layer1">
<g
- id="g4828">
+ style="display:inline"
+ id="g4808">
<path
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm="0.32"
+ embroider_trim_after="True"
+ embroider_satin_column="True"
+ d="M 34.811856,55.028284 V 41.664807 m -3.140416,13.29666 v -13.29666"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4334"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4357"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 44.233107,54.961467 44.099472,44.872042 M 41.35996,54.961467 41.293142,44.938859"
+ embroider_satin_column="True"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_spacing_mm="0.33"
+ inkscape:connector-curvature="0" />
+ <path
+ embroider_running_stitch_length_mm="2.5"
inkscape:connector-curvature="0"
- embroider_fill_underlay_inset_mm=".3"
- embroider_fill_underlay_angle="45"
- embroider_fill_underlay="True"
- embroider_max_stitch_length_mm="4"
- id="path5770"
- transform="scale(0.26458333)"
- d="m 62.755859,185.12695 c 0,0 -4.54649,-0.12742 -5.55664,5.55469 v 66.03906 c 0,0 1.263006,5.68223 6.1875,5.42969 l 13.257812,0.12695 -0.125,-77.02539 z M 66.625,229.79688 c 2.370474,-0.0417 3.455078,1.29101 3.455078,1.29101 v 4.16797 c -0.378807,0.88388 -1.894531,1.13476 -1.894531,1.13476 l -3.410156,0.12696 c -2.399112,-0.63135 -2.777344,-3.15625 -2.777344,-3.15625 0.12627,-2.65165 2.777344,-3.2832 2.777344,-3.28321 0.686588,-0.18939 1.302577,-0.27164 1.849609,-0.28124 z m -0.513672,16.79492 c 0.175254,-0.005 0.361299,0.004 0.558594,0.0273 0,0 2.52549,-0.25241 2.904297,2.9043 0,0 0.378699,2.90439 -2.904297,3.2832 0,0 -3.534473,-7.9e-4 -3.408203,-3.03125 0,0 0.220808,-3.10729 2.849609,-3.18359 z"
- style="opacity:1;fill:#003399;fill-opacity:1;stroke:none;stroke-width:1.70078731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ id="path4380"
+ d="M 42.829942,44.938859 41.694047,41.798443"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
<path
- style="opacity:1;fill:none;fill-opacity:1;stroke:#003399;stroke-width:0.44999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998,0.44999998;stroke-dashoffset:0;stroke-opacity:1"
- d="m 20.363467,48.919569 0.425223,-6.992559 1.464658,-4.582962 3.685268,-4.204986 4.299478,-2.598587 5.433409,-1.511903 6.66183,-0.188989 10.819569,-0.09449 11.622767,0.236236 5.149924,1.322916 5.149927,3.685268 3.354538,4.819194 1.27567,4.488469 0.614212,4.015996 -0.425225,3.779761"
- id="path5866"
+ id="path4416"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 50.246671,55.362371 4.944486,-1.069078 m -6.61492,0 6.481284,-3.407688 m -10.089422,-0.334086 4.744032,-4.744032 m -9.354434,1.403164 5.345393,-5.612661 m -5.412208,2.605878 3.608139,-3.474503 m -2.071341,0.46772 11.02487,10.690783 0.133633,3.474503 m -11.759859,-14.098468 0.06682,4.944486 3.34087,1.870887 7.884451,7.349913"
+ embroider_satin_column="True"
+ embroider_zigzag_spacing_mm="0.33"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_underlay_inset_mm=".4"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ inkscape:connector-curvature="0" />
+ <path
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm="0.33"
+ embroider_satin_column="True"
+ d="m 48.576237,45.874302 5.746295,-0.06681 m -5.87993,7.617174 6.614919,-2.605876 m -4.209494,4.877668 3.474505,-1.937705 m -1.336349,1.5368 -0.133633,-13.49711 m -0.400905,13.563928 -2.605879,-2.204974 0.133636,-11.425772"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4451"
+ inkscape:connector-curvature="0"
+ embroider_trim_after="True" />
+ <path
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm="0.33"
+ embroider_satin_column="True"
+ d="m 62.035343,54.91994 -0.0945,-6.945313 m -3.023805,6.945313 0.09449,-6.992559"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4508"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 60.334448,47.785639 0.04725,-5.811383"
+ id="path4539"
inkscape:connector-curvature="0"
embroider_running_stitch_length_mm="2.5" />
<path
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm=".33"
+ embroider_satin_column="True"
+ d="m 61.988093,41.59628 -0.04725,6.992559 m -2.929312,-7.039808 v 7.65402"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4573"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 62.366072,48.25811 2.787573,-2.504093 2.787573,-3.638021"
+ id="path4608"
inkscape:connector-curvature="0"
- embroider_fill_underlay_inset_mm=".4"
- embroider_fill_underlay_angle="45"
- embroider_fill_underlay="True"
- embroider_max_stitch_length_mm="4"
- id="path5958"
- transform="scale(0.26458333)"
- d="m 316.91016,184.50195 c -1.66764,0.0725 -2.24805,2.39258 -2.24805,2.39258 l 0.12695,4.04102 c -0.50507,2.14657 -3.15625,2.65039 -3.15625,2.65039 -1.89404,0 -3.41015,-2.27344 -3.41015,-2.27344 l -6.56641,-0.75586 -0.125,70.70898 h 14.64648 c 3.78807,-0.12626 5.17774,-4.92382 5.17774,-4.92382 l 0.125,-66.66992 c -0.12627,-4.16689 -3.78711,-5.05079 -3.78711,-5.05079 -0.28411,-0.0947 -0.54497,-0.12949 -0.7832,-0.11914 z m -6.16211,45.44922 3.41015,0.25391 c 2.90419,0.63134 2.52539,3.15625 2.52539,3.15625 0.12627,1.89403 -2.40039,2.77734 -2.40039,2.77734 l -3.66211,0.25195 c -1.38895,-0.50507 -2.27148,-1.51367 -2.27148,-1.51367 l 0.125,-3.1582 c 0.12626,-1.76778 2.27344,-1.76758 2.27344,-1.76758 z m 1.76757,16.54102 c 0,0 2.65177,0.001 2.9043,3.1582 0,0 4.8e-4,3.15625 -3.15625,3.15625 0,0 -3.02998,-0.12579 -3.15625,-3.15625 0,0 0.25149,-3.03194 3.4082,-3.1582 z"
- style="opacity:1;fill:#003399;fill-opacity:1;stroke:none;stroke-width:1.70078731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- embroider_angle="180" />
+ embroider_running_stitch_length_mm="2.5" />
+ <path
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm="0.33"
+ embroider_satin_column="True"
+ d="m 64.019718,42.257739 7.417781,0.14174 m -11.150298,5.953125 7.654017,-0.33073 m -3.307291,6.283854 7.039808,-0.141739 m -1.511906,-12.473215 -4.960937,6.3311 5.480655,6.992559 m -4.299479,-13.465402 -5.008184,6.898066 5.480653,6.567336"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4652"
+ embroider_trim_after="True"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm="0.33"
+ embroider_satin_column="True"
+ d="m 33.072916,68.10186 -0.09449,-3.401788 m -0.921322,3.000188 -1.275667,-2.976563 m 0.944938,3.071056 -3.071056,-1.086681 m 3.638021,1.299292 -3.000184,2.055246 m 3.968749,-1.346538 c -0.0945,0.09449 -2.267857,2.740326 -2.267857,2.740326 m 4.441219,-1.322916 -3.567149,1.677267 m 3.449031,1.417413 -3.09468,-1.063059 m 0.212614,3.260045 -1.252048,-3.472656 m -1.063057,3.449032 -0.188989,-3.96875 m -0.614211,0.637836 c 0,0 1.252045,0.779576 2.173364,0.897692 0,0 1.086681,0.02363 1.393786,-0.566963 0,0 0.4016,-0.496093 -0.614211,-1.228422 0,0 -1.204799,-0.614211 -1.606399,-0.897694 0,0 -1.34654,-0.87407 -1.41741,-1.960751 0,0 -0.259859,-1.937128 1.559151,-2.504092 0,0 1.063058,-0.685082 3.449033,0.188988 m -4.77195,8.409968 c 0,0 2.409598,0.803201 3.96875,-0.02363 0,0 1.441035,-0.637826 1.441035,-2.055237 0,0 0.236235,-1.511905 -0.826823,-2.291481 0,0 -1.559152,-0.968564 -2.102493,-1.228422 0,0 -0.94494,-0.283482 -0.755952,-1.110305 0,0 0.07087,-0.755953 1.630022,-0.354353 0,0 0.826823,0.236235 1.441035,0.685082"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4343" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 35.71875,66.849812 3.425409,-0.236233 -0.04725,3.307291 0.07087,3.071056 0.02363,0.944941"
+ id="path4394"
+ inkscape:connector-curvature="0"
+ embroider_running_stitch_length_mm="2.5" />
<path
inkscape:connector-curvature="0"
embroider_zigzag_underlay_spacing_mm="1.2"
@@ -404,20 +176,255 @@
embroider_zigzag_underlay="True"
embroider_zigzag_spacing_mm=".33"
embroider_satin_column="True"
- d="m 75.03592,69.527657 h 10.289876 m -11.893495,6.013564 h 11.225321 m -12.49485,4.476763 9.554885,3.474506 M 69.155989,83.358854 c 0,0.267269 4.34313,7.015824 4.34313,7.015824 m -7.550364,-5.412208 0.334087,7.149459 m 15.167546,-25.524237 0.200451,6.280832 c 0,0 -1.135896,15.902538 -17.105249,17.572972 m 13.898015,-23.786986 0.06682,6.414468 c 0,0 -1.069078,12.762119 -14.165286,14.098466"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#003399;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path6164" />
+ d="m 40.23084,74.503832 0.02363,-7.65402 m -2.078876,7.677642 0.02363,-7.630393"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4448" />
<path
- sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccc"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 39.262277,66.471836 c 0,0 -2.645833,0 -2.763951,-0.02363 -0.118118,-0.02363 -0.73233,0.165364 -0.73233,0.165364"
+ id="path4503"
inkscape:connector-curvature="0"
- id="path6289"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#003399;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 74.835466,54.761016 87.597585,54.62738 m -13.563928,-8.084902 11.960312,-4.34313 m -16.771162,-6.882191 8.018084,-7.483546 m -13.898015,5.144939 2.539061,-7.884452 m -20.312483,7.416729 -0.133636,-7.617181 m -10.69078,8.753077 -1.804069,-7.817634 M 27.662396,38.658027 20.713388,30.63994 m 4.409947,14.098468 -10.557146,-2.338609 m 10.891233,16.37026 -12.428033,1.00226 m 13.76438,12.962572 -11.559406,3.073599 m 15.434814,3.541321 -7.617181,9.554884 m 13.831198,-4.81085 c -0.133636,0.267269 -2.00452,8.552625 -2.00452,8.552625 m 29.733734,-7.483547 0.267269,7.550365 m 1.202714,-2.472243 -1.603619,0.200451 -28.865107,-0.06682 h 0.06682 c 0,0 -15.367996,-0.935442 -17.038431,-17.572971 l -0.06682,-28.531018 c 0,0 1.469982,-15.367998 17.572971,-16.83798 h 28.597838 c 0,0 14.833458,1.135895 16.971615,17.506154 l -0.133635,26.593317 m -15.835722,15.501633 -1.937702,0.267268 h -27.32831 c 0,0 -12.895754,-0.334086 -14.76664,-14.633005 V 45.005678 c 0,0 0.935443,-12.962572 14.432554,-14.432554 l 28.664657,-0.06682 c 0,0 12.294398,1.5368 13.697563,14.699824 v 26.259233"
+ embroider_running_stitch_length_mm="2.5" />
+ <path
+ inkscape:connector-curvature="0"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm="0.33"
+ embroider_satin_column="True"
+ d="m 35.435267,67.629388 7.535899,0.02363 m -7.535899,-1.795393 h 7.535899"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4561" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 44.624812,66.684447 0.519719,2.291483 c 0,0 0.259858,3.212798 0.212611,3.354538 -0.04725,0.14174 -0.118118,1.748139 -0.118118,1.748139"
+ id="path4620"
+ inkscape:connector-curvature="0"
+ embroider_running_stitch_length_mm="2.5" />
+ <path
+ inkscape:connector-curvature="0"
+ embroider_zigzag_underlay_spacing_mm="1.25"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm="0.33"
+ embroider_satin_column="True"
+ d="m 46.278458,74.503832 0.04725,-8.669829 m -2.102494,8.646204 0.02363,-8.575333"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4682" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 47.861235,66.778943 3.118303,-0.07087 0.259858,1.228423 0.118117,2.83482 0.02363,3.472657"
+ id="path4745"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc"
+ embroider_running_stitch_length_mm="2.5" />
+ <path
+ inkscape:connector-curvature="0"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm=".33"
+ embroider_satin_column="True"
+ d="m 52.420572,74.527454 v -7.677642 m -2.078868,7.630395 v -7.724888"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4811" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 51.357513,66.613579 -3.378162,0.04725"
+ id="path4878"
+ inkscape:connector-curvature="0"
+ embroider_running_stitch_length_mm="2.5" />
+ <path
+ inkscape:connector-curvature="0"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm=".33"
embroider_satin_column="True"
+ d="m 47.601375,67.653013 h 7.512277 m -7.535899,-1.771764 7.583146,-0.02363"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4948" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 57.357885,67.322284 -0.425222,1.464656 -0.165365,1.984375 0.590587,1.700893 2.220611,1.370166 h 1.653646 l 1.228423,-0.708708"
+ id="path5019"
+ inkscape:connector-curvature="0"
+ embroider_running_stitch_length_mm="2.5" />
+ <path
+ inkscape:connector-curvature="0"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
embroider_zigzag_spacing_mm=".33"
+ embroider_satin_column="True"
+ d="m 61.657364,71.031176 0.02363,4.890066 m -1.630029,-4.417597 c 0,0 -0.566962,4.582962 -0.566962,4.51209 m -0.425225,-4.937313 c 0,0 -3.02381,3.543525 -3.000185,3.42541 m 2.409597,-4.181364 -3.874256,0.685083 m 3.945128,-1.913503 -3.28367,-0.661459 m 4.228611,0.02362 -1.795389,-3.165549 m 2.763951,3.047431 -0.212611,-3.992372 m 1.393788,4.370351 0.236233,-4.086868 m 0.803201,9.402156 c 0,0 -1.630024,1.039434 -3.23642,0.708705 0,0 -2.14974,-0.188986 -3.260045,-2.315102 0,0 -0.87407,-1.511905 -0.448847,-3.260045 0,0 0.4016,-2.196986 2.291481,-3.09468 0,0 2.456845,-1.34654 4.724702,0.330729 m 0.02362,5.315289 c 0,0 -1.488282,1.299295 -2.763952,1.063059 0,0 -1.677267,0.188989 -2.267855,-2.078868 0,0 -0.236235,-1.771764 0.921317,-2.740328 0,0 0.897693,-0.779576 2.409598,-0.425223 0,0 0.992187,0.496094 1.488281,1.063058"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path5109" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 64.515809,67.275037 0.685083,0.614212 0.04725,3.567149 -0.14174,2.527716"
+ id="path5184"
+ inkscape:connector-curvature="0"
+ embroider_running_stitch_length_mm="2.5" />
+ <path
+ inkscape:connector-curvature="0"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm=".33"
+ embroider_satin_column="True"
+ d="m 66.193079,74.480207 -0.02363,-4.51209 m -2.007991,4.51209 v -4.630208"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path5262" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 65.082774,69.613763 0.02363,-3.449031"
+ id="path5341"
+ inkscape:connector-curvature="0"
+ embroider_running_stitch_length_mm="2.4" />
+ <path
+ inkscape:connector-curvature="0"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm=".33"
+ embroider_satin_column="True"
+ d="m 66.169454,65.857625 0.02363,5.008186 m -2.031626,-5.031808 -10e-7,5.008183"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path5423" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5508"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 66.074961,69.070423 4.03962,-6e-6 m -4.346724,1.748145 4.417597,0.04725"
+ embroider_satin_column="True"
+ embroider_zigzag_spacing_mm=".33"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay_spacing_mm="1.2" />
+ <path
+ embroider_running_stitch_length_mm="2.5"
+ inkscape:connector-curvature="0"
+ id="path5593"
+ d="m 70.256322,70.157104 0.401601,-2.007997 -0.09449,-1.984375"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5681"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 71.50837,65.857625 0.04725,8.646207 m -2.055249,-8.622583 0.04725,8.622583"
+ embroider_satin_column="True"
+ embroider_zigzag_spacing_mm=".33"
+ embroider_trim_after="True"
embroider_zigzag_underlay="True"
embroider_zigzag_underlay_inset_mm=".04"
embroider_zigzag_underlay_spacing_mm="1.2" />
</g>
</g>
+ <g
+ style="display:inline"
+ inkscape:label="Needle - Grey"
+ id="layer3"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ id="g4815">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4730"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 67.051242,59.672092 -3.274052,0.03341 m 3.240643,-0.56795 c 0,0 -2.271792,-0.267269 -3.240643,-0.03341"
+ embroider_satin_column="True"
+ embroider_zigzag_spacing_mm="0.33" />
+ <path
+ embroider_running_stitch_length_mm="2.5"
+ inkscape:connector-curvature="0"
+ id="path4771"
+ d="M 63.576739,59.505048 61.505398,59.97277 57.329313,60.00618 49.945993,60.073 43.297662,60.173227 36.114794,60.073 30.669177,60.00618 h -0.768398"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4815"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 29.633508,60.874806 0.902036,0.534538 13.898014,-0.06682 c 0,0 2.639287,-0.400903 4.109269,-0.634765 l 12.595078,-0.16704 c 0,0 2.372017,0.334087 3.274051,0.334087 m -34.845264,-1.737254 0.935443,-0.534538 c 0,0 13.129614,-0.200453 13.630745,-0.06682 0,0 3.842,0.60136 4.744035,0.701586 l 12.194172,0.167043 c 0,0 2.639287,-0.400904 3.173826,-0.367496"
+ embroider_satin_column="True"
+ embroider_zigzag_spacing_mm=".33"
+ embroider_center_walk_underlay="True"
+ embroider_center_walk_underlay_stitch_length_mm="2.5" />
+ <path
+ inkscape:connector-curvature="0"
+ embroider_zigzag_spacing_mm="0.33"
+ embroider_satin_column="True"
+ d="m 63.9016,60.84944 c 0,0 1.842632,0.165365 3.165549,-0.07087 m -3.212796,-0.519717 3.212796,-0.09449"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4862" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4911"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#4d4f53;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 66.26395,59.054055 c 0,0 2.787574,0.283482 4.29948,0.732329 m -4.370351,1.133928 c 0,0 4.015997,-0.614212 4.488468,-0.897694"
+ embroider_satin_column="True"
+ embroider_zigzag_spacing_mm="0.33"
+ embroider_center_walk_underlay="True"
+ embroider_center_walk_underlay_stitch_length_mm="2.5"
+ embroider_trim_after="True" />
+ </g>
+ </g>
+ <g
+ inkscape:label="Hoop - Green"
+ id="layer2"
+ inkscape:groupmode="layer"
+ style="display:inline">
+ <g
+ id="g4828">
+ <path
+ style="opacity:1;fill:#003399;fill-opacity:1;stroke:none;stroke-width:1.70078731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 62.755859,185.12695 c 0,0 -4.54649,-0.12742 -5.55664,5.55469 v 66.03906 c 0,0 1.263006,5.68223 6.1875,5.42969 l 13.257812,0.12695 -0.125,-77.02539 z M 66.625,229.79688 c 2.370474,-0.0417 3.455078,1.29101 3.455078,1.29101 v 4.16797 c -0.378807,0.88388 -1.894531,1.13476 -1.894531,1.13476 l -3.410156,0.12696 c -2.399112,-0.63135 -2.777344,-3.15625 -2.777344,-3.15625 0.12627,-2.65165 2.777344,-3.2832 2.777344,-3.28321 0.686588,-0.18939 1.302577,-0.27164 1.849609,-0.28124 z m -0.513672,16.79492 c 0.175254,-0.005 0.361299,0.004 0.558594,0.0273 0,0 2.52549,-0.25241 2.904297,2.9043 0,0 0.378699,2.90439 -2.904297,3.2832 0,0 -3.534473,-7.9e-4 -3.408203,-3.03125 0,0 0.220808,-3.10729 2.849609,-3.18359 z"
+ transform="scale(0.26458333)"
+ id="path5770"
+ embroider_max_stitch_length_mm="4"
+ embroider_fill_underlay="True"
+ embroider_fill_underlay_angle="45"
+ embroider_fill_underlay_inset_mm=".3"
+ inkscape:connector-curvature="0" />
+ <path
+ embroider_running_stitch_length_mm="2.5"
+ inkscape:connector-curvature="0"
+ id="path5866"
+ d="m 20.363467,48.919569 0.425223,-6.992559 1.464658,-4.582962 3.685268,-4.204986 4.299478,-2.598587 5.433409,-1.511903 6.66183,-0.188989 10.819569,-0.09449 11.622767,0.236236 5.149924,1.322916 5.149927,3.685268 3.354538,4.819194 1.27567,4.488469 0.614212,4.015996 -0.425225,3.779761"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#003399;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.44999998, 0.44999998;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ embroider_angle="180"
+ style="opacity:1;fill:#003399;fill-opacity:1;stroke:none;stroke-width:1.70078731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 316.91016,184.50195 c -1.66764,0.0725 -2.24805,2.39258 -2.24805,2.39258 l 0.12695,4.04102 c -0.50507,2.14657 -3.15625,2.65039 -3.15625,2.65039 -1.89404,0 -3.41015,-2.27344 -3.41015,-2.27344 l -6.56641,-0.75586 -0.125,70.70898 h 14.64648 c 3.78807,-0.12626 5.17774,-4.92382 5.17774,-4.92382 l 0.125,-66.66992 c -0.12627,-4.16689 -3.78711,-5.05079 -3.78711,-5.05079 -0.28411,-0.0947 -0.54497,-0.12949 -0.7832,-0.11914 z m -6.16211,45.44922 3.41015,0.25391 c 2.90419,0.63134 2.52539,3.15625 2.52539,3.15625 0.12627,1.89403 -2.40039,2.77734 -2.40039,2.77734 l -3.66211,0.25195 c -1.38895,-0.50507 -2.27148,-1.51367 -2.27148,-1.51367 l 0.125,-3.1582 c 0.12626,-1.76778 2.27344,-1.76758 2.27344,-1.76758 z m 1.76757,16.54102 c 0,0 2.65177,0.001 2.9043,3.1582 0,0 4.8e-4,3.15625 -3.15625,3.15625 0,0 -3.02998,-0.12579 -3.15625,-3.15625 0,0 0.25149,-3.03194 3.4082,-3.1582 z"
+ transform="scale(0.26458333)"
+ id="path5958"
+ embroider_max_stitch_length_mm="4"
+ embroider_fill_underlay="True"
+ embroider_fill_underlay_angle="45"
+ embroider_fill_underlay_inset_mm=".4"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path6164"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#003399;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 75.03592,69.527657 h 10.289876 m -11.893495,6.013564 h 11.225321 m -12.49485,4.476763 9.554885,3.474506 M 69.155989,83.358854 c 0,0.267269 4.34313,7.015824 4.34313,7.015824 m -7.550364,-5.412208 0.334087,7.149459 m 15.167546,-25.524237 0.200451,6.280832 c 0,0 -1.135896,15.902538 -17.105249,17.572972 m 13.898015,-23.786986 0.06682,6.414468 c 0,0 -1.069078,12.762119 -14.165286,14.098466"
+ embroider_satin_column="True"
+ embroider_zigzag_spacing_mm=".33"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ inkscape:connector-curvature="0" />
+ <path
+ embroider_zigzag_underlay_spacing_mm="1.2"
+ embroider_zigzag_underlay_inset_mm=".04"
+ embroider_zigzag_underlay="True"
+ embroider_zigzag_spacing_mm=".33"
+ embroider_satin_column="True"
+ d="M 74.835466,54.761016 87.597585,54.62738 m -13.563928,-8.084902 11.960312,-4.34313 m -16.771162,-6.882191 8.018084,-7.483546 m -13.898015,5.144939 2.539061,-7.884452 m -20.312483,7.416729 -0.133636,-7.617181 m -10.69078,8.753077 -1.804069,-7.817634 M 27.662396,38.658027 20.713388,30.63994 m 4.409947,14.098468 -10.557146,-2.338609 m 10.891233,16.37026 -12.428033,1.00226 m 13.76438,12.962572 -11.559406,3.073599 m 15.434814,3.541321 -7.617181,9.554884 m 13.831198,-4.81085 c -0.133636,0.267269 -2.00452,8.552625 -2.00452,8.552625 m 29.733734,-7.483547 0.267269,7.550365 m 1.202714,-2.472243 -1.603619,0.200451 -28.865107,-0.06682 h 0.06682 c 0,0 -15.367996,-0.935442 -17.038431,-17.572971 l -0.06682,-28.531018 c 0,0 1.469982,-15.367998 17.572971,-16.83798 h 28.597838 c 0,0 14.833458,1.135895 16.971615,17.506154 l -0.133635,26.593317 m -15.835722,15.501633 -1.937702,0.267268 h -27.32831 c 0,0 -12.895754,-0.334086 -14.76664,-14.633005 V 45.005678 c 0,0 0.935443,-12.962572 14.432554,-14.432554 l 28.664657,-0.06682 c 0,0 12.294398,1.5368 13.697563,14.699824 v 26.259233"
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#003399;stroke-width:0.44999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path6289"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccc" />
+ </g>
+ </g>
</svg>
diff --git a/lib/extensions/base.py b/lib/extensions/base.py
index ff587ca5..52321cfc 100644
--- a/lib/extensions/base.py
+++ b/lib/extensions/base.py
@@ -63,10 +63,10 @@ class InkStitchMetadata(MutableMapping):
else:
item.getparent().remove(item)
- def _find_item(self, name):
+ def _find_item(self, name, create=True):
tag = inkex.addNS(name, "inkstitch")
item = self.metadata.find(tag)
- if item is None:
+ if item is None and create:
item = inkex.etree.SubElement(self.metadata, tag)
return item
@@ -80,9 +80,9 @@ class InkStitchMetadata(MutableMapping):
return None
def __delitem__(self, name):
- item = self._find_item(name)
+ item = self._find_item(name, create=False)
- if item:
+ if item is not None:
self.metadata.remove(item)
def __iter__(self):
diff --git a/lib/extensions/print_pdf.py b/lib/extensions/print_pdf.py
index baeb7eba..6e2eff58 100644
--- a/lib/extensions/print_pdf.py
+++ b/lib/extensions/print_pdf.py
@@ -21,7 +21,7 @@ import requests
from .base import InkstitchExtension
from ..i18n import _, translation as inkstitch_translation
from ..svg import PIXELS_PER_MM, render_stitch_plan
-from ..svg.tags import SVG_GROUP_TAG
+from ..svg.tags import SVG_GROUP_TAG, INKSCAPE_GROUPMODE
from ..stitch_plan import patches_to_stitch_plan
from ..threads import ThreadCatalog
@@ -94,6 +94,8 @@ class PrintPreviewServer(Thread):
self.html = kwargs.pop('html')
self.metadata = kwargs.pop('metadata')
self.stitch_plan = kwargs.pop('stitch_plan')
+ self.realistic_overview_svg = kwargs.pop('realistic_overview_svg')
+ self.realistic_color_block_svgs = kwargs.pop('realistic_color_block_svgs')
Thread.__init__(self, *args, **kwargs)
self.daemon = True
self.last_request_time = None
@@ -202,6 +204,14 @@ class PrintPreviewServer(Thread):
return jsonify(threads)
+ @self.app.route('/realistic/block<int:index>', methods=['GET'])
+ def get_realistic_block(index):
+ return Response(self.realistic_color_block_svgs[index], mimetype='image/svg+xml')
+
+ @self.app.route('/realistic/overview', methods=['GET'])
+ def get_realistic_overview():
+ return Response(self.realistic_overview_svg, mimetype='image/svg+xml')
+
def stop(self):
# for whatever reason, shutting down only seems possible in
# the context of a flask request, so we'll just make one
@@ -295,38 +305,24 @@ class Print(InkstitchExtension):
return env
- def strip_namespaces(self):
+ def strip_namespaces(self, svg):
# namespace prefixes seem to trip up HTML, so get rid of them
- for element in self.document.iter():
+ for element in svg.iter():
if element.tag[0]=='{':
element.tag = element.tag[element.tag.index('}',1) + 1:]
- def effect(self):
- # It doesn't really make sense to print just a couple of selected
- # objects. It's almost certain they meant to print the whole design.
- # If they really wanted to print just a few objects, they could set
- # the rest invisible temporarily.
- self.selected = {}
+ def render_svgs(self, stitch_plan, realistic=False):
+ svg = deepcopy(self.document).getroot()
+ render_stitch_plan(svg, stitch_plan, realistic)
- if not self.get_elements():
- return
-
- self.hide_all_layers()
-
- patches = self.elements_to_patches(self.elements)
- stitch_plan = patches_to_stitch_plan(patches)
- palette = ThreadCatalog().match_and_apply_palette(stitch_plan, self.get_inkstitch_metadata()['thread-palette'])
- render_stitch_plan(self.document.getroot(), stitch_plan)
-
- self.strip_namespaces()
+ self.strip_namespaces(svg)
# Now the stitch plan layer will contain a set of groups, each
# corresponding to a color block. We'll create a set of SVG files
# corresponding to each individual color block and a final one
# for all color blocks together.
- svg = self.document.getroot()
- layers = svg.findall("./g[@{http://www.inkscape.org/namespaces/inkscape}groupmode='layer']")
+ layers = svg.findall("./g[@%s='layer']" % INKSCAPE_GROUPMODE)
stitch_plan_layer = svg.find(".//*[@id='__inkstitch_stitch_plan__']")
# First, delete all of the other layers. We don't need them and they'll
@@ -335,9 +331,9 @@ class Print(InkstitchExtension):
if layer is not stitch_plan_layer:
svg.remove(layer)
- overview_svg = inkex.etree.tostring(self.document)
-
+ overview_svg = inkex.etree.tostring(svg)
color_block_groups = stitch_plan_layer.getchildren()
+ color_block_svgs = []
for i, group in enumerate(color_block_groups):
# clear the stitch plan layer
@@ -347,12 +343,15 @@ class Print(InkstitchExtension):
stitch_plan_layer.append(group)
# save an SVG preview
- stitch_plan.color_blocks[i].svg_preview = inkex.etree.tostring(self.document)
+ color_block_svgs.append(inkex.etree.tostring(svg))
+ return overview_svg, color_block_svgs
+
+ def render_html(self, stitch_plan, overview_svg, selected_palette):
env = self.build_environment()
template = env.get_template('index.html')
- html = template.render(
+ return template.render(
view = {'client_overview': False, 'client_detailedview': False, 'operator_overview': True, 'operator_detailedview': True},
logo = {'src' : '', 'title' : 'LOGO'},
date = date.today(),
@@ -371,14 +370,38 @@ class Print(InkstitchExtension):
svg_overview = overview_svg,
color_blocks = stitch_plan.color_blocks,
palettes = ThreadCatalog().palette_names(),
- selected_palette = palette,
+ selected_palette = selected_palette,
)
- # We've totally mucked with the SVG. Restore it so that we can save
- # metadata into it.
- self.document = deepcopy(self.original_document)
+ def effect(self):
+ # It doesn't really make sense to print just a couple of selected
+ # objects. It's almost certain they meant to print the whole design.
+ # If they really wanted to print just a few objects, they could set
+ # the rest invisible temporarily.
+ self.selected = {}
+
+ if not self.get_elements():
+ return
+
+ patches = self.elements_to_patches(self.elements)
+ stitch_plan = patches_to_stitch_plan(patches)
+ palette = ThreadCatalog().match_and_apply_palette(stitch_plan, self.get_inkstitch_metadata()['thread-palette'])
+
+ overview_svg, color_block_svgs = self.render_svgs(stitch_plan, realistic=False)
+ realistic_overview_svg, realistic_color_block_svgs = self.render_svgs(stitch_plan, realistic=True)
+
+ for i, svg in enumerate(color_block_svgs):
+ stitch_plan.color_blocks[i].svg_preview = svg
+
+ html = self.render_html(stitch_plan, overview_svg, palette)
- print_server = PrintPreviewServer(html=html, metadata=self.get_inkstitch_metadata(), stitch_plan=stitch_plan)
+ print_server = PrintPreviewServer(
+ html=html,
+ metadata=self.get_inkstitch_metadata(),
+ stitch_plan=stitch_plan,
+ realistic_overview_svg=realistic_overview_svg,
+ realistic_color_block_svgs=realistic_color_block_svgs
+ )
print_server.start()
time.sleep(1)
diff --git a/lib/svg/realistic_rendering.py b/lib/svg/realistic_rendering.py
new file mode 100644
index 00000000..e31534da
--- /dev/null
+++ b/lib/svg/realistic_rendering.py
@@ -0,0 +1,129 @@
+import simplepath
+import math
+
+from .units import PIXELS_PER_MM
+from ..utils import cache, Point
+
+# The stitch vector path looks like this:
+# _______
+# (_______)
+#
+# It's 0.32mm high, which is the approximate thickness of common machine
+# embroidery threads.
+
+# 1.216 pixels = 0.32mm
+stitch_height = 1.216
+
+# This vector path starts at the upper right corner of the stitch shape and
+# proceeds counter-clockwise.and contains a placeholder (%s) for the stitch
+# length.
+#
+# It contains two invisible "whiskers" of zero width that go above and below
+# to ensure that the SVG renderer allocates a large enough canvas area when
+# computing the gaussian blur steps. Otherwise, we'd have to expand the
+# width and height attributes of the <filter> tag to add more buffer space.
+# The width and height are specified in multiples of the bounding box
+# size, It's the bounding box aligned with the global SVG canvas's axes, not
+# the axes of the stitch itself. That means that having a big enough value
+# to add enough padding on the long sides of the stitch would waste a ton
+# of space on the short sides and significantly slow down rendering.
+stitch_path = "M0,0c0.4,0,0.4,0.3,0.4,0.6c0,0.3,-0.1,0.6,-0.4,0.6v0.2,-0.2h-%sc-0.4,0,-0.4,-0.3,-0.4,-0.6c0,-0.3,0.1,-0.6,0.4,-0.6v-0.2,0.2z"
+
+# This filter makes the above stitch path look like a real stitch with lighting.
+realistic_filter = """
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="realistic-stitch-filter"
+ x="-0.1"
+ width="1.2"
+ y="-0.1"
+ height="1.2">
+ <feGaussianBlur
+ stdDeviation="1.5"
+ id="feGaussianBlur1542-6"
+ in="SourceAlpha" />
+ <feComponentTransfer
+ id="feComponentTransfer1544-7"
+ result="result1">
+ <feFuncR
+ id="feFuncR1546-5"
+ type="identity" />
+ <feFuncG
+ id="feFuncG1548-3"
+ type="identity" />
+ <feFuncB
+ id="feFuncB1550-5"
+ type="identity"
+ slope="4.5300000000000002" />
+ <feFuncA
+ id="feFuncA1552-6"
+ type="gamma"
+ slope="0.14999999999999999"
+ intercept="0"
+ amplitude="3.1299999999999999"
+ offset="-0.33000000000000002" />
+ </feComponentTransfer>
+ <feComposite
+ in2="SourceAlpha"
+ id="feComposite1558-2"
+ operator="in" />
+ <feGaussianBlur
+ stdDeviation="0.089999999999999997"
+ id="feGaussianBlur1969" />
+ <feMorphology
+ id="feMorphology1971"
+ operator="dilate"
+ radius="0.10000000000000001" />
+ <feSpecularLighting
+ id="feSpecularLighting1973"
+ result="result2"
+ specularConstant="0.70899999"
+ surfaceScale="30">
+ <fePointLight
+ id="fePointLight1975"
+ z="10" />
+ </feSpecularLighting>
+ <feGaussianBlur
+ stdDeviation="0.040000000000000001"
+ id="feGaussianBlur1979" />
+ <feComposite
+ in2="SourceGraphic"
+ id="feComposite1977"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result3"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ id="feComposite1981"
+ operator="in" />
+ </filter>
+"""
+
+def realistic_stitch(start, end):
+ """Generate a stitch vector path given a start and end point."""
+
+ end = Point(*end)
+ start = Point(*start)
+
+ stitch_length = (end - start).length()
+ stitch_center = (end + start) / 2.0
+ stitch_direction = (end - start)
+ stitch_angle = math.atan2(stitch_direction.y, stitch_direction.x)
+
+ stitch_length = max(0, stitch_length - 0.2 * PIXELS_PER_MM)
+
+ # create the path by filling in the length in the template
+ path = simplepath.parsePath(stitch_path % stitch_length)
+
+ # rotate the path to match the stitch
+ rotation_center_x = -stitch_length / 2.0
+ rotation_center_y = stitch_height / 2.0
+ simplepath.rotatePath(path, stitch_angle, cx=rotation_center_x, cy=rotation_center_y)
+
+ # move the path to the location of the stitch
+ simplepath.translatePath(path, stitch_center.x - rotation_center_x, stitch_center.y - rotation_center_y)
+
+ return simplepath.formatPath(path)
diff --git a/lib/svg/svg.py b/lib/svg/svg.py
index 852215f2..5552abd8 100644
--- a/lib/svg/svg.py
+++ b/lib/svg/svg.py
@@ -1,7 +1,8 @@
import simpletransform, simplestyle, inkex
from .units import get_viewbox_transform
-from .tags import SVG_GROUP_TAG, INKSCAPE_LABEL, INKSCAPE_GROUPMODE, SVG_PATH_TAG
+from .tags import SVG_GROUP_TAG, INKSCAPE_LABEL, INKSCAPE_GROUPMODE, SVG_PATH_TAG, SVG_DEFS_TAG
+from .realistic_rendering import realistic_stitch, realistic_filter
from ..i18n import _
from ..utils import cache
@@ -32,6 +33,28 @@ def get_correction_transform(svg):
return transform
+def color_block_to_realistic_stitches(color_block, svg):
+ paths = []
+
+ for point_list in color_block_to_point_lists(color_block):
+ color = color_block.color.visible_on_white.darker.to_hex_str()
+ start = point_list[0]
+ for point in point_list[1:]:
+ paths.append(inkex.etree.Element(
+ SVG_PATH_TAG,
+ {'style': simplestyle.formatStyle(
+ {
+ 'fill': color,
+ 'stroke': 'none',
+ 'filter': 'url(#realistic-stitch-filter)'
+ }),
+ 'd': realistic_stitch(start, point),
+ 'transform': get_correction_transform(svg)
+ }))
+ start = point
+
+ return paths
+
def color_block_to_paths(color_block, svg):
paths = []
# We could emit just a single path with one subpath per point list, but
@@ -56,8 +79,7 @@ def color_block_to_paths(color_block, svg):
return paths
-
-def render_stitch_plan(svg, stitch_plan):
+def render_stitch_plan(svg, stitch_plan, realistic=False):
layer = svg.find(".//*[@id='__inkstitch_stitch_plan__']")
if layer is None:
layer = inkex.etree.Element(SVG_GROUP_TAG,
@@ -76,6 +98,17 @@ def render_stitch_plan(svg, stitch_plan):
SVG_GROUP_TAG,
{'id': '__color_block_%d__' % i,
INKSCAPE_LABEL: "color block %d" % (i + 1)})
- group.extend(color_block_to_paths(color_block, svg))
+ if realistic:
+ group.extend(color_block_to_realistic_stitches(color_block, svg))
+ else:
+ group.extend(color_block_to_paths(color_block, svg))
svg.append(layer)
+
+ if realistic:
+ defs = svg.find(SVG_DEFS_TAG)
+
+ if defs is None:
+ defs = inkex.etree.SubElement(svg, SVG_DEFS_TAG)
+
+ defs.append(inkex.etree.fromstring(realistic_filter))
diff --git a/lib/threads/color.py b/lib/threads/color.py
index af474127..fede2ecc 100644
--- a/lib/threads/color.py
+++ b/lib/threads/color.py
@@ -80,3 +80,18 @@ class ThreadColor(object):
color = tuple(value * 255 for value in color)
return ThreadColor(color, name=self.name, number=self.number, manufacturer=self.manufacturer)
+
+ @property
+ def darker(self):
+ hls = list(colorsys.rgb_to_hls(*self.rgb_normalized))
+
+ # Capping lightness should make the color visible without changing it
+ # too much.
+ hls[1] *= 0.75
+
+ color = colorsys.hls_to_rgb(*hls)
+
+ # convert back to values in the range of 0-255
+ color = tuple(value * 255 for value in color)
+
+ return ThreadColor(color, name=self.name, number=self.number, manufacturer=self.manufacturer)
diff --git a/lib/utils/geometry.py b/lib/utils/geometry.py
index 61b98bcb..7ff9b1cd 100644
--- a/lib/utils/geometry.py
+++ b/lib/utils/geometry.py
@@ -71,6 +71,12 @@ class Point:
else:
raise ValueError("cannot multiply Point by %s" % type(other))
+ def __div__(self, other):
+ if isinstance(other, (int, float)):
+ return self * (1.0 / other)
+ else:
+ raise ValueErorr("cannot divide Point by %s" % type(other))
+
def __repr__(self):
return "Point(%s,%s)" % (self.x, self.y)
diff --git a/print/resources/inkstitch.js b/print/resources/inkstitch.js
index 67690df2..4a757d5f 100644
--- a/print/resources/inkstitch.js
+++ b/print/resources/inkstitch.js
@@ -7,6 +7,10 @@ $.postJSON = function(url, data, success=null) {
});
};
+var realistic_rendering = {};
+var realistic_cache = {};
+var normal_rendering = {};
+
function ping() {
$.get("/ping")
.done(function() { setTimeout(ping, 1000) })
@@ -142,6 +146,11 @@ $(function() {
setSVGTransform($(this), $(this).find('svg').css('transform'));
});
+ // ignore mouse events on the buttons (Fill, 100%, Apply to All)
+ $('figure.inksimulation div').on('mousedown mouseup', function(e) {
+ e.stopPropagation();
+ });
+
/* Apply transforms to All */
$('button.svg-apply').click(function() {
var transform = $(this).parent().siblings('svg').css('transform');
@@ -190,6 +199,23 @@ $(function() {
}
});
});
+
+// $.getJSON('/realistic', function(realistic_data) {
+ // realistic_rendering is global
+ /*
+ $.each(realistic_data, function(name, xml) {
+ var image = new Image();
+ console.log("doing " + name);
+ image.onload = function() {
+ console.log("setting " + name + " = " + image);
+ realistic_rendering[name] = image;
+ }
+ image.src = 'data:image/svg+xml,' + xml;
+ })
+ */
+// realistic_rendering = realistic_data;
+// });
+
// wait until page size is set (if they've specified one) and then scale SVGs to fit
setTimeout(function() { scaleAllSvg() }, 500);
});
@@ -288,16 +314,86 @@ $(function() {
$('.modal').hide();
});
- //Checkbox
- $(':checkbox').on('change initialize', function() {
+ // View selection checkboxes
+ $(':checkbox.view').on('change initialize', function() {
var field_name = $(this).attr('data-field-name');
$('.' + field_name).toggle($(this).prop('checked'));
setPageNumbers();
}).on('change', function() {
+ var field_name = $(this).attr('data-field-name');
$.postJSON('/settings/' + field_name, {value: $(this).prop('checked')});
});
+ // Realistic rendering checkboxes
+ $(':checkbox.realistic').on('change', function(e) {
+ console.log("realistic rendering checkbox");
+
+ var item = $(this).data('field-name');
+ var figure = $(this).closest('figure');
+ var svg = figure.find('svg');
+ var transform = svg.css('transform');
+ var checked = $(this).prop('checked');
+
+ console.log("" + item + " " + transform);
+
+ function finalize(svg_content) {
+ svg[0].outerHTML = svg_content;
+ // can't use the svg variable here because setting outerHTML created a new tag
+ figure.find('svg').css({transform: transform});
+ }
+
+ // do this later to allow this event handler to return now,
+ // which will cause the checkbox to be checked or unchecked
+ // immediately even if SVG rendering takes awhile
+ setTimeout(function() {
+ if (checked) {
+ if (!(item in normal_rendering)) {
+ normal_rendering[item] = svg[0].outerHTML;
+ }
+
+ if (!(item in realistic_cache)) {
+ // pre-render the realistic SVG to a raster image to spare the poor browser
+ var image = document.createElement('img');
+ image.onload = function() {
+ console.log("rendering!");
+ var canvas = document.createElement('canvas');
+
+ // maybe make DPI configurable? for now, use 600
+ canvas.width = image.width / 96 * 600;
+ canvas.height = image.height / 96 * 600;
+
+ var ctx = canvas.getContext('2d');
+
+ // rendering slows down the browser enough that we can miss sending
+ // pings, so tell the server side to wait for us
+ $.get("/printing/start")
+ .done(function() {
+ ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height);
+ realistic_cache[item] = '<svg width=' + image.width + ' height=' + image.height + ' xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">' +
+ '<image x=0 y=0 width=' + image.width + ' height=' + image.height + ' xlink:href="' + canvas.toDataURL() + '" />' +
+ '</svg>';
+ finalize(realistic_cache[item]);
+ $.get("/printing/end");
+ });
+ };
+ image.src = '/realistic/' + item;
+ } else {
+ finalize(realistic_cache[item]);
+ }
+ } else {
+ finalize(normal_rendering[item]);
+ }
+ }, 100);
+
+ e.stopPropagation();
+ return true;
+ });
+
+ $('button.svg-realistic').click(function(e){
+ $(this).find('input').click();
+ });
+
// Logo
$('#logo-picker').change(function(e) {
var file = e.originalEvent.currentTarget.files[0];
diff --git a/print/resources/style.css b/print/resources/style.css
index 58ec8714..716934a8 100644
--- a/print/resources/style.css
+++ b/print/resources/style.css
@@ -473,6 +473,28 @@ body {
border: none;
background: grey;
color: white;
+ display: inline-block;
+ font-size: 16px;
+ font-family: "Barlow", sans-serif;
+ padding-left: 3px;
+ padding-right: 3px;
+ margin: 0px 1px 0px 1px;
+ }
+
+ input.realistic {
+ position: absolute;
+ transform: scale(0.7);
+ margin-left: 2px;
+ }
+
+ label.realistic {
+ margin-left: 20px;
+ }
+
+ /* prevents Chrome from sending a double event for the checkbox
+ and the containing <button> */
+ .realistic {
+ pointer-events: none;
}
/* Color Swatches */
diff --git a/print/templates/operator_overview.html b/print/templates/operator_overview.html
index 367d6d2b..6fa46911 100644
--- a/print/templates/operator_overview.html
+++ b/print/templates/operator_overview.html
@@ -32,6 +32,10 @@
<button class="svg-fit">{{ _('Fit') }}</button>
<button class="svg-full">100%</button>
<button class="svg-apply">{{ _('Apply to all') }}</button>
+ <button class="svg-realistic">
+ <input type="checkbox" id="realistic-operator-overview" data-field-name="overview" class="realistic" />
+ <label for="realistic-operator-overview" class="realistic">Realistic</label>
+ </button>
</div>
</figure>
</main>
diff --git a/print/templates/print_detail.html b/print/templates/print_detail.html
index 714d33a2..e73fe918 100644
--- a/print/templates/print_detail.html
+++ b/print/templates/print_detail.html
@@ -22,9 +22,12 @@
<button class="svg-fit">Fit</button>
<button class="svg-full">100%</button>
<button class="svg-apply">Apply to all</button>
+ <button class="svg-realistic">
+ <input type="checkbox" id="realistic-color-block-{{ loop.index0 }}" data-field-name="block{{ loop.index0 }}" class="realistic" />
+ <label for="realistic-color-block-{{ loop.index0 }}" class="realistic">Realistic</label>
+ </button>
</div>
- </figure>
-
+ </figure>
<div class="color-palette detailed">
{% include 'color_swatch.html' %}
</div>
diff --git a/print/templates/print_overview.html b/print/templates/print_overview.html
index efcf5b2e..b42ab7a9 100644
--- a/print/templates/print_overview.html
+++ b/print/templates/print_overview.html
@@ -32,14 +32,18 @@
<button class="svg-fit">Fit</button>
<button class="svg-full">100%</button>
<button class="svg-apply">Apply to all</button>
+ <button class="svg-realistic">
+ <input type="checkbox" id="realistic-client-overview" data-field-name="overview" class="realistic" />
+ <label for="realistic-client-overview" class="realistic">Realistic</label>
+ </button>
</div>
- </figure>
-
+ </figure>
+
<div class="color-palette">
{% for color_block in color_blocks %}
{% include 'color_swatch.html' %}
- {% endfor %}
-
+ {% endfor %}
+
</div>
<div class="signature">{{ _('Client Signature') }}</div>
</main>
diff --git a/print/templates/ui.html b/print/templates/ui.html
index b09dc941..3b11f345 100644
--- a/print/templates/ui.html
+++ b/print/templates/ui.html
@@ -26,10 +26,10 @@
<div>
<fieldset>
<legend>{{ _('Print Layouts') }}</legend>
- <p><input type="checkbox" id="client-overview" data-field-name="client-overview" /><label for="client-overview">Client Overview</label></p>
- <p><input type="checkbox" id="client-detailedview" data-field-name="client-detailedview" /><label for="client-detailedview">Client Detailed View</label></p>
- <p><input type="checkbox" id="operator-overview" data-field-name="operator-overview" CHECKED /><label for="operator-overview">Operator Overview</label></p>
- <p><input type="checkbox" id="operator-detailedview" data-field-name="operator-detailedview" CHECKED /><label for="operator-detailedview">Operator Detailed View</label></p>
+ <p><input type="checkbox" class="view" id="client-overview" data-field-name="client-overview" /><label for="client-overview">Client Overview</label></p>
+ <p><input type="checkbox" class="view" id="client-detailedview" data-field-name="client-detailedview" /><label for="client-detailedview">Client Detailed View</label></p>
+ <p><input type="checkbox" class="view" id="operator-overview" data-field-name="operator-overview" CHECKED /><label for="operator-overview">Operator Overview</label></p>
+ <p><input type="checkbox" class="view" id="operator-detailedview" data-field-name="operator-detailedview" CHECKED /><label for="operator-detailedview">Operator Detailed View</label></p>
</fieldset>
<button id="save-settings" title="{{ _("Includes these Page Setup settings and also the icon.") }}">{{ _("Save as defaults") }}</button>
</div>