Files
editor/packages/nodes/src/index.ts
T
77442861d9 editor: complete floorplan construction documentation (#531)
* Add roof surface placement support for items

Items (e.g. solar panels) can now be placed on sloped roof surfaces.
The placement system computes euler rotation from the roof surface
normal so items sit flush on the slope instead of going inside.

- Add roofStrategy to placement-strategies with enter/move/click/leave
- Wire roof:enter/move/click/leave events in the placement coordinator
- Add calculateRoofRotation in placement-math using surface normals
- Support full 3D cursor rotation for sloped surfaces
- Items on roofs are parented to the level with world-space rotation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fixed conflict

* feat(floorplan): add construction dimension strings

* feat(floorplan): coordinate opening dimensions

* feat(floorplan): add opening documentation

* feat(floorplan): add construction dimensions and notes

* feat(floorplan): add interior dimensions and curved note leaders

* feat(floorplan): improve construction dimensions and document plan

* feat(floorplan): harden construction document output

* feat(floorplan): add annotation collision diagnostics

* feat(floorplan): size export annotations in paper space

* feat(floorplan): automatically separate overlapping labels

* fix(floorplan): resolve dense label overlaps

* fix(floorplan): remove stale collision warning overlays

* fix(floorplan): treat mark pills as collision obstacles

* feat(floorplan): place short dimension values outside

* fix(floorplan): preserve dimension string order

* fix(floorplan): avoid architectural geometry in label layout

* feat(floorplan): add dimension side fallback leaders

* docs(floorplan): update chapter 17 implementation status

* fix(floorplan): dimension subdivided interior walls

* feat: add associative floor plan dimensions

* feat: add continuous construction dimension strings

* feat: add structural floor plan grids

* feat: coordinate columns with structural grids

Snap column placement and movement to structural axes and intersections, derive associative grid references, and preserve floor-plan rotation by allowing secondary-button pointer moves through the grid drafting layer.

* feat: add architectural room documentation

Add room-role metadata, editable documentation fields, centered room labels, and persisted live/PDF visibility while preserving generic zone behavior.

* feat: generate architectural room schedules

Add registry-driven room schedule rows with unit-aware areas and heights, natural room ordering, enclosure resolution, and document-quality warnings.

* feat: add reliable room clear dimensions

Derive unit-aware clear dimensions from proven modeled inside wall faces for straight rectangular rooms, including rotated and split-wall enclosures, while suppressing unproven datums.

* feat: add architectural stair documentation

Add level-aware UP/DN graphics, derived flight and rail notes, plan break and overhead conventions, linked destination-level projection, and persisted live/PDF visibility.

* feat: add typed specialty construction notes

Add schema-validated specialty payloads, standardized plan notation, contract-scope metadata, configurable overhead outlines, and editor authoring controls.

* feat: add curved and circular dimensions

Add associative radius, diameter, center, chord, arc-length, angular, and coordinate modes with unit-aware notation, repeated-feature labels, 2D authoring, and document controls.

* feat: coordinate floor plan drawing types

Add persistent floor, foundation, reflected-ceiling, roof, and site plan views with per-dimension show, omit, reference, and foundation-controller behavior across live and PDF output.

* feat: add associative curved wall dimensions

Bind radius, center, chord, arc-length, and angular construction dimensions directly to curved wall geometry so annotations update when the host curve changes.

* fix: render automatic curved wall dimensions

The wall floor-plan builder explicitly skipped curved walls, leaving the associative authoring workflow as the only dimension path. Render a concentric arc-length dimension automatically and keep it governed by automatic-dimension visibility.

* fix: use radius callout for curved walls

Replace the automatic arc-length annotation with the source-standard radius method: computed center mark, radial leader, curve arrow, and R value. Keep adjacent linear strings responsible for locating the curve tangencies and depth.

* Implement construction dimension string editing

* Add construction dimension standards controls

* Apply drawing standards to automatic dimensions

* Add floorplan overhead and reference visibility controls

* Add view-specific dimension segment suppression

* Add persistent drawing sheet model

* Plot floorplan exports at fixed scale

* Apply paper-space annotation profiles

* Compose floorplan PDF sheets

* Support sheet paper sizes and preflight

* Persist pinned annotation layout overrides

* Expand annotation collision obstacles

* Add floorplan annotation preflight surface

* Add reusable drawing sheet general notes

* Add drawing sheet keyed note instances

* Add drawing sheet document markers

* Expand construction note leader terminators

* Add wall assembly layer model

* Resolve wall assembly datum references

* Add wall assembly floorplan graphics

* Add opening documentation dimension policies

* Add finish-face room clear dimensions

* Extend room clear dimensions to rectilinear rooms

* Add construction module advisories

* Add clearance advisory profiles

* Add dimension completeness audit

* Expand dimension completeness audit

* Include preflight issues in completeness audit

* feat: complete floorplan construction documentation

* refactor: remove construction note node

* feat: refine floorplan documentation and unit display

* fix(editor): improve floorplan PDF dimensions

* fix(floorplan): refresh annotation collision layout

* fix(floorplan): keep annotations clear and restore registry boundaries

* feat(floorplan): refine construction dimension references

* fix(floorplan): align documentation tools with architecture

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-22 14:02:17 -04:00

208 lines
9.4 KiB
TypeScript

import type { AnyNodeDefinition, Plugin } from '@pascal-app/core'
import { boxVentDefinition } from './box-vent'
import { buildingDefinition } from './building'
import { cabinetDefinition, cabinetModuleDefinition } from './cabinet'
import { ceilingDefinition } from './ceiling'
import { chimneyDefinition } from './chimney'
import { columnDefinition } from './column'
import { constructionDimensionDefinition } from './construction-dimension'
import { cupolaDefinition } from './cupola'
import { doorDefinition } from './door'
import { dormerDefinition } from './dormer'
import { downspoutDefinition } from './downspout'
import { drawingSheetDefinition } from './drawing-sheet'
import { ductFittingDefinition } from './duct-fitting'
import { ductSegmentDefinition } from './duct-segment'
import { ductTerminalDefinition } from './duct-terminal'
import { elevatorDefinition } from './elevator'
import { eyebrowVentDefinition } from './eyebrow-vent'
import { fenceDefinition } from './fence'
import { guideDefinition } from './guide'
import { gutterDefinition } from './gutter'
import { hvacEquipmentDefinition } from './hvac-equipment'
import { itemDefinition } from './item'
import { levelDefinition } from './level'
import { linesetDefinition } from './lineset'
import { liquidLineDefinition } from './liquid-line'
import { measurementDefinition } from './measurement'
import { pipeFittingDefinition } from './pipe-fitting'
import { pipeSegmentDefinition } from './pipe-segment'
import { pipeTrapDefinition } from './pipe-trap'
import { ridgeVentDefinition } from './ridge-vent'
import { roofDefinition } from './roof'
import { roofSegmentDefinition } from './roof-segment'
import { scanDefinition } from './scan'
import { shelfDefinition } from './shelf'
import { siteDefinition } from './site'
import { skylightDefinition } from './skylight'
import { slabDefinition } from './slab'
import { solarPanelDefinition } from './solar-panel'
import { spawnDefinition } from './spawn'
import { stairDefinition } from './stair'
import { stairSegmentDefinition } from './stair-segment'
import { structuralGridDefinition } from './structural-grid'
import { turbineVentDefinition } from './turbine-vent'
import { wallDefinition } from './wall'
import { windowDefinition } from './window'
import { zoneDefinition } from './zone'
/**
* Built-in plugin bundling every node kind shipped with the Pascal editor.
*
* Apps load this once at bootstrap (`loadPlugin(builtinPlugin)`) before
* mounting the viewer. New built-in nodes are added by creating a folder
* here under `src/<kind>/` and appending its `NodeDefinition` below.
*
* External plugins follow the exact same shape — same `Plugin` type, same
* `loadPlugin` call path. This is intentional: the API is stress-tested
* by built-ins before any third-party plugin lands.
*
* All kinds are registered unconditionally. Parity is verified by
* comparing against deployed production rather than an in-app env-var
* flag toggle. As of Phase 6 the legacy mount points in `viewer/` are
* gone — every kind dispatches through the registry.
*/
export const builtinPlugin: Plugin = {
id: 'pascal:core',
apiVersion: 1,
nodes: [
// Stage E-complete (full registry path)
shelfDefinition as unknown as AnyNodeDefinition,
spawnDefinition as unknown as AnyNodeDefinition,
wallDefinition as unknown as AnyNodeDefinition,
fenceDefinition as unknown as AnyNodeDefinition,
slabDefinition as unknown as AnyNodeDefinition,
ceilingDefinition as unknown as AnyNodeDefinition,
doorDefinition as unknown as AnyNodeDefinition,
windowDefinition as unknown as AnyNodeDefinition,
cabinetDefinition as unknown as AnyNodeDefinition,
cabinetModuleDefinition as unknown as AnyNodeDefinition,
itemDefinition as unknown as AnyNodeDefinition,
// Stage A — wrap-exports the legacy renderer + system. Legacy
// panels / move tools / floorplan branches still serve these.
columnDefinition as unknown as AnyNodeDefinition,
elevatorDefinition as unknown as AnyNodeDefinition,
roofDefinition as unknown as AnyNodeDefinition,
roofSegmentDefinition as unknown as AnyNodeDefinition,
stairDefinition as unknown as AnyNodeDefinition,
stairSegmentDefinition as unknown as AnyNodeDefinition,
zoneDefinition as unknown as AnyNodeDefinition,
siteDefinition as unknown as AnyNodeDefinition,
buildingDefinition as unknown as AnyNodeDefinition,
levelDefinition as unknown as AnyNodeDefinition,
guideDefinition as unknown as AnyNodeDefinition,
scanDefinition as unknown as AnyNodeDefinition,
measurementDefinition as unknown as AnyNodeDefinition,
constructionDimensionDefinition as unknown as AnyNodeDefinition,
drawingSheetDefinition as unknown as AnyNodeDefinition,
structuralGridDefinition as unknown as AnyNodeDefinition,
// Roof-mounted accessories (custom renderer + bespoke roof-event tool).
boxVentDefinition as unknown as AnyNodeDefinition,
ridgeVentDefinition as unknown as AnyNodeDefinition,
turbineVentDefinition as unknown as AnyNodeDefinition,
cupolaDefinition as unknown as AnyNodeDefinition,
eyebrowVentDefinition as unknown as AnyNodeDefinition,
chimneyDefinition as unknown as AnyNodeDefinition,
solarPanelDefinition as unknown as AnyNodeDefinition,
skylightDefinition as unknown as AnyNodeDefinition,
dormerDefinition as unknown as AnyNodeDefinition,
gutterDefinition as unknown as AnyNodeDefinition,
downspoutDefinition as unknown as AnyNodeDefinition,
// HVAC — Phase 1: round duct segment polyline. Phase 2: fittings + ports.
ductSegmentDefinition as unknown as AnyNodeDefinition,
ductFittingDefinition as unknown as AnyNodeDefinition,
ductTerminalDefinition as unknown as AnyNodeDefinition,
hvacEquipmentDefinition as unknown as AnyNodeDefinition,
linesetDefinition as unknown as AnyNodeDefinition,
liquidLineDefinition as unknown as AnyNodeDefinition,
// DWV plumbing — Phase 2 of the research doc's plan.
pipeSegmentDefinition as unknown as AnyNodeDefinition,
pipeFittingDefinition as unknown as AnyNodeDefinition,
pipeTrapDefinition as unknown as AnyNodeDefinition,
],
}
export { boxVentDefinition } from './box-vent'
export { buildingDefinition } from './building'
export {
bakeCabinetAnimationClip,
type CabinetPlacementType,
cabinetDefinition,
cabinetModuleDefinition,
poseCabinetMovingParts,
useCabinetPlacementStatus,
useCabinetPlacementType,
} from './cabinet'
export { ceilingDefinition } from './ceiling'
export { chimneyDefinition } from './chimney'
export { columnDefinition } from './column'
export { constructionDimensionDefinition } from './construction-dimension'
export { cupolaDefinition } from './cupola'
export { doorDefinition } from './door'
export { dormerDefinition } from './dormer'
export { downspoutDefinition } from './downspout'
export { drawingSheetDefinition } from './drawing-sheet'
export { ductFittingDefinition } from './duct-fitting'
export { ductSegmentDefinition } from './duct-segment'
export { ductTerminalDefinition } from './duct-terminal'
export { elevatorDefinition } from './elevator'
export { eyebrowVentDefinition } from './eyebrow-vent'
export { fenceDefinition } from './fence'
export { guideDefinition } from './guide'
export { gutterDefinition } from './gutter'
export { hvacEquipmentDefinition } from './hvac-equipment'
export { itemDefinition } from './item'
export { levelDefinition } from './level'
export { linesetDefinition } from './lineset'
export { liquidLineDefinition, useLiquidLineToolOptions } from './liquid-line'
export { measurementDefinition } from './measurement'
export { pipeFittingDefinition } from './pipe-fitting'
export { pipeSegmentDefinition } from './pipe-segment'
export { pipeTrapDefinition } from './pipe-trap'
export { ridgeVentDefinition } from './ridge-vent'
export { roofDefinition } from './roof'
export { roofSegmentDefinition } from './roof-segment'
export { scanDefinition } from './scan'
export {
type BuildClearanceAdvisoriesOptions,
buildClearanceAdvisories,
type ClearanceAdvisory,
type ClearanceAdvisoryCategory,
type ClearanceAdvisorySeverity,
type ClearanceEvidence,
type ClearanceProfile,
type ClearanceRule,
type ClearanceRuleSource,
DEFAULT_CLEARANCE_PROFILES,
} from './shared/clearance-advisories'
export {
type BuildConstructionModuleAdvisoriesOptions,
buildConstructionModuleAdvisories,
type ConstructionModuleAdvisory,
type ConstructionModuleAdvisorySeverity,
type ConstructionModuleMeasurementKind,
type ConstructionModuleProfile,
type ConstructionModuleSystem,
DEFAULT_CONSTRUCTION_MODULE_PROFILES,
} from './shared/construction-module-advisories'
export {
type BuildDimensionCompletenessAuditOptions,
buildDimensionCompletenessAudit,
type DimensionCompletenessIssue,
type DimensionCompletenessIssueKind,
type DimensionCompletenessIssueSeverity,
} from './shared/dimension-completeness-audit'
export { shelfDefinition } from './shelf'
export { siteDefinition } from './site'
export { skylightDefinition } from './skylight'
export { slabDefinition } from './slab'
export { solarPanelDefinition } from './solar-panel'
export { spawnDefinition } from './spawn'
export { stairDefinition } from './stair'
export { stairSegmentDefinition } from './stair-segment'
export { structuralGridDefinition } from './structural-grid'
export { turbineVentDefinition } from './turbine-vent'
export { wallDefinition } from './wall'
export { windowDefinition } from './window'
export { zoneDefinition } from './zone'