Files
autocad-mcp-pro/engineering/arch/__init__.py
T
Umut CANandClaude Opus 5.5 b68fe7ef66 feat(arch): door and window symbols, straight/L/U stairs and the Blondel check
openings.py draws what stands in the gap the wall engine cuts, from the same
numbers - the wall axis, its face offsets and model.segment_of - so the symbol
cannot drift off its gap. A door is drawn open at 90 degrees: its leaf as long
as the opening is wide, square to the wall from the hinge on the swing-side
face, and a quarter arc from the closed position to the open one. swing=in is
the left of the axis (the inside of a CCW perimeter); hand names the hinge jamb
seen from the swing side facing the wall. All four swing/hand pairs are tested
against hand-computed hinges and arc angles. A window is a frame line on each
face and two glazing lines at the thirds of the thickness.

stairs.py draws every riser once as a line across its flight, the outline, a
walking line up the middle with an open arrow at the top, and the language's
'up' word on the first tread at 2.5 mm times the plot scale. An L or a U turns
on a square landing; its first flight carries (risers + 1) // 2 risers. The
riser count and every dimension are refused by name before any geometry.

blondel() reports 2R + G against 600-650 mm - the step-length rule attributed
to Francois Blondel (1675), reported as a design rule and never as a building
code: no national stair regulation is checked.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FKFStjEFzpGyLq5bMpWxTd
2026-09-23 22:51:41 +03:00

101 lines
2.0 KiB
Python

"""Architectural 2D: the plan model and the engine that draws it (track F).
Merge rule for the three track-F branches: the re-exports below are additive
and alphabetical - keep every side's names.
"""
from __future__ import annotations
from .lang import LANGS, fmt_area_m2, fmt_number, tag_prefix, vocab
from .layers import ARCH_LAYER_DEFS, ARCH_LAYER_ROLES, ARCH_LAYERS, ARCH_ROLE_LAYER
from .materials import WALL_HATCH_TABLE, WALL_MATERIALS, wall_hatch
from .model import (
APP_ID,
KINDS,
Opening,
Room,
Stair,
Wall,
axis_segments,
decode,
encode,
from_payload,
opening_from_dict,
room_from_dict,
segment_of,
stair_from_dict,
to_payload,
to_values,
validate_openings,
wall_from_dict,
wall_length,
)
from .openings import opening_prims
from .stairs import (
ARROW_PAPER_MM,
BLONDEL_RANGE,
STAIR_KINDS,
TEXT_PAPER_MM,
TURNS,
blondel,
stair_prims,
)
from .walls import (
MIN_JOIN_ANGLE_DEG,
WallGeometry,
face_offsets,
room_segments,
wall_geometry,
wall_geometry_by_wall,
wall_segments,
)
__all__ = [
"APP_ID",
"ARCH_LAYERS",
"ARCH_LAYER_DEFS",
"ARCH_LAYER_ROLES",
"ARCH_ROLE_LAYER",
"ARROW_PAPER_MM",
"BLONDEL_RANGE",
"KINDS",
"LANGS",
"MIN_JOIN_ANGLE_DEG",
"Opening",
"Room",
"STAIR_KINDS",
"Stair",
"TEXT_PAPER_MM",
"TURNS",
"WALL_HATCH_TABLE",
"WALL_MATERIALS",
"Wall",
"WallGeometry",
"axis_segments",
"blondel",
"decode",
"encode",
"face_offsets",
"fmt_area_m2",
"fmt_number",
"from_payload",
"opening_from_dict",
"opening_prims",
"room_from_dict",
"room_segments",
"segment_of",
"stair_from_dict",
"stair_prims",
"tag_prefix",
"to_payload",
"to_values",
"validate_openings",
"vocab",
"wall_from_dict",
"wall_geometry",
"wall_geometry_by_wall",
"wall_hatch",
"wall_length",
"wall_segments",
]