This commit is contained in:
2026-09-09 17:35:23 +08:00
parent 2a98ae7556
commit 161af68fe3
1271 changed files with 58251 additions and 98639 deletions
@@ -0,0 +1,448 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Indexing Position Tables | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Indexing Position Tables | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../../index.html">
<img id="logo" class="svg" src="../../../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Anatomy-ControllerIndexingPositions">
<h1 id="indexing-position-tables">Indexing Position Tables</h1>
<p>Indexing Position Tables is the machine plane's single-brand leaf: the two global position lists a
Sinumerik control resolves coded-position words against, edited as drafts and saved whole. It lives
on the General Setup page at <code>/general-setup</code> under the Control-Tree id
<code>equipment/controller/machine/indexing-positions</code>, and of the five controller brands only Siemens
grows it. The tables it edits are machine data of the Siemens machine-data table; the assignment
that decides which axis reads which of them is shown here and edited on the sibling leaf,
<a class="xref" href="native-parameters.html">Parameters (Native)</a>.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p>Anatomy makes no claim that any id named here is stable across versions. The migration hop that
keeps an older <code>?tree=</code> value resolving is described in
<a class="xref" href="../../../platform/tree-ids-and-routes.html">Tree Ids and Routes</a>.</p>
</div>
<h2 id="the-one-single-brand-node">The One Single-Brand Node</h2>
<p>The branch builder pushes this leaf behind the <code>hasIndexingTables</code> snapshot flag, and that flag is a
<strong>pure type probe</strong>: it reports whether the runner's brand parameter table <em>is</em> the
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html">SiemensMachineDataTable</a>. Nothing about the tables' contents
is examined, so the node grows on every Siemens runner whether or not a single position has been
entered. Only the Siemens preset carries that table, which is why this leaf is the machine plane's
one single-brand row in the <a class="xref" href="../brand-matrix.html">Brand Matrix</a>; the program-data
plane beside it has several.</p>
<p>The flag and the panel's own read do not ask quite the same question. The flag inspects the <strong>first</strong>
brand parameter table in the resolved dependency list; the panel's reader looks for a Siemens
machine-data table <strong>anywhere</strong> in it. The two agree on every shipped preset, where the Siemens
machine-data table is the only parameter table present.</p>
<p>That table is also the sole implementer of
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.IIndexingPositionConfig.html">IIndexingPositionConfig</a> in the engine, so nothing else in a runner
can supply an indexing table and no other brand can grow this node by carrying a different type.</p>
<h2 id="what-the-two-tables-are">What the Two Tables Are</h2>
<p>The leaf edits <a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html#Hi_NcParsers_Dependencys_Siemens_SiemensMachineDataTable_IndexAxPosTab1">IndexAxPosTab1</a> and
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html#Hi_NcParsers_Dependencys_Siemens_SiemensMachineDataTable_IndexAxPosTab2">IndexAxPosTab2</a> — the general machine
data MD10910 and MD10930. They describe axes that take up discrete stations rather than arbitrary
positions: Hirth-coupled tables, indexing rotaries, turret-style workholders.</p>
<ul>
<li><strong>They are global, not per-axis.</strong> Each is one ordered list shared by every axis assigned to it, so
an edit to Table 1 changes every axis whose assignment reads 1.</li>
<li><strong>Row order is the position number, and numbering is 1-based.</strong> Row 1 is indexing position 1. The
used-length machine data beside each table — MD10900 and MD10920 — is not stored: the list count
<em>is</em> the used length, which is why the panel has no length field.</li>
<li><strong>Values are in the axis' own native units</strong> — degrees on a rotary axis, millimetres on a linear
one — and the panel prints no unit suffix on the cells, because the unit follows whichever axes
read the table.</li>
<li><strong>Values must be strictly ascending</strong>, and where a modular rotary axis reads the table they must
also satisfy <code>0 ≤ position &lt; 360</code>.</li>
<li><strong>At most 60 entries per table</strong>, the MD10910 / MD10930 array size. Finer station counts are what
the equidistant definition below exists for.</li>
</ul>
<h3 id="what-consumes-them">What consumes them</h3>
<p>The tables are read at the write stage of the parsing pipeline, through
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.IIndexingPositionConfig.html#Hi_NcParsers_Dependencys_IIndexingPositionConfig_TryGetIndexingPosition_">TryGetIndexingPosition</a><small>(API)</small>
and <a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.IIndexingPositionConfig.html#Hi_NcParsers_Dependencys_IIndexingPositionConfig_TryFindIndexingAnchor_">TryFindIndexingAnchor</a><small>(API)</small>,
for the Siemens coded-position coordinate functions <code>CAC()</code>, <code>CIC()</code>, <code>CDC()</code>, <code>CACP()</code> and <code>CACN()</code>
— the family whose argument is a position <strong>number</strong> rather than a coordinate. The Siemens
per-word coordinate syntax unwraps those verbs only on axes that
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.IIndexingPositionConfig.html#Hi_NcParsers_Dependencys_IIndexingPositionConfig_IsIndexingAxis_">IsIndexingAxis</a><small>(API)</small> reports
as usable, and the rotary-only members of the family additionally require a rotary axis; the rotary
words are then resolved by the ABC write pass and the linear words by the incremental-resolve pass,
both through the shared coded-position helper.</p>
<p><strong>An empty table is a real state with a visible consequence.</strong> An axis assigned to a table that holds
no entries is not a usable indexing axis, so its coded-position words are left unrecognised and
surface as unresolved text rather than being resolved against nothing. The engine lookups themselves
deliberately do not validate the Siemens constraints — a table that breaks them resolves nonsense
positions with no diagnostic — which is why the write endpoint, and this panel with it, is where the
rules are enforced.</p>
<h2 id="machine-data-not-program-data">Machine Data, Not Program Data</h2>
<p>The tables belong to the machine plane rather than the program-data plane: they configure the
machine's stations, not a part's setup, and they carry no per-workpiece meaning the way a work
coordinate or a datum shift does. That is the classification the branch builder gives the node, and
it is the reason the node sits beside Machine Limits and Rapid Feedrates rather than beside Work
Coordinates.</p>
<p><strong>Their storage half is a separate question, and the answer is the project.</strong> The Siemens preset
carries a <a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTableProxy.html">SiemensMachineDataTableProxy</a>, not a table: the
proxy holds a fixed machine-config seed, deep-clones it into the project's per-case list only when
the project has no Siemens machine-data table yet, and thereafter resolves the project's own table.
Three consequences follow, and they are the ones the plane's other project-owned leaves live with —
Machine Limits, Rapid Feedrates, Home / G28 Reference, M-Code Declarations and Parameters (Native),
all rows of the same per-case table. The plane's runner-owned leaves get the opposite of all three,
and which half a leaf falls in is listed on
<a class="xref" href="index.html">Machine and Controller Plane</a>:</p>
<ul>
<li>Edited positions are stored on the <strong>project</strong>, serialized with the per-case table as one XML
element per entry carrying its table number and its value.</li>
<li>Installing another Siemens runner, or re-applying the Siemens brand, leaves them alone: the
incoming proxy re-binds to the project's table instead of cloning its seed over it.</li>
<li>Saving a controller file captures the <strong>seed</strong>, not the edited table. A <code>.Controller</code> written after
the tables were filled in carries the preset seed they were cloned from.</li>
</ul>
<p>Switching to any other brand removes the Siemens machine-data table from the project, because no
proxy of the incoming runner resolves it, and the positions go with it. Switching back clones a fresh
table from the seed rather than restoring the removed one — see
<a class="xref" href="brand-switch.html">Brand Switch</a>.</p>
<h2 id="the-assignment-is-shown-here-and-edited-elsewhere">The Assignment Is Shown Here and Edited Elsewhere</h2>
<p>Above the two drafts the panel renders one display-only table: <strong>Axis</strong> against <strong>Indexing assignment
(MD30500)</strong>, the per-axis machine datum that decides what an axis does with the two global lists.
Four values are named:</p>
<table>
<thead>
<tr>
<th>Assignment</th>
<th>Label the user reads</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td><em>Not an indexing axis</em></td>
<td>the axis ignores the coded-position family</td>
</tr>
<tr>
<td>1</td>
<td><em>Table 1 (MD10910)</em></td>
<td>the axis reads the first draft below</td>
</tr>
<tr>
<td>2</td>
<td><em>Table 2 (MD10930)</em></td>
<td>the axis reads the second draft below</td>
</tr>
<tr>
<td>3</td>
<td><em>Equidistant (MD30501–MD30503)</em></td>
<td>positions come from a spacing rule, not from either table</td>
</tr>
</tbody>
</table>
<p>Any other stored value renders as the bare number.</p>
<p><strong>The rows are the axes that carry an MD30500 entry, not the plane's usual axis set.</strong> Every other
per-axis leaf reads the table's axis-type rows — the set a machine-tool install stamps the chain's
axis codes into — while this one reads the keys of the assignment row itself, sorted by axis name. An
axis of the machine with no assignment entry does not appear here at all, and an assignment entry
written against a name the machine does not have does.</p>
<p>An axis the table reports as modular rotary carries the note <em>(wraps 0–360°)</em> beside its name, and
its presence is what turns on the one-revolution rule for whichever table it reads. That report is
the machine-axis contract's default —
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.IMachineAxisConfig.html#Hi_NcParsers_Dependencys_IMachineAxisConfig_IsModularRotary_">IsModularRotary</a><small>(API)</small> is not
overridden by any parameter table — so on this branch every rotary and every spindle-mode axis counts
as modular.</p>
<p><strong>Nothing on this leaf writes an assignment.</strong> The panel renders the value as plain text, and the
leaf's REST surface exposes a reader for the two tables with their per-axis assignments and a writer
for one position table; no endpoint of its own writes an assignment. MD30500 is written where every
other raw machine datum is written: on
<a class="xref" href="native-parameters.html">Parameters (Native)</a>, as a row of the <strong>Axis parameters
(integer)</strong> section, added through the <em>Section</em> / <em>Parameter id</em> / <em>Axis</em> / <em>Value (raw)</em> footer with
the section set to <strong>Axis (integer)</strong>. With no assignment row anywhere on the table this panel says
so and points there: <em>&quot;No axis declares an indexing assignment (MD30500) yet — add it as a per-axis
integer parameter in Parameters (Native).&quot;</em></p>
<p>The equidistant definition is edited entirely on that same sibling leaf and has <strong>no</strong> surface here.
Its three machine data — the numerator MD30501, the denominator MD30502 and the offset MD30503 —
are ordinary parameter rows, and an axis on assignment 3 consults neither of the two tables this
panel edits. On a modular rotary axis the numerator is ignored and the revolution is divided into
MD30502 positions; elsewhere the spacing is the numerator over the denominator and the position count
is unbounded.</p>
<h2 id="draft-validate-save-whole">Draft, Validate, Save Whole</h2>
<p>This is the branch's one draft-then-save table, and it departs from the shared commit rule that
<a class="xref" href="../editing-contract.html">Editing Contract</a> sets for its siblings. Every other table
in the branch commits per cell and rolls a failed write back; this one commits nothing until a button
is pressed, and keeps a failed edit on screen.</p>
<ul>
<li><strong>Cells bind straight into the draft.</strong> Each numeric cell is bound with a two-way model and carries
no commit handler, so a cell's commit — which the widget runs on blur and on Enter, never on a
keystroke — lands in the draft row and goes no further. The badge, the validation line and the two
buttons therefore follow those commits rather than the typing. The field itself still refuses text
it cannot parse, with an untranslated message under the box; it carries no minimum and no maximum
here, so every rule below is the draft validator's — see
<a class="xref" href="../../../widget/numeric-input.html">Numeric Input</a>.</li>
<li><strong>Add and delete are draft operations too.</strong> <em>Add Position</em> appends an empty row and is disabled at
60; the row's delete button removes it from the draft with no confirmation and no request.</li>
<li><strong>An orange <em>unsaved</em> badge</strong> appears beside a table's title while the draft differs from what was
last saved, compared row count first and then value by value.</li>
<li><strong>Save Table sends the whole list</strong> for that one table and is disabled while the draft is clean or
while validation fails. <em>Revert</em> restores the draft from the last saved values.</li>
<li><strong>The validator mirrors the endpoint's own rules</strong> and reports the first violation as a line under
the table: the per-table maximum, a <em>fill in position … (or delete its row)</em> line naming an empty
or non-finite cell, a strictly-ascending check naming both offending positions with their values,
and the <code>0 ≤ position &lt; 360</code> range when a modular rotary axis reads that table.</li>
<li><strong>A failed save does not roll the draft back.</strong> The draft stays dirty and the badge stays up, so
the work is not lost — the opposite of every other panel in the branch.</li>
<li><strong>Saving an empty table clears it.</strong> The endpoint accepts an empty list, and the axes assigned to
that table then stop being indexing axes.</li>
</ul>
<p>The endpoint enforces the same four rules independently, so the panel's validation is live feedback
rather than the gate. A save that passes is applied to the live table and the panel does not re-read:
it marks the draft saved from what it sent.</p>
<h2 id="what-a-freshly-switched-siemens-runner-shows">What a Freshly Switched Siemens Runner Shows</h2>
<p><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html#Hi_NcParsers_Dependencys_Siemens_SiemensMachineDataTable_Default3Axis">Default3Axis</a> — the seed the Siemens
proxy clones — declares a linear X, Y and Z, a reference position and a velocity for each, a maximum
spindle speed and six note-only OEM M-codes. It declares <strong>no</strong> MD30500 assignment and <strong>no</strong> entry
in either position table. So a project that has just been switched to Siemens grows this node,
opens it successfully, and finds it completely empty: the assignment caption in place of the axis
table, and two titled tables with headers, no rows and an <em>Add Position</em> button.</p>
<p>This leaf is also the only place the two lists appear. Parameters (Native) shows every row of the
machine-data table's three parameter dictionaries, and the two position tables are not in any of
them — they are separate list properties, so this panel is the whole editable surface for MD10910
and MD10930.</p>
<p>The panel opens through the branch's two-layer empty gate: the shared <em>&quot;No NC runner — load a
project first.&quot;</em> from the runner snapshot, then <em>&quot;No Siemens machine-data table on the active
runner.&quot;</em> from its own read. The second line is also what a failed read leaves on screen, since the
presence flag starts false and the failure path only raises a toast.</p>
<h2 id="layout">Layout</h2>
<ul>
<li><strong>General Setup</strong> Control Tree — the left dock of <code>/general-setup</code>
<ul>
<li><strong>Controller</strong> Node Row
<ul>
<li><strong>Machine / Controller</strong> Group Row
<ul>
<li><strong>Indexing Position Tables</strong> Node Row — <code>equipment/controller/machine/indexing-positions</code>,
between <strong>Subprogram Folders</strong> and <strong>Parameters (Native)</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Editor Row — the panel of the selected node
<ul>
<li><strong>Indexing Position Tables</strong> Panel — one column, gutter-spaced
<ul>
<li>Description Caption — <em>&quot;Global indexing position tables for coded-position programming
(<code>CAC/CIC/CDC/CACP/CACN</code>). Row order is position-number order — row 1 is indexing position 1.
Values are in the axis' native units (degrees for rotary, mm for linear) and must be strictly
ascending. Which axis reads which table is MD30500, edited in Parameters (Native); an axis
whose table is empty is not an indexing axis (its coded-position words stay unresolved).&quot;</em></li>
<li>Assignment Table — dense, flat, bordered; display-only
<ul>
<li>Header Row — <strong>Axis</strong>, <strong>Indexing assignment (MD30500)</strong></li>
<li>Data Row — the axis name in bold, with <em>(wraps 0–360°)</em> beside it on a modular rotary axis,
then the assignment's label</li>
<li>No-Assignment Caption — replaces the table when no axis carries an assignment</li>
</ul>
</li>
<li>Position Table Block — one per table, twice
<ul>
<li>Title Row — <strong>Table 1 (MD10910)</strong> or <strong>Table 2 (MD10930)</strong>, then either <em>used by</em> and the
names of the axes assigned to it or <em>not used by any axis</em>, then an orange <strong>unsaved</strong> badge
while the draft is dirty</li>
<li>Table — dense, flat, bordered
<ul>
<li>Header Row — <strong>Position #</strong>, <strong>Value</strong>, and an unlabelled action column</li>
<li>Data Row — the 1-based position number in bold, the numeric cell, and a delete button that
removes the row from the draft</li>
</ul>
</li>
<li>Validation Line — the first rule the draft breaks, in the negative colour</li>
<li>Button Row — <strong>Add Position</strong> (disabled at 60 rows), then <strong>Revert</strong> and <strong>Save Table</strong>, both
disabled while the draft is clean and <strong>Save Table</strong> also while validation fails</li>
</ul>
</li>
<li>No-Table Body — replaces everything above: <em>&quot;No Siemens machine-data table on the active
runner.&quot;</em></li>
<li>Shared Empty State — replaces the whole body while the snapshot reports no runner: <em>&quot;No NC
runner — load a project first.&quot;</em></li>
</ul>
</li>
<li>Toast — negative, three seconds, the panel's context followed by the server's own message</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a class="xref" href="../../../index.html">HiNC App Anatomy</a> for git repository links.</p>
<h3 id="web-application">Web Application</h3>
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
<ul>
<li><code>wwwroot-src/src/components/controlTree/SoftNcIndexingPositionsPanel.vue</code> — this panel: the draft
model over the two tables, the dirty comparison behind the badge, the validator that mirrors the
endpoint's rules, the display-only assignment table with its four labels and its wrap note, and the
save that marks the draft clean without re-reading.</li>
<li><code>wwwroot-src/src/components/controlTree/softNcItemTypes.ts</code> — the node's id, label and label key,
and the snapshot flag it is pushed behind, between the subprogram and native leaves.</li>
<li><code>wwwroot-src/src/api/softNcRunner.ts</code> — the reader that parses the two tables and the axis rows,
the whole-table replace and its documented refusals, and the snapshot flag the builder gates on.</li>
<li><code>wwwroot-src/src/composables/useSoftNcRunner.ts</code> — the shared runner snapshot the first empty layer
reads.</li>
<li><code>wwwroot-src/src/components/widgets/NumericInput.vue</code> — the cell: the two-way binding this panel
uses in place of a commit handler, the blur-and-Enter moment that binding emits on, the
empty-to-null parse the validator then reports, and the untranslated parse message.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcEmptyState.vue</code> — the shared no-runner line.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcNativeParamsPanel.vue</code> — the sibling panel that owns
the assignment: the integer per-axis section and the footer that adds a row by id and axis.</li>
<li><code>wwwroot-src/src/i18n/en/softNc.ts</code> — the node label, the description caption, the four assignment
labels, the wrap note, the table titles, the used-by captions, the four validation messages and the
absent-table line quoted above.</li>
<li><code>wwwroot-src/src/i18n/en/common.ts</code> — the shared <strong>Axis</strong> and <strong>Value</strong> column headers.</li>
<li><code>Mech/SoftNcRunnerController.cs</code> — the REST surface: the read that pairs the two tables with the
per-axis assignments and reports presence from the Siemens table alone, the whole-table replace
with its capacity, finite, ascending and one-revolution checks, the integer per-axis parameter
write the assignment is edited through, and the brand switch whose sweep removes the table on
leaving Siemens.</li>
</ul>
<h3 id="hiapi-engine">HiAPI Engine</h3>
<ul>
<li><code>HiMech/NcParsers/Dependencys/IIndexingPositionConfig.cs</code> — the contract: 1-based position
numbering, the native-unit and frame rules, the position count, the cyclic test, the number-to-
coordinate lookup and the anchor search, and the rule that an axis whose table is empty is not a
usable indexing axis.</li>
<li><code>HiMech/NcParsers/Dependencys/Siemens/SiemensMachineDataTable.cs</code> — the two position lists, their
XML round-trip and the statement that the lookups do not validate the Siemens constraints, the
MD30500 assignment dictionary, the equidistant spacing resolution over MD30501–MD30503, the five
contract implementations, and the default seed that declares none of them.</li>
<li><code>HiMech/NcParsers/Dependencys/Siemens/SiemensMachineDataTableProxy.cs</code> — the get-or-create proxy:
the seed serialized on the runner, the deep clone installed only into a project that has no table,
and the deliberate refusal to implement the machine-config interfaces itself.</li>
<li><code>HiMech/NcParsers/Dependencys/IMachineAxisConfig.cs</code> — the axis contract, and the modular-rotary
default that makes every rotary and spindle axis subject to the one-revolution rule.</li>
<li><code>HiMech/NcParsers/SoftNcRunner.cs</code> — the Siemens preset that carries the machine-data proxy, and
the proxy resolution every read on this leaf goes through.</li>
<li><code>HiMech/NcParsers/Syntaxs/SiemensSyntaxUtil.cs</code> — the syntax list that wires the coded-position
producer and its two write-stage consumers into the Siemens pipeline.</li>
<li><code>HiMech/NcParsers/EvaluationSyntaxs/Siemens/SiemensAcIcSyntax.cs</code> — the producer: it unwraps the
five coded verbs only on usable indexing axes and stamps the per-word override, leaving the word
untouched elsewhere.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/CodedPositionUtil.cs</code> — the shared resolution: position number to
coordinate, the hold-on-failure semantics, and the diagnostics for an invalid number or a table
that has gone missing between stages.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/McAbcSyntax.cs</code>,
<code>HiMech/NcParsers/LogicSyntaxs/IncrementalResolveSyntax.cs</code> — the two write-stage consumers, rotary
words and linear words.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/McAbcCyclicPathSyntax.cs</code> — the tail pass that turns the resolved
directional approach into a path, and the one other syntax pass that reads the modular-rotary flag
directly.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="index.html">Machine and Controller Plane</a> — the plane this leaf sits on, and which half of the project each
of its neighbours is stored in</li>
<li><a class="xref" href="../brand-matrix.html">Brand Matrix</a> — the gate behind this node, why it is the machine plane's
only single-brand row, and what every other flag probes</li>
<li><a class="xref" href="../editing-contract.html">Editing Contract</a> — the per-cell commit rule the rest of the branch follows
and this panel deliberately breaks</li>
<li><a class="xref" href="native-parameters.html">Native Parameters</a> — where the MD30500 assignment and the equidistant
machine data this leaf only displays are actually edited</li>
</ul>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>