Files
Umut CANandClaude Opus 5.5 7e7fe11a71 fix(arch, table): what the 1.6.0 README renders showed
- The exterior dimension chains follow the plot scale. DIMSCALE is the
  plan's scale while they are drawn and is put back afterwards; a 1:50
  chain's 2.5 text had been 2.5 drawing units, 0.05 mm on the sheet.
- A headless TABLE merges its title row, as AutoCAD's TABLE does; a long
  title no longer wraps inside the first column over the header row.
- A headless TABLE's cell margin scales with the lettering. A flat 1.0 was
  0.02 mm on a 1:50 schedule; tables at the default 2.5 text are unchanged.
- drawing_new writes the Standard text style in arial.ttf, as AutoCAD
  2026's acadiso.dwt ships it: txt has no superscript two, so 'm²' read
  'm?' live and rendered as a box headlessly. The five bundled templates
  are rebuilt and build_templates --check reproduces them.

Each fix has a test that fails on the old code.

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

Bundled drawing templates

Five templates, built by the server's own tools — never hand-edited — and listed by drawing_template_list. Start from one with drawing_new(template="iso_a3_mech").

name standard sheet layer set styles page setup
iso_a3_mech ISO A3 landscape, ISO 5457 frame + ISO 7200 title block mech ISO-25 / ISOCP ISO_A3, monochrome.ctb, 1:1
iso_a1_arch ISO A1 landscape iso13567 ISO-25 / ISOCP, annotation scale 1:50 ISO_A1, monochrome.ctb, fit
iso_a3_pid ISO A3 landscape, ISO 5457 frame + title block pid ISO-25 / ISOCP ISO_A3, monochrome.ctb, 1:1
ansi_b_mech ANSI (metric) ANSI B landscape mech ANSI / ROMANS ANSI_B, monochrome.ctb, 1:1
ansi_d_arch ANSI (metric) ANSI D landscape iso13567 ANSI / ROMANS ANSI_D, monochrome.ctb, fit

The two files per template

  • <name>.dxf — the headless twin. Produced by uv run --frozen python scripts/build_templates.py, which runs drawing_new → apply_layer_set → styles → drawing_settings → layout rename → titleblock_apply_iso_a3 (A3 sheets) → page_setup_apply → drawing_save_as. scripts/build_templates.py --check rebuilds into a temporary folder and fails if any committed DXF differs (the save-time stamps $TDCREATE, $TDUPDATE, $FINGERPRINTGUID, $VERSIONGUID and the two EZDXF_META entries are masked; everything else must be byte-identical). tests/test_templates.py runs the same check.
  • <name>.dwt — the live twin, used by drawing_new(template=…) on the COM backend. AutoCAD's DWT is a DWG container, which no headless library writes, so these are produced on the live machine by uv run --frozen python scripts/smoke_settings_com.py --build-dwt (Task 25's smoke): it opens each DXF over COM and calls drawing_template_save(…dwt) (SaveAs(path, ac2018_Template)), then the files are committed once. While a .dwt is missing, resolve_template falls back to the DXF and reports source: "bundled_dxf"; drawing_template_list shows files.dwt.present. The live engine does not open that DXF blank: Documents.Add accepts only a genuine DWT (measured on AutoCAD 2026), so the COM drawing_new converts the DXF through SaveAs(…, ac2018_Template) once, caches the result under the temp folder keyed on path, size and mtime, and reports template_dwt: {path, cached}.

Line endings: ezdxf writes CRLF and .gitattributes pins templates/*.dxf to CRLF so a checkout on any platform equals a fresh build.

Rebuild after changing anything the build depends on (layer sets, the title block, the dimension presets, the settings facade) and commit the result together with the change — the reproducibility test is the gate.

The .dwt twins were built on 2026-09-22 on AutoCAD 2026 by scripts/smoke_settings_com.py --build-dwt — each DXF opened over COM and saved as a template (AcSaveAsType 66, ac2018_Template). Rebuild them the same way after changing a DXF; scripts/build_templates.py --check gates the DXF side only.