planscript 1.4.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LANGUAGE_REFERENCE.md +472 -4
  2. package/dist/ast/types.d.ts +84 -4
  3. package/dist/ast/types.d.ts.map +1 -1
  4. package/dist/cli.js +28 -6
  5. package/dist/cli.js.map +1 -1
  6. package/dist/exporters/svg.d.ts +3 -0
  7. package/dist/exporters/svg.d.ts.map +1 -1
  8. package/dist/exporters/svg.js +48 -2
  9. package/dist/exporters/svg.js.map +1 -1
  10. package/dist/geometry/index.d.ts.map +1 -1
  11. package/dist/geometry/index.js +7 -0
  12. package/dist/geometry/index.js.map +1 -1
  13. package/dist/geometry/types.d.ts +7 -0
  14. package/dist/geometry/types.d.ts.map +1 -1
  15. package/dist/lowering/index.d.ts +23 -1
  16. package/dist/lowering/index.d.ts.map +1 -1
  17. package/dist/lowering/index.js +374 -28
  18. package/dist/lowering/index.js.map +1 -1
  19. package/dist/parser/grammar.d.ts +52 -5
  20. package/dist/parser/grammar.d.ts.map +1 -1
  21. package/dist/parser/grammar.js +4927 -2026
  22. package/dist/parser/grammar.js.map +1 -1
  23. package/dist/validation/index.d.ts +5 -0
  24. package/dist/validation/index.d.ts.map +1 -1
  25. package/dist/validation/index.js +215 -0
  26. package/dist/validation/index.js.map +1 -1
  27. package/examples/advanced_positioning.psc +225 -0
  28. package/examples/advanced_positioning.svg +76 -0
  29. package/examples/courtyard_house.psc +141 -0
  30. package/examples/courtyard_house.svg +93 -0
  31. package/examples/orientation.psc +141 -0
  32. package/examples/orientation.svg +88 -0
  33. package/examples/zones.psc +275 -0
  34. package/examples/zones.svg +89 -0
  35. package/package.json +1 -1
  36. package/examples/casa_moderna.psc +0 -375
  37. package/examples/casa_moderna_v2.psc +0 -406
  38. package/examples/casa_moderna_v3.psc +0 -375
  39. package/examples/casa_moderna_v5.psc +0 -397
  40. package/examples/house2.psc +0 -156
  41. package/examples/house2.svg +0 -103
  42. package/examples/house3.svg +0 -139
