Chapter 23 / 第23章：DXF normal following / 法线跟随

This combined learning package includes all Chapter 22 G81/G82/G83/G196 files
and adds a SEPARATE Normal Following page. Start from a COPY of the application
runtime. Close it, back up and merge package/env and package/extScripts, then
restart. Do not replace another project's custom changes without merging.
Enable DXF with #929.item[12]=1 in the macro-parameter window.

Keep G196/O9196 and #6013..#6015 allocations. #6020..#6022 must be available;
change all script/UI references together if already assigned. Initialization
is INLINE in dxfpage; dxf-normal/init and dxf-custom/init are reference copies,
not additional scripts to schedule. The postprocessor includes Chapter 22's
G196 branch and the existing contour normal-following branch unchanged.

Switching between Drilling / Bore Milling and Normal Following clears the
current drawing and unsaved code. Reimport on the destination page. Each page
retains its own default process settings. Save important code before switching.

Normal example: import examples/normal-contours.dxf; Safe Z=10, Cut Z=-2,
Feed=300, End adjustment=0 (read-only); check both contours; Generate Normal
Code; Save/Load. C=tangent angle-90 degrees; use matching mechanical zero,
direction and rotary-axis mapping. Millimetres, G54/XY/G90, surface Z0.
The generated program has one cutting level and no tool change/spindle start
or G43. Arrange the tool/process accordingly. Clearance and process values
must suit the actual machine and fixtures. Save/Load does not start machining.
The retained G196 example requires its pilot-hole and D/I/Q conditions from
Chapter 22. See the accompanying chapter for complete explanations.

中文：将package内文件合并到已关闭的软件学习副本中，重启后启用DXF。
保留第22章G196/O9196、#6013至#6015分配，核对新参数#6020至#6022无冲突。
现有定制需逐项合并；不要用旧版后处理覆盖包含G196的版本。
切页清空图形和未保存程序，各页工艺默认值分别保留，切回后重新导入。
法线示例以工件表面Z0、毫米、G54、XY平面、绝对坐标生成一层轮廓。
C=切向角-90度；需配套实际C轴零位、正向与映射。末端修正固定0。
本例不自动安排换刀、主轴启动与G43；应按机台和工艺准备工具及坐标。
第22章的G196仍需满足底孔、刀具与D/I/Q约定。保存载入不自动启动加工。

Reader chapters: 23-dxf-normal-follow.md / .en.md / .html / .en.html.
Files under package are configuration files, not a complete runtime.
Do not run generated NC as a machine commissioning procedure.
