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
T
2026-09-09 17:35:23 +08:00

538 lines
34 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>Program Data Plane | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Program Data Plane | 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-ControllerProgramData">
<h1 id="program-data-plane">Program Data Plane</h1>
<p>Program Data is the second of the Controller branch's two plane stems: the coordinate, offset and
variable tables that belong to the workpiece rather than to the control, edited one leaf at a time.
It lives on the General Setup page at <code>/general-setup</code> under the Control-Tree id
<code>equipment/controller/program-data</code>, and each of its leaves takes that id plus one segment —
<code>work-coordinates</code>, <code>tool-offsets</code>, <code>siemens-tool-offsets</code>, <code>tool-names</code>, <code>datum-presets</code>,
<code>datum-shifts</code>, <code>frames</code>, <code>retained-variables</code>, <code>r-parameters</code>. The stem is not gated: it is part of
the branch builder's return value rather than a conditional entry, so it appears wherever a runner
resolves and always carries the two leaves no flag guards.</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>
<p>Selecting the stem shows the shared group editor: its own introduction over a clickable list of its
children. The introduction reads <em>&quot;Data that travels with the workpiece / project — work-coordinate
offsets (G54…), tool offsets and the brand-specific per-case tables. Kept on the project even when
the runner file is swapped.&quot;</em></p>
<p>Every leaf below follows the branch's shared editing rules — one read on mount, per-control commit,
capture-assign-await-restore on failure, a dense markup table with no sort and no pagination, and the
two empty layers. Those rules, and the places this plane departs from them, are
<a class="xref" href="../editing-contract.html">Editing Contract</a>.</p>
<h2 id="where-the-data-actually-lives">Where the Data Actually Lives</h2>
<p>The stem's introduction names a storage location, and here — unlike the machine stem's own
introduction — it holds for every leaf. What it does not say is that the location is not a file.</p>
<h3 id="one-list-inlined-in-the-project">One list, inlined in the project</h3>
<p><a class="xref" href="../../../../api/Hi.NcParsers.NcRunnerSuit.html">NcRunnerSuit</a> carries the runner beside the project's own
<a class="xref" href="../../../../api/Hi.NcParsers.NcRunnerSuit.html#Hi_NcParsers_NcRunnerSuit_PerCaseNcDependencyList">PerCaseNcDependencyList</a>, and serializes the two side by side. The
runner half can be written to a side file; the per-case half never is — the suit writes it as a
nested element with no file reference of its own, so it lands inside whatever file the owning project
writes. Every table this plane edits is an entry of that one list.</p>
<p>No panel and no endpoint reads or writes a table by reaching into that list by name. The one place
that addresses the list directly is the sweep that follows a runner swap, and it removes whole
entries rather than editing any value in one. A brand preset's pipeline list carries an
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.INcDependencyProxy.html">INcDependencyProxy</a> in place of each of these tables, and every read
and write resolves through
<a class="xref" href="../../../../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_GetEffectiveNcDependencyList_">GetEffectiveNcDependencyList</a><small>(API)</small>, which substitutes
the project's table for the placeholder. That is also what the snapshot flags probe, so the tree
grows a leaf for the concrete table and never for the proxy —
<a class="xref" href="../brand-matrix.html">Brand Matrix</a>.</p>
<h3 id="the-proxies-on-this-plane-carry-nothing">The proxies on this plane carry nothing</h3>
<p><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Generic.ToolOffsetTableProxy.html">ToolOffsetTableProxy</a> and its siblings — the Siemens <code>$TC_DP</code>,
frame and R-parameter proxies, the Heidenhain datum proxy and the Fanuc-family retained common
variable proxy — are get-or-create placeholders with no seed. Each serializes an empty element, and
on wiring installs a bare new instance into the per-case list when the project holds none of that
type; an existing table is left untouched.</p>
<p>Two consequences follow. A controller file written from the branch root's Object-Management menu
carries none of the values edited on this plane: the seedless proxies write an empty element, and the
one proxy on this plane that does carry a seed — the brand parameter-table proxy standing behind the
work coordinates on the Fanuc family and Syntec — serializes the fixed seed it was constructed with
rather than the table the panels have been editing. And a table this plane loses is not recoverable
from a preset: a fresh instance is what the proxy makes.</p>
<h3 id="which-store-a-work-coordinate-lands-in">Which store a work coordinate lands in</h3>
<p>Work Coordinates is the one leaf whose backing object changes with the brand. The panel reads and
writes the first <a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.IIsoCoordinateConfig.html">IIsoCoordinateConfig</a> in the effective list, and the
caption above its table names which one answered.</p>
<table>
<thead>
<tr>
<th>Brand</th>
<th>Backing object</th>
<th>Ids the table lists</th>
<th>Caption above the table</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fanuc, Mazak</td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Fanuc.FanucParameterTable.html">FanucParameterTable</a></td>
<td>G54–G59 and G54.1P1–G54.1P48</td>
<td><em>&quot;Stored in the Fanuc parameter table (#5221+ / #7001+).&quot;</em></td>
</tr>
<tr>
<td>Syntec</td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Syntec.SyntecParameterTable.html">SyntecParameterTable</a></td>
<td>G54–G59 and G54.1P1–G54.1P48</td>
<td><em>&quot;Stored in the Syntec parameter table (Pr5221+ / Pr7001+).&quot;</em></td>
</tr>
<tr>
<td>Siemens</td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensFrameTable.html">SiemensFrameTable</a></td>
<td>G54–G57 and G505–G599</td>
<td><em>&quot;Stored as Siemens settable frames ($P_UIFR; G500 cancels and is always zero).&quot;</em></td>
</tr>
<tr>
<td>Heidenhain</td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTable.html">HeidenhainDatumTable</a></td>
<td>G54–G59</td>
<td><em>&quot;G54–G59 map onto Heidenhain datum preset rows 1–6.&quot;</em></td>
</tr>
</tbody>
</table>
<p>An id appears only where the store actually holds it. A Fanuc-family or Syntec table yields an id
whose parameter address is present, and every one of those default tables seeds all of them at zero;
the Siemens frame table seeds G54–G57 and the extended series, and has no G58 or G59 row at all; the
Heidenhain table yields one id per preset row 1–6 that exists. G500 is never a row — the frame table
refuses to store it and does not seed it.</p>
<p>That caption is the panel's only statement of where a value went, and it is selected from the
snapshot's work-coordinate kind rather than from the brand marker.</p>
<h3 id="the-one-setting-that-is-not-in-the-list">The one setting that is not in the list</h3>
<p>The Tool Offsets leaf's <em>Set ideal offset dependent on tool house</em> toggle is not a dependency. It
writes <a class="xref" href="../../../../api/Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_IsIdealOffsetDependentOnToolHouse">IsIdealOffsetDependentOnToolHouse</a>, an
element the project serializes beside the runner suit. It therefore stays with the project like
everything else on this plane, but by a different route — and, being outside the per-case list, it is
untouched by the sweep that follows a runner swap.</p>
<h2 id="how-this-differs-from-the-machine-plane">How This Differs From the Machine Plane</h2>
<p>The machine plane's ownership is split. Several of its leaves are plain instances the runner owns
outright — the tool-change position, the block-skip layers, the subprogram folders, and on Siemens
and Heidenhain the peck clearance — and an install replaces them with the incoming runner's; the
rest are rows of the brand parameter table and are stored on the project. One leaf holds both
halves: Controller Parameters, where the macro loop guards are runner-owned fields sitting beside
table rows. Which side of that line a machine-plane field falls on is
<a class="xref" href="../machine/index.html">Machine and Controller Plane</a>.</p>
<p>This plane has no such split. Nothing on it is a plain runner-owned instance: every leaf resolves a
per-case table through a proxy, so every value it edits is stored on the project. That is what makes
the two introductions' phrasing load-bearing rather than decorative — and it is why installing a
controller file of the brand already in force changes nothing here at all: each of that brand's
proxies takes the table the project already holds rather than installing a fresh one over it. The
same install does return the machine plane's runner-owned settings to the incoming file's values.</p>
<p>The one crossing runs the other way. On Fanuc, Mazak and Syntec the work coordinates are rows of the
same brand parameter table whose other rows the machine plane's per-axis leaves and native parameter
form edit. A single object straddles both stems there, which is exactly why that table is per-case at
all: the two planes could not otherwise be separated.</p>
<h2 id="the-planes-leaves">The Plane's Leaves</h2>
<p>Ordered as the branch builder pushes them: the two ungated leaves first, then each gated leaf or
gated pair behind the snapshot flag that grows it. Which brands satisfy each flag is
<a class="xref" href="../brand-matrix.html">Brand Matrix</a>; the column that page does not carry is the last
one here.</p>
<table>
<thead>
<tr>
<th>Node segment</th>
<th>Label the tree shows</th>
<th>Gate</th>
<th>Backing table</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>work-coordinates</code></td>
<td>Work Coordinates (G54…)</td>
<td>ungated</td>
<td>the brand's ISO coordinate provider, per the table above</td>
</tr>
<tr>
<td><code>tool-offsets</code></td>
<td>Tool Offsets, read as Tool Offsets (ISO G43 H) where the Siemens table resolves</td>
<td>ungated; label switched by <code>hasSiemensToolOffsets</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.html">ToolOffsetTable</a></td>
</tr>
<tr>
<td><code>siemens-tool-offsets</code></td>
<td>Tool Offsets ($TC_DP)</td>
<td><code>hasSiemensToolOffsets</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensToolOffsetTable.html">SiemensToolOffsetTable</a>, its cutting-edge map</td>
</tr>
<tr>
<td><code>tool-names</code></td>
<td>Tool Names</td>
<td><code>hasSiemensToolOffsets</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensToolOffsetTable.html">SiemensToolOffsetTable</a>, its name map</td>
</tr>
<tr>
<td><code>datum-presets</code></td>
<td>Datum Presets (Q339)</td>
<td><code>hasDatums</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTable.html">HeidenhainDatumTable</a>, its preset rows</td>
</tr>
<tr>
<td><code>datum-shifts</code></td>
<td>Datum Shifts (D)</td>
<td><code>hasDatums</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTable.html">HeidenhainDatumTable</a>, its shift rows</td>
</tr>
<tr>
<td><code>frames</code></td>
<td>Frames (Siemens)</td>
<td><code>hasFrames</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensFrameTable.html">SiemensFrameTable</a></td>
</tr>
<tr>
<td><code>retained-variables</code></td>
<td>Retained Common Variables</td>
<td><code>hasRetainedVariables</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Fanuc.RetainedCommonVariableTable.html">RetainedCommonVariableTable</a></td>
</tr>
<tr>
<td><code>r-parameters</code></td>
<td>R Parameters</td>
<td><code>hasRParameters</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensRParameterTable.html">SiemensRParameterTable</a></td>
</tr>
</tbody>
</table>
<p>Every label above is a translated role string rather than a type name, so the tree renders the
translation and a locale change rewrites the rows without touching an id.</p>
<p><strong>Two leaves stand on every brand: Work Coordinates (G54…) and Tool Offsets.</strong> They are the builder's
unconditional entries, and every brand preset satisfies them — each carries an ISO coordinate
provider of its own, and all five proxy the generic tool-offset table. The remaining leaves are
pushed inside a flag test, and each of those flags is satisfied by one brand family only.</p>
<h3 id="fewer-tables-than-leaves">Fewer tables than leaves</h3>
<p>Two flags grow two leaves each, because two leaves edit two halves of one object. Tool Offsets
($TC_DP) and Tool Names are the cutting-edge map and the name map of a single Siemens tool-offset
table, which is why there is no separate tool-name flag and why the two nodes appear and disappear
together. Datum Presets (Q339) and Datum Shifts (D) are the preset rows and the shift rows of a
single Heidenhain datum table, served by one component that reads its role from the node id's last
segment.</p>
<p>The work coordinates then fold two more leaves together, on the two brands where the ISO provider is
a table this plane already lists. On Siemens, Work Coordinates and Frames (Siemens) are two views of
one frame dictionary — the same ids, the same X/Y/Z translations, edited through two panels. On
Heidenhain, the G54–G59 rows of Work Coordinates <em>are</em> preset rows 1–6 of Datum Presets (Q339), so
editing one changes what the other shows. Datum Shifts has no such alias, and the Siemens frame
table's per-axis translation components beyond X/Y/Z are reachable from neither panel.</p>
<h3 id="the-two-tool-offset-ledgers-disagree-on-the-sign-of-wear">The two tool-offset ledgers disagree on the sign of wear</h3>
<p>Where both are present the difference matters more than the labels suggest. On the generic table an
effective value is the ideal minus the wear; on the Siemens <code>$TC_DP</code> table it is the geometry plus
the wear. That is why the Siemens panel spells the addition out in a footnote below its table, and
says in its own description that a shortened tool is entered as negative wear, while the generic
panel states no sign rule at all. The relabel of the ungated leaf to <strong>Tool Offsets (ISO G43 H)</strong>
exists so that the two are not read as one ledger.</p>
<h2 id="what-a-brand-change-does-here">What a Brand Change Does Here</h2>
<p>A brand switch replaces the whole runner with the target brand's preset and then removes every
per-case table the new runner references through no proxy. This plane is where that sweep lands: the
machine plane's project-owned parameter table is one entry, and every other entry the sweep can reach
is a table edited here. The staged select, its confirmation and the rest of the control are
<a class="xref" href="../machine/brand-switch.html">Controller Brand</a>; what follows is the outcome for this plane
alone.</p>
<ul>
<li><strong>Tool Offsets survives every switch.</strong> All five presets proxy the generic tool-offset table, so
the sweep's keep-set always contains it. Its rows, its tool numbering and the tool-house dependence
toggle beside it come through a brand change unchanged; only the leaf's label can change.</li>
<li><strong>Every other table on the plane is brand-bound and is removed</strong> the moment the target brand
proxies none of it — the Siemens <code>$TC_DP</code> table with its tool-name map, the Siemens frame table,
the Siemens R-parameter table, the Heidenhain datum table, and the Fanuc-family or Syntec parameter
table that holds the work coordinates. Switching back does not restore what was removed; the proxy
makes a fresh instance instead, empty for the tool-offset, tool-name, R-parameter and
retained-variable tables, and zero-filled for the frame and datum tables that seed a row set in
their constructor.</li>
<li><strong>The Fanuc and Mazak presets proxy the same parameter table</strong>, so a switch between those two
brands sweeps nothing here: the work coordinates and every other row of that table stay where they
are.</li>
<li><strong>Retained Common Variables spans a family rather than a brand.</strong> Fanuc, Syntec and Mazak all proxy
it, so it survives any switch among those three and is removed on a switch to Siemens or
Heidenhain.</li>
<li><strong>Work coordinates are the one set of values a switch can carry across.</strong> The brand panel's <em>Carry
work-coordinate XYZ (G54…) into the new brand's table</em> checkbox is on by default; the switch reads
every id the outgoing providers exposed and, after the swap, writes each back only to a provider
on the incoming runner that lists it — never to a provider that would merely accept it. The
Fanuc-family and Syntec presets expose the same set — G54–G59 and all forty-eight G54.1 P offsets
on the brand table, every address seeded, plus the extended G59.1–G59.9 on the brand-neutral
table behind it — so a switch between Syntec and either of Fanuc and Mazak carries every one of
them. A switch into Siemens carries only G54–G57, the frame table listing no G58, no G59, no
G59.x and no G54.1 P id at all; a switch into Heidenhain carries G54–G59 and drops the
forty-eight G54.1 P offsets and the nine G59.x. No other table's values are carried, and the carry
is skipped for a table the swap re-bound rather than replaced — which is the Fanuc-to-Mazak case.</li>
</ul>
<p>The banner shown before the apply says as much in one line: <em>&quot;Switching brand replaces the whole
runner with the {brand} preset. Machine settings reset to that preset's defaults and the old brand's
program-data tables are removed — switching back does not restore them.&quot;</em></p>
<p>An Object-Management Load, Paste or XML apply runs the same install and the same sweep, so a
controller file of another brand takes this plane through the identical outcome without the carry
option. Both writes are refused while an NC program is playing.</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 — the plane beside this one</li>
<li><strong>Program Data</strong> Group Row — <code>equipment/controller/program-data</code>
<ul>
<li><strong>Work Coordinates (G54…)</strong> Node Row</li>
<li><strong>Tool Offsets</strong> Node Row — reads <strong>Tool Offsets (ISO G43 H)</strong> where the Siemens <code>$TC_DP</code>
table resolves</li>
<li><strong>Tool Offsets ($TC_DP)</strong> Node Row — grown while the snapshot reports a Siemens tool-offset
table</li>
<li><strong>Tool Names</strong> Node Row — grown on the same flag</li>
<li><strong>Datum Presets (Q339)</strong> Node Row — grown while it reports a Heidenhain datum table</li>
<li><strong>Datum Shifts (D)</strong> Node Row — grown on the same flag</li>
<li><strong>Frames (Siemens)</strong> Node Row — grown while it reports a Siemens frame table</li>
<li><strong>Retained Common Variables</strong> Node Row — grown while it reports a retained common variable
table</li>
<li><strong>R Parameters</strong> Node Row — grown while it reports a Siemens R-parameter table</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Editor Row — the panel of whichever node is selected
<ul>
<li><strong>Program Data</strong> Group Panel
<ul>
<li>Intro Caption — the stem's introduction line</li>
<li>Child List — one bordered, separated row per leaf above, each showing the leaf's label in the
theme's primary colour with a right chevron; a click selects that leaf</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>The stem's own editor holds no field, so nothing on this plane is edited from the group row itself.</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/softNcItemTypes.ts</code> — the branch builder: the program-data
stem's id, label key and intro key, the two leaves it pushes unconditionally, the snapshot flag
each further leaf is pushed behind in the order the table above lists them, and the tool-offsets
relabel.</li>
<li><code>wwwroot-src/src/components/controlTree/GroupInfoPanel.vue</code> — the stem's editor: the intro caption
and the clickable child list that selects a leaf.</li>
<li><code>wwwroot-src/src/components/controlTree/useControlTreeHost.ts</code> — builds the <code>equipment/controller</code>
root this stem hangs from, inside the equipment group.</li>
<li><code>wwwroot-src/src/api/softNcRunner.ts</code> — the snapshot shape the builder reads its flags from, and
the typed wrappers over each leaf's reader and writers.</li>
<li><code>wwwroot-src/src/composables/useSoftNcRunner.ts</code> — the shared snapshot the leaf panels gate on, the
brand switch with its carry option, and the Object-Management install that regrows the branch.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcWorkCoordinatesPanel.vue</code> — the one panel that reads
the snapshot's work-coordinate kind, the caption it selects from it, and the extended-row filter.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcToolOffsetsPanel.vue</code> — the generic ledger: the
tool-house dependence toggle, the refresh it enables, and the Siemens caveat gated on the brand
string rather than on the table flag.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcSiemensToolOffsetsPanel.vue</code> and
<code>wwwroot-src/src/components/controlTree/SoftNcToolNamesPanel.vue</code> — the two leaves over one Siemens
table: the cutting-edge rows and the name map.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcDatumTablePanel.vue</code> — the one component behind both
Heidenhain leaves, choosing its role from the node id's last segment.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcFramesPanel.vue</code> — the settable-frame table and its
own always-visible set, narrower than the work-coordinate panel's.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcRetainedVariablesPanel.vue</code> and
<code>wwwroot-src/src/components/controlTree/SoftNcRParametersPanel.vue</code> — the two sparse variable
tables, and the vacant entry a cleared cell writes.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcEmptyState.vue</code> — the shared no-runner line every
leaf on this plane falls back to.</li>
<li><code>wwwroot-src/src/api/equipmentSetup.ts</code> — the canvas marker id a work-coordinate row click writes,
outside this branch's own REST surface.</li>
<li><code>wwwroot-src/src/i18n/en/softNc.ts</code> — the stem's introduction line, every leaf label in the table
above, the work-coordinate storage captions and the brand-switch warning.</li>
<li><code>wwwroot-src/src/i18n/en/common.ts</code> — the shared column and action labels these tables reuse.</li>
<li><code>Mech/SoftNcRunnerController.cs</code> — the plane's REST surface: the presence flags, the per-table
readers and writers, the brand switch with its work-coordinate carry, and the sweep of per-case
tables the new runner references through no proxy.</li>
<li><code>Mech/EquipmentSetupDisplayController.cs</code> — the marked-coordinate id a work-coordinate row click
stores, on the user configuration rather than on the project.</li>
</ul>
<h3 id="hiapi-engine">HiAPI Engine</h3>
<ul>
<li><code>HiMech/NcParsers/NcRunnerSuit.cs</code> — the suit: the per-case list this plane's tables live in, the
serialization that inlines it with no file reference, and the proxy wiring that materialises a
table into a project holding none of that type.</li>
<li><code>HiMech/NcParsers/SoftNcRunner.cs</code> — the five brand presets as literal dependency lists, showing
which proxies each brand carries, and the proxy resolution every read on this plane goes through.</li>
<li><code>HiMech/NcParsers/Dependencys/INcDependencyProxy.cs</code> — the maker-and-taker contract, and why a
proxy's resolved data is never written into the runner.</li>
<li><code>HiMech/NcParsers/Dependencys/Generic/ToolOffsetTableProxy.cs</code> — the seedless get-or-create shape
the Siemens, Heidenhain and Fanuc-family per-case proxies on this plane all repeat.</li>
<li><code>HiMech/NcParsers/Dependencys/Fanuc/FanucParameterTableProxy.cs</code> — the contrasting seeded proxy,
and its own account of why the Fanuc-family table mixes machine configuration with the per-case
work-coordinate offsets.</li>
<li><code>HiMech/NcParsers/Dependencys/IIsoCoordinateConfig.cs</code> and
<code>HiMech/NcParsers/Dependencys/IsoCoordinateAddressMap.cs</code> — the interface the work-coordinate panel
edits through, and the address arithmetic that decides which ids a Fanuc-family or Syntec table
lists.</li>
<li><code>HiMech/NcParsers/Dependencys/Generic/ToolOffsetTable.cs</code> — the generic ledger every preset
proxies, and the subtraction that makes an effective value ideal minus wear.</li>
<li><code>HiMech/NcParsers/Dependencys/Siemens/SiemensToolOffsetTable.cs</code> — the cutting-edge map and the
name map behind two leaves, and the addition that makes an effective value geometry plus wear.</li>
<li><code>HiMech/NcParsers/Dependencys/Siemens/SiemensFrameTable.cs</code> — the settable frames: the ids the
constructor seeds, the ISO coordinate implementation the work-coordinate leaf shares, and the
per-axis translation components neither panel exposes.</li>
<li><code>HiMech/NcParsers/Dependencys/Siemens/SiemensRParameterTable.cs</code> and
<code>HiMech/NcParsers/Dependencys/Fanuc/RetainedCommonVariableTable.cs</code> — the two persistent variable
tables, their accepted id ranges, and the vacant entry a valueless element preserves across a save.</li>
<li><code>HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainDatumTable.cs</code> — the preset and shift rows behind
two leaves, and the mapping that aliases G54–G59 onto preset rows 1–6.</li>
<li><code>HiMech/MachiningProcs/MachiningActRunnerConfig.cs</code> — the tool-house dependence flag, the one
setting on this plane stored outside the per-case list.</li>
<li><code>HiNc/MachiningProcs/LocalProjectService.cs</code> — the facade setter every install and brand switch
assigns through, and the proxy re-binding that materialises the incoming brand's per-case tables.</li>
<li><code>HiNc/MachiningProcs/MachiningProject.cs</code> — where the suit and the runner configuration hang off
the project, and the load path for a project file carrying the per-case list.</li>
</ul>
<h2 id="pages">Pages</h2>
<p>Ordered by the first node each page owns, as the plane lists them.</p>
<ul>
<li><a class="xref" href="work-coordinates.html">Work Coordinates</a> — The one uniform face over four brand
storage models, its P0 and M0 row actions, and the row click that marks a coordinate on the canvas</li>
<li><a class="xref" href="tool-offsets.html">Tool Offsets</a> — The generic ISO ledger: ideal against wear, the
renameable tool number, and what tool-house dependence takes over</li>
<li><a class="xref" href="siemens-tool-offsets.html">Siemens Tool Offsets</a> — The <code>$TC_DP</code> cutting-edge table
and the tool-name map beside it, two leaves over one object</li>
<li><a class="xref" href="datum-tables.html">Datum Tables</a> — The Heidenhain preset and shift rows, one
component serving both, and the preset rows the work coordinates alias</li>
<li><a class="xref" href="frames.html">Frames</a> — The Siemens settable frames, the ids they seed, and what
the work-coordinate leaf shows of the same table</li>
<li><a class="xref" href="persistent-variables.html">Persistent Variables</a> — The retained common variables
and the R parameters: sparse tables, accepted ranges, and the difference between vacant and deleted</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../index.html">Controller Branch</a> — the branch this plane is half of, its runner root and the machine plane
beside it</li>
<li><a class="xref" href="../machine/index.html">Machine and Controller Plane</a> — the other plane, whose ownership splits between the runner and
the project where this one does not</li>
<li><a class="xref" href="../brand-matrix.html">Brand Matrix</a> — which brand satisfies each gate named above, and what each
flag actually probes</li>
<li><a class="xref" href="../editing-contract.html">Editing Contract</a> — the commit, rollback and rendering rules every leaf on
this plane inherits, and the panels that depart from them</li>
<li><a class="xref" href="work-coordinates.html">Work Coordinates</a> — the ungated leaf whose backing object changes with the
brand, and the only values a brand switch can carry</li>
<li><a class="xref" href="tool-offsets.html">Tool Offsets</a> — the other ungated leaf, and the one table on this plane that
survives every brand switch</li>
<li><a class="xref" href="siemens-tool-offsets.html">Siemens Tool Offsets</a> — the second tool-offset ledger, whose presence
relabels the first</li>
<li><a class="xref" href="datum-tables.html">Datum Tables</a> — the two Heidenhain leaves, and the preset rows the work
coordinates share</li>
<li><a class="xref" href="frames.html">Frames</a> — the Siemens frame table, read by two leaves of this plane at once</li>
<li><a class="xref" href="persistent-variables.html">Persistent Variables</a> — the two variable tables a program's arithmetic
reads, kept on the project rather than reset with the session</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>