- 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
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 byuv run --frozen python scripts/build_templates.py, which runsdrawing_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 --checkrebuilds into a temporary folder and fails if any committed DXF differs (the save-time stamps$TDCREATE,$TDUPDATE,$FINGERPRINTGUID,$VERSIONGUIDand the twoEZDXF_METAentries are masked; everything else must be byte-identical).tests/test_templates.pyruns the same check.<name>.dwt— the live twin, used bydrawing_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 byuv run --frozen python scripts/smoke_settings_com.py --build-dwt(Task 25's smoke): it opens each DXF over COM and callsdrawing_template_save(…dwt)(SaveAs(path, ac2018_Template)), then the files are committed once. While a.dwtis missing,resolve_templatefalls back to the DXF and reportssource: "bundled_dxf";drawing_template_listshowsfiles.dwt.present. The live engine does not open that DXF blank:Documents.Addaccepts only a genuine DWT (measured on AutoCAD 2026), so the COMdrawing_newconverts the DXF throughSaveAs(…, ac2018_Template)once, caches the result under the temp folder keyed on path, size and mtime, and reportstemplate_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.