1
0
Fork 0
mirror of https://github.com/imjasonh/terraform-playground synced 2026-07-07 23:35:16 +00:00

Add parametric magnet pockets (default 1/8" dia x 1/16" deep) on each exterior face

Co-authored-by: Jason Hall <imjasonh@users.noreply.github.com>
This commit is contained in:
Cursor Agent 2026-06-15 01:35:27 +00:00
parent d41cb29cd2
commit 6e0225b175
No known key found for this signature in database
9 changed files with 127138 additions and 45106 deletions

View file

@ -81,7 +81,7 @@ sudo apt-get install openscad # or https://openscad.org
## Usage
```bash
# default: 30 mm edges, 12 mm thick, single net, writes out/snub_net.scad + preview
# default: 30 mm edges, 12 mm thick, magnet pockets, single net -> out/snub_net.scad
uv run generate.py
# pick your own size/depth and also render an STL
@ -106,6 +106,9 @@ slice and print.
| `--web` | `0.4` | living-hinge web left at the top of each groove (mm), ~12 print layers |
| `--slack` | `6` | extra fold opening added to every groove (degrees) |
| `--over` | `0.4` | run grooves this far past each vertex for a clean fold (mm) |
| `--magnet-diameter` | `3.175` | magnet pocket diameter (mm) — default 1/8 in |
| `--magnet-depth` | `1.5875` | magnet pocket depth (mm) — default 1/16 in |
| `--no-magnets` | off | do not pocket magnet holes in the faces |
| `--max-faces-per-piece` | — | split the net into pieces of at most N faces |
| `--no-boundary-bevel` | off | leave glue-seam edges square instead of chamfered |
| `--solid` | off | also export the reference snub dodecahedron solid |
@ -132,6 +135,23 @@ Tip for choosing a size: the finished solid's circumradius is about
`2.16 × edge`, so its overall diameter is about `4.31 × edge`. So 30 mm edges
give a ball roughly 130 mm across.
## Magnets
Each face gets a cylindrical magnet pocket centered on its **exterior**
surface (`z = T`, the continuous outer side — the *opposite* side from the
inner fold grooves). The default pocket is **1/8 in diameter × 1/16 in deep**
(`3.175 mm × 1.5875 mm`); change it with `--magnet-diameter` / `--magnet-depth`,
or disable with `--no-magnets`.
Because the exterior side faces **up** when you print grooved-side-down, the
pockets are simple top-opening cavities — printable with no supports. Drop a
disc magnet into each pocket (a dab of glue holds it). Mind magnet polarity if
you want neighboring solids (or the folded faces) to attract rather than repel.
If you want the magnet flush or slightly recessed, set `--magnet-depth` to your
magnet's thickness; for a press-fit, shrink `--magnet-diameter` by ~0.1 mm, or
leave it slightly oversized and glue (the "leave more room" bias).
## Files
| File | Purpose |

View file

@ -39,6 +39,12 @@ def main(argv=None):
help="extra fold opening added to every groove, deg (default 6)")
ap.add_argument("--over", type=float, default=0.4,
help="run grooves this far past each vertex, mm (default 0.4)")
ap.add_argument("--magnet-diameter", type=float, default=25.4 / 8.0,
help="magnet pocket diameter, mm (default 3.175 = 1/8 in)")
ap.add_argument("--magnet-depth", type=float, default=25.4 / 16.0,
help="magnet pocket depth, mm (default 1.5875 = 1/16 in)")
ap.add_argument("--no-magnets", action="store_true",
help="do not pocket magnet holes in the faces")
ap.add_argument("--max-faces-per-piece", type=int, default=None,
help="split the net into smaller pieces of at most N faces")
ap.add_argument("--no-boundary-bevel", action="store_true",
@ -73,8 +79,13 @@ def main(argv=None):
print(" WARNING: overlaps detected; try --max-faces-per-piece to split",
file=sys.stderr)
if not args.no_magnets:
print(f" magnet pockets: {args.magnet_diameter:.3f} mm dia x "
f"{args.magnet_depth:.3f} mm deep, one per face (exterior)")
svg_path = args.out + "_preview.svg"
write_svg(pieces, svg_path)
magnet_r = (args.magnet_diameter / 2.0 / args.edge) if not args.no_magnets else 0.0
write_svg(pieces, svg_path, magnet_radius=magnet_r)
print(f" wrote {svg_path}")
params = FoldParams(
@ -84,6 +95,9 @@ def main(argv=None):
slack_deg=args.slack,
over_mm=args.over,
bevel_boundary=not args.no_boundary_bevel,
magnets=not args.no_magnets,
magnet_diameter_mm=args.magnet_diameter,
magnet_depth_mm=args.magnet_depth,
)
scad = generate_scad(pieces, params)
scad_path = args.out + ".scad"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Before After
Before After

View file

@ -1,6 +1,7 @@
// Snub dodecahedron foldable net - generated by scadgen.py
// edge = 30.0 mm, thickness(depth) = 12.0 mm,
// hinge web = 0.4 mm, fold slack = 6.0 deg
// magnet pockets = 3.175 mm dia x 1.587 mm deep, exterior face centers
// Print inner (grooved) side DOWN; no supports needed.
T = 12.0;
$fn = 8;
@ -573,6 +574,98 @@ module piece6() {
linear_extrude(height = 30.8000) polygon([[0, -0.0500], [2.2460, -0.0500], [0, 11.6000]]);
multmatrix([[-0.103465, 0.000000, 0.994633, 846.801613], [0.994633, 0.000000, 0.103465, 54.745225], [0.000000, 1.000000, 0.000000, 0.000000], [0.000000, 0.000000, 0.000000, 1.000000]])
linear_extrude(height = 30.8000) polygon([[0, -0.0500], [3.4586, -0.0500], [0, 11.6000]]);
translate([149.5895, 220.6816, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([158.3478, 192.7150, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([126.0655, 238.1591, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([158.9423, 248.4551, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([178.8938, 220.3691, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([125.6981, 203.7098, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([146.6215, 179.9677, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([175.2504, 188.9334, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([128.0596, 255.3645, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([110.1682, 231.2834, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([147.4905, 261.4496, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([175.9217, 251.8754, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([187.3936, 205.2776, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([187.7135, 235.2759, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([109.9510, 210.9231, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([127.3247, 186.4659, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([155.3797, 152.0010, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([180.4267, 172.4044, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([104.5356, 272.8420, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([96.2650, 241.6130, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([153.0182, 277.8644, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([185.2745, 279.6488, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([216.6979, 204.9650, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([205.0330, 235.0911, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([86.0596, 193.9513, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([113.2044, 176.4352, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([126.0754, 152.3136, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([146.0270, 124.2276, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([178.9037, 134.5235, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([197.3294, 168.6228, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([95.7773, 300.8086, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([75.2313, 273.1545, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([128.4270, 289.8138, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([80.3677, 234.7373, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([176.5162, 307.6155, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([208.7985, 262.1713, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([209.1659, 296.6206, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([240.2219, 187.4875, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([240.5893, 221.9368, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([76.7068, 166.1778, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([56.7553, 194.2638, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([117.2557, 137.4068, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([157.4787, 111.2330, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([129.0475, 120.8073, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([194.8010, 141.3993, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([176.9096, 117.3182, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([107.5036, 313.5559, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([78.8747, 304.5902, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([66.4116, 258.2477, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([66.7315, 288.2460, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([126.8003, 307.0577, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([188.2425, 320.3628, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([224.6958, 269.0471, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([224.9129, 289.4074, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([207.5392, 313.8646, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([256.1192, 194.3633, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([238.2278, 170.2822, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([256.3363, 214.7236, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([59.7274, 162.7576, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([47.9356, 179.3571, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([48.2555, 209.3553, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([151.9510, 94.8183, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([119.6947, 93.0338, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([200.4336, 99.8407, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([98.7453, 341.5226, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([73.6983, 321.1192, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([37.4272, 288.5586, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([248.8043, 306.3792, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([221.6596, 323.8953, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([270.0224, 184.0336, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([30.6161, 179.5418, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([163.4027, 81.8238, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([95.8033, 76.0620, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([128.4530, 65.0672, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([209.1919, 71.8740, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([75.2214, 359.0001, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([108.0981, 369.2960, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([56.7957, 324.9008, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([13.9032, 306.0361, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([278.1086, 306.0666, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([258.1571, 334.1526, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([157.8750, 65.4090, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([97.4300, 58.8181, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([116.7267, 52.3199, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([197.4656, 59.1267, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([226.0945, 68.0924, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([59.3241, 352.1243, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([77.2155, 376.2054, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([96.6464, 382.2906, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([15.8973, 323.2414, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([275.1366, 337.5729, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
translate([125.4850, 24.3532, 10.4125]) cylinder(h = 1.6375, d = 3.1750, $fn = 32);
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,180 +1,278 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1545" height="277" viewBox="0 0 1545 277">
<rect width="1545" height="277" fill="white"/>
<polygon points="198.17,142.49 167.94,116.30 133.69,136.97 142.76,175.93 182.61,179.34" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="104.49,164.30 142.76,175.93 133.69,136.97" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="198.17,142.49 182.61,179.34 222.31,174.39" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="167.94,116.30 132.92,96.98 133.69,136.97" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="159.73,212.15 182.61,179.34 142.76,175.93" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="198.17,142.49 205.73,103.21 167.94,116.30" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="142.76,175.93 104.49,164.30 113.56,203.26" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="95.42,125.34 104.49,164.30 133.69,136.97" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="222.31,174.39 237.87,137.54 198.17,142.49" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="222.31,174.39 182.61,179.34 206.75,211.24" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="167.16,76.31 132.92,96.98 167.94,116.30" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="133.69,136.97 132.92,96.98 98.67,117.64" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="199.59,215.56 182.61,179.34 159.73,212.15" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="159.73,212.15 142.76,175.93 119.88,208.73" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="198.17,142.49 235.97,129.40 205.73,103.21" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="205.73,103.21 175.50,77.02 167.94,116.30" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="113.56,203.26 104.49,164.30 75.28,191.64" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="40.00,158.78 70.24,184.97 104.49,164.30 95.42,125.34 55.56,121.93" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="262.00,169.44 237.87,137.54 222.31,174.39" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="271.23,216.76 262.16,177.80 222.31,174.39 206.75,211.24 236.98,237.43" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<line x1="142.76" y1="175.93" x2="133.69" y2="136.97" stroke="#c000c0" stroke-width="1.2"/>
<line x1="182.61" y1="179.34" x2="198.17" y2="142.49" stroke="#c000c0" stroke-width="1.2"/>
<line x1="133.69" y1="136.97" x2="167.94" y2="116.30" stroke="#c000c0" stroke-width="1.2"/>
<line x1="182.61" y1="179.34" x2="142.76" y2="175.93" stroke="#c000c0" stroke-width="1.2"/>
<line x1="167.94" y1="116.30" x2="198.17" y2="142.49" stroke="#c000c0" stroke-width="1.2"/>
<line x1="142.76" y1="175.93" x2="104.49" y2="164.30" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="133.69" y1="136.97" x2="104.49" y2="164.30" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="222.31" y1="174.39" x2="198.17" y2="142.49" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="182.61" y1="179.34" x2="222.31" y2="174.39" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="132.92" y1="96.98" x2="167.94" y2="116.30" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="132.92" y1="96.98" x2="133.69" y2="136.97" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="182.61" y1="179.34" x2="159.73" y2="212.15" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="142.76" y1="175.93" x2="159.73" y2="212.15" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="198.17" y1="142.49" x2="205.73" y2="103.21" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="205.73" y1="103.21" x2="167.94" y2="116.30" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="104.49" y1="164.30" x2="113.56" y2="203.26" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="104.49" y1="164.30" x2="95.42" y2="125.34" stroke="#c000c0" stroke-width="1.2"/>
<line x1="237.87" y1="137.54" x2="222.31" y2="174.39" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="206.75" y1="211.24" x2="222.31" y2="174.39" stroke="#c000c0" stroke-width="1.2"/>
<polygon points="439.78,55.12 413.59,85.36 434.26,119.60 473.22,110.53 476.63,70.68" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="473.22,110.53 434.26,119.60 461.59,148.81" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="413.59,85.36 439.78,55.12 400.50,47.56" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="434.26,119.60 413.59,85.36 394.27,120.38" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="473.22,110.53 509.44,93.56 476.63,70.68" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="422.63,157.88 461.59,148.81 434.26,119.60" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="473.22,110.53 461.59,148.81 500.55,139.74" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="374.31,77.80 413.59,85.36 400.50,47.56" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="394.27,120.38 413.59,85.36 373.60,86.13" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="414.93,154.63 434.26,119.60 394.27,120.38" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="506.03,133.42 509.44,93.56 473.22,110.53" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="456.07,213.29 482.26,183.06 461.59,148.81 422.63,157.88 419.22,197.73" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="461.59,148.81 488.93,178.01 500.55,139.74" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="361.22,40.00 374.31,77.80 400.50,47.56" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="373.60,86.13 334.64,95.20 331.23,135.05 368.08,150.61 394.27,120.38" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="394.27,120.38 374.94,155.40 414.93,154.63" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="386.41,174.85 419.22,197.73 422.63,157.88" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="482.26,183.06 456.07,213.29 495.35,220.85" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="424.17,237.43 456.07,213.29 419.22,197.73" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="500.55,139.74 488.93,178.01 527.89,168.94" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<line x1="434.26" y1="119.60" x2="473.22" y2="110.53" stroke="#c000c0" stroke-width="1.2"/>
<line x1="439.78" y1="55.12" x2="413.59" y2="85.36" stroke="#c000c0" stroke-width="1.2"/>
<line x1="413.59" y1="85.36" x2="434.26" y2="119.60" stroke="#c000c0" stroke-width="1.2"/>
<line x1="473.22" y1="110.53" x2="476.63" y2="70.68" stroke="#c000c0" stroke-width="1.2"/>
<line x1="461.59" y1="148.81" x2="434.26" y2="119.60" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="461.59" y1="148.81" x2="473.22" y2="110.53" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="413.59" y1="85.36" x2="400.50" y2="47.56" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="413.59" y1="85.36" x2="394.27" y2="120.38" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="434.26" y1="119.60" x2="394.27" y2="120.38" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="509.44" y1="93.56" x2="473.22" y2="110.53" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="461.59" y1="148.81" x2="422.63" y2="157.88" stroke="#c000c0" stroke-width="1.2"/>
<line x1="461.59" y1="148.81" x2="500.55" y2="139.74" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="400.50" y1="47.56" x2="374.31" y2="77.80" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="394.27" y1="120.38" x2="373.60" y2="86.13" stroke="#c000c0" stroke-width="1.2"/>
<line x1="414.93" y1="154.63" x2="394.27" y2="120.38" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="422.63" y1="157.88" x2="419.22" y2="197.73" stroke="#c000c0" stroke-width="1.2"/>
<line x1="482.26" y1="183.06" x2="456.07" y2="213.29" stroke="#c000c0" stroke-width="1.2"/>
<line x1="456.07" y1="213.29" x2="419.22" y2="197.73" stroke="#c000c0" stroke-width="1.2"/>
<line x1="488.93" y1="178.01" x2="500.55" y2="139.74" stroke="#2a8f2a" stroke-width="1.2"/>
<polygon points="698.36,198.21 733.94,216.48 762.31,188.28 744.26,152.59 704.74,158.72" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="772.55,226.95 762.31,188.28 733.94,216.48" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="704.74,158.72 667.35,172.94 698.36,198.21" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="784.20,154.81 744.26,152.59 762.31,188.28" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="704.74,158.72 744.26,152.59 719.19,121.43" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="800.92,198.76 762.31,188.28 772.55,226.95" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="673.73,133.46 667.35,172.94 704.74,158.72" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="784.20,154.81 762.31,188.28 802.25,190.50" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="766.15,119.11 744.26,152.59 784.20,154.81" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="679.66,127.56 704.74,158.72 719.19,121.43" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="719.19,121.43 744.26,152.59 758.71,115.29" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="800.92,198.76 772.55,226.95 811.15,237.43" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="627.82,179.08 667.35,172.94 673.73,133.46 638.14,115.19 609.77,143.38" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="802.25,190.50 841.78,184.37 848.16,144.88 812.57,126.61 784.20,154.81" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="766.15,119.11 784.20,154.81 806.09,121.33" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="694.11,90.26 679.66,127.56 719.19,121.43" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="765.09,75.80 729.51,57.53 701.14,85.73 719.19,121.43 758.71,115.29" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="800.92,198.76 811.15,237.43 839.52,209.23" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="587.89,176.86 627.82,179.08 609.77,143.38" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="638.14,115.19 599.54,104.72 609.77,143.38" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="671.76,93.51 638.14,115.19 673.73,133.46" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<line x1="762.31" y1="188.28" x2="733.94" y2="216.48" stroke="#c000c0" stroke-width="1.2"/>
<line x1="698.36" y1="198.21" x2="704.74" y2="158.72" stroke="#c000c0" stroke-width="1.2"/>
<line x1="744.26" y1="152.59" x2="762.31" y2="188.28" stroke="#c000c0" stroke-width="1.2"/>
<line x1="744.26" y1="152.59" x2="704.74" y2="158.72" stroke="#c000c0" stroke-width="1.2"/>
<line x1="762.31" y1="188.28" x2="772.55" y2="226.95" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="667.35" y1="172.94" x2="704.74" y2="158.72" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="762.31" y1="188.28" x2="784.20" y2="154.81" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="744.26" y1="152.59" x2="784.20" y2="154.81" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="704.74" y1="158.72" x2="719.19" y2="121.43" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="744.26" y1="152.59" x2="719.19" y2="121.43" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="772.55" y1="226.95" x2="800.92" y2="198.76" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="667.35" y1="172.94" x2="673.73" y2="133.46" stroke="#c000c0" stroke-width="1.2"/>
<line x1="784.20" y1="154.81" x2="802.25" y2="190.50" stroke="#c000c0" stroke-width="1.2"/>
<line x1="784.20" y1="154.81" x2="766.15" y2="119.11" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="679.66" y1="127.56" x2="719.19" y2="121.43" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="758.71" y1="115.29" x2="719.19" y2="121.43" stroke="#c000c0" stroke-width="1.2"/>
<line x1="811.15" y1="237.43" x2="800.92" y2="198.76" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="627.82" y1="179.08" x2="609.77" y2="143.38" stroke="#c000c0" stroke-width="1.2"/>
<line x1="609.77" y1="143.38" x2="638.14" y2="115.19" stroke="#c000c0" stroke-width="1.2"/>
<line x1="638.14" y1="115.19" x2="673.73" y2="133.46" stroke="#c000c0" stroke-width="1.2"/>
<polygon points="1004.35,119.00 1003.92,159.00 1041.83,171.77 1065.68,139.66 1042.52,107.05" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="1004.35,119.00 969.49,138.63 1003.92,159.00" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1041.83,171.77 1003.92,159.00 1011.82,198.21" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1042.52,107.05 1013.08,79.97 1004.35,119.00" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1081.56,176.37 1065.68,139.66 1041.83,171.77" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1042.52,107.05 1065.68,139.66 1082.34,103.29" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="969.07,178.63 1003.92,159.00 969.49,138.63" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="969.92,98.63 969.49,138.63 1004.35,119.00" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1003.92,159.00 973.91,185.45 1011.82,198.21" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1049.73,210.98 1041.83,171.77 1011.82,198.21" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1004.35,119.00 1013.08,79.97 974.91,91.92" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1013.08,79.97 1042.52,107.05 1051.25,68.01" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1081.56,176.37 1041.83,171.77 1057.71,208.48" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1105.42,144.26 1065.68,139.66 1081.56,176.37" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1059.18,70.68 1042.52,107.05 1082.34,103.29" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="969.49,138.63 934.64,158.26 969.07,178.63" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="969.49,138.63 969.92,98.63 932.01,85.87 908.16,117.98 931.32,150.59" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<polygon points="1049.73,210.98 1011.82,198.21 1019.72,237.43" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1013.08,79.97 983.64,52.89 974.91,91.92" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1105.42,144.26 1081.56,176.37 1121.30,180.98" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<line x1="1003.92" y1="159.00" x2="1004.35" y2="119.00" stroke="#c000c0" stroke-width="1.2"/>
<line x1="1041.83" y1="171.77" x2="1003.92" y2="159.00" stroke="#c000c0" stroke-width="1.2"/>
<line x1="1042.52" y1="107.05" x2="1004.35" y2="119.00" stroke="#c000c0" stroke-width="1.2"/>
<line x1="1065.68" y1="139.66" x2="1041.83" y2="171.77" stroke="#c000c0" stroke-width="1.2"/>
<line x1="1065.68" y1="139.66" x2="1042.52" y2="107.05" stroke="#c000c0" stroke-width="1.2"/>
<line x1="1003.92" y1="159.00" x2="969.49" y2="138.63" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="969.49" y1="138.63" x2="1004.35" y2="119.00" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1003.92" y1="159.00" x2="1011.82" y2="198.21" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1041.83" y1="171.77" x2="1011.82" y2="198.21" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1013.08" y1="79.97" x2="1004.35" y2="119.00" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1013.08" y1="79.97" x2="1042.52" y2="107.05" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1041.83" y1="171.77" x2="1081.56" y2="176.37" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1065.68" y1="139.66" x2="1081.56" y2="176.37" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1082.34" y1="103.29" x2="1042.52" y2="107.05" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="969.07" y1="178.63" x2="969.49" y2="138.63" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="969.49" y1="138.63" x2="969.92" y2="98.63" stroke="#c000c0" stroke-width="1.2"/>
<line x1="1011.82" y1="198.21" x2="1049.73" y2="210.98" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1013.08" y1="79.97" x2="974.91" y2="91.92" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1081.56" y1="176.37" x2="1105.42" y2="144.26" stroke="#2a8f2a" stroke-width="1.2"/>
<polygon points="1199.30,201.71 1181.30,237.43 1221.23,235.16" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1288.37,198.07 1281.23,237.43 1318.89,223.93" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1326.03,184.57 1288.37,198.07 1318.89,223.93" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1326.03,184.57 1295.51,158.71 1288.37,198.07" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<line x1="1288.37" y1="198.07" x2="1318.89" y2="223.93" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1288.37" y1="198.07" x2="1326.03" y2="184.57" stroke="#2a8f2a" stroke-width="1.2"/>
<polygon points="1432.98,237.43 1449.29,200.90 1409.51,205.04" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1409.51,205.04 1449.29,200.90 1425.81,168.51" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1449.29,200.90 1465.60,164.38 1425.81,168.51" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1409.51,205.04 1425.81,168.51 1386.03,172.65" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1425.81,168.51 1465.60,164.38 1442.12,131.99" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1465.60,164.38 1481.91,127.85 1442.12,131.99" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<polygon points="1505.38,160.24 1481.91,127.85 1465.60,164.38" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<line x1="1449.29" y1="200.90" x2="1409.51" y2="205.04" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1449.29" y1="200.90" x2="1425.81" y2="168.51" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1425.81" y1="168.51" x2="1409.51" y2="205.04" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1465.60" y1="164.38" x2="1425.81" y2="168.51" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1465.60" y1="164.38" x2="1442.12" y2="131.99" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="1465.60" y1="164.38" x2="1481.91" y2="127.85" stroke="#2a8f2a" stroke-width="1.2"/>
<svg xmlns="http://www.w3.org/2000/svg" width="474" height="607" viewBox="0 0 474 607">
<rect width="474" height="607" fill="white"/>
<polygon points="266.77,293.10 267.19,253.10 229.28,240.33 205.43,272.44 228.59,305.05" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="239.45" cy="272.80" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="228.59,305.05 258.03,332.13 266.77,293.10" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="251.13" cy="310.09" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="229.28,240.33 189.55,235.73 205.43,272.44" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="208.09" cy="249.50" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="267.19,253.10 259.29,213.89 229.28,240.33" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="251.92" cy="235.77" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="301.62,273.47 267.19,253.10 266.77,293.10" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="278.53" cy="273.22" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="228.59,305.05 205.43,272.44 188.77,308.81" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="207.60" cy="295.43" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="219.86,344.09 258.03,332.13 228.59,305.05" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="235.50" cy="327.09" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="266.77,293.10 258.03,332.13 296.20,320.18" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="273.67" cy="315.14" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="213.40,203.62 189.55,235.73 229.28,240.33" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="210.75" cy="226.56" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="205.43,272.44 189.55,235.73 165.69,267.84" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="186.89" cy="258.67" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="229.28,240.33 259.29,213.89 221.39,201.12" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="236.65" cy="218.45" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="267.19,253.10 297.20,226.65 259.29,213.89" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="274.56" cy="231.21" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="301.62,273.47 266.77,293.10 301.19,313.47" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="289.86" cy="293.34" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="301.62,273.47 302.04,233.47 267.19,253.10" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="290.28" cy="253.35" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="188.77,308.81 205.43,272.44 165.61,276.20" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="186.60" cy="285.82" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="188.77,308.81 211.94,341.42 228.59,305.05" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="209.77" cy="318.43" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="281.20,364.74 258.03,332.13 219.86,344.09 219.43,384.08 257.34,396.85" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="247.17" cy="364.38" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="258.03,332.13 287.47,359.21 296.20,320.18" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="280.57" cy="337.17" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="213.40,203.62 190.24,171.01 152.07,182.97 151.64,222.96 189.55,235.73" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="179.38" cy="203.26" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="189.55,235.73 149.82,231.12 165.69,267.84" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="168.35" cy="244.90" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="221.39,201.12 259.29,213.89 251.39,174.67" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="244.02" cy="196.56" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="259.72,173.89 259.29,213.89 297.20,226.65 321.06,194.54 297.89,161.93" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="287.03" cy="194.18" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="301.62,273.47 301.19,313.47 339.10,326.23 362.95,294.12 339.79,261.51" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="328.93" cy="293.76" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="336.47,253.84 302.04,233.47 301.62,273.47" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="313.38" cy="253.59" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="127.43,288.15 127.01,328.15 164.92,340.92 188.77,308.81 165.61,276.20" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="154.75" cy="308.45" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="188.77,308.81 172.11,345.17 211.94,341.42" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="190.94" cy="331.80" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="219.43,384.08 219.86,344.09 185.01,363.72" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="208.10" cy="363.96" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="227.33,423.30 257.34,396.85 219.43,384.08" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="234.70" cy="401.41" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="297.08,401.45 281.20,364.74 257.34,396.85" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="278.54" cy="387.68" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="296.20,320.18 287.47,359.21 325.64,347.26" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="303.11" cy="342.22" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="190.24,171.01 160.80,143.93 152.07,182.97" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="167.70" cy="165.97" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="117.22,202.59 151.64,222.96 152.07,182.97" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="140.31" cy="202.84" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="213.40,203.62 230.06,167.25 190.24,171.01" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="211.24" cy="180.63" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="165.69,267.84 149.82,231.12 125.96,263.23" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="147.16" cy="254.06" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="297.89,161.93 268.45,134.85 259.72,173.89" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="275.35" cy="156.89" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="321.06,194.54 297.20,226.65 336.94,231.26" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="318.40" cy="217.49" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="297.89,161.93 321.06,194.54 337.72,158.18" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="318.89" cy="171.55" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="362.95,294.12 339.10,326.23 378.83,330.84" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="360.30" cy="317.06" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="379.61,257.76 339.79,261.51 362.95,294.12" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="360.79" cy="271.13" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="164.92,340.92 127.01,328.15 134.91,367.36" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="142.28" cy="345.48" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="92.58,307.78 127.01,328.15 127.43,288.15" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="115.67" cy="308.03" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="185.01,363.72 184.58,403.71 219.43,384.08" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="196.34" cy="383.84" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="227.33,423.30 265.24,436.06 257.34,396.85" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="249.97" cy="418.74" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="189.42,410.53 227.33,423.30 219.43,384.08" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="212.06" cy="405.97" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="320.93,369.35 281.20,364.74 297.08,401.45" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="299.73" cy="378.51" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="257.34,396.85 273.22,433.56 297.08,401.45" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="275.88" cy="410.62" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="198.97,131.98 160.80,143.93 190.24,171.01" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="183.34" cy="148.97" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="152.07,182.97 160.80,143.93 122.63,155.88" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="145.17" cy="160.93" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="116.79,242.59 151.64,222.96 117.22,202.59" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="128.55" cy="222.72" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="117.64,162.60 117.22,202.59 152.07,182.97" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="128.98" cy="182.72" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="230.06,167.25 206.90,134.64 190.24,171.01" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="209.07" cy="157.64" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="306.63,122.90 268.45,134.85 297.89,161.93" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="290.99" cy="139.90" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="360.79,199.15 321.06,194.54 336.94,231.26" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="339.59" cy="208.32" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="337.72,158.18 321.06,194.54 360.88,190.79" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="339.88" cy="181.17" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="314.55,125.57 297.89,161.93 337.72,158.18" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="316.72" cy="148.56" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="402.69,298.73 362.95,294.12 378.83,330.84" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="381.49" cy="307.90" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="378.83,330.84 339.10,326.23 354.98,362.94" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="357.64" cy="340.00" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="379.61,257.76 362.95,294.12 402.78,290.37" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="381.78" cy="280.75" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="134.91,367.36 127.01,328.15 97.00,354.60" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="119.64" cy="350.04" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="92.15,347.78 127.01,328.15 92.58,307.78" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="103.91" cy="327.90" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="127.43,288.15 93.01,267.78 92.58,307.78" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="104.34" cy="287.91" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="265.24,436.06 227.33,423.30 235.23,462.51" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="242.60" cy="440.62" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="165.57,442.64 188.73,475.25 226.91,463.29 227.33,423.30 189.42,410.53" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="199.59" cy="443.00" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="296.39,466.17 334.56,454.22 334.98,414.22 297.08,401.45 273.22,433.56" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="307.24" cy="433.93" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="160.80,143.93 198.97,131.98 199.40,91.98 161.49,79.21 137.64,111.32" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="171.66" cy="111.68" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="122.63,155.88 160.80,143.93 131.36,116.85" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="138.26" cy="138.89" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="55.88,181.94 79.04,214.55 117.22,202.59 117.64,162.60 79.73,149.83" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="89.90" cy="182.30" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="399.05,178.83 399.48,138.84 361.57,126.07 337.72,158.18 360.88,190.79" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="371.74" cy="158.54" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="354.37,121.81 314.55,125.57 337.72,158.18" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="335.55" cy="135.19" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="418.57,335.44 402.69,298.73 378.83,330.84" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="400.03" cy="321.67" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="57.73,327.41 92.15,347.78 92.58,307.78" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="80.82" cy="327.66" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="273.14,475.27 265.24,436.06 235.23,462.51" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="257.87" cy="457.95" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="148.91,479.01 188.73,475.25 165.57,442.64" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="167.74" cy="465.63" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="226.91,463.29 188.73,475.25 218.17,502.33" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="211.27" cy="480.29" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="334.56,454.22 296.39,466.17 325.82,493.25" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="318.92" cy="471.21" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="161.49,79.21 121.76,74.61 137.64,111.32" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="140.30" cy="88.38" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="191.50,52.77 161.49,79.21 199.40,91.98" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="184.13" cy="74.65" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="131.36,116.85 93.19,128.80 122.63,155.88" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="115.73" cy="133.85" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="79.73,149.83 40.00,145.23 55.88,181.94" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="58.54" cy="159.00" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="399.48,138.84 399.05,178.83 433.90,159.20" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="410.81" cy="158.96" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="399.48,138.84 391.58,99.62 361.57,126.07" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="384.21" cy="121.51" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="235.23,462.51 243.13,501.72 273.14,475.27" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="250.50" cy="479.83" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="148.91,479.01 172.08,511.61 188.73,475.25" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="169.91" cy="488.62" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="180.00,514.28 218.17,502.33 188.73,475.25" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="195.64" cy="497.29" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="325.82,493.25 296.39,466.17 287.65,505.21" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="303.29" cy="488.21" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="325.82,493.25 364.00,481.30 334.56,454.22" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="341.46" cy="476.26" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="137.64,111.32 121.76,74.61 97.90,106.72" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="119.10" cy="97.55" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="145.61,42.50 121.76,74.61 161.49,79.21" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="142.95" cy="65.44" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="191.50,52.77 153.59,40.00 161.49,79.21" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="168.86" cy="57.33" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="79.73,149.83 63.86,113.12 40.00,145.23" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="61.20" cy="136.06" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="391.58,99.62 399.48,138.84 429.49,112.39" fill="#cfe8ff" stroke="#888" stroke-width="0.6"/>
<circle cx="406.85" cy="116.95" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<polygon points="241.34,534.94 218.17,502.33 180.00,514.28 179.57,554.28 217.48,567.05" fill="#ffe9b3" stroke="#888" stroke-width="0.6"/>
<circle cx="207.31" cy="534.58" r="2.12" fill="#444" fill-opacity="0.55" stroke="none"/>
<line x1="228.59" y1="305.05" x2="266.77" y2="293.10" stroke="#c000c0" stroke-width="1.2"/>
<line x1="205.43" y1="272.44" x2="229.28" y2="240.33" stroke="#c000c0" stroke-width="1.2"/>
<line x1="229.28" y1="240.33" x2="267.19" y2="253.10" stroke="#c000c0" stroke-width="1.2"/>
<line x1="267.19" y1="253.10" x2="266.77" y2="293.10" stroke="#c000c0" stroke-width="1.2"/>
<line x1="205.43" y1="272.44" x2="228.59" y2="305.05" stroke="#c000c0" stroke-width="1.2"/>
<line x1="258.03" y1="332.13" x2="228.59" y2="305.05" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="258.03" y1="332.13" x2="266.77" y2="293.10" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="189.55" y1="235.73" x2="229.28" y2="240.33" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="189.55" y1="235.73" x2="205.43" y2="272.44" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="259.29" y1="213.89" x2="229.28" y2="240.33" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="259.29" y1="213.89" x2="267.19" y2="253.10" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="266.77" y1="293.10" x2="301.62" y2="273.47" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="267.19" y1="253.10" x2="301.62" y2="273.47" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="205.43" y1="272.44" x2="188.77" y2="308.81" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="228.59" y1="305.05" x2="188.77" y2="308.81" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="258.03" y1="332.13" x2="219.86" y2="344.09" stroke="#c000c0" stroke-width="1.2"/>
<line x1="258.03" y1="332.13" x2="296.20" y2="320.18" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="189.55" y1="235.73" x2="213.40" y2="203.62" stroke="#c000c0" stroke-width="1.2"/>
<line x1="189.55" y1="235.73" x2="165.69" y2="267.84" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="259.29" y1="213.89" x2="221.39" y2="201.12" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="297.20" y1="226.65" x2="259.29" y2="213.89" stroke="#c000c0" stroke-width="1.2"/>
<line x1="301.62" y1="273.47" x2="301.19" y2="313.47" stroke="#c000c0" stroke-width="1.2"/>
<line x1="302.04" y1="233.47" x2="301.62" y2="273.47" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="188.77" y1="308.81" x2="165.61" y2="276.20" stroke="#c000c0" stroke-width="1.2"/>
<line x1="211.94" y1="341.42" x2="188.77" y2="308.81" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="219.86" y1="344.09" x2="219.43" y2="384.08" stroke="#c000c0" stroke-width="1.2"/>
<line x1="219.43" y1="384.08" x2="257.34" y2="396.85" stroke="#c000c0" stroke-width="1.2"/>
<line x1="281.20" y1="364.74" x2="257.34" y2="396.85" stroke="#c000c0" stroke-width="1.2"/>
<line x1="287.47" y1="359.21" x2="296.20" y2="320.18" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="152.07" y1="182.97" x2="190.24" y2="171.01" stroke="#c000c0" stroke-width="1.2"/>
<line x1="151.64" y1="222.96" x2="152.07" y2="182.97" stroke="#c000c0" stroke-width="1.2"/>
<line x1="190.24" y1="171.01" x2="213.40" y2="203.62" stroke="#c000c0" stroke-width="1.2"/>
<line x1="149.82" y1="231.12" x2="165.69" y2="267.84" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="259.72" y1="173.89" x2="297.89" y2="161.93" stroke="#c000c0" stroke-width="1.2"/>
<line x1="321.06" y1="194.54" x2="297.20" y2="226.65" stroke="#c000c0" stroke-width="1.2"/>
<line x1="321.06" y1="194.54" x2="297.89" y2="161.93" stroke="#c000c0" stroke-width="1.2"/>
<line x1="362.95" y1="294.12" x2="339.10" y2="326.23" stroke="#c000c0" stroke-width="1.2"/>
<line x1="339.79" y1="261.51" x2="362.95" y2="294.12" stroke="#c000c0" stroke-width="1.2"/>
<line x1="127.01" y1="328.15" x2="164.92" y2="340.92" stroke="#c000c0" stroke-width="1.2"/>
<line x1="127.43" y1="288.15" x2="127.01" y2="328.15" stroke="#c000c0" stroke-width="1.2"/>
<line x1="219.43" y1="384.08" x2="185.01" y2="363.72" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="227.33" y1="423.30" x2="257.34" y2="396.85" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="227.33" y1="423.30" x2="219.43" y2="384.08" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="281.20" y1="364.74" x2="297.08" y2="401.45" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="297.08" y1="401.45" x2="257.34" y2="396.85" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="160.80" y1="143.93" x2="190.24" y2="171.01" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="160.80" y1="143.93" x2="152.07" y2="182.97" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="151.64" y1="222.96" x2="117.22" y2="202.59" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="152.07" y1="182.97" x2="117.22" y2="202.59" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="190.24" y1="171.01" x2="230.06" y2="167.25" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="268.45" y1="134.85" x2="297.89" y2="161.93" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="321.06" y1="194.54" x2="336.94" y2="231.26" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="321.06" y1="194.54" x2="337.72" y2="158.18" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="297.89" y1="161.93" x2="337.72" y2="158.18" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="362.95" y1="294.12" x2="378.83" y2="330.84" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="339.10" y1="326.23" x2="378.83" y2="330.84" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="362.95" y1="294.12" x2="379.61" y2="257.76" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="127.01" y1="328.15" x2="134.91" y2="367.36" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="127.01" y1="328.15" x2="92.58" y2="307.78" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="127.43" y1="288.15" x2="92.58" y2="307.78" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="265.24" y1="436.06" x2="227.33" y2="423.30" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="227.33" y1="423.30" x2="189.42" y2="410.53" stroke="#c000c0" stroke-width="1.2"/>
<line x1="273.22" y1="433.56" x2="297.08" y2="401.45" stroke="#c000c0" stroke-width="1.2"/>
<line x1="198.97" y1="131.98" x2="160.80" y2="143.93" stroke="#c000c0" stroke-width="1.2"/>
<line x1="160.80" y1="143.93" x2="122.63" y2="155.88" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="117.22" y1="202.59" x2="117.64" y2="162.60" stroke="#c000c0" stroke-width="1.2"/>
<line x1="360.88" y1="190.79" x2="337.72" y2="158.18" stroke="#c000c0" stroke-width="1.2"/>
<line x1="314.55" y1="125.57" x2="337.72" y2="158.18" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="378.83" y1="330.84" x2="402.69" y2="298.73" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="92.15" y1="347.78" x2="92.58" y2="307.78" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="265.24" y1="436.06" x2="235.23" y2="462.51" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="188.73" y1="475.25" x2="165.57" y2="442.64" stroke="#c000c0" stroke-width="1.2"/>
<line x1="188.73" y1="475.25" x2="226.91" y2="463.29" stroke="#c000c0" stroke-width="1.2"/>
<line x1="296.39" y1="466.17" x2="334.56" y2="454.22" stroke="#c000c0" stroke-width="1.2"/>
<line x1="137.64" y1="111.32" x2="161.49" y2="79.21" stroke="#c000c0" stroke-width="1.2"/>
<line x1="161.49" y1="79.21" x2="199.40" y2="91.98" stroke="#c000c0" stroke-width="1.2"/>
<line x1="122.63" y1="155.88" x2="131.36" y2="116.85" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="79.73" y1="149.83" x2="55.88" y2="181.94" stroke="#c000c0" stroke-width="1.2"/>
<line x1="399.48" y1="138.84" x2="399.05" y2="178.83" stroke="#c000c0" stroke-width="1.2"/>
<line x1="399.48" y1="138.84" x2="361.57" y2="126.07" stroke="#c000c0" stroke-width="1.2"/>
<line x1="235.23" y1="462.51" x2="273.14" y2="475.27" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="188.73" y1="475.25" x2="148.91" y2="479.01" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="218.17" y1="502.33" x2="188.73" y2="475.25" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="296.39" y1="466.17" x2="325.82" y2="493.25" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="334.56" y1="454.22" x2="325.82" y2="493.25" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="121.76" y1="74.61" x2="137.64" y2="111.32" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="121.76" y1="74.61" x2="161.49" y2="79.21" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="161.49" y1="79.21" x2="191.50" y2="52.77" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="40.00" y1="145.23" x2="79.73" y2="149.83" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="399.48" y1="138.84" x2="391.58" y2="99.62" stroke="#2a8f2a" stroke-width="1.2"/>
<line x1="180.00" y1="514.28" x2="218.17" y2="502.33" stroke="#c000c0" stroke-width="1.2"/>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Before After
Before After

View file

@ -38,7 +38,7 @@ def verify_no_overlap(pieces):
return bad
def write_svg(pieces, path, scale=40.0, gap=1.5):
def write_svg(pieces, path, scale=40.0, gap=1.5, magnet_radius=0.0):
offsets = layout_pieces(pieces, gap=gap)
# global bbox
minx = miny = 1e9
@ -73,6 +73,14 @@ def write_svg(pieces, path, scale=40.0, gap=1.5):
f'<polygon points="{pts}" fill="{fill}" stroke="#888" '
f'stroke-width="0.6"/>'
)
if magnet_radius > 0:
cx = sum(x for x, _ in poly) / len(poly)
cy = sum(y for _, y in poly) / len(poly)
out.append(
f'<circle cx="{X(cx + ox):.2f}" cy="{Y(cy + oy):.2f}" '
f'r="{magnet_radius * scale:.2f}" fill="#444" '
f'fill-opacity="0.55" stroke="none"/>'
)
# hinges (fold lines) in green
for h in p.hinges:
x1, y1 = h.p

View file

@ -49,6 +49,10 @@ class FoldParams:
eps_mm: float = 0.05 # cut a hair below the bed for clean booleans
bevel_boundary: bool = True # chamfer glue-seam edges too
piece_gap_mm: float = 8.0 # spacing between pieces in the layout
magnets: bool = True # pocket a magnet hole in each exterior face
magnet_diameter_mm: float = 25.4 / 8.0 # 1/8 inch
magnet_depth_mm: float = 25.4 / 16.0 # 1/16 inch
magnet_fn: int = 32 # facets for the round magnet pocket
def _unit(v):
@ -151,6 +155,21 @@ def _scad_for_piece(piece, params: FoldParams, offset, name):
lines.append(f" multmatrix({_fmt_mat(m)})")
lines.append(f" linear_extrude(height = {L:.4f}) polygon({tri});")
# magnet pockets: one per face, centered on the exterior (top) surface
if params.magnets and params.magnet_diameter_mm > 0 and params.magnet_depth_mm > 0:
if params.magnet_depth_mm >= T:
raise ValueError("magnet_depth_mm must be smaller than thickness_mm")
d = params.magnet_diameter_mm
depth = params.magnet_depth_mm
z0 = T - depth
for _, poly in piece.faces:
cx = sum(S(p)[0] for p in poly) / len(poly)
cy = sum(S(p)[1] for p in poly) / len(poly)
lines.append(
f" translate([{cx:.4f}, {cy:.4f}, {z0:.4f}]) "
f"cylinder(h = {depth + eps:.4f}, d = {d:.4f}, $fn = {params.magnet_fn});"
)
lines.append(" }")
lines.append("}")
return "\n".join(lines)
@ -165,10 +184,16 @@ def generate_scad(pieces, params: FoldParams) -> str:
offsets.append((cursor - x0 * params.edge_mm, -y0 * params.edge_mm))
cursor += (x1 - x0) * params.edge_mm + params.piece_gap_mm
magnet_note = (
f"// magnet pockets = {params.magnet_diameter_mm:.3f} mm dia x "
f"{params.magnet_depth_mm:.3f} mm deep, exterior face centers"
if params.magnets else "// magnet pockets: disabled"
)
header = [
"// Snub dodecahedron foldable net - generated by scadgen.py",
f"// edge = {params.edge_mm} mm, thickness(depth) = {params.thickness_mm} mm,",
f"// hinge web = {params.web_mm} mm, fold slack = {params.slack_deg} deg",
magnet_note,
"// Print inner (grooved) side DOWN; no supports needed.",
f"T = {params.thickness_mm};",
"$fn = 8;",