@@ -0,0 +1,141 @@
1
+ # Courtyard House Example
2
+ # A U-shaped house with a central patio, demonstrating the courtyard feature.
3
+
4
+ units m
5
+
6
+ defaults {
7
+ door_width 0.9
8
+ window_width 1.5
9
+ }
10
+
11
+ plan "Casa con Patio" {
12
+ # Rectangular footprint - the courtyard is an open space within
13
+ footprint rect (0, 0) (20, 30)
14
+
15
+ # === South Wing (Entry and Living) ===
16
+ room entry {
17
+ rect (0, 0) (6, 8)
18
+ label "Entry"
19
+ }
20
+
21
+ room living {
22
+ rect (6, 0) (14, 8)
23
+ label "Living Room"
24
+ }
25
+
26
+ room dining {
27
+ rect (14, 0) (20, 8)
28
+ label "Dining"
29
+ }
30
+
31
+ # === West Wing (Kitchen and Service) ===
32
+ room kitchen {
33
+ rect (0, 8) (6, 15)
34
+ label "Kitchen"
35
+ }
36
+
37
+ room laundry {
38
+ rect (0, 15) (6, 22)
39
+ label "Laundry"
40
+ }
41
+
42
+ # === East Wing (Bedrooms) ===
43
+ room bedroom1 {
44
+ rect (14, 8) (20, 15)
45
+ label "Bedroom 1"
46
+ }
47
+
48
+ room bath1 {
49
+ rect (14, 15) (20, 22)
50
+ label "Bath"
51
+ }
52
+
53
+ # === North Wing (Master Suite) ===
54
+ room master {
55
+ rect (0, 22) (10, 30)
56
+ label "Master Bedroom"
57
+ }
58
+
59
+ room master_bath {
60
+ rect (10, 22) (14, 30)
61
+ label "Master Bath"
62
+ }
63
+
64
+ room closet {
65
+ rect (14, 22) (20, 30)
66
+ label "Walk-in Closet"
67
+ }
68
+
69
+ # === Central Courtyard (open space in the middle) ===
70
+ courtyard patio {
71
+ rect (6, 8) (14, 22)
72
+ label "Central Patio"
73
+ }
74
+
75
+ # === Interior Doors ===
76
+ opening door d_entry_living {
77
+ between entry and living
78
+ on shared_edge
79
+ at 50%
80
+ }
81
+
82
+ opening door d_living_dining {
83
+ between living and dining
84
+ on shared_edge
85
+ at 50%
86
+ }
87
+
88
+ opening door d_entry_kitchen {
89
+ between entry and kitchen
90
+ on shared_edge
91
+ at 50%
92
+ }
93
+
94
+ opening door d_kitchen_laundry {
95
+ between kitchen and laundry
96
+ on shared_edge
97
+ at 50%
98
+ }
99
+
100
+ opening door d_dining_bedroom1 {
101
+ between dining and bedroom1
102
+ on shared_edge
103
+ at 50%
104
+ }
105
+
106
+ opening door d_bedroom1_bath1 {
107
+ between bedroom1 and bath1
108
+ on shared_edge
109
+ at 50%
110
+ }
111
+
112
+ opening door d_master_bath {
113
+ between master and master_bath
114
+ on shared_edge
115
+ at 50%
116
+ }
117
+
118
+ opening door d_bath_closet {
119
+ between master_bath and closet
120
+ on shared_edge
121
+ at 50%
122
+ }
123
+
124
+ # === Exterior Door ===
125
+ opening door d_front {
126
+ on entry.edge south
127
+ at 50%
128
+ width 1.0
129
+ }
130
+
131
+ # === Windows (exterior walls) ===
132
+ opening window w_living { on living.edge south at 4.0 }
133
+ opening window w_dining { on dining.edge east at 4.0 }
134
+ opening window w_master { on master.edge north at 4.0 }
135
+ opening window w_bedroom1 { on bedroom1.edge east at 3.5 }
136
+
137
+ # Validation
138
+ assert no_overlap rooms
139
+ assert inside footprint all_rooms
140
+ assert min_room_area master >= 20.0
141
+ }
@@ -0,0 +1,93 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="1000" height="800" viewBox="0 0 1000 800">
3
+ <defs>
4
+ <style>
5
+ .room-label { font-family: Arial, sans-serif; font-weight: 500; }
6
+ </style>
7
+ </defs>
8
+
9
+ <!-- Background -->
10
+ <rect width="1000" height="800" fill="#ffffff" />
11
+
12
+ <!-- Footprint (boundary) -->
13
+ <path d="M 273.33 740.00 L 726.67 740.00 L 726.67 60.00 L 273.33 60.00 Z" fill="none" stroke="#7f8c8d" stroke-width="2" stroke-dasharray="8,4" />
14
+
15
+ <!-- Rooms -->
16
+ <path d="M 273.33 740.00 L 409.33 740.00 L 409.33 558.67 L 273.33 558.67 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
17
+ <path d="M 409.33 740.00 L 590.67 740.00 L 590.67 558.67 L 409.33 558.67 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
18
+ <path d="M 590.67 740.00 L 726.67 740.00 L 726.67 558.67 L 590.67 558.67 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
19
+ <path d="M 273.33 558.67 L 409.33 558.67 L 409.33 400.00 L 273.33 400.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
20
+ <path d="M 273.33 400.00 L 409.33 400.00 L 409.33 241.33 L 273.33 241.33 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
21
+ <path d="M 590.67 558.67 L 726.67 558.67 L 726.67 400.00 L 590.67 400.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
22
+ <path d="M 590.67 400.00 L 726.67 400.00 L 726.67 241.33 L 590.67 241.33 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
23
+ <path d="M 273.33 241.33 L 500.00 241.33 L 500.00 60.00 L 273.33 60.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
24
+ <path d="M 500.00 241.33 L 590.67 241.33 L 590.67 60.00 L 500.00 60.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
25
+ <path d="M 590.67 241.33 L 726.67 241.33 L 726.67 60.00 L 590.67 60.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
26
+
27
+ <!-- Courtyards -->
28
+ <path d="M 409.33 558.67 L 590.67 558.67 L 590.67 241.33 L 409.33 241.33 Z" fill="#d5f5e3" stroke="#27ae60" stroke-width="2" stroke-dasharray="4,2" />
29
+
30
+ <!-- Walls -->
31
+ <line x1="409.33" y1="740.00" x2="409.33" y2="558.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
32
+ <line x1="273.33" y1="558.67" x2="409.33" y2="558.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
33
+ <line x1="590.67" y1="740.00" x2="590.67" y2="558.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
34
+ <line x1="590.67" y1="558.67" x2="726.67" y2="558.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
35
+ <line x1="273.33" y1="400.00" x2="409.33" y2="400.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
36
+ <line x1="273.33" y1="241.33" x2="409.33" y2="241.33" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
37
+ <line x1="590.67" y1="400.00" x2="726.67" y2="400.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
38
+ <line x1="590.67" y1="241.33" x2="726.67" y2="241.33" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
39
+ <line x1="500.00" y1="241.33" x2="500.00" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
40
+ <line x1="590.67" y1="241.33" x2="590.67" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
41
+ <line x1="273.33" y1="740.00" x2="409.33" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
42
+ <line x1="273.33" y1="740.00" x2="273.33" y2="558.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
43
+ <line x1="409.33" y1="740.00" x2="590.67" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
44
+ <line x1="409.33" y1="558.67" x2="590.67" y2="558.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
45
+ <line x1="590.67" y1="740.00" x2="726.67" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
46
+ <line x1="726.67" y1="740.00" x2="726.67" y2="558.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
47
+ <line x1="409.33" y1="558.67" x2="409.33" y2="400.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
48
+ <line x1="273.33" y1="558.67" x2="273.33" y2="400.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
49
+ <line x1="409.33" y1="400.00" x2="409.33" y2="241.33" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
50
+ <line x1="273.33" y1="400.00" x2="273.33" y2="241.33" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
51
+ <line x1="726.67" y1="558.67" x2="726.67" y2="400.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
52
+ <line x1="590.67" y1="558.67" x2="590.67" y2="400.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
53
+ <line x1="726.67" y1="400.00" x2="726.67" y2="241.33" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
54
+ <line x1="590.67" y1="400.00" x2="590.67" y2="241.33" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
55
+ <line x1="409.33" y1="241.33" x2="500.00" y2="241.33" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
56
+ <line x1="273.33" y1="60.00" x2="500.00" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
57
+ <line x1="273.33" y1="241.33" x2="273.33" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
58
+ <line x1="500.00" y1="241.33" x2="590.67" y2="241.33" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
59
+ <line x1="500.00" y1="60.00" x2="590.67" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
60
+ <line x1="726.67" y1="241.33" x2="726.67" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
61
+ <line x1="590.67" y1="60.00" x2="726.67" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
62
+
63
+ <!-- Openings (doors/windows) -->
64
+ <line x1="409.33" y1="659.53" x2="409.33" y2="639.13" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
65
+ <line x1="590.67" y1="659.53" x2="590.67" y2="639.13" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
66
+ <line x1="331.13" y1="558.67" x2="351.53" y2="558.67" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
67
+ <line x1="331.13" y1="400.00" x2="351.53" y2="400.00" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
68
+ <line x1="648.47" y1="558.67" x2="668.87" y2="558.67" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
69
+ <line x1="648.47" y1="400.00" x2="668.87" y2="400.00" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
70
+ <line x1="500.00" y1="160.87" x2="500.00" y2="140.47" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
71
+ <line x1="590.67" y1="160.87" x2="590.67" y2="140.47" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
72
+ <line x1="330.00" y1="740.00" x2="352.67" y2="740.00" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
73
+ <line x1="483.00" y1="740.00" x2="517.00" y2="740.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
74
+ <line x1="726.67" y1="666.33" x2="726.67" y2="632.33" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
75
+ <line x1="347.00" y1="60.00" x2="381.00" y2="60.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
76
+ <line x1="726.67" y1="496.33" x2="726.67" y2="462.33" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
77
+
78
+ <!-- Labels -->
79
+ <text x="341.33" y="649.33" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Entry</text>
80
+ <text x="500.00" y="649.33" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Living Room</text>
81
+ <text x="658.67" y="649.33" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Dining</text>
82
+ <text x="341.33" y="479.33" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Kitchen</text>
83
+ <text x="341.33" y="320.67" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Laundry</text>
84
+ <text x="658.67" y="479.33" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Bedroom 1</text>
85
+ <text x="658.67" y="320.67" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Bath</text>
86
+ <text x="386.67" y="150.67" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Master Bedroom</text>
87
+ <text x="545.33" y="150.67" font-size="11" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Master Bath</text>
88
+ <text x="658.67" y="150.67" font-size="13" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Walk-in Closet</text>
89
+ <text x="500.00" y="400.00" font-size="14" fill="#27ae60" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif" font-style="italic">Central Patio</text>
90
+
91
+ <!-- Dimensions -->
92
+
93
+ </svg>
@@ -0,0 +1,141 @@
1
+ # Orientation-Aware House Design
2
+ #
3
+ # This example demonstrates site orientation features that help you design
4
+ # with solar orientation and street access in mind.
5
+ #
6
+ # The house faces south (street), so:
7
+ # - East = morning sun (ideal for bedrooms)
8
+ # - West = afternoon sun (ideal for living areas)
9
+ # - North = back/garden (quiet, private)
10
+ # - South = street/front (access, visibility)
11
+
12
+ units m
13
+
14
+ defaults {
15
+ door_width 0.9
16
+ window_width 1.5
17
+ }
18
+
19
+ # Define site orientation
20
+ site {
21
+ street south # Front of the lot faces south
22
+ hemisphere north # Northern hemisphere (default)
23
+ }
24
+
25
+ plan "Orientation-Aware House" {
26
+ footprint rect (0, 0) (18, 14)
27
+
28
+ # === Street Side (South) - Entry and Services ===
29
+
30
+ # Garage near street for easy access
31
+ room garage {
32
+ rect (0, 0) (6, 6)
33
+ label "Garage"
34
+ }
35
+
36
+ # Entry/foyer - needs street access
37
+ room entry {
38
+ rect (6, 0) (10, 4)
39
+ label "Entry"
40
+ }
41
+
42
+ # Laundry - service area, doesn't need premium location
43
+ room laundry {
44
+ rect (10, 0) (14, 4)
45
+ label "Laundry"
46
+ }
47
+
48
+ # === Living Areas (West/Center) - Afternoon Sun ===
49
+
50
+ room living {
51
+ rect (0, 6) (10, 14)
52
+ label "Living Room"
53
+ }
54
+
55
+ room dining {
56
+ rect (10, 8) (14, 14)
57
+ label "Dining"
58
+ }
59
+
60
+ room kitchen {
61
+ rect (10, 4) (14, 8)
62
+ label "Kitchen"
63
+ }
64
+
65
+ # === Bedrooms (East) - Morning Sun ===
66
+
67
+ room master {
68
+ rect (14, 8) (18, 14)
69
+ label "Master"
70
+ }
71
+
72
+ room bedroom2 {
73
+ rect (14, 4) (18, 8)
74
+ label "Bedroom 2"
75
+ }
76
+
77
+ room bath {
78
+ rect (14, 0) (18, 4)
79
+ label "Bath"
80
+ }
81
+
82
+ # === Doors ===
83
+
84
+ # Exterior entry
85
+ opening door d_front {
86
+ on entry.edge south
87
+ at 50%
88
+ width 1.0
89
+ }
90
+
91
+ # Interior connections
92
+ opening door d_entry_living { between entry and living on shared_edge at 50% }
93
+ opening door d_living_dining { between living and dining on shared_edge at 50% }
94
+ opening door d_dining_kitchen { between dining and kitchen on shared_edge at 50% }
95
+ opening door d_kitchen_laundry { between kitchen and laundry on shared_edge at 50% }
96
+ opening door d_entry_garage { between entry and garage on shared_edge at 50% }
97
+ opening door d_master_dining { between master and dining on shared_edge at 50% }
98
+ opening door d_bedroom_kitchen { between bedroom2 and kitchen on shared_edge at 50% }
99
+ opening door d_bath_laundry { between bath and laundry on shared_edge at 50% }
100
+
101
+ # === Windows - Strategic Placement for Light ===
102
+
103
+ # Living room - afternoon sun (west) + garden view (north)
104
+ opening window w_living_west { on living.edge west at 4.0 width 2.5 }
105
+ opening window w_living_north { on living.edge north at 4.0 width 3.0 }
106
+
107
+ # Dining - garden view
108
+ opening window w_dining { on dining.edge north at 2.0 width 2.0 }
109
+
110
+ # Master bedroom - morning sun (east) + garden view
111
+ opening window w_master_east { on master.edge east at 3.0 width 1.8 }
112
+ opening window w_master_north { on master.edge north at 2.0 width 1.5 }
113
+
114
+ # Bedroom 2 - morning sun
115
+ opening window w_bed2 { on bedroom2.edge east at 2.0 width 1.5 }
116
+
117
+ # === Orientation Assertions ===
118
+
119
+ # Bedrooms should have morning sun for natural wake-up
120
+ assert orientation master has_window morning_sun
121
+ assert orientation bedroom2 has_window morning_sun
122
+
123
+ # Living areas should have afternoon sun and/or garden view
124
+ assert orientation living has_window afternoon_sun
125
+ assert orientation living garden_view
126
+ assert orientation dining garden_view
127
+
128
+ # Service areas should be near street (don't waste good orientations)
129
+ assert orientation garage near street
130
+ assert orientation entry near street
131
+ assert orientation laundry near street
132
+
133
+ # Master should have garden view (privacy + nature)
134
+ assert orientation master garden_view
135
+
136
+ # === Standard Assertions ===
137
+ assert no_overlap rooms
138
+ assert inside footprint all_rooms
139
+ assert min_room_area master >= 15
140
+ assert min_room_area living >= 25
141
+ }
@@ -0,0 +1,88 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="1000" height="800" viewBox="0 0 1000 800">
3
+ <defs>
4
+ <style>
5
+ .room-label { font-family: Arial, sans-serif; font-weight: 500; }
6
+ </style>
7
+ </defs>
8
+
9
+ <!-- Background -->
10
+ <rect width="1000" height="800" fill="#ffffff" />
11
+
12
+ <!-- Footprint (boundary) -->
13
+ <path d="M 62.86 740.00 L 937.14 740.00 L 937.14 60.00 L 62.86 60.00 Z" fill="none" stroke="#7f8c8d" stroke-width="2" stroke-dasharray="8,4" />
14
+
15
+ <!-- Rooms -->
16
+ <path d="M 62.86 740.00 L 354.29 740.00 L 354.29 448.57 L 62.86 448.57 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
17
+ <path d="M 354.29 740.00 L 548.57 740.00 L 548.57 545.71 L 354.29 545.71 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
18
+ <path d="M 548.57 740.00 L 742.86 740.00 L 742.86 545.71 L 548.57 545.71 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
19
+ <path d="M 62.86 448.57 L 548.57 448.57 L 548.57 60.00 L 62.86 60.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
20
+ <path d="M 548.57 351.43 L 742.86 351.43 L 742.86 60.00 L 548.57 60.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
21
+ <path d="M 548.57 545.71 L 742.86 545.71 L 742.86 351.43 L 548.57 351.43 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
22
+ <path d="M 742.86 351.43 L 937.14 351.43 L 937.14 60.00 L 742.86 60.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
23
+ <path d="M 742.86 545.71 L 937.14 545.71 L 937.14 351.43 L 742.86 351.43 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
24
+ <path d="M 742.86 740.00 L 937.14 740.00 L 937.14 545.71 L 742.86 545.71 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
25
+
26
+ <!-- Courtyards -->
27
+
28
+
29
+ <!-- Walls -->
30
+ <line x1="354.29" y1="740.00" x2="354.29" y2="545.71" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
31
+ <line x1="62.86" y1="448.57" x2="354.29" y2="448.57" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
32
+ <line x1="548.57" y1="740.00" x2="548.57" y2="545.71" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
33
+ <line x1="742.86" y1="740.00" x2="742.86" y2="545.71" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
34
+ <line x1="548.57" y1="545.71" x2="742.86" y2="545.71" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
35
+ <line x1="548.57" y1="351.43" x2="548.57" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
36
+ <line x1="548.57" y1="448.57" x2="548.57" y2="351.43" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
37
+ <line x1="548.57" y1="351.43" x2="742.86" y2="351.43" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
38
+ <line x1="742.86" y1="351.43" x2="742.86" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
39
+ <line x1="742.86" y1="545.71" x2="742.86" y2="351.43" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
40
+ <line x1="742.86" y1="351.43" x2="937.14" y2="351.43" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
41
+ <line x1="742.86" y1="545.71" x2="937.14" y2="545.71" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
42
+ <line x1="62.86" y1="740.00" x2="354.29" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
43
+ <line x1="354.29" y1="545.71" x2="354.29" y2="448.57" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
44
+ <line x1="62.86" y1="740.00" x2="62.86" y2="448.57" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
45
+ <line x1="354.29" y1="740.00" x2="548.57" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
46
+ <line x1="354.29" y1="545.71" x2="548.57" y2="545.71" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
47
+ <line x1="548.57" y1="740.00" x2="742.86" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
48
+ <line x1="354.29" y1="448.57" x2="548.57" y2="448.57" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
49
+ <line x1="62.86" y1="60.00" x2="548.57" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
50
+ <line x1="62.86" y1="448.57" x2="62.86" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
51
+ <line x1="548.57" y1="60.00" x2="742.86" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
52
+ <line x1="548.57" y1="545.71" x2="548.57" y2="448.57" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
53
+ <line x1="937.14" y1="351.43" x2="937.14" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
54
+ <line x1="742.86" y1="60.00" x2="937.14" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
55
+ <line x1="937.14" y1="545.71" x2="937.14" y2="351.43" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
56
+ <line x1="742.86" y1="740.00" x2="937.14" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
57
+ <line x1="937.14" y1="740.00" x2="937.14" y2="545.71" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
58
+
59
+ <!-- Openings (doors/windows) -->
60
+ <line x1="427.14" y1="740.00" x2="475.71" y2="740.00" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
61
+ <line x1="548.57" y1="227.57" x2="548.57" y2="183.86" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
62
+ <line x1="623.86" y1="351.43" x2="667.57" y2="351.43" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
63
+ <line x1="623.86" y1="545.71" x2="667.57" y2="545.71" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
64
+ <line x1="354.29" y1="664.71" x2="354.29" y2="621.00" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
65
+ <line x1="742.86" y1="227.57" x2="742.86" y2="183.86" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
66
+ <line x1="742.86" y1="470.43" x2="742.86" y2="426.71" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
67
+ <line x1="742.86" y1="664.71" x2="742.86" y2="621.00" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
68
+ <line x1="62.86" y1="315.00" x2="62.86" y2="193.57" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
69
+ <line x1="184.29" y1="60.00" x2="330.00" y2="60.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
70
+ <line x1="597.14" y1="60.00" x2="694.29" y2="60.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
71
+ <line x1="937.14" y1="249.43" x2="937.14" y2="162.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
72
+ <line x1="803.57" y1="60.00" x2="876.43" y2="60.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
73
+ <line x1="937.14" y1="485.00" x2="937.14" y2="412.14" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
74
+
75
+ <!-- Labels -->
76
+ <text x="208.57" y="594.29" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Garage</text>
77
+ <text x="451.43" y="642.86" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Entry</text>
78
+ <text x="645.71" y="642.86" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Laundry</text>
79
+ <text x="305.71" y="254.29" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Living Room</text>
80
+ <text x="645.71" y="205.71" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Dining</text>
81
+ <text x="645.71" y="448.57" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Kitchen</text>
82
+ <text x="840.00" y="205.71" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Master</text>
83
+ <text x="840.00" y="448.57" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Bedroom 2</text>
84
+ <text x="840.00" y="642.86" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Bath</text>
85
+
86
+ <!-- Dimensions -->
87
+
88
+ </svg>