Un cursor (sólo posición) recorre el plano dejando paredes detrás. Cada muro lleva su propio rumbo absoluto y avanza el cursor a su extremo. Variables y expresiones se evalúan en compilación.
muro E 6 como sur # traza pared y avanza al extremo muro N 4 como este muro O 6 como norte cerrar # cierra el polígono al primer vértice
Cada muro exige rumbo + distancia. No hay girar ni rumbo como sentencias top-level — el rumbo se da en cada muro.
escala metros # 1ª línea útil, opcional plano # defaults globales alto-puerta = 2.10 antepecho = 1.00 variable largo = 7 # perímetro CCW: muros con rumbo absoluto muro E largo como sur … cerrar # tabiques internos (desde anclas) # habitaciones # muebles
Indentación significativa (estilo Python). Comentarios con #, bloques ###...### o /*…*/.
| escala metros | defecto |
| escala centimetros | |
| escala milimetros | |
| escala pies | ×304.8 mm |
| escala pulgadas | ×25.4 mm |
| escala yardas | ×914.4 mm |
Sufijo en valor anula la escala global: 120cm, 800mm, 2m.
plano alto-puerta = 2.10 alto-ventana = 1.20 antepecho = 1.00 ancho-puerta = 0.85 ancho-ventana = 1.20 alto-techo = 2.50 grosor-muro = 0.25 grosor-pared = 0.15 grosor-tabique = 0.08
Cualquier propiedad inline en una puerta, ventana o muro sobrescribe el default del plano. Si no hay plano, se usan defaults hardcoded (puerta 80×210, ventana 100×120, antepecho 100, muro 25 cm, pared 15 cm, tabique 8 cm).
variable largo = 6.00 variable ancho = 4.50 muro E largo muro N (largo / 2 - 0.45) # atajo estilo MFL (_prefix) _largo = 6.00 muro E _largo # tuplas (variables-punto) variable esquina = (0, 10.5) inicio en esquina
Regla dimensional:
| + − | literal sin sufijo = distancia (escala global) |
| × ÷ | literal sin sufijo = escalar adimensional |
Por eso largo / 2 divide entre 2 (escalar) y largo - 0.45 resta 45 cm.
| muro | exterior / carga · 250 mm |
| pared | interior portante · 150 mm |
| tabique | divisorio ligero · 80 mm |
muro 90 6 como sur grosor 0.30 # rumbo + distancia muro E 6 como sur alero 0.40 # cardinal letra + alero muro de (0,0) a (6,0) como sur # entre dos puntos
Rumbo: número compás (0=N, 90=E, 180=S, 270=O) o palabra/letra cardinal (N, S, E, O, NE, NO, SE, SO · norte, sur, este, oeste, noreste…). Modificadores: como NAME, grosor T, alero E.
El cursor es sólo una posición — no tiene rumbo propio (cada muro lleva el suyo).
| inicio en (x, y) | posición absoluta · default (0,0) |
| inicio en <ancla> | fija el cursor en un ancla declarada |
| desde <ancla> | salta a un ancla con auto-corrección (ver abajo) |
| cerrar | muro recto del cursor al primer vértice del polígono |
Convención: +X = Este, +Y = Norte. Tras cada muro, el cursor queda en su extremo.
Tres formas de medir el offset (todas dentro de un muro):
muro E 6 como sur ancla a 3 como p1 # desde inicio del muro ancla a 3 desde fin como p2 # desde el final ancla a 3 desde otro_muro como p3 # perpendicular a otro muro
Nombrar un muro con como NAME registra dos auto-anclas: NAME (inicio del muro) y NAME.fin (extremo). Las usas con desde NAME o desde NAME.fin.
Al arrancar un nuevo muro desde un ancla pegada a otra pared, HDL ajusta dos cosas en función del rumbo:
| Cara | arranca en la cara del muro de origen que evita cruzar su cuerpo. Tú no tienes que sumar/restar el grosor. |
| Lado del cuerpo | el cuerpo del nuevo muro crece siempre hacia +X (verticales) o +Y (horizontales). Así dos tabiques que cruzan la misma pared por el mismo punto quedan alineados aunque uno suba y otro baje. |
muro E 8 como carga ancla a 3 como junta desde junta tabique N 3 # sube — cuerpo al este desde junta tabique S 3 # baja — cuerpo al este, alineado con el de arriba
Los muros perimetrales (sin desde) y los muro de A a B mantienen la convención CCW estándar (cuerpo a la izquierda del rumbo).
puerta a 1.20 ancho 0.90 tipo abatible bisagra derecha abre dentro hojas 1
| tipo | abatible · corredera · plegable · vaiven · pivotante · fija |
| bisagra | izquierda · derecha · ambas |
| abre dentro/fuera | muros exteriores |
| abre hacia <hab> | tabiques interiores · barre hacia esa habitación |
| corre | izquierda · derecha (correderas) |
| empotrada si | corredera empotrada en tabique |
| hojas | 1 · 2 · 3 |
Variantes de posición: a 1.20 desde fin, centrada.
ventana a 4.00 ancho 1.50 alto 1.20 antepecho 1.00 tipo oscilobatiente
| tipo | fija · abatible · corredera · oscilobatiente · guillotina |
| antepecho | altura del alféizar |
habitacion salon delimita [sur, este, tab_central, oeste]
Lista los muros que rodean la habitación. El compilador la pinta y permite asociar muebles.
# TOP-LEVEL (fuera de cualquier `planta`) → en TODAS las plantas: muro E 7 como sur muro N 5 como este muro O 7 como norte muro S 5 como oeste cerrar # DENTRO de un bloque `planta NAME` → solo esa planta: planta baja muro de (0,2.8) a (7,2.8) como divisor_pb habitacion salon delimita [sur, este, divisor_pb, oeste] planta primera muro de (0,2) a (7,2) como divisor_p1
Sin bloque planta: todo el fichero es una planta única (retrocompat). Con plantas: el editor muestra una barra para alternar entre ellas. Los muros top-level se replican en todas. Los tabiques internos y habitaciones se ponen dentro de la planta a la que pertenecen.
Para retranquear un muro común en una planta concreta, redefínelo dentro de esa planta con el mismo nombre — sustituye al heredado solo ahí.
# Pilar libre (no atado a un muro) pilar en (3, 2) ancho 0.40 fondo 0.40 rotacion 0 # Pilar centrado en un ancla previa pilar desde esquina_NW ancho 0.30 # Pilar atado a un muro (anidado en él) muro E 6 como sur pilar a 3 ancho 0.40 fondo 0.40
Default 40×40 cm. en (x,y) y desde <ancla> sitúan el centro del pilar; en muro, a N es el offset desde el inicio.
ancla en (3.5, 4.0) como centro
Punto con nombre, no asociado a un muro. Se puede usar en muro de A a B, desde A, pilar desde A, etc.
mueble cocina/bajo.mfl contra fachada_sur a 0.40 altura 0 mueble cocina/isla.mfl en (2.50, 1.80) rotacion 45
contra <muro> autorota y se pega · en (x,y) + rotacion es libre. Mutuamente excluyentes.
# de línea ### bloque multilínea ### /* bloque estilo C */ muro E 6 /* inline */
escalera principal en (1000mm, 2000mm) forma = recta # recta | espiral | l | u pasos = 14 huella = 280mm contrahuella = 175mm ancho = 900mm rumbo = 0 # 0|90|180|270 dirección de subida
El compilador calcula automáticamente largo = pasos × huella y alto = pasos × contrahuella. Si el nombre está declarado, crea anclas name, name.fin, name.izq, name.dcha.
cota fachada-sur desde-punto = (0, 0) a-punto = (6000mm, 0) etiqueta = ancho fachada # opcional (auto = distancia) offset = 500mm # mm desde la línea base # También sirve referenciar anclas en lugar de tuplas: cota desde-punto = fachada a-punto = fachada.fin
Si omites etiqueta, se calcula automáticamente como la distancia en metros con 2 decimales.
pilar p1 en (3000mm, 2000mm) ancho = 300mm fondo = 300mm forma = redondo # cuadrado | redondo (nuevo 2026-05-26) como p1 # crea 9 anclas: p1, p1.norte, p1.este, ...
Las 9 anclas (centro + 4 caras + 4 esquinas) permiten que un muro arranque "desde p1.este" sin calcular coordenadas.
| Rueda del ratón | zoom |
| Click + arrastrar | mover |
| Doble click | reset (ajuste automático) |
| Splitter central | redimensionar editor / canvas |