planscript 1.0.0 → 1.4.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 +754 -0
- package/README.md +98 -107
- package/dist/ast/types.d.ts +11 -1
- package/dist/ast/types.d.ts.map +1 -1
- package/dist/exporters/svg.d.ts.map +1 -1
- package/dist/exporters/svg.js +126 -1
- package/dist/exporters/svg.js.map +1 -1
- package/dist/geometry/index.d.ts.map +1 -1
- package/dist/geometry/index.js +70 -16
- package/dist/geometry/index.js.map +1 -1
- package/dist/parser/grammar.d.ts +11 -4
- package/dist/parser/grammar.d.ts.map +1 -1
- package/dist/parser/grammar.js +578 -170
- package/dist/parser/grammar.js.map +1 -1
- package/examples/casa_moderna.psc +375 -0
- package/examples/casa_moderna_v2.psc +406 -0
- package/examples/casa_moderna_v3.psc +375 -0
- package/examples/casa_moderna_v5.psc +397 -0
- package/examples/house2.psc +156 -0
- package/examples/house2.svg +103 -0
- package/examples/house3.svg +139 -0
- package/package.json +2 -1
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
# Casa Moderna - Terreno 20m x 60m
|
|
2
|
+
# v5: Diseño limpio, coordenadas verificadas
|
|
3
|
+
#
|
|
4
|
+
# Layout conceptual (vista desde arriba, norte = arriba):
|
|
5
|
+
#
|
|
6
|
+
# NORTE (fondo terreno)
|
|
7
|
+
# +------------------+
|
|
8
|
+
# | MASTER |VEST|BAÑ| Y=28-32
|
|
9
|
+
# +---------+----+---+
|
|
10
|
+
# | BED3 | PASILLO | Y=23-28
|
|
11
|
+
# +---------+---------+
|
|
12
|
+
# | BED2 | BAÑO | | Y=18-23
|
|
13
|
+
# +---------+------+ |
|
|
14
|
+
# | COCINA | COMEDOR | Y=12-18
|
|
15
|
+
# +---------+---------+
|
|
16
|
+
# | OFIC | LIVING | Y=6-12
|
|
17
|
+
# +-------+-----------+
|
|
18
|
+
# |GARAGE |FOYER|LAVAD| Y=1-6
|
|
19
|
+
# +-------+-----+-----+
|
|
20
|
+
# SUR (frente/calle)
|
|
21
|
+
|
|
22
|
+
units m
|
|
23
|
+
|
|
24
|
+
defaults {
|
|
25
|
+
door_width 0.9
|
|
26
|
+
window_width 1.5
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
plan "Casa Moderna" {
|
|
30
|
+
footprint rect (1, 1) (19, 32)
|
|
31
|
+
|
|
32
|
+
# ============================================
|
|
33
|
+
# FRENTE - Sur (Y = 1 a 6)
|
|
34
|
+
# ============================================
|
|
35
|
+
|
|
36
|
+
room garage {
|
|
37
|
+
rect (1, 1) (7, 6)
|
|
38
|
+
label "Cochera"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
room foyer {
|
|
42
|
+
rect (7, 1) (13, 6)
|
|
43
|
+
label "Hall"
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
room laundry {
|
|
47
|
+
rect (13, 1) (19, 6)
|
|
48
|
+
label "Lavadero"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# ============================================
|
|
52
|
+
# ZONA SOCIAL - Centro (Y = 6 a 18)
|
|
53
|
+
# ============================================
|
|
54
|
+
|
|
55
|
+
room office {
|
|
56
|
+
rect (1, 6) (6, 12)
|
|
57
|
+
label "Oficina"
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
room living {
|
|
61
|
+
rect (6, 6) (19, 12)
|
|
62
|
+
label "Living"
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
room kitchen {
|
|
66
|
+
rect (1, 12) (8, 18)
|
|
67
|
+
label "Cocina"
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
room dining {
|
|
71
|
+
rect (8, 12) (19, 18)
|
|
72
|
+
label "Comedor"
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
# ============================================
|
|
76
|
+
# ZONA PRIVADA - Norte (Y = 18 a 32)
|
|
77
|
+
# ============================================
|
|
78
|
+
|
|
79
|
+
# Pasillo central que conecta todo
|
|
80
|
+
room hallway {
|
|
81
|
+
rect (8, 18) (12, 28)
|
|
82
|
+
label "Pasillo"
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
room bedroom2 {
|
|
86
|
+
rect (1, 18) (8, 23)
|
|
87
|
+
label "Dormitorio 2"
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
room bath_shared {
|
|
91
|
+
rect (12, 18) (16, 22)
|
|
92
|
+
label "Baño"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
room bedroom3 {
|
|
96
|
+
rect (1, 23) (8, 28)
|
|
97
|
+
label "Dormitorio 3"
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
room storage {
|
|
101
|
+
rect (16, 18) (19, 22)
|
|
102
|
+
label "Placard"
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
room sitting {
|
|
106
|
+
rect (12, 22) (19, 28)
|
|
107
|
+
label "Estar Íntimo"
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
# ============================================
|
|
111
|
+
# SUITE MASTER - Fondo Norte (Y = 28 a 32)
|
|
112
|
+
# ============================================
|
|
113
|
+
|
|
114
|
+
room master {
|
|
115
|
+
rect (1, 28) (10, 32)
|
|
116
|
+
label "Suite Principal"
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
room walkin {
|
|
120
|
+
rect (10, 28) (14, 32)
|
|
121
|
+
label "Vestidor"
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
room bath_master {
|
|
125
|
+
rect (14, 28) (19, 32)
|
|
126
|
+
label "Baño Suite"
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
# ============================================
|
|
130
|
+
# PUERTAS - Acceso
|
|
131
|
+
# ============================================
|
|
132
|
+
|
|
133
|
+
opening door d_entrada {
|
|
134
|
+
on foyer.edge south
|
|
135
|
+
at 50%
|
|
136
|
+
width 1.2
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
opening door d_garage_ext {
|
|
140
|
+
on garage.edge south
|
|
141
|
+
at 50%
|
|
142
|
+
width 5.0
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
opening door d_garage_int {
|
|
146
|
+
between garage and foyer
|
|
147
|
+
on shared_edge
|
|
148
|
+
at 50%
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
opening door d_laundry_ext {
|
|
152
|
+
on laundry.edge south
|
|
153
|
+
at 50%
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
opening door d_foyer_laundry {
|
|
157
|
+
between foyer and laundry
|
|
158
|
+
on shared_edge
|
|
159
|
+
at 50%
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
# ============================================
|
|
163
|
+
# PUERTAS - Zona Social
|
|
164
|
+
# ============================================
|
|
165
|
+
|
|
166
|
+
opening door d_foyer_living {
|
|
167
|
+
between foyer and living
|
|
168
|
+
on shared_edge
|
|
169
|
+
at 50%
|
|
170
|
+
width 1.5
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
opening door d_foyer_office {
|
|
174
|
+
between foyer and office
|
|
175
|
+
on shared_edge
|
|
176
|
+
at 50%
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
opening door d_office_living {
|
|
180
|
+
between office and living
|
|
181
|
+
on shared_edge
|
|
182
|
+
at 50%
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
opening door d_living_dining {
|
|
186
|
+
between living and dining
|
|
187
|
+
on shared_edge
|
|
188
|
+
at 50%
|
|
189
|
+
width 2.5
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
opening door d_living_kitchen {
|
|
193
|
+
between living and kitchen
|
|
194
|
+
on shared_edge
|
|
195
|
+
at 50%
|
|
196
|
+
width 1.2
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
opening door d_kitchen_dining {
|
|
200
|
+
between kitchen and dining
|
|
201
|
+
on shared_edge
|
|
202
|
+
at 50%
|
|
203
|
+
width 1.2
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
# ============================================
|
|
207
|
+
# PUERTAS - Circulación a zona privada
|
|
208
|
+
# ============================================
|
|
209
|
+
|
|
210
|
+
opening door d_dining_hall {
|
|
211
|
+
between dining and hallway
|
|
212
|
+
on shared_edge
|
|
213
|
+
at 50%
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
opening door d_kitchen_hall {
|
|
217
|
+
between kitchen and hallway
|
|
218
|
+
on shared_edge
|
|
219
|
+
at 50%
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
# ============================================
|
|
223
|
+
# PUERTAS - Zona Privada
|
|
224
|
+
# ============================================
|
|
225
|
+
|
|
226
|
+
opening door d_hall_bed2 {
|
|
227
|
+
between hallway and bedroom2
|
|
228
|
+
on shared_edge
|
|
229
|
+
at 50%
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
opening door d_hall_bed3 {
|
|
233
|
+
between hallway and bedroom3
|
|
234
|
+
on shared_edge
|
|
235
|
+
at 50%
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
opening door d_hall_bath {
|
|
239
|
+
between hallway and bath_shared
|
|
240
|
+
on shared_edge
|
|
241
|
+
at 50%
|
|
242
|
+
width 0.8
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
opening door d_hall_sitting {
|
|
246
|
+
between hallway and sitting
|
|
247
|
+
on shared_edge
|
|
248
|
+
at 50%
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
opening door d_hall_master {
|
|
252
|
+
between hallway and master
|
|
253
|
+
on shared_edge
|
|
254
|
+
at 50%
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
# ============================================
|
|
258
|
+
# PUERTAS - Suite Master
|
|
259
|
+
# ============================================
|
|
260
|
+
|
|
261
|
+
opening door d_master_walkin {
|
|
262
|
+
between master and walkin
|
|
263
|
+
on shared_edge
|
|
264
|
+
at 50%
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
opening door d_walkin_bath {
|
|
268
|
+
between walkin and bath_master
|
|
269
|
+
on shared_edge
|
|
270
|
+
at 50%
|
|
271
|
+
width 0.8
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
# ============================================
|
|
275
|
+
# VENTANAS - Fachada Sur
|
|
276
|
+
# ============================================
|
|
277
|
+
|
|
278
|
+
opening window w_office_s {
|
|
279
|
+
on office.edge south
|
|
280
|
+
at 2.5
|
|
281
|
+
width 2.0
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
# ============================================
|
|
285
|
+
# VENTANAS - Fachada Oeste
|
|
286
|
+
# ============================================
|
|
287
|
+
|
|
288
|
+
opening window w_garage_w {
|
|
289
|
+
on garage.edge west
|
|
290
|
+
at 2.5
|
|
291
|
+
width 1.5
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
opening window w_office_w {
|
|
295
|
+
on office.edge west
|
|
296
|
+
at 3.0
|
|
297
|
+
width 2.0
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
opening window w_kitchen_w {
|
|
301
|
+
on kitchen.edge west
|
|
302
|
+
at 3.0
|
|
303
|
+
width 2.0
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
opening window w_bed2_w {
|
|
307
|
+
on bedroom2.edge west
|
|
308
|
+
at 3.5
|
|
309
|
+
width 2.0
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
opening window w_bed3_w {
|
|
313
|
+
on bedroom3.edge west
|
|
314
|
+
at 2.5
|
|
315
|
+
width 2.0
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
opening window w_master_w {
|
|
319
|
+
on master.edge west
|
|
320
|
+
at 4.5
|
|
321
|
+
width 3.0
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
# ============================================
|
|
325
|
+
# VENTANAS - Fachada Este
|
|
326
|
+
# ============================================
|
|
327
|
+
|
|
328
|
+
opening window w_laundry_e {
|
|
329
|
+
on laundry.edge east
|
|
330
|
+
at 2.5
|
|
331
|
+
width 1.2
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
opening window w_living_e {
|
|
335
|
+
on living.edge east
|
|
336
|
+
at 6.5
|
|
337
|
+
width 3.0
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
opening window w_dining_e {
|
|
341
|
+
on dining.edge east
|
|
342
|
+
at 5.5
|
|
343
|
+
width 3.0
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
opening window w_storage_e {
|
|
347
|
+
on storage.edge east
|
|
348
|
+
at 2.0
|
|
349
|
+
width 1.0
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
opening window w_sitting_e {
|
|
353
|
+
on sitting.edge east
|
|
354
|
+
at 3.0
|
|
355
|
+
width 2.5
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
opening window w_bath_master_e {
|
|
359
|
+
on bath_master.edge east
|
|
360
|
+
at 2.5
|
|
361
|
+
width 1.2
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
# ============================================
|
|
365
|
+
# VENTANAS - Fachada Norte
|
|
366
|
+
# ============================================
|
|
367
|
+
|
|
368
|
+
opening window w_master_n {
|
|
369
|
+
on master.edge north
|
|
370
|
+
at 4.5
|
|
371
|
+
width 3.0
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
opening window w_walkin_n {
|
|
375
|
+
on walkin.edge north
|
|
376
|
+
at 2.0
|
|
377
|
+
width 1.5
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
opening window w_bath_master_n {
|
|
381
|
+
on bath_master.edge north
|
|
382
|
+
at 2.5
|
|
383
|
+
width 1.2
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
# ============================================
|
|
387
|
+
# VALIDACIONES
|
|
388
|
+
# ============================================
|
|
389
|
+
|
|
390
|
+
assert no_overlap rooms
|
|
391
|
+
assert inside footprint all_rooms
|
|
392
|
+
assert min_room_area master >= 25
|
|
393
|
+
assert min_room_area living >= 40
|
|
394
|
+
assert min_room_area bedroom2 >= 15
|
|
395
|
+
assert min_room_area bedroom3 >= 15
|
|
396
|
+
assert min_room_area garage >= 25
|
|
397
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
units m
|
|
2
|
+
origin (0, 0)
|
|
3
|
+
|
|
4
|
+
defaults {
|
|
5
|
+
door_width 0.9
|
|
6
|
+
window_width 1.8
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
plan "Modern 3BR + Ensuite + Office + 2-Car Garage" {
|
|
10
|
+
# Building footprint (lot is 20x60; we only occupy 20x18)
|
|
11
|
+
footprint rect (0, 0) (20, 18)
|
|
12
|
+
|
|
13
|
+
# --- FRONT / STREET ZONE --------------------------------------------------
|
|
14
|
+
|
|
15
|
+
room garage {
|
|
16
|
+
rect (0, 0) (7.2, 6.2)
|
|
17
|
+
label "2-Car Garage"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
room office {
|
|
21
|
+
rect (12.5, 0) (20, 5.0)
|
|
22
|
+
label "Office"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
room foyer {
|
|
26
|
+
rect (7.2, 0) (12.5, 5.0)
|
|
27
|
+
label "Entry / Foyer"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# --- CORE / CIRCULATION (gallery hall, not oversized) ----------------------
|
|
31
|
+
|
|
32
|
+
room hall {
|
|
33
|
+
rect (7.2, 5.0) (12.5, 12.8)
|
|
34
|
+
label "Gallery Hall"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# --- GREAT ROOM (modern open-plan, facing garden) --------------------------
|
|
38
|
+
|
|
39
|
+
room great_room {
|
|
40
|
+
rect (12.5, 5.0) (20, 18)
|
|
41
|
+
label "Great Room (Living/Dining/Kitchen)"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# --- PRIVATE WING (LEFT) ---------------------------------------------------
|
|
45
|
+
|
|
46
|
+
room bedroom3 {
|
|
47
|
+
rect (0, 6.2) (7.2, 10.2)
|
|
48
|
+
label "Bedroom 3"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
room bathroom {
|
|
52
|
+
rect (0, 10.2) (3.4, 12.8)
|
|
53
|
+
label "Bathroom"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
room laundry {
|
|
57
|
+
rect (3.4, 10.2) (7.2, 12.8)
|
|
58
|
+
label "Laundry / Storage"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
room bedroom2 {
|
|
62
|
+
rect (0, 12.8) (7.2, 14.8)
|
|
63
|
+
label "Bedroom 2"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# Master suite at the back-left corner (has exterior walls on west + north)
|
|
67
|
+
room master {
|
|
68
|
+
rect (0, 14.8) (7.2, 18)
|
|
69
|
+
label "Master Bedroom"
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
room ensuite {
|
|
73
|
+
rect (0, 12.8) (3.4, 14.8)
|
|
74
|
+
label "Ensuite Bath"
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
room closet {
|
|
78
|
+
rect (3.4, 12.8) (7.2, 14.8)
|
|
79
|
+
label "Walk-in Closet"
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# NOTE: closet overlaps bedroom2 if we keep bedroom2 at (0,12.8)-(7.2,14.8)
|
|
83
|
+
# So bedroom2 is moved to the right side of the private wing:
|
|
84
|
+
room bedroom2 {
|
|
85
|
+
rect (0, 10.2) (7.2, 12.8)
|
|
86
|
+
label "Bedroom 2"
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
# And Bedroom 3 becomes smaller + shifted:
|
|
90
|
+
room bedroom3 {
|
|
91
|
+
rect (0, 6.2) (7.2, 10.2)
|
|
92
|
+
label "Bedroom 3"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
# Bathroom/Laundry stay as above (0..12.8 range) — consistent.
|
|
96
|
+
|
|
97
|
+
# --- DOORS ----------------------------------------------------------------
|
|
98
|
+
|
|
99
|
+
# Exterior front door (clear entry)
|
|
100
|
+
opening door d_front { on foyer.edge south at 50% width 1.1 }
|
|
101
|
+
|
|
102
|
+
# Garage internal access
|
|
103
|
+
opening door d_garage_foyer { between garage and foyer on shared_edge at 50% }
|
|
104
|
+
|
|
105
|
+
# Foyer to hall and to great room
|
|
106
|
+
opening door d_foyer_hall { between foyer and hall on shared_edge at 50% }
|
|
107
|
+
opening door d_hall_great { between hall and great_room on shared_edge at 55% width 1.6 }
|
|
108
|
+
|
|
109
|
+
# Office access from foyer (optional: could also be from hall)
|
|
110
|
+
opening door d_foyer_office { between foyer and office on shared_edge at 50% }
|
|
111
|
+
|
|
112
|
+
# Private wing connections from hall
|
|
113
|
+
opening door d_hall_bed3 { between hall and bedroom3 on shared_edge at 30% }
|
|
114
|
+
opening door d_hall_bed2 { between hall and bedroom2 on shared_edge at 55% }
|
|
115
|
+
opening door d_hall_bath { between hall and bathroom on shared_edge at 75% }
|
|
116
|
+
|
|
117
|
+
# Master suite connections
|
|
118
|
+
opening door d_hall_master { between hall and master on shared_edge at 85% }
|
|
119
|
+
opening door d_master_ensuite { between master and ensuite on shared_edge at 50% }
|
|
120
|
+
opening door d_master_closet { between master and closet on shared_edge at 50% }
|
|
121
|
+
|
|
122
|
+
# --- WINDOWS (make it feel modern) ----------------------------------------
|
|
123
|
+
|
|
124
|
+
# Office: street-facing
|
|
125
|
+
opening window w_office_s1 { on office.edge south at 2.0 width 2.0 }
|
|
126
|
+
opening window w_office_s2 { on office.edge south at 5.5 width 2.0 }
|
|
127
|
+
|
|
128
|
+
# Great room: BIG glazing to garden (north edge)
|
|
129
|
+
opening window w_great_n1 { on great_room.edge north at 2.0 width 3.0 }
|
|
130
|
+
opening window w_great_n2 { on great_room.edge north at 6.0 width 3.0 }
|
|
131
|
+
|
|
132
|
+
# Great room: side glazing (east)
|
|
133
|
+
opening window w_great_e1 { on great_room.edge east at 6.0 width 2.0 }
|
|
134
|
+
opening window w_great_e2 { on great_room.edge east at 11.5 width 2.0 }
|
|
135
|
+
|
|
136
|
+
# Bedrooms: exterior windows (no more “boxed master”)
|
|
137
|
+
opening window w_bed3_w { on bedroom3.edge west at 2.0 width 1.8 }
|
|
138
|
+
opening window w_bed2_w { on bedroom2.edge west at 1.5 width 1.8 }
|
|
139
|
+
|
|
140
|
+
# Master gets corner light (west + north)
|
|
141
|
+
opening window w_master_w { on master.edge west at 1.0 width 2.4 }
|
|
142
|
+
opening window w_master_n { on master.edge north at 3.0 width 2.8 }
|
|
143
|
+
|
|
144
|
+
# Bathrooms/laundry: small exterior windows (optional but realistic)
|
|
145
|
+
opening window w_bath_w { on bathroom.edge west at 1.0 width 0.8 }
|
|
146
|
+
opening window w_ensuite_w { on ensuite.edge west at 1.0 width 0.8 }
|
|
147
|
+
|
|
148
|
+
# --- VALIDATION ------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
assert no_overlap rooms
|
|
151
|
+
assert inside footprint all_rooms
|
|
152
|
+
|
|
153
|
+
assert min_room_area master >= 14.0
|
|
154
|
+
assert min_room_area bedroom2 >= 10.0
|
|
155
|
+
assert min_room_area bedroom3 >= 10.0
|
|
156
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
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 122.22 740.00 L 877.78 740.00 L 877.78 60.00 L 122.22 60.00 Z" fill="none" stroke="#7f8c8d" stroke-width="2" stroke-dasharray="8,4" />
|
|
14
|
+
|
|
15
|
+
<!-- Rooms -->
|
|
16
|
+
<path d="M 122.22 740.00 L 394.22 740.00 L 394.22 505.78 L 122.22 505.78 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
17
|
+
<path d="M 594.44 740.00 L 877.78 740.00 L 877.78 551.11 L 594.44 551.11 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
18
|
+
<path d="M 394.22 740.00 L 594.44 740.00 L 594.44 551.11 L 394.22 551.11 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
19
|
+
<path d="M 394.22 551.11 L 594.44 551.11 L 594.44 256.44 L 394.22 256.44 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
20
|
+
<path d="M 594.44 551.11 L 877.78 551.11 L 877.78 60.00 L 594.44 60.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
21
|
+
<path d="M 122.22 505.78 L 394.22 505.78 L 394.22 354.67 L 122.22 354.67 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
22
|
+
<path d="M 122.22 354.67 L 250.67 354.67 L 250.67 256.44 L 122.22 256.44 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
23
|
+
<path d="M 250.67 354.67 L 394.22 354.67 L 394.22 256.44 L 250.67 256.44 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
24
|
+
<path d="M 122.22 354.67 L 394.22 354.67 L 394.22 256.44 L 122.22 256.44 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
25
|
+
<path d="M 122.22 180.89 L 394.22 180.89 L 394.22 60.00 L 122.22 60.00 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
26
|
+
<path d="M 122.22 256.44 L 250.67 256.44 L 250.67 180.89 L 122.22 180.89 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
27
|
+
<path d="M 250.67 256.44 L 394.22 256.44 L 394.22 180.89 L 250.67 180.89 Z" fill="#ecf0f1" stroke="#bdc3c7" stroke-width="1" />
|
|
28
|
+
|
|
29
|
+
<!-- Walls -->
|
|
30
|
+
<line x1="394.22" y1="740.00" x2="394.22" y2="551.11" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
31
|
+
<line x1="394.22" y1="551.11" x2="394.22" y2="505.78" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
32
|
+
<line x1="122.22" y1="505.78" x2="394.22" y2="505.78" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
33
|
+
<line x1="594.44" y1="551.11" x2="877.78" y2="551.11" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
34
|
+
<line x1="594.44" y1="740.00" x2="594.44" y2="551.11" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
35
|
+
<line x1="394.22" y1="551.11" x2="594.44" y2="551.11" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
36
|
+
<line x1="594.44" y1="551.11" x2="594.44" y2="256.44" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
37
|
+
<line x1="394.22" y1="505.78" x2="394.22" y2="354.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
38
|
+
<line x1="394.22" y1="354.67" x2="394.22" y2="256.44" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
39
|
+
<line x1="122.22" y1="354.67" x2="250.67" y2="354.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
40
|
+
<line x1="250.67" y1="354.67" x2="394.22" y2="354.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
41
|
+
<line x1="122.22" y1="354.67" x2="394.22" y2="354.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
42
|
+
<line x1="250.67" y1="354.67" x2="250.67" y2="256.44" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
43
|
+
<line x1="122.22" y1="256.44" x2="250.67" y2="256.44" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
44
|
+
<line x1="122.22" y1="354.67" x2="122.22" y2="256.44" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
45
|
+
<line x1="250.67" y1="256.44" x2="394.22" y2="256.44" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
46
|
+
<line x1="122.22" y1="180.89" x2="250.67" y2="180.89" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
47
|
+
<line x1="250.67" y1="180.89" x2="394.22" y2="180.89" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
48
|
+
<line x1="250.67" y1="256.44" x2="250.67" y2="180.89" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
49
|
+
<line x1="122.22" y1="740.00" x2="394.22" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
50
|
+
<line x1="122.22" y1="740.00" x2="122.22" y2="505.78" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
51
|
+
<line x1="594.44" y1="740.00" x2="877.78" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
52
|
+
<line x1="877.78" y1="740.00" x2="877.78" y2="551.11" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
53
|
+
<line x1="394.22" y1="740.00" x2="594.44" y2="740.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
54
|
+
<line x1="394.22" y1="256.44" x2="594.44" y2="256.44" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
55
|
+
<line x1="877.78" y1="551.11" x2="877.78" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
56
|
+
<line x1="594.44" y1="60.00" x2="877.78" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
57
|
+
<line x1="594.44" y1="256.44" x2="594.44" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
58
|
+
<line x1="122.22" y1="505.78" x2="122.22" y2="354.67" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
59
|
+
<line x1="394.22" y1="180.89" x2="394.22" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
60
|
+
<line x1="122.22" y1="60.00" x2="394.22" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
61
|
+
<line x1="122.22" y1="180.89" x2="122.22" y2="60.00" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
62
|
+
<line x1="122.22" y1="256.44" x2="122.22" y2="180.89" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
63
|
+
<line x1="394.22" y1="256.44" x2="394.22" y2="180.89" stroke="#2c3e50" stroke-width="3" stroke-linecap="round" />
|
|
64
|
+
|
|
65
|
+
<!-- Openings (doors/windows) -->
|
|
66
|
+
<line x1="473.56" y1="740.00" x2="515.11" y2="740.00" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
|
|
67
|
+
<line x1="394.22" y1="662.56" x2="394.22" y2="628.56" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
|
|
68
|
+
<line x1="477.33" y1="551.11" x2="511.33" y2="551.11" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
|
|
69
|
+
<line x1="594.44" y1="419.27" x2="594.44" y2="358.82" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
|
|
70
|
+
<line x1="594.44" y1="662.56" x2="594.44" y2="628.56" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
|
|
71
|
+
<line x1="394.22" y1="477.44" x2="394.22" y2="443.44" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
|
|
72
|
+
<line x1="169.44" y1="180.89" x2="203.44" y2="180.89" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
|
|
73
|
+
<line x1="305.44" y1="180.89" x2="339.44" y2="180.89" stroke="#e74c3c" stroke-width="4" stroke-linecap="round" />
|
|
74
|
+
<line x1="632.22" y1="740.00" x2="707.78" y2="740.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
75
|
+
<line x1="764.44" y1="740.00" x2="840.00" y2="740.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
76
|
+
<line x1="613.33" y1="60.00" x2="726.67" y2="60.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
77
|
+
<line x1="764.44" y1="60.00" x2="877.78" y2="60.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
78
|
+
<line x1="877.78" y1="362.22" x2="877.78" y2="286.67" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
79
|
+
<line x1="877.78" y1="154.44" x2="877.78" y2="78.89" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
80
|
+
<line x1="122.22" y1="464.22" x2="122.22" y2="396.22" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
81
|
+
<line x1="122.22" y1="332.00" x2="122.22" y2="264.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
82
|
+
<line x1="122.22" y1="188.44" x2="122.22" y2="97.78" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
83
|
+
<line x1="182.67" y1="60.00" x2="288.44" y2="60.00" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
84
|
+
<line x1="122.22" y1="332.00" x2="122.22" y2="301.78" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
85
|
+
<line x1="122.22" y1="233.78" x2="122.22" y2="203.56" stroke="#3498db" stroke-width="3" stroke-linecap="round" />
|
|
86
|
+
|
|
87
|
+
<!-- Labels -->
|
|
88
|
+
<text x="258.22" y="622.89" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">2-Car Garage</text>
|
|
89
|
+
<text x="736.11" y="645.56" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Office</text>
|
|
90
|
+
<text x="494.33" y="645.56" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Entry / Foyer</text>
|
|
91
|
+
<text x="494.33" y="403.78" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Gallery Hall</text>
|
|
92
|
+
<text x="736.11" y="305.56" font-size="11" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Great Room (Living/Dining/Kitchen)</text>
|
|
93
|
+
<text x="258.22" y="430.22" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Bedroom 3</text>
|
|
94
|
+
<text x="186.44" y="305.56" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Bathroom</text>
|
|
95
|
+
<text x="322.44" y="305.56" font-size="11" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Laundry / Storage</text>
|
|
96
|
+
<text x="258.22" y="305.56" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Bedroom 2</text>
|
|
97
|
+
<text x="258.22" y="120.44" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Master Bedroom</text>
|
|
98
|
+
<text x="186.44" y="218.67" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Ensuite Bath</text>
|
|
99
|
+
<text x="322.44" y="218.67" font-size="14" fill="#2c3e50" text-anchor="middle" dominant-baseline="middle" font-family="Arial, sans-serif">Walk-in Closet</text>
|
|
100
|
+
|
|
101
|
+
<!-- Dimensions -->
|
|
102
|
+
|
|
103
|
+
</svg>
|