Files
houseplan-card/docs/specs/052-view-dimensions.md

4.2 KiB
Raw Permalink Blame History

ТЗ #52 — Размеры стен и площади в View

Закрыто 2026-09-07 решением владельца, объединено с #53. Слой размеров в режиме просмотра не делается. Раздел «Площади» остаётся действующим контрактом и переиспользуется опцией «Отображать размеры» экспорта PDF (#53). Раздел «Длины» (осевые пролёты стен) на бумаге НЕ применяется: ТЗ #53 §7.3 печатает внутренние размеры каждой комнаты грань-в-грань и внешние размеры наружных граней. «Настройка» и «Collision/zoom» к экрану больше не относятся.

Цель

Добавить read-only architectural annotation layer на основе существующей геометрии и cell_cm, не создавая второй системы измерений.

Настройка

Per-space settings.dimensions: 'off' | 'areas' | 'full', default off. Отдельный card/kiosk default: kiosk всегда скрывает dimensions, пока будущая явная card option не разрешит их. Editor preview использует effective setting.

Площади

  • areas и full показывают значение чистого пола через тот же clean-floor/geometryArea resolver, что tooltip #28.
  • Единицы/округление — существующий formatArea; metric m², imperial ft².
  • Label anchor — сохранённый room label position либо interior visual point; annotation не перемещает пользовательское room name.
  • Очень малая/узкая room скрывает annotation при отсутствии безопасного места, tooltip/card всё равно содержит площадь.

Длины

  • full аннотирует unique physical wall centreline spans из текущей normalized wall model. Общая стена рисуется один раз.
  • Virtual/open boundary не получает physical length annotation.
  • Doors/windows/gates не вычитаются из общей длины span; это размер стены по оси, а не чистая кладка.
  • Partitions и physical segments сохранённых room drafts входят; columns не имеют линейного размера. Толщина не меняет длину оси.
  • Collinear мусорные fragments сначала проходят существующую compaction; annotation не объединяет через угол/разрыв.

Label расположен параллельно span, читаемый текст никогда не upside-down; offset выбирается со стороны вне clean floor при возможности. Значение использует segmentCm/formatLength и space grid scale.

Collision/zoom

Projection вычисляет candidates и детерминированно скрывает labels, чьи screen bbox пересекаются с более приоритетными (selected room, outer wall, longer span). Ни один label не становится меньше доступного font minimum. На малом zoom слой постепенно скрывает wall dimensions, затем areas; stored setting не меняется. pointer-events:none.

Проверки и приёмка

  • rectangles, diagonal/L/nested/shared/thick/open walls, partitions/drafts;
  • metric/imperial, different cell_cm, resize and optimize;
  • deterministic collision at several viewports/zooms;
  • View/kiosk/editor visibility and print-friendly golden;
  • area совпадает с room card, length с live ruler для того же span;
  • никакой config mutation от отображения слоя.