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:
parent
d41cb29cd2
commit
6e0225b175
9 changed files with 127138 additions and 45106 deletions
|
|
@ -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), ~1–2 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 |
|
||||
|
|
|
|||
|
|
@ -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 |
Binary file not shown.
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 26 KiB |
|
|
@ -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
|
|
@ -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 |
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue