HDL · Chuleta de referencia v1

Editor HDL Manual

HDL — House Description Language

Castellano · plantas paramétricas · cursor + anclas

Idea

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.

Estructura del fichero

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

escala metrosdefecto
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 · defaults globales

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).

Variables y expresiones

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.

Tipos de pared

muroexterior / carga · 250 mm
paredinterior portante · 150 mm
tabiquedivisorio 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.

Cursor

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)
cerrarmuro 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.

Anclas

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.

Auto-corrección al usar desde

Al arrancar un nuevo muro desde un ancla pegada a otra pared, HDL ajusta dos cosas en función del rumbo:

Caraarranca en la cara del muro de origen que evita cruzar su cuerpo. Tú no tienes que sumar/restar el grosor.
Lado del cuerpoel 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).

Puertas

puerta a 1.20
  ancho 0.90
  tipo abatible
  bisagra derecha
  abre dentro
  hojas 1
tipoabatible · corredera · plegable · vaiven · pivotante · fija
bisagraizquierda · derecha · ambas
abre dentro/fueramuros exteriores
abre hacia <hab>tabiques interiores · barre hacia esa habitación
correizquierda · derecha (correderas)
empotrada sicorredera empotrada en tabique
hojas1 · 2 · 3

Variantes de posición: a 1.20 desde fin, centrada.

Ventanas

ventana a 4.00
  ancho 1.50
  alto 1.20
  antepecho 1.00
  tipo oscilobatiente
tipofija · abatible · corredera · oscilobatiente · guillotina
antepechoaltura del alféizar

Habitaciones

habitacion salon
  delimita [sur, este, tab_central, oeste]

Lista los muros que rodean la habitación. El compilador la pinta y permite asociar muebles.

Plantas (niveles)

# 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í.

Pilares

# 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.

Anclas libres

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.

Muebles (integración MFL/MDL)

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.

Comentarios

# de línea
### bloque
multilínea ###
/* bloque
estilo C */
muro E 6 /* inline */

Escaleras (nuevo 2026-05-26)

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.

Cotas (anotaciones dimensionales) (nuevo 2026-05-26)

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.

Pilares / columnas (extensión)

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.

Editor — atajos del lienzo

Rueda del ratónzoom
Click + arrastrarmover
Doble clickreset (ajuste automático)
Splitter centralredimensionar editor / canvas