This repository has been archived on 2026-10-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
HiNC-2025-win-desktop-Deploy/App/wwwroot/HiAPI-docsite/anatomy/general-setup/controller/program-data/datum-tables.html
T
2026-09-12 18:16:27 +08:00

462 lines
30 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Datum Tables | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Datum 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-ControllerDatumTables">
<h1 id="datum-tables">Datum Tables</h1>
<p>Datum Tables is the pair of Heidenhain per-case ledgers the Controller branch grows together: the
preset rows a <code>CYCL DEF 247</code> cycle selects, and the datum shift rows a <code>CYCL DEF 7</code> cycle adds on top
of the selected preset. Both live on the General Setup page at <code>/general-setup</code> under the
Control-Tree ids <code>equipment/controller/program-data/datum-presets</code> and
<code>equipment/controller/program-data/datum-shifts</code> — reached as
<code>?tree=equipment/controller/program-data/datum-presets</code> and
<code>?tree=equipment/controller/program-data/datum-shifts</code> — and the tree labels them
<strong>Datum Presets (Q339)</strong> and <strong>Datum Shifts (D)</strong>. One snapshot flag grows the pair, one component
serves both nodes, and one of the two tables is also the object the Work Coordinates leaf edits.</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="two-nodes-one-component">Two Nodes, One Component</h2>
<p>The branch builder pushes both nodes inside a single test on the snapshot's datum flag, so the two
rows appear and disappear as a pair and never one without the other. That flag probes
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTable.html">HeidenhainDatumTable</a> over the runner's proxy-resolved dependency
list, and only the Heidenhain preset carries it — which brand grows which leaf is
<a class="xref" href="../brand-matrix.html">Brand Matrix</a>.</p>
<p>Both nodes carry the same item type, so the editor row mounts the same component for either
selection. The component takes its role from the last segment of the node id it is given: an id
ending in <code>datum-shifts</code> makes it the shift editor, and <strong>anything else</strong> makes it the preset editor.
The test is a suffix match with a preset default rather than an equality check over two known ids, so
the preset role is what an unrecognised id falls to.</p>
<p>Four things follow from that role, and nothing else in the panel differs between the two nodes.</p>
<table>
<thead>
<tr>
<th>Decided by the role</th>
<th>Datum Presets (Q339)</th>
<th>Datum Shifts (D)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Which array of the one read is rendered</td>
<td>the preset rows</td>
<td>the shift rows</td>
</tr>
<tr>
<td>The index column's header</td>
<td><code>Q339</code></td>
<td><code>D</code></td>
</tr>
<tr>
<td>The description caption above the table</td>
<td><em>&quot;Datum presets (CYCL DEF 247, Q339 = row). Rows 1–6 double as G54–G59.&quot;</em></td>
<td><em>&quot;Datum shifts (CYCL DEF 7).&quot;</em></td>
</tr>
<tr>
<td>The route segment its writes address</td>
<td><code>preset</code></td>
<td><code>shift</code></td>
</tr>
</tbody>
</table>
<p><strong>One request serves both nodes.</strong> The read returns a presence flag together with <em>both</em> arrays, and
the panel keeps one and discards the other. Selecting the sibling node changes the node id, which
changes the editor row's remount key, so the component remounts and re-fetches the same payload for
the other half. Reading the pair therefore costs two identical requests, and neither node can show a
value the other's request had already returned.</p>
<p>The <code>preset</code> and <code>shift</code> segments are the only two the panel ever sends; the endpoint's rejection of
a third is one of the departures recorded in
<a class="xref" href="../editing-contract.html">Editing Contract</a>.</p>
<h2 id="what-each-table-holds">What Each Table Holds</h2>
<p>Both tables are the same shape — an integer row number against an X / Y / Z translation — and both
are seeded with rows 1 through 20 at zero when the table is constructed. What separates them is which
klartext cycle reads which, and how the value is applied.</p>
<ul>
<li><strong>Datum Presets (Q339)</strong> is the preset store. <code>CYCL DEF 247 DATUM SETTING</code> with <code>Q339=N</code> selects
row <em>N</em>, and its translation becomes the block's active coordinate offset. The same parser claims
the DIN/ISO spelling <code>G247 Q339=+N</code> and stamps the identical cycle record, so both dialects reach
one store.</li>
<li><strong>Datum Shifts (D)</strong> is the shift store. <code>CYCL DEF 7</code> with a <code>#N</code> row index reads row <em>N</em>, and the
translation composes <strong>on top of</strong> the active preset rather than replacing it — the two land in
separate entries of the block's transform chain. <code>CYCL DEF 7</code> written with direct X / Y / Z values
instead of a <code>#</code> index reads no table row at all.</li>
</ul>
<p>The two stores sit on one dependency and are two dictionaries of it, which is why one flag grows two
nodes and one request answers for both.</p>
<p><strong>Neither store is a parameter table.</strong> <a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTable.html">HeidenhainDatumTable</a> does not
derive from the controller parameter base every brand's machine settings hang off, and the Heidenhain
preset carries it as an entry of its own beside the machine-parameter entry. So no datum row has a
native parameter number, and none of these values appears in
<a class="xref" href="../machine/native-parameters.html">Native Parameters</a> — unlike the Fanuc and Syntec work
coordinates, which are parameter addresses and do.</p>
<h3 id="where-the-table-is-stored">Where the table is stored</h3>
<p>The Heidenhain preset does not carry a datum table. It carries
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTableProxy.html">HeidenhainDatumTableProxy</a>, a get-or-create placeholder that installs
a bare new table into the project's per-case list when that list holds none of the type, and resolves
to the project's own table when it does. The proxy holds no seed and serializes as an empty element,
so a controller file saved from the branch root carries none of these values, and installing a
Heidenhain runner file over a Heidenhain project leaves the rows already edited exactly where they
are. The plane's storage model in full is <a class="xref" href="index.html">Program Data Plane</a>.</p>
<h2 id="the-columns-and-the-axis-set">The Columns and the Axis Set</h2>
<p>Each leaf renders one dense markup table: the row-number column, three value columns, and an
unlabelled action column.</p>
<ul>
<li>The row-number cell is bold plain text and cannot be edited. Its header is the role's literal —
<code>Q339</code> or <code>D</code>.</li>
<li>The three value headers read <code>X (mm)</code>, <code>Y (mm)</code> and <code>Z (mm)</code>. Those three and the index literal
beside them are hard-coded rather than translated, so they read the same under any locale, while
the description caption, both empty bodies and the action button's tooltip are translated.</li>
<li>The action column has no header text and holds one button per row.</li>
</ul>
<p><strong>The axis set is fixed at three and does not follow the machine.</strong> A datum row is a three-component
translation on both sides of the wire, so the columns are X, Y and Z whatever the machining chain
declares — a fourth or rotary axis has no column here and no stored datum component. That is the
opposite of the branch's <a class="xref" href="../machine/per-axis-tables.html">Per-Axis Tables</a>, whose rows are the
chain's own axis names. The <code>mm</code> in the header is a label: nothing on the path from the stored
translation to the cell converts anything.</p>
<p>Rows are whatever the read returned, in row-number order. A table built by the proxy opens with
twenty rows of zeros in each node; a table deserialized from a project file carries the rows that
file holds.</p>
<h2 id="editing-a-row">Editing a Row</h2>
<p>Every value cell is the shared numeric field, so it commits on blur or on Enter and never per
keystroke; its parsing, its bounds behaviour and the second commit that follows Enter are
<a class="xref" href="../../../widget/numeric-input.html">Numeric Input</a>. No cell here passes a minimum or a maximum, so a negative
offset is accepted and stored.</p>
<p><strong>The write is the whole row.</strong> A commit assigns the new number into the local row and then sends
that row's three components as they stand to the row's number; a failure restores the one component
the handler captured and raises the branch's standard toast, though the request carried all three.
That shape, the toast it ends in and what a failed write leaves behind are
<a class="xref" href="../editing-contract.html">Editing Contract</a>.</p>
<p>A cleared cell parses to null, and <code>Infinity</code> or <code>NaN</code> parse to a non-finite number; the handler
returns before the request in every one of those cases. Nothing is written and nothing is restored,
so the cell is left blank — or showing the literal <code>Infinity</code> — while the stored number stands
unchanged, until the panel is remounted by selecting another node and coming back.</p>
<p>The action button is labelled with the single character <code>0</code> and carries the tooltip <em>&ldquo;Reset to
zero&rdquo;</em>. It writes zeros into all three components of that row through a route of its own rather than
through the row setter, and it is not a delete: the row stays, at zero. It is also the one write on
these two leaves that is not optimistic — the request resolves first, and only then are the three
local cells set to zero. No confirmation guards it.</p>
<p>Neither leaf has an add control, a delete control, a draft or a save button, and the component
declares no events at all, so no edit made here rebuilds the branch or marks anything dirty.</p>
<h2 id="the-preset-table-is-also-the-work-coordinate-table">The Preset Table Is Also the Work-Coordinate Table</h2>
<p>This is the pairing with <a class="xref" href="work-coordinates.html">Work Coordinates</a>, and it holds for
exactly one of the two tables.</p>
<p><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTable.html">HeidenhainDatumTable</a> implements
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.IIsoCoordinateConfig.html">IIsoCoordinateConfig</a>, and the work-coordinate endpoint reads and
writes through the <em>first</em> implementer of that interface in the runner's proxy-resolved list. On the
Heidenhain preset the datum proxy is the second entry of the dependency list, immediately after the
brand marker, and no other entry that preset carries implements the interface — the Heidenhain
machine-parameter table does not. So on Heidenhain the object behind Work Coordinates is this datum
table, and the snapshot's coordinate-kind field reports the Heidenhain arm for that same reason.</p>
<p>The alias is narrow, and one-directional in coverage.</p>
<ul>
<li><strong>Datum Presets (Q339) aliases.</strong> The ISO face maps <code>G54</code> through <code>G59</code> onto preset rows 1 through
6, in order, on both the read and the write, and enumerates no id outside that series — one for
each of those six rows the table holds, which is all six unless a stored project table omits one of
them. Editing the <code>Q339</code> row 3 cells changes what Work Coordinates shows for <code>G56</code>, and an edit
made on <code>G56</code> changes row 3 — one instance, one cell, two faces. The row-zeroing button reaches the
same cells.</li>
<li><strong>Datum Shifts (D) does not alias.</strong> Nothing on the ISO face touches the shift store: the id
enumeration reads the preset dictionary only, and both the offset getter and the offset setter
resolve to preset rows. The shift table has exactly one editing surface, the leaf on this page.</li>
<li><strong>Preset rows 7 through 20 have no work-coordinate face either.</strong> The ISO face reserves six rows
for the <code>G54</code> series and enumerates no id past <code>G59</code>, so fourteen preset rows and all twenty shift
rows are reachable from this page and from nowhere else on the branch.</li>
</ul>
<p>The two faces are never on screen together — the editor row mounts one panel at a time — and each
panel reads once on mount, so moving the selection between the two nodes is itself the refresh. What
a mounted panel therefore does not see is
<a class="xref" href="../editing-contract.html">Editing Contract</a>.</p>
<h3 id="what-a-brand-switch-does-to-the-pair">What a brand switch does to the pair</h3>
<p>The brand switch's carry option reads the outgoing runner's coordinate provider and writes the values
into the incoming one, for the ids the incoming provider enumerates. On this table that means at most
six values, landing in preset rows 1 through 6; a switch away from Heidenhain reads those same six
rows out. <strong>No shift row is ever carried, and neither are preset rows 7 through 20.</strong></p>
<p>A switch away from Heidenhain then sweeps the datum table itself, because no other brand preset
proxies it — both stores go, and switching back materializes a fresh table of zeros rather than
restoring them. The staged select, its confirmation and the rest of that operation are
<a class="xref" href="../machine/brand-switch.html">Brand Switch</a>.</p>
<h2 id="what-the-rows-feed">What the Rows Feed</h2>
<p>At run time both stores are read and neither is written. No syntax in the parse pipeline writes
either dictionary — every writer is one of the four surfaces named below — so playing a program
cannot change a datum row.</p>
<p><strong>The preset path.</strong> A <code>CYCL DEF 247</code> block resolves its <code>Q339</code> number — a literal, or the number a
Q-expression evaluated to — looks the row up, and writes a synthetic coordinate id naming that row
alongside the translation. The shared ISO coordinate syntax then keeps the offset alive on following
blocks by re-resolving that synthetic id against the same table, which is how a mid-program edit to a
row takes effect on the blocks after the declaration. A <code>CYCL DEF 247</code> whose <code>Q339</code> is not a number
resolves nothing, leaves the active datum unchanged, and reports the validation warning <em>&quot;CYCL DEF
247 without a literal Q339 preset number; the active datum is kept unchanged.&quot;</em></p>
<p><strong>A successful preset selection clears the active shift.</strong> That is the one path in the cycle handler
that does not carry the previous block's shift forward.</p>
<p><strong>The shift path.</strong> A <code>CYCL DEF 7</code> block carrying a <code>#</code> index reads that shift row and composes it as
a second, separate transform entry, so preset and shift add rather than replace. On blocks with no
cycle the shift is carried modally, and a numbered shift re-resolves from the table on every block,
exactly as the preset does. A <code>CYCL DEF 7</code> written with direct values carries them forward verbatim
instead and needs no datum table at all; cancelling is a zero shift. A <code>CYCL DEF 7</code> carrying neither
form reports <em>&quot;CYCL DEF 7 carries neither a #-table index nor direct X/Y/Z values; the active datum
shift is kept unchanged.&quot;</em></p>
<p><strong>A <code>G54</code> with axis words is not a table read.</strong> On the Heidenhain syntax list the datum-shift parser
claims a <code>G54</code> that is followed by at least one axis value and routes it into the direct-shift flow,
which reads no row; a bare <code>G54</code> is left alone and reaches the ISO path, where it resolves preset row</p>
<ol>
<li>So <code>G54</code> means a table lookup or a literal shift depending on what follows it in the block.</li>
</ol>
<p>A row number that resolves to nothing yields a zero translation rather than an error, on both paths.
And nothing is active at the first block: the Heidenhain preset's initializer seeds no coordinate
section at all, unlike the Fanuc family's <code>G54</code> and the Siemens cancel frame, so a program that
issues no datum cycle and no <code>G54</code> machines with no offset applied.</p>
<h2 id="where-non-zero-rows-come-from">Where Non-Zero Rows Come From</h2>
<p>Four surfaces put a value into these tables, and only the first is on this page.</p>
<ul>
<li><strong>The two leaves themselves</strong>, per cell or per row.</li>
<li><strong>Work Coordinates</strong>, for preset rows 1 through 6 only, through the alias above.</li>
<li><strong>A brand switch onto Heidenhain with its carry option on</strong>, through that same ISO face and into
the table the incoming preset resolves: at most six offsets, into preset rows 1 through 6 —
<a class="xref" href="../machine/brand-switch.html">Brand Switch</a>.</li>
<li><strong>A project-load migration.</strong> Opening a project file that carries the superseded controller
environment element and no per-case list populates the materialized per-case tables from that
element, and the datum half runs only when the legacy brand element reads Heidenhain. It copies
preset entries and shift entries by row number, overwriting a row it names and leaving every other
row as seeded. The legacy work-coordinate table is replayed first, through the same ISO face that
aliases onto preset rows 1 through 6, so where the two overlap the explicit datum copy is what
stands.</li>
</ul>
<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>Program Data</strong> Group Row — <code>equipment/controller/program-data</code>
<ul>
<li><strong>Datum Presets (Q339)</strong> Node Row — <code>equipment/controller/program-data/datum-presets</code></li>
<li><strong>Datum Shifts (D)</strong> Node Row — <code>equipment/controller/program-data/datum-shifts</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Editor Row — the panel of whichever node is selected, one at a time
<ul>
<li><strong>Datum Presets (Q339)</strong> / <strong>Datum Shifts (D)</strong> Panel — one component, its role taken from the
selected id's last segment
<ul>
<li>No-Runner Body — <em>&quot;No NC runner — load a project first.&quot;</em>; the shared empty state, shown
instead of everything below while the snapshot reports no runner</li>
<li>Absent-Table Body — <em>&quot;No Heidenhain datum table on the active runner.&quot;</em>; shown instead of
everything below while the panel's own read reports no table</li>
<li>Description Caption — grey, one line: <em>&quot;Datum presets (CYCL DEF 247, Q339 = row). Rows 1–6
double as G54–G59.&quot;</em> or <em>&quot;Datum shifts (CYCL DEF 7).&quot;</em></li>
<li>Datum Table — dense, flat, bordered; no sort, no pagination, no column menu
<ul>
<li>Header Row — <code>Q339</code> or <code>D</code>, then <code>X (mm)</code>, <code>Y (mm)</code> and <code>Z (mm)</code>, then an unlabelled action
column</li>
<li>Datum Row, one per row the read returned, in row-number order
<ul>
<li>Row Number Label — bold plain text, never editable</li>
<li>Value Numeric Field, one per axis column — no minimum, no maximum, no unit suffix</li>
<li><strong>0</strong> Button — flat, dense, centred, tooltip <em>&ldquo;Reset to zero&rdquo;</em></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Toast — negative, three seconds, the panel's context followed by the server's own message</li>
</ul>
</li>
</ul>
<p>The panel carries no heading, no toolbar, no add row, no delete button, no toggle, no save button and
no dialog.</p>
<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/SoftNcDatumTablePanel.vue</code> — the one component behind both
leaves: the role taken from the node id's suffix with its preset default, the four things that
role decides, the literal column headers, the whole-row cell commit with its non-finite guard, and
the non-optimistic row reset.</li>
<li><code>wwwroot-src/src/components/controlTree/softNcItemTypes.ts</code> — the branch builder: the two node ids
and label keys pushed together inside one flag test, and the single item type both carry.</li>
<li><code>wwwroot-src/src/components/controlTree/PrimarySlavePanel.vue</code> — the editor row: the remount key
that makes a move between the two nodes a re-fetch, and the events this panel declares none of.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcEmptyState.vue</code> — the shared no-runner line the panel
opens with.</li>
<li><code>wwwroot-src/src/components/widgets/NumericInput.vue</code> — the value cell: commit on blur or Enter,
the empty-text-to-null parse, and the infinity and NaN literals the panel's handler then rejects.</li>
<li><code>wwwroot-src/src/api/softNcRunner.ts</code> — the read that returns both tables and its row shape, the
two role values, the per-row setter and the reset call, and the snapshot's datum flag.</li>
<li><code>wwwroot-src/src/composables/useSoftNcRunner.ts</code> — the shared snapshot the first empty layer reads.</li>
<li><code>wwwroot-src/src/api/http.ts</code> — the envelope helper that turns a success-flagged failure body into
a thrown error.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcWorkCoordinatesPanel.vue</code> — the second face on the
preset rows: the same six cells addressed by coordinate id, and the caption that names the mapping.</li>
<li><code>wwwroot-src/src/i18n/en/softNc.ts</code> — the two node labels, the two descriptions, the absent-table
body and the three error contexts.</li>
<li><code>wwwroot-src/src/i18n/en/common.ts</code> — the reset button's tooltip.</li>
<li><code>Mech/SoftNcRunnerController.cs</code> — the REST surface: the datum flag's probe in the snapshot
builder, the read that returns both dictionaries ordered by row number, the per-row writer and the
zeroing route behind one shared table-segment guard, the work-coordinate routes that reach the same
object through the ISO interface, and the brand switch's capture-swap-carry-sweep.</li>
</ul>
<h3 id="hiapi-engine">HiAPI Engine</h3>
<ul>
<li><code>HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainDatumTable.cs</code> — the two dictionaries, their
twenty seeded rows, the accessors both cycles read through, and the ISO face: the <code>G54</code>–<code>G59</code> map
onto preset rows 1–6, the synthetic preset ids it also resolves, and the id enumeration that stops
at six.</li>
<li><code>HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainDatumTableProxy.cs</code> — the seedless get-or-create
placeholder the preset carries, and the bare table it installs into a project holding none.</li>
<li><code>HiMech/NcParsers/Dependencys/IIsoCoordinateConfig.cs</code> — the offset-provider contract whose first
implementer the work-coordinate face resolves.</li>
<li><code>HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainParameterTable.cs</code> — the other Heidenhain
per-case table: it derives from the controller parameter base, which declares no coordinate
contract, which is why the datum table is the preset's only implementer of one.</li>
<li><code>HiMech/NcParsers/SoftNcRunner.cs</code> — the Heidenhain preset's dependency list and the position of the
datum proxy in it, the proxy resolution every read goes through, and the legacy per-case populate
that fills both dictionaries by row number after replaying the legacy coordinate table.</li>
<li><code>HiMech/NcParsers/ParsingSyntaxs/Heidenhain/CyclDefSyntaxs/HeidenhainDatumSettingSyntax.cs</code> — the
<code>CYCL DEF 247</code> parser and the DIN/ISO <code>G247</code> spelling it claims for the same cycle record.</li>
<li><code>HiMech/NcParsers/ParsingSyntaxs/Heidenhain/CyclDefSyntaxs/HeidenhainDatumShiftSyntax.cs</code> — the
<code>CYCL DEF 7</code> parser: the <code>#</code> row index, the direct-value form, and the axis-word test that decides
whether a <code>G54</code> becomes a direct shift or stays on the ISO path.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/Heidenhain/HeidenhainCoordinateOffsetSyntax.cs</code> — the resolver: the
preset lookup and its synthetic id, the additive shift in its own transform entry, the modal carry
that re-resolves a numbered shift from the table, the shift reset a successful preset selection
performs, and the two validation warnings.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/IsoCoordinateOffsetSyntax.cs</code> — the <code>G54</code>-series path and the modal
lookback that re-queries the table for the carried id.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/CoordinateOffsetUtil.cs</code> — the offset resolution and the translation
composed onto the block's transform chain.</li>
<li><code>HiMech/NcParsers/Syntaxs/HeidenhainSyntaxUtil.cs</code> — the Heidenhain syntax list carrying both the
ISO coordinate syntax and the datum-cycle syntax.</li>
<li><code>HiMech/NcParsers/Initializers/StaticInitializer.cs</code> — the Heidenhain initializer that seeds no
coordinate section, against the Fanuc and Siemens ones that do.</li>
<li><code>HiGeom/Geom/Vec3d.cs</code> — the three-component translation a datum row stores, and the zero it
defaults to.</li>
<li><code>HiNc/MachiningProcs/MachiningProject.cs</code> — the load path that wires the proxies and then runs the
legacy per-case populate on a project carrying no per-case list.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="index.html">Program Data Plane</a> — the plane these two leaves sit on, where their table is
stored, and the per-case tables beside them a brand switch keeps or sweeps</li>
<li><a class="xref" href="work-coordinates.html">Work Coordinates</a> — the second face on the preset rows: the same six cells
addressed as <code>G54</code>–<code>G59</code>, on the one brand where two nodes edit one object</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>