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.
- package/LANGUAGE_REFERENCE.md +472 -4
- package/dist/ast/types.d.ts +84 -4
- package/dist/ast/types.d.ts.map +1 -1
- package/dist/cli.js +28 -6
- package/dist/cli.js.map +1 -1
- package/dist/exporters/svg.d.ts +3 -0
- package/dist/exporters/svg.d.ts.map +1 -1
- package/dist/exporters/svg.js +48 -2
- package/dist/exporters/svg.js.map +1 -1
- package/dist/geometry/index.d.ts.map +1 -1
- package/dist/geometry/index.js +7 -0
- package/dist/geometry/index.js.map +1 -1
- package/dist/geometry/types.d.ts +7 -0
- package/dist/geometry/types.d.ts.map +1 -1
- package/dist/lowering/index.d.ts +23 -1
- package/dist/lowering/index.d.ts.map +1 -1
- package/dist/lowering/index.js +374 -28
- package/dist/lowering/index.js.map +1 -1
- package/dist/parser/grammar.d.ts +52 -5
- package/dist/parser/grammar.d.ts.map +1 -1
- package/dist/parser/grammar.js +4927 -2026
- package/dist/parser/grammar.js.map +1 -1
- package/dist/validation/index.d.ts +5 -0
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +215 -0
- package/dist/validation/index.js.map +1 -1
- package/examples/advanced_positioning.psc +225 -0
- package/examples/advanced_positioning.svg +76 -0
- package/examples/courtyard_house.psc +141 -0
- package/examples/courtyard_house.svg +93 -0
- package/examples/orientation.psc +141 -0
- package/examples/orientation.svg +88 -0
- package/examples/zones.psc +275 -0
- package/examples/zones.svg +89 -0
- package/package.json +1 -1
- package/examples/casa_moderna.psc +0 -375
- package/examples/casa_moderna_v2.psc +0 -406
- package/examples/casa_moderna_v3.psc +0 -375
- package/examples/casa_moderna_v5.psc +0 -397
- package/examples/house2.psc +0 -156
- package/examples/house2.svg +0 -103
- 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>
|