This commit is contained in:
2026-09-11 03:46:11 +08:00
parent 45b9f9ed5d
commit b7f55aa631
114 changed files with 3646 additions and 576 deletions
@@ -93,10 +93,10 @@ knows which directory a change landed in but not which screen it shows up on.</p
<p>Ordered the way a request travels: the front end first, then the process that serves it.</p>
<h2 id="directories">Directories</h2>
<ul>
<li><a href="webservice-spa/index.html">Web Service SPA Source Tree</a> — the Quasar front end under
<li><a href="webservice-spa.html">Web Service SPA Source Tree</a> — the Quasar front end under
<code>wwwroot-src/src</code>: how <code>components/</code> is grouped two ways at once, what the Control-Tree registry
actually is, and why half the route table is redirects</li>
<li><a href="webservice-backend/index.html">Web Service Backend Source Tree</a> — the ASP.NET Core half: how to read
<li><a href="webservice-backend.html">Web Service Backend Source Tree</a> — the ASP.NET Core half: how to read
a filename, why folder nesting does not predict a route, and which declared hub is never mapped</li>
</ul>
<h2 id="what-this-layer-is-for">What This Layer Is For</h2>
@@ -118,8 +118,8 @@ retired the page-by-page map of its files.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../index.html">HiNC App Anatomy</a> — the section index, and the surface-keyed way in</li>
<li><a class="xref" href="webservice-spa/index.html">Web Service SPA Source Tree</a> — the flagship front end</li>
<li><a class="xref" href="webservice-backend/index.html">Web Service Backend Source Tree</a> — the process that
<li><a class="xref" href="webservice-spa.html">Web Service SPA Source Tree</a> — the flagship front end</li>
<li><a class="xref" href="webservice-backend.html">Web Service Backend Source Tree</a> — the process that
serves it</li>
<li><a class="xref" href="../platform/index.html">Platform</a> — the machinery under every screen, entered by mechanism rather
than by directory</li>
@@ -16,10 +16,10 @@
<a href="index.html" name="" title="Overview">Overview</a>
</li>
<li>
<a href="webservice-spa/index.html" name="" title="Web Service SPA">Web Service SPA</a>
<a href="webservice-spa.html" name="" title="Web Service SPA">Web Service SPA</a>
</li>
<li>
<a href="webservice-backend/index.html" name="" title="Web Service Backend">Web Service Backend</a>
<a href="webservice-backend.html" name="" title="Web Service Backend">Web Service Backend</a>
</li>
</ul>
</div>
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Web Service SPA","href":"webservice-spa/index.html","topicHref":"webservice-spa/index.html"},{"name":"Web Service Backend","href":"webservice-backend/index.html","topicHref":"webservice-backend/index.html"}]}
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Web Service SPA","href":"webservice-spa.html","topicHref":"webservice-spa.html"},{"name":"Web Service Backend","href":"webservice-backend.html","topicHref":"webservice-backend.html"}]}
@@ -7,13 +7,13 @@
<meta name="title" content="Web Service Backend Source Tree | 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">
<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="docfx:rel" content="../../">
@@ -30,7 +30,7 @@
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../public/docfx.min.js"></script>
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
@@ -43,8 +43,8 @@
<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 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">
@@ -145,7 +145,7 @@ list is unreachable however complete its class looks — see the trap under <cod
<li><strong>The tree is not self-contained.</strong> The project service types <code>Program.cs</code> leans on hardest live in
the sibling HiNc engine repository, not here.</li>
</ul>
<p>Documented in <a class="xref" href="../../platform/program-and-hosting.html">Program and Hosting</a>.</p>
<p>Documented in <a class="xref" href="../platform/program-and-hosting.html">Program and Hosting</a>.</p>
<h2 id="execution">Execution</h2>
<p><code>Execution/</code> is the run cockpit's whole backend: playback control, the strip and cycle-line charts,
the NC-program branch index, run-output queries, and the real-time push layer.</p>
@@ -166,10 +166,10 @@ the repository references. The Execution canvas rides <code>Disp/RenderingHub.cs
canvas. A reader looking for &ldquo;the hub behind the Execution page&rdquo; by name will find this file first
and be wrong.</p>
</div>
<p>Documented in <a class="xref" href="../../execution/index.html">Execution Page</a>,
<a class="xref" href="../../execution/program.html">Program Branch</a>,
<a class="xref" href="../../execution/selected-step-info-panel.html">Selected-Step Info Panel</a>,
<a class="xref" href="../../execution/strip-charts.html">Strip Charts</a> and <a class="xref" href="../../execution/cycle-line-charts.html">Cycle-Line Charts</a>.</p>
<p>Documented in <a class="xref" href="../execution/index.html">Execution Page</a>,
<a class="xref" href="../execution/program.html">Program Branch</a>,
<a class="xref" href="../execution/selected-step-info-panel.html">Selected-Step Info Panel</a>,
<a class="xref" href="../execution/strip-charts.html">Strip Charts</a> and <a class="xref" href="../execution/cycle-line-charts.html">Cycle-Line Charts</a>.</p>
<h2 id="mech">Mech</h2>
<p><code>Mech/</code> is the largest domain folder: the REST surfaces for the machine tool, the tool house and
cutter editing, fixtures and workpieces, spindle capability, background and coolant, and the three
@@ -179,20 +179,20 @@ connection. <code>Mech/CutterDtoBuilder.cs</code> is the shared read-side DTO sh
loaded project actually plays them. No SignalR hub lives here.</p>
<ul>
<li><code>Mech/MechBuilder/</code> — the standalone mechanism-building session, held by a process-wide singleton
rather than per user. Documented in <a class="xref" href="../../util/mech-builder.html">Mechanism Builder Page</a>.</li>
rather than per user. Documented in <a class="xref" href="../util/mech-builder.html">Mechanism Builder Page</a>.</li>
<li><code>Mech/Topo/</code> — one thin controller per transformer kind, each editing an instance held in the
keyed object store. Documented in
<a class="xref" href="../../geom/transformer-panel.html">Transformer Select Panel</a>.</li>
<a class="xref" href="../geom/transformer-panel.html">Transformer Select Panel</a>.</li>
<li><code>Mech/SoftNcRunnerController.cs</code> — the one endpoint family behind the Controller branch, and the
file whose snapshot decides which of that branch's nodes exist. Documented in
<a class="xref" href="../../general-setup/controller/index.html">Controller Branch</a>, with
<a class="xref" href="../../general-setup/controller/brand-matrix.html">Brand Matrix</a> for the snapshot flags themselves.</li>
<a class="xref" href="../general-setup/controller/index.html">Controller Branch</a>, with
<a class="xref" href="../general-setup/controller/brand-matrix.html">Brand Matrix</a> for the snapshot flags themselves.</li>
<li><code>Mech/CsvRunnerController.cs</code> and <code>Mech/ClRunnerController.cs</code> — the two resident non-brand runner
suits, reached from tree branches the Preference menu hides by default. Documented in
<a class="xref" href="../../shell/preference-menu.html">Preference Menu Dropdown</a> until those branches have a page.</li>
<a class="xref" href="../shell/preference-menu.html">Preference Menu Dropdown</a> until those branches have a page.</li>
</ul>
<p>Documented in <a class="xref" href="../../general-setup/index.html">General Setup Page</a> and
<a class="xref" href="../../tool-house/index.html">Tool House Page</a> and the panels beneath them.</p>
<p>Documented in <a class="xref" href="../general-setup/index.html">General Setup Page</a> and
<a class="xref" href="../tool-house/index.html">Tool House Page</a> and the panels beneath them.</p>
<h2 id="missions">Missions</h2>
<p><code>Missions/</code> is the mission command tree's backend. Two things here surprise readers:</p>
<ul>
@@ -207,7 +207,7 @@ attribute once per process, replacing hand-maintained kind switches, and
command gets an editor without a bespoke panel. <code>Missions/ScriptCompletionService.cs</code> and
<code>Missions/ScriptCompileCheckService.cs</code> are the Roslyn pair behind the script editor; the compile
check reuses the same options and globals type the script command uses at run time.</p>
<p>Documented in <a class="xref" href="../../execution/mission/mission-root-panel.html">Mission Root Panel</a> and the command panels under it.</p>
<p>Documented in <a class="xref" href="../execution/mission/mission-root-panel.html">Mission Root Panel</a> and the command panels under it.</p>
<h2 id="disp">Disp</h2>
<p><code>Disp/</code> is the rendering layer. <code>Disp/RenderingHub.cs</code> is the single transport surface for every 3D
canvas in the application — canvas initialization, pointer, key and touch input, resize, view
@@ -217,21 +217,21 @@ engines the hub resolves against. <code>Disp/StlPreviewController.cs</code> is t
<p>The <code>*Displayee.cs</code> files are scene-graph composition objects rather than web types, and each has a
live instantiation site: the execution scene, the equipment-setup scene, the step-subtraction scene
and the two coordinate-frame displayees the first two compose in.</p>
<p>Documented in <a class="xref" href="../../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service</a>,
<a class="xref" href="../../widget/renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a> and — for
<p>Documented in <a class="xref" href="../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service</a>,
<a class="xref" href="../widget/renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a> and — for
<code>Disp/StlPreviewController.cs</code> and the per-connection slot behind it —
<a class="xref" href="../../util/stl-preview-pane.html">STL Preview Pane</a>.</p>
<a class="xref" href="../util/stl-preview-pane.html">STL Preview Pane</a>.</p>
<h2 id="environments">Environments</h2>
<p><code>Environments/</code> is session and environment scope: the project lifecycle, per-user preference
persistence, the Execution page's division flags, and the shipped localized step-present catalog. It
is also where the Log Viewer's data comes from — the log endpoints sit on the project controller
beside status, new, load, save, reload, save-as and close.</p>
<p>Documented in <a class="xref" href="../../shell/main-panel.html">Main Panel</a>,
<a class="xref" href="../../platform/session-state.html">Session State</a>,
<a class="xref" href="../../shell/preference-menu.html">Preference Menu Dropdown</a>,
<a class="xref" href="../../platform/i18n.html">Internationalization</a>,
<a class="xref" href="../../platform/log-viewer.html">Log Viewer Page</a> and
<a class="xref" href="../../execution/step-present-dialog.html">Step Present Dialog</a>.</p>
<p>Documented in <a class="xref" href="../shell/main-panel.html">Main Panel</a>,
<a class="xref" href="../platform/session-state.html">Session State</a>,
<a class="xref" href="../shell/preference-menu.html">Preference Menu Dropdown</a>,
<a class="xref" href="../platform/i18n.html">Internationalization</a>,
<a class="xref" href="../platform/log-viewer.html">Log Viewer Page</a> and
<a class="xref" href="../execution/step-present-dialog.html">Step Present Dialog</a>.</p>
<h2 id="common-geom-and-widget">Common, Geom and Widget</h2>
<ul>
<li><code>Common/</code> — cross-cutting infrastructure with no single domain owner: the optional login gate, the
@@ -245,31 +245,31 @@ disconnect handler always walks an empty registry. The bound comes from the brow
<code>wwwroot-src/src/composables/useCleanupHub.ts</code> posts the index-remove endpoint on
<code>Common/IndexController.cs</code> for every key it holds when its host unmounts, and again whenever a
key it registered is replaced. Documented in
<a class="xref" href="../../conventions/dictionary-service-pattern.html">Dictionary Service Pattern</a>,
<a class="xref" href="../../conventions/webapi-hub-cleanup-pattern.html">WebAPI Hub Cleanup Pattern</a>,
<a class="xref" href="../../platform/login-and-auth.html">Login and Authentication</a> and
<a class="xref" href="../../platform/log-viewer.html">Log Viewer Page</a>.</li>
<a class="xref" href="../conventions/dictionary-service-pattern.html">Dictionary Service Pattern</a>,
<a class="xref" href="../conventions/webapi-hub-cleanup-pattern.html">WebAPI Hub Cleanup Pattern</a>,
<a class="xref" href="../platform/login-and-auth.html">Login and Authentication</a> and
<a class="xref" href="../platform/log-viewer.html">Log Viewer Page</a>.</li>
<li><code>Geom/</code> — one CRUD controller per geometry kind, on the same keyed-object pattern, and nothing
else: no hubs, no services. Documented in <a class="xref" href="../../geom/index.html">Geometry Panels</a>.</li>
else: no hubs, no services. Documented in <a class="xref" href="../geom/index.html">Geometry Panels</a>.</li>
<li><code>Widget/</code> — the generic value and lifecycle controllers the reusable inputs post to: the 3D vector,
the 4×4 matrix, and the object-management surface that handles file operations, XML editing and
copy-paste for indexed objects. Documented in
<a class="xref" href="../../widget/object-management-menu-button.html">Object Management Menu Button</a>,
<a class="xref" href="../../widget/vec3d-control.html">Vec3dControl Component</a> and
<a class="xref" href="../../widget/mat4d-control.html">Mat4dControl Component</a>.</li>
<a class="xref" href="../widget/object-management-menu-button.html">Object Management Menu Button</a>,
<a class="xref" href="../widget/vec3d-control.html">Vec3dControl Component</a> and
<a class="xref" href="../widget/mat4d-control.html">Mat4dControl Component</a>.</li>
</ul>
<h2 id="controller-and-demo">Controller and Demo</h2>
<p><code>Controller/</code> is the single-file surface behind the legacy controller page. It has a successor in
<code>Mech/SoftNcRunnerController.cs</code>, whose own doc comment says so, but <strong>both are live</strong> — the legacy
page has not been removed. Documented in <a class="xref" href="../../legacy-controller.html">Legacy Controller</a>.</p>
page has not been removed. Documented in <a class="xref" href="../legacy-controller.html">Legacy Controller</a>.</p>
<p><code>Demo/</code> is customer-facing sample code — a custom colour guide and a per-step optimization sweep —
compiled into the assembly with no call site in the running application. Read it as an example of
how to extend the engine, not as part of the shipped behaviour.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../index.html">Anatomy by Source Directory</a> — the other two source trees, and how this
<li><a class="xref" href="index.html">Anatomy by Source Directory</a> — the other two source trees, and how this
layer is meant to be entered</li>
<li><a class="xref" href="../webservice-spa/index.html">Web Service SPA Source Tree</a> — the front end this process
<li><a class="xref" href="webservice-spa.html">Web Service SPA Source Tree</a> — the front end this process
serves and answers</li>
</ul>
@@ -7,13 +7,13 @@
<meta name="title" content="Web Service SPA Source Tree | 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">
<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="docfx:rel" content="../../">
@@ -30,7 +30,7 @@
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../public/docfx.min.js"></script>
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
@@ -43,8 +43,8 @@
<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 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">
@@ -116,7 +116,7 @@ page exists for it.</p>
<li><code>wwwroot-src/src/App.vue</code> — not the shell. It is a bare router view plus the once-per-load wiring
that subscribes the project store to the execution-status hub. The real shell is
<code>wwwroot-src/src/layouts/MainLayout.vue</code>. Documented in
<a class="xref" href="../../platform/session-state.html">Session State</a>.</li>
<a class="xref" href="../platform/session-state.html">Session State</a>.</li>
<li><code>wwwroot-src/src/boot/auth.ts</code>, <code>wwwroot-src/src/boot/i18n.ts</code>,
<code>wwwroot-src/src/boot/routine-toast.ts</code> — Quasar boot files, run once before mount and in a
declared order. The auth boot file patches the global fetch and inspects every 401, which is why
@@ -125,13 +125,13 @@ fires only while the auth store reports the login gate enabled, and not when the
already on the login route, so on a build with the gate off a 401 redirects nowhere. The toast
boot file patches the shared notify helper so every toast is mirrored into the footer history
without touching a call site. Documented in
<a class="xref" href="../../platform/login-and-auth.html">Login and Authentication</a> and
<a class="xref" href="../../platform/i18n.html">Internationalization</a>.</li>
<a class="xref" href="../platform/login-and-auth.html">Login and Authentication</a> and
<a class="xref" href="../platform/i18n.html">Internationalization</a>.</li>
<li><code>wwwroot-src/src/layouts/MainLayout.vue</code> — the shell: menu bar, the routed page container, footer.
It also owns the mechanism every page depends on and no page implements: a project epoch, bumped
when the loaded project changes, is the keep-alive key, so a project change destroys and rebuilds
every cached page. Documented in <a class="xref" href="../../shell/main-panel.html">Main Panel</a> and
<a class="xref" href="../../platform/session-state.html">Session State</a>.</li>
every cached page. Documented in <a class="xref" href="../shell/main-panel.html">Main Panel</a> and
<a class="xref" href="../platform/session-state.html">Session State</a>.</li>
</ul>
<h2 id="the-rest-edge">The REST Edge</h2>
<p><code>wwwroot-src/src/api/</code> is one thin typed module per backend controller family — functions, DTO types
@@ -142,7 +142,7 @@ application: each module wraps one named controller almost one-to-one.</p>
deliberately bypass it, so &ldquo;every API module goes through it&rdquo; would be wrong.</li>
<li><code>wwwroot-src/src/api/index-service.ts</code><strong>not</strong> a barrel file. It wraps the backend's keyed object
store, which is where the <code>key</code> string threaded through the whole application comes from.
Documented in <a class="xref" href="../../conventions/dictionary-service-pattern.html">Dictionary Service Pattern</a>.</li>
Documented in <a class="xref" href="../conventions/dictionary-service-pattern.html">Dictionary Service Pattern</a>.</li>
</ul>
<h2 id="components">Components</h2>
<ul>
@@ -152,9 +152,9 @@ Documented in <a class="xref" href="../../conventions/dictionary-service-pattern
The canvas does not render locally: it opens a SignalR connection and paints server-rendered
frames, which is why several pages each own a canvas bound to a different backend scene.
Documented in
<a class="xref" href="../../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service</a>,
<a href="../../util/file-explorer.html">File Explorer</a> and
<a class="xref" href="../../util/stl-preview-pane.html">STL Preview Pane</a>.</li>
<a class="xref" href="../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service</a>,
<a href="../util/file-explorer.html">File Explorer</a> and
<a class="xref" href="../util/stl-preview-pane.html">STL Preview Pane</a>.</li>
<li><code>wwwroot-src/src/components/controlTree/</code> — the largest folder in the SPA by a factor of two, and
a <strong>registry-driven panel system</strong> rather than a folder of tree widgets.
<code>wwwroot-src/src/components/controlTree/itemTypes.ts</code> and its domain siblings map an item-type
@@ -164,14 +164,14 @@ tree, gates a dirty selection switch, and syncs <code>?tree=</code>; the many
panel components are the editors the registry resolves. It serves <strong>three</strong> consumers, not one —
the Execution and General Setup pages each instantiate their own scoped host, while the Tool House
page reuses the identical panels and registry through a tab cascade and never touches the host.
Documented in <a class="xref" href="../../platform/control-tree.html">Control Tree</a> — the folder's own page — with
<a class="xref" href="../../execution/index.html">Execution Page</a>, <a class="xref" href="../../general-setup/index.html">General Setup Page</a> and
<a class="xref" href="../../tool-house/index.html">Tool House Page</a> for the three consumers, and
<a class="xref" href="../../execution/program.html">Program Branch</a> for the NC-program item types and panels that live in
Documented in <a class="xref" href="../platform/control-tree.html">Control Tree</a> — the folder's own page — with
<a class="xref" href="../execution/index.html">Execution Page</a>, <a class="xref" href="../general-setup/index.html">General Setup Page</a> and
<a class="xref" href="../tool-house/index.html">Tool House Page</a> for the three consumers, and
<a class="xref" href="../execution/program.html">Program Branch</a> for the NC-program item types and panels that live in
this folder. The nineteen <code>SoftNc*</code> panels and their registry are a wave of their own, documented
under <a class="xref" href="../../general-setup/controller/index.html">Controller Branch</a>: which of them the tree mounts at all is decided
by <a class="xref" href="../../general-setup/controller/brand-matrix.html">Brand Matrix</a>, and what they share is
<a class="xref" href="../../general-setup/controller/editing-contract.html">Editing Contract</a>.</li>
under <a class="xref" href="../general-setup/controller/index.html">Controller Branch</a>: which of them the tree mounts at all is decided
by <a class="xref" href="../general-setup/controller/brand-matrix.html">Brand Matrix</a>, and what they share is
<a class="xref" href="../general-setup/controller/editing-contract.html">Editing Contract</a>.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/</code> — the Tool House branch's panels. Easy to
confuse with <code>wwwroot-src/src/components/toolhouse/</code>: these are the panels the registry mounts,
that folder holds
@@ -180,24 +180,24 @@ the content fragments those panels embed, and the dependency runs one way only.<
sub-folder, the uPlot charting layer. Not purely page-local:
<code>wwwroot-src/src/components/execution/ExecutionToolBar.vue</code> is mounted by the Control Tree's
primary panel, and the spindle contours chart imports from the charts folder. Documented in
<a class="xref" href="../../execution/index.html">Execution Page</a>, <a class="xref" href="../../execution/strip-charts.html">Strip Charts</a> and
<a class="xref" href="../../execution/cycle-line-charts.html">Cycle-Line Charts</a>.</li>
<a class="xref" href="../execution/index.html">Execution Page</a>, <a class="xref" href="../execution/strip-charts.html">Strip Charts</a> and
<a class="xref" href="../execution/cycle-line-charts.html">Cycle-Line Charts</a>.</li>
<li><code>wwwroot-src/src/components/geom/</code> and <code>wwwroot-src/src/components/topo/</code> — structural twins: one
editor per kind, the same <code>modelKey</code> prop and <code>changed</code> / <code>error</code> emits, and a single kind → editor
map — <code>wwwroot-src/src/components/geom/geometryEditors.ts</code> and
<code>wwwroot-src/src/components/topo/transformerEditors.ts</code> — that is the source of truth for both the
switchboard and the Control Tree. A new kind must be registered there,
not merely dropped in the folder. &ldquo;topo&rdquo; means coordinate <strong>transformers</strong>, not mesh topology.
Documented in <a class="xref" href="../../geom/index.html">Geometry Panels</a> and
<a class="xref" href="../../geom/transformer-panel.html">Transformer Select Panel</a>.</li>
Documented in <a class="xref" href="../geom/index.html">Geometry Panels</a> and
<a class="xref" href="../geom/transformer-panel.html">Transformer Select Panel</a>.</li>
<li><code>wwwroot-src/src/components/widgets/</code> — the reusable input library: numeric, vector and matrix
inputs, the file-path input and picker, the CodeMirror text editor, the display-options and
object-management menus. Documented in <a class="xref" href="../../widget/index.html">Widgets</a>.</li>
object-management menus. Documented in <a class="xref" href="../widget/index.html">Widgets</a>.</li>
<li><code>wwwroot-src/src/components/panels/</code> — pure layout machinery with no domain: the collapsible
expansion panel and the resizable stack whose registration contract produces the &ldquo;rows collapse in
place&rdquo; behaviour the tree pages describe. Documented in
<a class="xref" href="../../platform/control-tree.html">Control Tree</a>, whose dock rows are both expansion rows, and
<a class="xref" href="../../platform/session-state.html">Session State</a> for the keep-mounted flag that decides whether a
<a class="xref" href="../platform/control-tree.html">Control Tree</a>, whose dock rows are both expansion rows, and
<a class="xref" href="../platform/session-state.html">Session State</a> for the keep-mounted flag that decides whether a
collapse unmounts its content.</li>
<li><code>wwwroot-src/src/components/mission/</code>, <code>.../toolhouse/</code>, <code>.../spindle/</code>, <code>.../preference/</code>,
<code>.../mech/</code>, <code>.../workpiece/</code> and <code>.../controller/</code> — the domain and page folders named above. The
@@ -212,21 +212,21 @@ behind every hub composable, so a hub opens only while something consumes it.
<code>wwwroot-src/src/composables/useToolHouse.ts</code> and <code>wwwroot-src/src/composables/useSpindleCapability.ts</code> are module-level
singletons, not per-component instances. <code>wwwroot-src/src/composables/useViewPrefs.ts</code> stores layout state in the
browser only — it is neither in the project file nor in the server's user config. Documented in
<a class="xref" href="../../platform/session-state.html">Session State</a>.</li>
<a class="xref" href="../platform/session-state.html">Session State</a>.</li>
<li><code>wwwroot-src/src/stores/</code> — four Pinia stores. <code>wwwroot-src/src/stores/index.ts</code> is <strong>not</strong> a barrel; it is the
Quasar factory. Most shared state lives in <code>composables/</code> instead. Documented in
<a class="xref" href="../../platform/session-state.html">Session State</a>.</li>
<a class="xref" href="../platform/session-state.html">Session State</a>.</li>
<li><code>wwwroot-src/src/router/</code><code>wwwroot-src/src/router/routes.ts</code> is the table plus the legacy redirects, and
<code>wwwroot-src/src/router/treeRoutes.ts</code> is the load-bearing file its name understates: it holds the accumulated
chain of tree-id renames and the id → page resolver, plus the tab-name constants both the router
and the tab composable consume. A route's <code>meta.title</code> holds an i18n key, not a title.
Documented in <a class="xref" href="../../platform/tree-ids-and-routes.html">Tree Ids and Routes</a>.</li>
Documented in <a class="xref" href="../platform/tree-ids-and-routes.html">Tree Ids and Routes</a>.</li>
<li><code>wwwroot-src/src/i18n/</code> — three locales shipped together, each a list of namespace files.
<strong>English is the schema</strong>, not merely a locale: the two Chinese bundles are typed against it, so a
key present in English and missing there is a build error. Keys are split by UI region rather than
by source file, so there is no one-to-one mapping between an i18n file and a components folder.
Documented in <a class="xref" href="../../platform/i18n.html">Internationalization</a> and
<a class="xref" href="../../conventions/translation-remarks.html">Translation Remarks</a>.</li>
Documented in <a class="xref" href="../platform/i18n.html">Internationalization</a> and
<a class="xref" href="../conventions/translation-remarks.html">Translation Remarks</a>.</li>
<li><code>wwwroot-src/src/pages/</code> — one file per route, and page size is a poor guide to importance: the
General Setup page is small because it delegates almost everything to the Control Tree dock and the
equipment canvas, while the File Explorer page is a thin wrapper around a large shared component.</li>
@@ -237,9 +237,9 @@ is a separate, shorter toast scale.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../index.html">Anatomy by Source Directory</a> — the other two source trees, and how this
<li><a class="xref" href="index.html">Anatomy by Source Directory</a> — the other two source trees, and how this
layer is meant to be entered</li>
<li><a class="xref" href="../webservice-backend/index.html">Web Service Backend Source Tree</a> — the process that
<li><a class="xref" href="webservice-backend.html">Web Service Backend Source Tree</a> — the process that
serves this application and answers its REST and hub traffic</li>
</ul>
@@ -380,6 +380,8 @@ ownership rules that keep them on the project</li>
<li><a class="xref" href="../../platform/control-tree.html">Control Tree</a> — the engine that builds, rebuilds and selects this branch</li>
<li><a class="xref" href="../../legacy-controller.html">Legacy Controller Page</a> — the superseded HardNcEnv route this branch replaces, still shipped
at <code>/controller</code></li>
<li><a class="xref" href="../../legacy-controller-settings.html">Legacy Controller Settings</a> — the model that route edits, what this branch shares with
it, and the three settings it holds alone</li>
</ul>
</article>
@@ -117,13 +117,18 @@ Heidenhain after the rightmost <code>DR+</code>/<code>DR-</code> and <code>RL</c
holds — and the shape of the source note the optimizer embeds, a <code>;</code> comment on Heidenhain and a
parenthesized one on the rest. The radius-compensation syntax all five presets
carry reads it too, raising its negative-radius validation warning only where the marker is
Heidenhain. <strong>The piece classifier does not read it</strong>: none of its re-interpolation guards is
keyed on the brand, and the guard that singles a klartext arc out is keyed on where the arc's
centre came from. So an arc centred on a modal <code>CC</code> line splits like any other, and the one
refused (<code>NcOpt--SplitionStartPointCenterUnsupported</code>) is the arc whose <code>CC</code> chain left an
in-plane coordinate for its own start point to supply. An arc whose centre falls entirely on its
start point never reaches that guard: with no radius it is not an arc at all, so it warns
<code>Arc-CircleCenter--OnStartPoint</code> and is degraded to a chord as the program is read.</p>
Heidenhain. <strong>The piece classifier does not read it</strong>: neither of its re-interpolation guards is keyed
on the brand — one keys on where the arc's centre came from, the other on the piece's own
incremental words. So a klartext arc centred on a
modal <code>CC</code> line splits like any other, provided the chain supplies both in-plane centre coordinates
and the <code>C</code> block states its own words absolutely; an incomplete chain
(<code>NcOpt--SplitionStartPointCenterUnsupported</code>) and an incremental word on the block itself
(<code>NcOpt--SplitionIncrementalUnsupported</code>) are each optimized as whole lines, and
<a class="xref" href="../../../../technique/nc-dialects/controller-heidenhain.html">Heidenhain Support</a> states both. An arc whose centre falls
entirely on its start point never reaches the centre guard: with no radius it is not an arc at all,
so it warns <code>Arc-CircleCenter--OnStartPoint</code> and is degraded to a chord as the program is read. The
incremental guard is not conditioned on the block being an arc, so a degraded chord that still
carries an <code>I</code> word trips it like any other line.</p>
<p>Each of the five properties returns a <strong>new instance per read</strong>, so no two projects can share one
preset and the returned runner is safe to mutate before it is installed. The five brand tokens are
declared once as constants on the brand dependency and are then enumerated again, independently, in
@@ -531,7 +536,8 @@ one free-form string property, with no behaviour of its own; its readers live el
<li><code>HiMech/NcOpt/SoftNcOptProc.cs</code> — where NC optimization reads the marker back out of the session's
effective dependency list, for the writeback grammar.</li>
<li><code>HiMech/NcOpt/NcOptPieceClassifier.cs</code> — the re-interpolation guards, none of them keyed on the
brand; the arc guard keys on the centre's provenance instead.</li>
brand; the two a klartext arc can reach key on the centre's provenance and on the piece's own
incremental words instead.</li>
<li><code>HiMech/NcParsers/Keywords/Generic/ArcCenterSource.cs</code> — the two centre-provenance stamps: the one
the arc guard refuses, and the one that tells the writeback a split arc's fragments share the <code>CC</code>
line unchanged. An arc whose own block states its centre carries neither.</li>
@@ -317,7 +317,8 @@ tool length low.</p>
missing pair and the millimetre value it used instead. A fallback that finds <code>NaN</code> — the sentinel the
generic ledger's tool-house refresh writes for a tool whose tip length does not resolve — raises a
configuration warning of its own and degrades to 0 rather than composing a non-finite translation.
Both carry the code <code>SiemensToolOffset--TcdpRowMissing</code>.</p>
The usable-height arm carries the code <code>SiemensToolOffset--TcdpRowMissing</code>; the <code>NaN</code> arm carries
<code>SiemensToolOffset--TcdpRowMissingGenericHeightNaN</code>.</p>
<p>The fallback crosses the sign boundary. What it reads out of the generic table is that table's own
effective height, ideal minus wear; what it substitutes is a <code>$TC_DP</code> height, geometry plus wear. A
project that keeps wear in both places therefore compensates in one direction while the row exists
@@ -143,7 +143,12 @@ from different things and can disagree — one of the departures catalogued in
<a class="xref" href="../editing-contract.html">Editing Contract</a>.</p>
<h2 id="what-a-row-holds">What a Row Holds</h2>
<p>The table is the Fanuc Memory C layout: the H number and the D number address the same row, so one
row carries both the length and the radius of one offset.</p>
row carries both the length and the radius of one offset. Fanuc's older memory types are narrower —
Memory A keeps a single value per offset number (no geometry/wear split, and H and D read the same
number), Memory B splits geometry from wear but still lets H and D share one value — so a program
written for those controls calls the radius by a different number than the length (<code>G43 H3</code> with
<code>G41 D33</code>, say). A program that pairs <code>H3</code> with <code>D3</code> therefore presupposes Memory C, which is what
this table models; on the older types the same words would compensate the radius by the tool length.</p>
<table>
<thead>
<tr>
@@ -203,8 +208,9 @@ less the radial wear, and those two are exactly what
shortens the compensation and a negative wear lengthens it. Nothing in the panel states this: the
four column headers name the components and no footnote names the operation, which is why the rule
belongs here. An offset number the table holds no row for is not an error either: both getters
answer 0 for it, and neither the ISO height path nor the radius side reports the miss — a mistyped H
is a zero-length compensation that plays to the end of the program without a warning.</p>
answer 0 for it and the program plays on with a zero compensation — each side reports the miss
once, from the block that selects the row (<code>Comp-ToolHeight--RowMissing</code> on the H word,
<code>RadiusComp--RowMissing</code> on the D word), and nothing else marks it.</p>
<div class="WARNING">
<h5>Warning</h5>
<p><strong>The neighbouring Siemens ledger uses the opposite convention.</strong> On
@@ -234,6 +240,18 @@ signed rather than absolute. A negative effective radius — a radial wear large
radius — is accepted, and it offsets the path to the opposite of the programmed side. On the first
block of a compensation move the parser raises a validation warning for that case on Heidenhain
only, mirroring the look-ahead check a TNC control performs; the other brands take it silently.</p>
<p>An effective radius larger than the inner radius of the contour it compensates is a different
case. The compensated path then runs against the programmed direction — an inner arc smaller than
the offset, or an inner step shorter than it — and a control stops there (Fanuc alarm PS0041,
<em>interference in cutter compensation</em>). Both engines report it as the validation warning
<code>RadiusComp--Interference</code> on the offending block and keep playing the swapped-side path, so the
run stays inspectable. The usual cause is this table rather than the program: a CAM post that emits
the <strong>tool-centre path</strong> and leaves <code>G41 D..</code> in place expects the D row to hold the <strong>wear only</strong>,
so the ideal radius of such a row is 0 — and a tool-house refresh left on its cutter-radius basis
writes the cutter's real radius into every row and silently turns that program into an overcut. The
<a href="#the-radius-basis">radius basis</a> below is what tells the refresh which strategy the program follows;
the tell-tale signs of a tool-centre program are lead-in and lead-out arcs smaller than the tool
radius and a finishing contour that lies one tool radius inside the wall.</p>
<h3 id="the-macro-variable-window">The macro-variable window</h3>
<p>On the Fanuc, Mazak and Syntec syntax lists a variable lookup maps <code>#2001</code> through <code>#2200</code> onto the
effective <strong>height</strong> of offsets 1 through 200, so a macro program can read the same subtraction the
@@ -265,6 +283,46 @@ panel's catalogued departures from <a class="xref" href="../editing-contract.htm
<li>Row CRUD disappears: the <strong>Add</strong> button is not rendered and each row's delete button becomes a
grey em dash. A <strong>Refresh from Tool House</strong> button appears next to the toggle in their place.</li>
</ul>
<h3 id="the-radius-basis">The radius basis</h3>
<p>Length and radius do not follow the tool house the same way, because shops post their programs under
two cutter-compensation strategies and only one of them wants the cutter's radius in the table:</p>
<table>
<thead>
<tr>
<th>Basis</th>
<th>The NC path is</th>
<th>The D row holds</th>
<th>A refresh writes to <strong>Ideal Radius</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Cutter radius</strong></td>
<td>the part contour; the control offsets it by the tool radius</td>
<td>geometry (the cutter radius) plus wear</td>
<td>the largest radius on the cutter profile</td>
</tr>
<tr>
<td><strong>Zero-based</strong></td>
<td>the tool-centre path — the CAM system already offset it, <code>G41 D..</code> stays in the program</td>
<td>the wear only; geometry is 0</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>The basis is a project-level setting — <a class="xref" href="../../../../api/Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_RadiusOffsetBasis">RadiusOffsetBasis</a>
(<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html">RadiusOffsetBasis</a>, serialized beside the tool-house
dependence, default <em>cutter radius</em> so an older project refreshes exactly as before) — chosen from the
<strong>Radius basis</strong> select in the panel's toolbar and written through
<code>PUT api/mech/soft-nc-runner/tool-offsets/radius-basis</code>. Every refresh honours it: the button, the
play-time refresh while the dependence is on, and both refresh endpoints. The height side is untouched by
the choice; the wear columns are never written by any refresh.</p>
<p>Pick the basis from the program, not from habit: a zero-based program shows lead-in and lead-out arcs
whose radius is smaller than the tool radius and a finishing contour one tool radius inside the wall
it produces (a Ø8 end mill following a circle of radius 2.5 is finishing a Ø13 bore, not a Ø5 one);
a cutter-radius program draws the part contour itself. Refreshing a zero-based program on the
cutter-radius basis is the overcut the radius side reports as <code>RadiusComp--Interference</code> — see
<a href="#how-the-radius-reaches-the-path">How the radius reaches the path</a>.</p>
<h3 id="the-table-does-not-otherwise-track-the-tool-library">The table does not otherwise track the tool library</h3>
<p>Offset number and tool id are independent integers, and with the dependence off nothing reconciles
them. A row may name a number the project's tool library has never held, and the library may hold
@@ -275,8 +333,8 @@ as written. The library itself is edited on <a class="xref" href="../../../tool-
<p>One endpoint backs both the button and the toggle, and it runs three steps. For every tool in the
project's library it writes the ideal height from that tool's spindle-buckle-to-tool-tip length —
<code>NaN</code> where the length does not resolve — and, where the cutter is a milling cutter, the ideal
radius from the largest radius on its cutter profile; a row is created for a library tool that had
none. <strong>It then deletes every row whose number is not in the library.</strong> The wear columns are never
radius by the <a href="#the-radius-basis">radius basis</a>: the largest radius on its cutter profile under
<em>cutter radius</em>, 0 under <em>zero-based</em>; a row is created for a library tool that had none. <strong>It then deletes every row whose number is not in the library.</strong> The wear columns are never
touched.</p>
<p>The engine carries the same three steps of its own, as
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.html#Hi_NcParsers_Dependencys_Generic_ToolOffsetTable_UpdateIdealByToolHouse_">UpdateIdealByToolHouse</a><small>(API)</small>,
@@ -354,9 +412,13 @@ again on every runner assignment.</p>
<ul>
<li><strong>Set ideal offset dependent on tool house</strong> Toggle</li>
<li><strong>Refresh from Tool House</strong> Button — flat, refresh icon; only while the dependence is on</li>
<li><strong>Radius basis</strong> Select — dense, outlined; <strong>Cutter radius (D row = cutter radius; NC is
the part contour)</strong> or <strong>Zero-based (D row holds wear only; NC is the tool-centre path)</strong></li>
<li><strong>Add</strong> Button — primary, add icon, right-aligned; only while the dependence is off</li>
</ul>
</li>
<li>Radius-Basis Hint Line — grey caption under the toolbar, one of two sentences chosen by the
selected basis</li>
<li>Offset Table — dense, flat, bordered
<ul>
<li>Header Row — <strong>Tool #</strong>, <strong>Ideal Height (mm)</strong>, <strong>Axial Wear (mm)</strong>, <strong>Ideal Radius (mm)</strong>,
@@ -134,7 +134,7 @@ project directory. Load / Save As / Copy / Paste / XML.</li>
</li>
<li><code>equipment/fixture/geometry</code>&ldquo;Geometry&rdquo;, a Geometry slot backing
<a class="xref" href="../../api/Hi.NcMech.Fixtures.Fixture.html#Hi_NcMech_Fixtures_Fixture_Geom">Geom</a>. The slot's own panel is the kind picker
(<a class="xref" href="../geom/geom-manage-control.html">Geometry Management Control</a>, selector only); the picked kind's
(<a class="xref" href="../geom/geometry-editor.html">Geometry Management Control</a>, selector only); the picked kind's
editor is the slot's child item. Kinds offered: <code>Box3d</code>, <code>Cylindroid</code>, <code>StlFile</code>,
<code>TransformationGeom</code>, <code>GeomCombination</code>, plus None. The geometry must satisfy <code>IStlSource</code>, so the
runtime-only voxel <code>CubeTreeFile</code> is not among them.</li>
@@ -120,7 +120,8 @@ surface, editing a different model from the branch above.</p>
<li><a class="xref" href="../platform/control-tree.html">Control Tree</a> — the engine behind this page's tree: how a branch is built, rebuilt and selected</li>
<li><a href="controller/index.html">Controller Branch</a> — the branch this page hosts whose node set changes with the controller brand</li>
<li><a href="hidden-controllers.html">Hidden Controller Branches</a> — the two equipment nodes this page withholds until a preference or a link asks for them</li>
<li><a class="xref" href="../legacy-controller.html">Legacy Controller</a> — the superseded controller screen at its own route, and the three settings only it edits</li>
<li><a class="xref" href="../legacy-controller.html">Legacy Controller</a> — the superseded controller screen at its own route: its seven tabs, how an edit commits, and its viewer</li>
<li><a class="xref" href="../legacy-controller-settings.html">Legacy Controller Settings</a> — the model that screen edits, and the three settings the equipment tree has no editor for</li>
</ul>
</article>
@@ -108,16 +108,16 @@ geometry, anchors, mesh and material are all edited through the child items belo
</li>
<li><code>equipment/workpiece/raw-geometry</code>&ldquo;Raw Geometry&rdquo;, a Geometry slot backing
<a class="xref" href="../../api/Hi.NcMech.Workpieces.Workpiece.html#Hi_NcMech_Workpieces_Workpiece_InitGeom">InitGeom</a>. The slot's own panel is the kind picker
(<a class="xref" href="../geom/geom-manage-control.html">Geometry Management Control</a>, selector only); the picked kind's
(<a class="xref" href="../geom/geometry-editor.html">Geometry Management Control</a>, selector only); the picked kind's
editor is the slot's child item. Kinds offered: <code>Box3d</code>, <code>Cylindroid</code>, <code>StlFile</code>,
<code>TransformationGeom</code>, <code>GeomCombination</code>, <code>CubeTreeFile</code>, plus None. <code>ExtendedCylinder</code> is an
<code>IMakeXmlSource</code> and was offered here until its start section — wired by a host, never serialized
— was found to reload a saved project degenerate; see
<a class="xref" href="../geom/extended-cylinder-panel.html">Extended Cylinder Panel</a> for what an older project holding
<a class="xref" href="../geom/extended-cylinder-editor.html">ExtendedCylinder Editor</a> for what an older project holding
one still shows. The source
choice folds into that one picker — picking the voxel <code>CubeTreeFile</code>, which the picker shows as
<code>MeshedGeomFile</code>, <em>is</em> the meshed source (see
<a class="xref" href="../geom/meshed-geom-panel.html">Meshed Geometry Panel</a>).</li>
<a class="xref" href="../geom/meshed-geom-file-editor.html">MeshedGeomFile Editor</a>).</li>
<li><code>equipment/workpiece/target-geometry</code>&ldquo;Target Geometry&rdquo;, the same slot shape backing
<a class="xref" href="../../api/Hi.NcMech.Workpieces.Workpiece.html#Hi_NcMech_Workpieces_Workpiece_IdealGeom">IdealGeom</a>. Kinds offered: <code>Box3d</code>, <code>Cylindroid</code>, <code>StlFile</code>,
<code>TransformationGeom</code>, plus None. The target must satisfy <code>IGetStl</code>, so <code>CubeTreeFile</code> is not among
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Box3d Control | HiAPI-C# 2025 </title>
<title>Box3d Editor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Box3d Control | HiAPI-C# 2025 ">
<meta name="title" content="Box3d Editor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div>
<article data-uid="Anatomy-Box3dControl">
<h1 id="box3d-control">Box3d Control</h1>
<h1 id="box3d-editor">Box3d Editor</h1>
<p>The Box3d editor edits an axis-aligned <a class="xref" href="../../api/Hi.Geom.Box3d.html">Box3d</a> through four vector rows — Min, Max,
Dimension and Center — of which an <strong>Edit Mode</strong> selector decides which two are writable. It is
@@ -148,7 +148,7 @@ entry. There is deliberately no update wrapper here; the editor posts the update
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="geom-manage-control.html">Geometry Management Panel</a> — the switchboard that offers this kind and
<li><a href="geometry-editor.html">Geometry Editor</a> — the switchboard that offers this kind and
hosts this editor</li>
</ul>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Cylindroid Control | HiAPI-C# 2025 </title>
<title>Cylindroid Editor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Cylindroid Control | HiAPI-C# 2025 ">
<meta name="title" content="Cylindroid Editor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div>
<article data-uid="Anatomy-CylindroidControl">
<h1 id="cylindroid-control">Cylindroid Control</h1>
<h1 id="cylindroid-editor">Cylindroid Editor</h1>
<p>The Cylindroid editor edits a <a class="xref" href="../../api/Hi.Geom.Cylindroid.html">Cylindroid</a> — a solid of revolution defined by a list of
(Z, R) pairs — as a table of rows, with a minimum of two. It is reached from any Geometry slot that
@@ -152,7 +152,7 @@ Tool House host.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="geom-manage-control.html">Geometry Management Panel</a> — the switchboard that offers this kind and
<li><a href="geometry-editor.html">Geometry Editor</a> — the switchboard that offers this kind and
hosts this editor</li>
<li><a class="xref" href="../tool-house/holder/cylindroid-holder-panel.html">Cylindroid Holder Panel</a> — the second host, and the surface
that owns the tessellation resolution</li>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Extended Cylinder Panel | HiAPI-C# 2025 </title>
<title>ExtendedCylinder Editor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Extended Cylinder Panel | HiAPI-C# 2025 ">
<meta name="title" content="ExtendedCylinder Editor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div>
<article data-uid="Anatomy-ExtendedCylinderPanel">
<h1 id="extended-cylinder-panel">Extended Cylinder Panel</h1>
<h1 id="extendedcylinder-editor">ExtendedCylinder Editor</h1>
<p>The Extended Cylinder editor edits one number on an <a class="xref" href="../../api/Hi.Geom.ExtendedCylinder.html">ExtendedCylinder</a>: its full
length, measured from <code>Z=0</code> and <strong>including the span below the start section</strong>. Its only home on
@@ -174,7 +174,7 @@ the geometry-issue warnings it surfaces.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="geom-manage-control.html">Geometry Management Panel</a> — the switchboard that offers this kind and
<li><a href="geometry-editor.html">Geometry Editor</a> — the switchboard that offers this kind and
hosts this editor</li>
<li><a class="xref" href="../tool-house/cutter/milling-cutter-panel.html">Milling Cutter Panel</a> — the cutter whose Upper Beam is this
editor's real home, and the one surface that supplies a start section</li>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Geometry Combination Control | HiAPI-C# 2025 </title>
<title>GeomCombination Editor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Geometry Combination Control | HiAPI-C# 2025 ">
<meta name="title" content="GeomCombination Editor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div>
<article data-uid="Anatomy-GeomCombinationControl">
<h1 id="geometry-combination-control">Geometry Combination Control</h1>
<h1 id="geomcombination-editor">GeomCombination Editor</h1>
<p>A <a class="xref" href="../../api/Hi.Geom.GeomCombination.html">GeomCombination</a> is several geometries treated as one, and it has <strong>two faces</strong>: an
inline editor that renders every child's own editor at once, and a Control-Tree panel that manages
@@ -164,7 +164,7 @@ cache.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="geom-manage-control.html">Geometry Management Panel</a> — the switchboard that offers this kind, and
<li><a href="geometry-editor.html">Geometry Editor</a> — the switchboard that offers this kind, and
the panel each child card embeds</li>
</ul>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Geometry Management Panel | HiAPI-C# 2025 </title>
<title>Geometry Editor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Geometry Management Panel | HiAPI-C# 2025 ">
<meta name="title" content="Geometry Editor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div>
<article data-uid="Anatomy-GeomManageControl">
<h1 id="geometry-management-panel">Geometry Management Panel</h1>
<h1 id="geometry-editor">Geometry Editor</h1>
<p>The geometry switchboard is one control: a kind picker over the kinds its host allows, and — unless
the host asked for the picker alone — the picked kind's editor beneath it. It binds a
@@ -206,14 +206,14 @@ the host's own field, and the ones that accept <code>None</code> and store null.
<ul>
<li><a class="xref" href="../util/mech-builder.html">Mechanism Builder Page</a> — embeds this control under its anchor
editor</li>
<li><a href="box3d-control.html">Box3d Control</a> — the kind editors this switchboard resolves</li>
<li><a href="cylindroid-control.html">Cylindroid Control</a> — the same, for a solid of revolution</li>
<li><a href="extended-cylinder-panel.html">Extended Cylinder Panel</a> — the same, and the kind exactly one host offers</li>
<li><a href="stlfile-control.html">STL File Control</a> — the same, for an STL reference</li>
<li><a href="meshed-geom-panel.html">Meshed Geometry Panel</a> — the same, for a voxel cube tree</li>
<li><a href="transformation-geom-control.html">Transformation Geometry Control</a> — one of the container kinds
<li><a href="box3d-editor.html">Box3d Editor</a> — the kind editors this switchboard resolves</li>
<li><a href="cylindroid-editor.html">Cylindroid Editor</a> — the same, for a solid of revolution</li>
<li><a href="extended-cylinder-editor.html">ExtendedCylinder Editor</a> — the same, and the kind exactly one host offers</li>
<li><a href="stlfile-editor.html">StlFile Editor</a> — the same, for an STL reference</li>
<li><a href="meshed-geom-file-editor.html">MeshedGeomFile Editor</a> — the same, for a voxel cube tree</li>
<li><a href="transformation-geom-editor.html">TransformationGeom Editor</a> — one of the container kinds
this panel offers, and why picking it replaces rather than wraps</li>
<li><a href="geom-combination-control.html">Geometry Combination Control</a> — the other container kind, whose
<li><a href="geom-combination-editor.html">GeomCombination Editor</a> — the other container kind, whose
every child embeds this panel again</li>
</ul>
@@ -89,14 +89,14 @@
<p>The Geometry Panels are the editors for <a class="xref" href="../../technique/api-foundations/basic-geometry.html">Geometry Objects</a>, together
with the switchboard that picks which <a class="xref" href="../../api/Hi.Mech.Topo.ITransformer.html">ITransformer</a> places them. Two switchboards
run the folder: the <a href="geom-manage-control.html">Geometry Management Panel</a> chooses a geometry kind and
run the folder: the <a href="geometry-editor.html">Geometry Editor</a> chooses a geometry kind and
hosts that kind's editor, and the <a href="transformer-panel.html">Transformer Select Panel</a> does the same for
a transformer.</p>
<p>On the shipped SPA a Control Tree is where both switchboards are usually met. A <strong>Geometry slot</strong> or
a <strong>Transformer slot</strong> carries the kind picker, and the picked kind becomes the slot's single child
node, whose panel is that kind's editor. The same editors are also embedded inline, without a tree —
by <a href="transformation-geom-control.html">Transformation Geometry Control</a> for its inner geometry and inner
transformer, by <a href="geom-combination-control.html">Geometry Combination Control</a> for each child, by the
by <a href="transformation-geom-editor.html">TransformationGeom Editor</a> for its inner geometry and inner
transformer, by <a href="geom-combination-editor.html">GeomCombination Editor</a> for each child, by the
Mechanism Builder page, and by the Tool House cutter's upper beam.</p>
<p>A page belongs in this folder when it documents one geometry kind's editor, or a switchboard that
picks a kind and hosts that editor. The transformer switchboard lives beside the geometry kinds
@@ -114,31 +114,31 @@ then the operators that wrap and combine them, and last the two switchboards tha
</thead>
<tbody>
<tr>
<td><a href="box3d-control.html">Box3d Control</a></td>
<td><a href="box3d-editor.html">Box3d Editor</a></td>
<td>A 3D box defined by min/max coordinates</td>
</tr>
<tr>
<td><a href="cylindroid-control.html">Cylindroid Control</a></td>
<td><a href="cylindroid-editor.html">Cylindroid Editor</a></td>
<td>A cylindroid with radius values along the Z axis</td>
</tr>
<tr>
<td><a href="extended-cylinder-panel.html">Extended Cylinder Panel</a></td>
<td><a href="extended-cylinder-editor.html">ExtendedCylinder Editor</a></td>
<td>An <a class="xref" href="../../api/Hi.Geom.ExtendedCylinder.html">ExtendedCylinder</a> and its full length</td>
</tr>
<tr>
<td><a href="stlfile-control.html">STL File Control</a></td>
<td><a href="stlfile-editor.html">StlFile Editor</a></td>
<td>An <a class="xref" href="../../api/Hi.Geom.IStlSource.html">IStlSource</a> loaded from an STL file</td>
</tr>
<tr>
<td><a href="meshed-geom-panel.html">Meshed Geometry Panel</a></td>
<td>A <a class="xref" href="../../api/Hi.Cbtr.CubeTreeFile.html">CubeTreeFile</a>, the pre-computed voxel cube tree; the kind picker shows it as <code>MeshedGeomFile</code></td>
<td><a href="meshed-geom-file-editor.html">MeshedGeomFile Editor</a></td>
<td>A <a class="xref" href="../../api/Hi.Cbtr.CubeTreeFile.html">CubeTreeFile</a>, the pre-computed voxel cube tree; the kind picker and this page name it <code>MeshedGeomFile</code>, the code calls it <code>CubeTreeFile</code></td>
</tr>
<tr>
<td><a href="transformation-geom-control.html">Transformation Geometry Control</a></td>
<td><a href="transformation-geom-editor.html">TransformationGeom Editor</a></td>
<td>An inner geometry plus the transformer that places it</td>
</tr>
<tr>
<td><a href="geom-combination-control.html">Geometry Combination Control</a></td>
<td><a href="geom-combination-editor.html">GeomCombination Editor</a></td>
<td>Several geometries combined into one</td>
</tr>
</tbody>
@@ -157,7 +157,7 @@ own model accepts, so <code>CubeTreeFile</code> reaches only the workpiece's raw
</thead>
<tbody>
<tr>
<td><a href="geom-manage-control.html">Geometry Management Panel</a></td>
<td><a href="geometry-editor.html">Geometry Editor</a></td>
<td>The geometry kind picker and the picked kind's editor</td>
</tr>
<tr>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Meshed Geometry Panel | HiAPI-C# 2025 </title>
<title>MeshedGeomFile Editor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Meshed Geometry Panel | HiAPI-C# 2025 ">
<meta name="title" content="MeshedGeomFile Editor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div>
<article data-uid="Anatomy-MeshedGeomPanel">
<h1 id="meshed-geometry-panel">Meshed Geometry Panel</h1>
<h1 id="meshedgeomfile-editor">MeshedGeomFile Editor</h1>
<p>The meshed-geometry editor points a geometry at a pre-computed voxel cube tree in a <code>.wct</code> file. Its
model is <a class="xref" href="../../api/Hi.Cbtr.CubeTreeFile.html">CubeTreeFile</a>, a <em>reference</em> to that file: neither the editor nor the
@@ -155,9 +155,9 @@ builds the meshed geometry for the canvas, and the display toggle that shows it.
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="geom-manage-control.html">Geometry Management Panel</a> — the switchboard that offers this kind and
<li><a href="geometry-editor.html">Geometry Editor</a> — the switchboard that offers this kind and
hosts this editor</li>
<li><a href="stlfile-control.html">STL File Control</a> — the other file-backed kind, and the one this slot offers
<li><a href="stlfile-editor.html">StlFile Editor</a> — the other file-backed kind, and the one this slot offers
beside it</li>
</ul>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>STL File Control | HiAPI-C# 2025 </title>
<title>StlFile Editor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="STL File Control | HiAPI-C# 2025 ">
<meta name="title" content="StlFile Editor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div>
<article data-uid="Anatomy-StlFileControl">
<h1 id="stl-file-control">STL File Control</h1>
<h1 id="stlfile-editor">StlFile Editor</h1>
<p>The STL file editor points a geometry at an <code>.stl</code> file rather than describing a shape: the model
holds a file reference, and the editor is a picker over it plus a read-only summary of what was
@@ -171,9 +171,9 @@ the caller's own rendering connection and superseded as the selection moves.</li
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="geom-manage-control.html">Geometry Management Panel</a> — the switchboard that offers this kind and
<li><a href="geometry-editor.html">Geometry Editor</a> — the switchboard that offers this kind and
hosts this editor</li>
<li><a href="meshed-geom-panel.html">Meshed Geometry Panel</a> — the other file-backed kind, and the one the
<li><a href="meshed-geom-file-editor.html">MeshedGeomFile Editor</a> — the other file-backed kind, and the one the
workpiece's raw geometry offers beside this one</li>
<li><a class="xref" href="../util/stl-preview-pane.html">STL Preview Pane</a> — the preview the picker opens on an <code>.stl</code> row
before the pick is confirmed</li>
@@ -16,31 +16,31 @@
<a href="index.html" name="" title="Overview">Overview</a>
</li>
<li>
<a href="box3d-control.html" name="" title="Box3d Control">Box3d Control</a>
<a href="box3d-editor.html" name="" title="Box3d Editor">Box3d Editor</a>
</li>
<li>
<a href="cylindroid-control.html" name="" title="Cylindroid Control">Cylindroid Control</a>
<a href="cylindroid-editor.html" name="" title="Cylindroid Editor">Cylindroid Editor</a>
</li>
<li>
<a href="extended-cylinder-panel.html" name="" title="Extended Cylinder Panel">Extended Cylinder Panel</a>
<a href="extended-cylinder-editor.html" name="" title="ExtendedCylinder Editor">ExtendedCylinder Editor</a>
</li>
<li>
<a href="stlfile-control.html" name="" title="STL File Control">STL File Control</a>
<a href="stlfile-editor.html" name="" title="StlFile Editor">StlFile Editor</a>
</li>
<li>
<a href="geom-combination-control.html" name="" title="Geometry Combination Control">Geometry Combination Control</a>
<a href="geom-combination-editor.html" name="" title="GeomCombination Editor">GeomCombination Editor</a>
</li>
<li>
<a href="meshed-geom-panel.html" name="" title="Meshed Geometry Panel">Meshed Geometry Panel</a>
<a href="meshed-geom-file-editor.html" name="" title="MeshedGeomFile Editor">MeshedGeomFile Editor</a>
</li>
<li>
<a href="transformation-geom-control.html" name="" title="Transformation Geometry Control">Transformation Geometry Control</a>
<a href="transformation-geom-editor.html" name="" title="TransformationGeom Editor">TransformationGeom Editor</a>
</li>
<li>
<a href="transformer-panel.html" name="" title="Transformer Panel">Transformer Panel</a>
</li>
<li>
<a href="geom-manage-control.html" name="" title="Geometry Management Panel">Geometry Management Panel</a>
<a href="geometry-editor.html" name="" title="Geometry Editor">Geometry Editor</a>
</li>
</ul>
</div>
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Box3d Control","href":"box3d-control.html","topicHref":"box3d-control.html"},{"name":"Cylindroid Control","href":"cylindroid-control.html","topicHref":"cylindroid-control.html"},{"name":"Extended Cylinder Panel","href":"extended-cylinder-panel.html","topicHref":"extended-cylinder-panel.html"},{"name":"STL File Control","href":"stlfile-control.html","topicHref":"stlfile-control.html"},{"name":"Geometry Combination Control","href":"geom-combination-control.html","topicHref":"geom-combination-control.html"},{"name":"Meshed Geometry Panel","href":"meshed-geom-panel.html","topicHref":"meshed-geom-panel.html"},{"name":"Transformation Geometry Control","href":"transformation-geom-control.html","topicHref":"transformation-geom-control.html"},{"name":"Transformer Panel","href":"transformer-panel.html","topicHref":"transformer-panel.html"},{"name":"Geometry Management Panel","href":"geom-manage-control.html","topicHref":"geom-manage-control.html"}]}
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Box3d Editor","href":"box3d-editor.html","topicHref":"box3d-editor.html"},{"name":"Cylindroid Editor","href":"cylindroid-editor.html","topicHref":"cylindroid-editor.html"},{"name":"ExtendedCylinder Editor","href":"extended-cylinder-editor.html","topicHref":"extended-cylinder-editor.html"},{"name":"StlFile Editor","href":"stlfile-editor.html","topicHref":"stlfile-editor.html"},{"name":"GeomCombination Editor","href":"geom-combination-editor.html","topicHref":"geom-combination-editor.html"},{"name":"MeshedGeomFile Editor","href":"meshed-geom-file-editor.html","topicHref":"meshed-geom-file-editor.html"},{"name":"TransformationGeom Editor","href":"transformation-geom-editor.html","topicHref":"transformation-geom-editor.html"},{"name":"Transformer Panel","href":"transformer-panel.html","topicHref":"transformer-panel.html"},{"name":"Geometry Editor","href":"geometry-editor.html","topicHref":"geometry-editor.html"}]}
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Transformation Geometry Control | HiAPI-C# 2025 </title>
<title>TransformationGeom Editor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Transformation Geometry Control | HiAPI-C# 2025 ">
<meta name="title" content="TransformationGeom Editor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div>
<article data-uid="Anatomy-TransformationGeomControl">
<h1 id="transformation-geometry-control">Transformation Geometry Control</h1>
<h1 id="transformationgeom-editor">TransformationGeom Editor</h1>
<p>A <a class="xref" href="../../api/Hi.Geom.TransformationGeom.html">TransformationGeom</a> is an inner geometry plus the transformer that places it, and the
editor is those two things side by side. It has two faces: an embedded two-card editor,
@@ -97,14 +97,14 @@ nodes.</p>
container-aware create endpoint, which constructs a fresh instance and discards whatever was
there. There is no operation anywhere that wraps an existing geometry into a transformation
geometry, or extracts it back out — see
<a href="geom-manage-control.html">Geometry Management Panel</a>.</p>
<a href="geometry-editor.html">Geometry Editor</a>.</p>
</div>
<h2 id="layout">Layout</h2>
<h3 id="the-embedded-editor">The embedded editor</h3>
<p>Two bordered cards, each badged with the live type behind it, over a short explanation of what a
transformer applied to a geometry means:</p>
<ul>
<li><strong>Inner Geometry</strong> (<code>.../inner-geom</code>) — the full <a href="geom-manage-control.html">Geometry Management Panel</a>,
<li><strong>Inner Geometry</strong> (<code>.../inner-geom</code>) — the full <a href="geometry-editor.html">Geometry Editor</a>,
its dropdown labelled <em>Inner geometry type</em>, over five kinds: Box3d, Cylindroid, StlFile, a nested
TransformationGeom and GeomCombination — which is what makes recursion and nesting legal — plus a
<strong>None (unset)</strong> entry.</li>
@@ -177,7 +177,7 @@ the store the two aliases are registered into.</li>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../technique/mechanism/transformers.html">Transformers</a></li>
<li><a href="geom-manage-control.html">Geometry Management Panel</a> — the switchboard this editor embeds for its
<li><a href="geometry-editor.html">Geometry Editor</a> — the switchboard this editor embeds for its
inner geometry, and the only place a wrap or extract exists</li>
<li><a class="xref" href="transformer-panel.html">Transformer Select Panel</a> — the inner-transformer picker and its seven
kinds</li>
@@ -104,7 +104,7 @@ occupies a transformer-valued slot and edits the one that is there. For the mode
<code>.../inner-transformer</code> child is a Transformer slot too.</p>
<p>Two surfaces embed the panel outside any tree — the <a class="xref" href="../util/mech-builder.html">Mechanism Builder Page</a>
(<code>/util/mech-builder</code>), for the selected branch's transformer, and the inner-transformer card of
<a href="transformation-geom-control.html">Transformation Geometry Control</a>.</p>
<a href="transformation-geom-editor.html">TransformationGeom Editor</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Transformer Select Panel
@@ -275,7 +275,7 @@ create endpoints, and the typed wrappers for every update and <code>Index*</code
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../util/mech-builder.html">Mechanism Builder Page</a> — edits a mechanisms per-branch transformer through this switchboard</li>
<li><a href="transformation-geom-control.html">Transformation Geometry Control</a> — embeds this picker as its inner
<li><a href="transformation-geom-editor.html">TransformationGeom Editor</a> — embeds this picker as its inner
transformer, with no kind restriction at all</li>
</ul>
@@ -175,6 +175,7 @@ regroup adds a migration hop. The ids themselves have moved repeatedly.</p>
<li><a href="general-setup/index.html">General Setup Page</a> — The equipment Control Tree: the machine, the spindle envelope, the scene, the fixture, the workpiece and the controller branch</li>
<li><a href="tool-house/index.html">Tool House Page</a> — The tool library and the per-tool editor tabs, cutter and holder</li>
<li><a href="legacy-controller.html">Legacy Controller</a> — The superseded HardNcEnv controller surface and its REST implementation</li>
<li><a href="legacy-controller-settings.html">Legacy Controller Settings</a> — The HardNcEnv model that surface edits: the three settings it owns alone, what it shares with the Controller branch, and the engine files behind both</li>
<li><a href="util/index.html">Utility Pages</a> — The two <code>/util/</code> routes: the File Explorer and the Mechanism Builder</li>
<li><a href="by-source/index.html">By Source Directory</a> — The same knowledge keyed on the source tree instead of the screen: one directory index per half of the flagship</li>
</ul>
@@ -0,0 +1,271 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Legacy Controller Settings | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Legacy Controller Settings | 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-LegacyControllerSettings">
<h1 id="legacy-controller-settings">Legacy Controller Settings</h1>
<p><a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> is the model the Legacy Controller page at <code>/controller/:tab?</code> edits,
and this page is what that model holds: how it stands to the runner the rest of the application
configures, the three settings this screen owns alone, the ones it shares with the Controller Branch
on General Setup, and the one marker class both faces draw a work coordinate with. The screen itself
— its seven tabs, how an edit commits, its object-management chain, its viewer and its layout — is
<a class="xref" href="legacy-controller.html">Legacy Controller Page</a>.</p>
<h2 id="the-model-it-edits-and-the-one-it-does-not">The Model It Edits, and the One It Does Not</h2>
<p>The project carries both models side by side and serializes both. <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> is
loaded from the project's own <code>NcEnv</code> element unconditionally; <a class="xref" href="../api/Hi.NcParsers.NcRunnerSuit.html">NcRunnerSuit</a> — the
runner plus the project's per-case dependency list — is read from its own nested element. The legacy
element is a <em>fallback source</em> for the suit rather than a shared store: a project file that carries
no runner element derives one from the legacy element at load time, and from then on the two drift
apart, because every later edit lands on one of them alone.</p>
<p>The legacy model is still read at play time. The legacy NC runner is constructed over a delegate
onto the project's <code>NcEnv</code>, so installing a replacement through the screen's ⋮ menu propagates
without rewiring, and a project-level switch selects which of the two pipelines plays. That switch
defaults to the SoftNc pipeline and no screen in the web application changes it; it is a scripting
property, <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableSoftNcRunner_">EnableSoftNcRunner</a><small>(API)</small>. The legacy
NC optimisation route is the other live reader: it is taken whenever the switch is off or the
session holds no played SoftNc layers, and it is handed <code>MachiningProject.NcEnv</code> directly.</p>
<h2 id="what-only-this-screen-edits">What Only This Screen Edits</h2>
<p>Three settings on this screen have no editor anywhere else in the web application — neither on the
branch, nor on any other page.</p>
<h3 id="align-p0-and-its-undo-history">Align P0, and its undo history</h3>
<p>The Coordinate Table tab — that is the tab button's label; <strong>ISO Coordinate Table</strong> is the heading
over the panel it opens — carries a third row action beside <strong>P0</strong> and <strong>M0</strong>: <strong>Align P0</strong>, titled
<em>&quot;Move workpiece+fixture so ProgramZero coincides with this ISO entry (mutates
Fixture.GeomToTableTransformer)&quot;</em>. It does not write the coordinate — it writes the <strong>fixture's
geometry-to-table transformer</strong>, moving the workpiece and fixture so that program zero lands on the
offset the row holds. The write goes to the authored setup equipment and reports the edit, so the
runtime face follows at the next rebuild. The branch's Work Coordinates leaf carries P0 and M0 and
no alignment.</p>
<p>The endpoint keeps no undo slot. It answers with the assigned translation plus the transformer as it
stood <strong>before</strong> and <strong>after</strong> the write, both serialized as XML, and the tab holds the history
itself: <strong>Undo Align</strong> and <strong>Redo Align</strong> buttons over two component-local stacks, the undo stack
capped at 32 entries and the oldest dropped past it. A third button sits beside them, <strong>Show on
Display</strong>, which belongs to the viewer rather than to the history: it is a bound toggle over the
<code>IsoCoordinate</code> rendering flag, carrying a <code>visibility</code> / <code>visibility_off</code> icon and writing through
the same flag endpoint the Scene dropdown writes. The two datum tabs carry the same button over
<code>HeidenhainCoordinate</code>. Each step posts a stashed snapshot back to a stateless revert endpoint,
which parses it and assigns the result as the fixture's transformer. Both stacks are cleared
whenever the tab's has-a-project prop changes, and the snapshot the component believes is current is
only what it last saw — a transformer changed from another surface is overwritten wholesale by the
next undo or redo rather than merged.</p>
<p>The engine exposes the same operation as a script call,
<a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_AlignWorkpieceProgramZeroToIso_">AlignWorkpieceProgramZeroToIso</a><small>(API)</small>; the
history is the screen's own.</p>
<h3 id="enable-shortest-rotary-path">Enable Shortest Rotary Path</h3>
<p>The <strong>Config</strong> tab's single toggle writes <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_EnableShortestRotary">EnableShortestRotary</a>, which
constructs <code>true</code>. Its banner reads <em>&quot;<strong>Shortest Rotary Path:</strong> optimises rotary axis motion to use
the shortest angular distance between positions.&quot;</em> On the legacy pipeline the flag gates one step:
each rotary axis of a block is cycled into the ±180° window around the previous block's value. The
toggle is narrower than it reads, because that same cycle is applied unconditionally on
<a class="xref" href="../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a> — the brand branch runs it before the flag is consulted, so
clearing the box changes nothing there.</p>
<p>The runner's dependency layer declares no counterpart: no brand parameter table, no generic config
and no branch leaf carries a shortest-rotary switch. The nearest thing the runner pipeline has is the
Heidenhain <code>M126</code> / <code>M127</code> pair, which is read from the program text rather than from any setting.</p>
<h3 id="heidenhain-master-axis-character">Heidenhain master-axis character</h3>
<p>The <strong>Brand</strong> tab grows a second card while the brand is Heidenhain, holding one select over <code>A</code>,
<code>B</code>, <code>C</code> labelled <strong>Master-axis character</strong>. It writes
<a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_HeidenhainMasterAxisChar">HeidenhainMasterAxisChar</a>, a character face over the integer axis
direction the <code>PLANE … SEQ</code> solution family is resolved against. Reads are normalised: anything that
is not <code>B</code> or <code>C</code> after trimming and upper-casing becomes <code>A</code>. On the runner pipeline the master
rotary is <strong>derived rather than configured</strong> — it is the first declared rotary axis — so the branch
has nothing to expose and no leaf for it.</p>
<h2 id="what-it-shares-with-the-branch">What It Shares With the Branch</h2>
<p>Naming what is <em>not</em> exclusive matters as much. The CNC brand, the stroke limits, the rapid feed,
the tool-change time, the tool offset table with its tool-house dependence, the work coordinates
with their P0 and M0 actions, and the Heidenhain datum preset and datum shift tables all have
editors on the branch — see
<a class="xref" href="general-setup/controller/brand-matrix.html">Brand Matrix</a> for which of those leaves each brand grows. The
<strong>Max Speed (rpm)</strong> column has a counterpart too: on the runner pipeline the rotary speed ceiling is
read from the rapid-feedrate config, and the legacy import funnels this field into it at rpm × 360
deg/min, so the branch's Rapid Feedrates leaf edits the runner-side number.</p>
<p>One control on this screen writes a value the branch also writes. <strong>Set ideal offset dependent on
tool house</strong> is a project-level configuration flag rather than a member of either NC model, and both
the Offset Table tab and the branch's Tool Offsets leaf read and write that one flag. The two
<em>tables</em> stay separate: this tab's <strong>Refresh from Tool House</strong> recomputes
<a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_MillingToolOffsetTable">MillingToolOffsetTable</a> from <a class="xref" href="../api/Hi.Machining.MachiningToolHouse.html">MachiningToolHouse</a>,
while the branch's refresh recomputes the runner's own tool-offset table.</p>
<h2 id="two-faces-of-a-work-coordinate">Two Faces of a Work Coordinate</h2>
<p>The work-coordinate marker is one displayee class serving two providers. The screen's viewer draws
it from <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_IsoCoordinateTable">IsoCoordinateTable</a> — a
<a class="xref" href="../api/Hi.NcParsers.Dependencys.Generic.IsoCoordinateTable.html">IsoCoordinateTable</a> instance owned by the legacy model, which
constructs with <code>G54</code><code>G59</code> and <code>G59.1</code><code>G59.9</code> all at zero. The General Setup canvas builds the
same displayee over the active runner's effective
<a class="xref" href="../api/Hi.NcParsers.Dependencys.IIsoCoordinateConfig.html">IIsoCoordinateConfig</a> instead, which on most brands is the brand
parameter table. Same marker, same code, two stores.</p>
<p>Selecting a row on the ISO Coordinate Table tab writes the marker's id onto the shared Execution
displayee, so it decides which offset the marker draws at. It decides that whether or not the marker
is drawn: all three coordinate flags are off in the shipped rendering-flag set — as are the machine
tool and the cutter, leaving the workpiece, the fixture, the dimension bar and the cutter-location
strip as the four that arrive on — so on an untouched project the selection column moves something
invisible until <strong>Show on Display</strong> is pressed. The datum tabs also carry a single-selection column,
but nothing is sent when it changes — there the selection is a highlight and nothing more.</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/controller/CoordinateTableTab.vue</code><strong>Align P0</strong> with its two
client-side history stacks and their cap, and the <strong>Show on Display</strong> toggle bound to the
<code>IsoCoordinate</code> rendering flag.</li>
<li><code>wwwroot-src/src/components/controller/DatumPresetTab.vue</code> and
<code>wwwroot-src/src/components/controller/DatumShiftTab.vue</code> — the same <strong>Show on Display</strong> button
over <code>HeidenhainCoordinate</code>, and the row selection that is a highlight and nothing more.</li>
<li><code>wwwroot-src/src/components/controller/OffsetTableTab.vue</code><strong>Refresh from Tool House</strong>, and the
two-step toggle over the project-level tool-house dependence flag the branch also writes.</li>
<li><code>wwwroot-src/src/components/controller/ConfigTab.vue</code> — the shortest-rotary toggle and its banner.</li>
<li><code>wwwroot-src/src/components/controller/BrandTab.vue</code> — the Heidenhain master-axis card: its read
normalisation and its write.</li>
<li><code>wwwroot-src/src/api/renderingFlags.ts</code> — the flag indices those toggles write, and which of the
shipped set default on.</li>
<li><code>wwwroot-src/src/api/controller.ts</code> — the typed wrappers over the align and revert endpoints, and
the brand constants these settings are read against.</li>
<li><code>Controller/ControllerController.cs</code> — the align endpoint that snapshots the transformer either
side of the write, and the stateless revert this screen's history posts back to.</li>
</ul>
<h3 id="hiapi-engine">HiAPI Engine</h3>
<ul>
<li><code>HiUniNc/Numerical/HardNcEnv.cs</code> — the model this screen edits: the coordinate, datum and offset
tables, the stroke boxes that construct infinite, the rapid rate and tooling time, the
shortest-rotary flag with its Heidenhain exclusion, and the master-axis character over its integer
direction.</li>
<li><code>HiUniNc/Numerical/HardNcLine.cs</code> — the legacy consumers of two of those settings: the
shortest-rotary path application and the <code>SEQ</code> solve that reads the master-axis direction.</li>
<li><code>HiUniNc/Numerical/MillingToolOffsetTable.cs</code> — the offset table and the tool-house recompute the
Refresh button calls.</li>
<li><code>HiMech/NcParsers/Dependencys/Generic/IsoCoordinateTable.cs</code> — the coordinate table type and the
fifteen G-code keys it constructs with, shared by name with the runner's brand-agnostic table.</li>
<li><code>HiMech/Machining/MachiningEquipmentUtils/MachiningEquipmentUtil.cs</code> — the alignment itself: the
translation written into the fixture's geometry-to-table transformer.</li>
<li><code>HiMech/NcParsers/SoftNcRunner.cs</code> — the legacy import: which legacy fields are funnelled into
which runner dependency, including the rotary speed conversion into the rapid-feedrate config.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/PolarInterpolationUtil.cs</code> — the rotary speed ceiling the runner
pipeline reads, and why it is the rapid-rate bucket rather than a setting of its own.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/Heidenhain/HeidenhainPlaneTiltSyntax.cs</code> — the derived master rotary
on the runner pipeline: the first declared rotary axis, with no configured alternative.</li>
<li><code>HiNc/MachiningProcs/MachiningProject.cs</code> — where both models hang off the project, and the load
path that derives a runner from the legacy element only when no runner element is present.</li>
<li><code>HiNc/MachiningProcs/LocalProjectService.cs</code> — the legacy runner built over a delegate onto the
project's model, and the switch that selects which pipeline is active.</li>
<li><code>HiNc/Numerical/FilePlayers/HardNcRunner.cs</code> — the legacy runner itself.</li>
<li><code>HiNc/MachiningProcs/SessionShell.cs</code> — the scripting face of the pipeline switch and of the
alignment, and the optimisation route that passes the legacy model directly.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="legacy-controller.html">Legacy Controller Page</a> — the screen these settings are edited on: its seven tabs, its commit
and rollback rules, its object-management chain and its viewer</li>
<li><a class="xref" href="general-setup/controller/index.html">Controller Branch</a> — the SoftNcRunner-native controller branch that carries the editors for
everything named above as shared</li>
<li><a class="xref" href="general-setup/index.html">General Setup Page</a> — the page that hosts that branch, and the rest of the equipment tree
beside it</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>
@@ -100,96 +100,9 @@ different models, so an edit on one is invisible to the other.</p>
page, and Anatomy makes no claim that it is stable across versions. The migration hop that keeps
an older 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-model-it-edits-and-the-one-it-does-not">The Model It Edits, and the One It Does Not</h2>
<p>The project carries both models side by side and serializes both. <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> is
loaded from the project's own <code>NcEnv</code> element unconditionally; <a class="xref" href="../api/Hi.NcParsers.NcRunnerSuit.html">NcRunnerSuit</a> — the
runner plus the project's per-case dependency list — is read from its own nested element. The legacy
element is a <em>fallback source</em> for the suit rather than a shared store: a project file that carries
no runner element derives one from the legacy element at load time, and from then on the two drift
apart, because every later edit lands on one of them alone.</p>
<p>The legacy model is still read at play time. The legacy NC runner is constructed over a delegate
onto the project's <code>NcEnv</code>, so installing a replacement through this page's ⋮ menu propagates without
rewiring, and a project-level switch selects which of the two pipelines plays. That switch defaults
to the SoftNc pipeline and no screen in the web application changes it; it is a scripting property,
<a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableSoftNcRunner_">EnableSoftNcRunner</a><small>(API)</small>. The legacy NC
optimisation route is the other live reader: it is taken whenever the switch is off or the session
holds no played SoftNc layers, and it is handed <code>MachiningProject.NcEnv</code> directly.</p>
<h2 id="what-only-this-screen-edits">What Only This Screen Edits</h2>
<p>Three settings on this screen have no editor anywhere else in the web application — neither on the
branch, nor on any other page.</p>
<h3 id="align-p0-and-its-undo-history">Align P0, and its undo history</h3>
<p>The Coordinate Table tab — that is the tab button's label; <strong>ISO Coordinate Table</strong> is the heading over the panel it opens — carries a third row action beside <strong>P0</strong> and <strong>M0</strong>: <strong>Align P0</strong>,
titled <em>&quot;Move workpiece+fixture so ProgramZero coincides with this ISO entry (mutates
Fixture.GeomToTableTransformer)&quot;</em>. It does not write the coordinate — it writes the <strong>fixture's
geometry-to-table transformer</strong>, moving the workpiece and fixture so that program zero lands on the
offset the row holds. The write goes to the authored setup equipment and reports the edit, so the
runtime face follows at the next rebuild. The branch's Work Coordinates leaf carries P0 and M0 and
no alignment.</p>
<p>The endpoint keeps no undo slot. It answers with the assigned translation plus the transformer as it
stood <strong>before</strong> and <strong>after</strong> the write, both serialized as XML, and the tab holds the history
itself: <strong>Undo Align</strong> and <strong>Redo Align</strong> buttons over two component-local stacks, the undo stack
capped at 32 entries and the oldest dropped past it. A third button sits beside them, <strong>Show on
Display</strong>, which belongs to the viewer rather than to the history: it is a bound toggle over the
<code>IsoCoordinate</code> rendering flag, carrying a <code>visibility</code> / <code>visibility_off</code> icon and writing through
the same flag endpoint the Scene dropdown writes. The two datum tabs carry the same button over
<code>HeidenhainCoordinate</code>. Each step posts a stashed snapshot back to a
stateless revert endpoint, which parses it and assigns the result as the fixture's transformer. Both
stacks are cleared whenever the tab's has-a-project prop changes, and the snapshot the component
believes is current is only what it last saw — a transformer changed from another surface is
overwritten wholesale by the next undo or redo rather than merged.</p>
<p>The engine exposes the same operation as a script call,
<a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_AlignWorkpieceProgramZeroToIso_">AlignWorkpieceProgramZeroToIso</a><small>(API)</small>; the
history is the screen's own.</p>
<h3 id="enable-shortest-rotary-path">Enable Shortest Rotary Path</h3>
<p>The <strong>Config</strong> tab's single toggle writes <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_EnableShortestRotary">EnableShortestRotary</a>, which
constructs <code>true</code>. Its banner reads <em>&quot;<strong>Shortest Rotary Path:</strong> optimises rotary axis motion to use
the shortest angular distance between positions.&quot;</em> On the legacy pipeline the flag gates one step:
each rotary axis of a block is cycled into the ±180° window around the previous block's value. The
toggle is narrower than it reads, because that same cycle is applied unconditionally on
<a class="xref" href="../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a> — the brand branch runs it before the flag is consulted, so
clearing the box changes nothing there.</p>
<p>The runner's dependency layer declares no counterpart: no brand parameter table, no generic config
and no branch leaf carries a shortest-rotary switch. The nearest thing the runner pipeline has is the
Heidenhain <code>M126</code> / <code>M127</code> pair, which is read from the program text rather than from any setting.</p>
<h3 id="heidenhain-master-axis-character">Heidenhain master-axis character</h3>
<p>The <strong>Brand</strong> tab grows a second card while the brand is Heidenhain, holding one select over <code>A</code>,
<code>B</code>, <code>C</code> labelled <strong>Master-axis character</strong>. It writes
<a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_HeidenhainMasterAxisChar">HeidenhainMasterAxisChar</a>, a character face over the integer axis
direction the <code>PLANE … SEQ</code> solution family is resolved against. Reads are normalised: anything that
is not <code>B</code> or <code>C</code> after trimming and upper-casing becomes <code>A</code>. On the runner pipeline the master
rotary is <strong>derived rather than configured</strong> — it is the first declared rotary axis — so the branch
has nothing to expose and no leaf for it.</p>
<h2 id="what-it-shares-with-the-branch">What It Shares With the Branch</h2>
<p>Naming what is <em>not</em> exclusive matters as much. The CNC brand, the stroke limits, the rapid feed,
the tool-change time, the tool offset table with its tool-house dependence, the work coordinates
with their P0 and M0 actions, and the Heidenhain datum preset and datum shift tables all have
editors on the branch — see
<a class="xref" href="general-setup/controller/brand-matrix.html">Brand Matrix</a> for which of those leaves each brand grows. The
<strong>Max Speed (rpm)</strong> column has a counterpart too: on the runner pipeline the rotary speed ceiling is
read from the rapid-feedrate config, and the legacy import funnels this field into it at rpm × 360
deg/min, so the branch's Rapid Feedrates leaf edits the runner-side number.</p>
<p>One control on this screen writes a value the branch also writes. <strong>Set ideal offset dependent on
tool house</strong> is a project-level configuration flag rather than a member of either NC model, and both
the Offset Table tab and the branch's Tool Offsets leaf read and write that one flag. The two
<em>tables</em> stay separate: this tab's <strong>Refresh from Tool House</strong> recomputes
<a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_MillingToolOffsetTable">MillingToolOffsetTable</a> from <a class="xref" href="../api/Hi.Machining.MachiningToolHouse.html">MachiningToolHouse</a>,
while the branch's refresh recomputes the runner's own tool-offset table.</p>
<h2 id="two-faces-of-a-work-coordinate">Two Faces of a Work Coordinate</h2>
<p>The work-coordinate marker is one displayee class serving two providers. This page's viewer draws it
from <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_IsoCoordinateTable">IsoCoordinateTable</a> — a
<a class="xref" href="../api/Hi.NcParsers.Dependencys.Generic.IsoCoordinateTable.html">IsoCoordinateTable</a> instance owned by the legacy model, which
constructs with <code>G54</code><code>G59</code> and <code>G59.1</code><code>G59.9</code> all at zero. The General Setup canvas builds the
same displayee over the active runner's effective
<a class="xref" href="../api/Hi.NcParsers.Dependencys.IIsoCoordinateConfig.html">IIsoCoordinateConfig</a> instead, which on most brands is the brand
parameter table. Same marker, same code, two stores.</p>
<p>Selecting a row on the ISO Coordinate Table tab writes the marker's id onto the shared Execution
displayee, so it decides which offset the marker draws at. It decides that whether or not the marker
is drawn: all three coordinate flags are off in the shipped rendering-flag set — as are the machine
tool and the cutter, leaving the workpiece, the fixture, the dimension bar and the cutter-location
strip as the four that arrive on — so on an untouched project the selection column moves something
invisible until <strong>Show on Display</strong> is pressed. The datum tabs also carry a
single-selection column, but nothing is sent when it changes — there the selection is a highlight and
nothing more.</p>
<p>The model this screen edits — what <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> holds, the three settings it
owns alone, what it shares with the branch, and the engine files behind all of it — is
<a class="xref" href="legacy-controller-settings.html">Legacy Controller Settings</a>.</p>
<h2 id="the-tabs">The Tabs</h2>
<p>The left pane is a tab strip over seven panels, addressable as the route's optional segment:
<code>coordinate-table</code>, <code>datum-preset</code>, <code>datum-shift</code>, <code>offset-table</code>, <code>machine</code>, <code>brand</code>, <code>config</code>. A
@@ -509,37 +422,21 @@ number and shift argument it draws nothing without, and the legacy tables it res
</ul>
<h3 id="hiapi-engine">HiAPI Engine</h3>
<ul>
<li><code>HiUniNc/Numerical/HardNcEnv.cs</code> — the model this page edits: the coordinate, datum and offset
tables, the stroke boxes that construct infinite, the rapid rate and tooling time, the
shortest-rotary flag with its Heidenhain exclusion, and the master-axis character over its integer
direction.</li>
<li><code>HiUniNc/Numerical/HardNcEnv.cs</code> — the model behind the tab table above: the coordinate, datum and
offset tables, the two stroke boxes that construct infinite, and the rapid rate and tooling time
the Machine tab writes.</li>
<li><code>HiGeom/Geom/Box3d.cs</code> — the box the two stroke limits are, its infinite construction, and the
six-argument constructor whose grouped argument order the interleaved stroke writes are handed to.</li>
<li><code>HiUniNc/Numerical/HardNcLine.cs</code> — the legacy consumers of two of those settings: the
shortest-rotary path application and the <code>SEQ</code> solve that reads the master-axis direction.</li>
<li><code>HiUniNc/Numerical/MillingToolOffsetTable.cs</code> — the offset table and the tool-house recompute the
Refresh button calls.</li>
<li><code>HiMech/NcParsers/Dependencys/Generic/IsoCoordinateTable.cs</code> — the coordinate table type and the
fifteen G-code keys it constructs with, shared by name with the runner's brand-agnostic table.</li>
<li><code>HiMech/Machining/MachiningEquipmentUtils/MachiningEquipmentUtil.cs</code> — the alignment itself: the
translation written into the fixture's geometry-to-table transformer.</li>
<li><code>HiMech/NcParsers/SoftNcRunner.cs</code> — the legacy import: which legacy fields are funnelled into
which runner dependency, including the rotary speed conversion into the rapid-feedrate config.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/PolarInterpolationUtil.cs</code> — the rotary speed ceiling the runner
pipeline reads, and why it is the rapid-rate bucket rather than a setting of its own.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/Heidenhain/HeidenhainPlaneTiltSyntax.cs</code> — the derived master rotary
on the runner pipeline: the first declared rotary axis, with no configured alternative.</li>
<li><code>HiNc/MachiningProcs/MachiningProject.cs</code> — where both models hang off the project, and the load
path that derives a runner from the legacy element only when no runner element is present.</li>
<li><code>HiNc/MachiningProcs/LocalProjectService.cs</code> — the legacy runner built over a delegate onto the
project's model, the switch that selects which pipeline is active, and the per-step stroke check
that falls back to the legacy boxes when no runner-side stroke config resolves.</li>
<li><code>HiNc/Numerical/FilePlayers/HardNcRunner.cs</code> — the legacy runner itself.</li>
<li><code>HiNc/MachiningProcs/SessionShell.cs</code> — the scripting face of the pipeline switch and of the
alignment, and the optimisation route that passes the legacy model directly.</li>
<li><code>HiUniNc/Numerical/MillingToolOffsetTable.cs</code> — the offset table the Offset Table tab edits: a
dictionary keyed on the offset id, which is the key a row rename moves an entry to.</li>
<li><code>HiNc/MachiningProcs/LocalProjectService.cs</code> — the per-step stroke check that falls back to the
legacy boxes when no runner-side stroke config resolves, which is what makes a regrouped box
observable.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="legacy-controller-settings.html">Legacy Controller Settings</a> — the model this screen edits, the three settings it
owns alone, and the engine files behind them</li>
<li><a class="xref" href="general-setup/controller/index.html">Controller Branch</a> — the SoftNcRunner-native controller branch that supersedes this screen,
and where controller settings for a project are edited</li>
<li><a class="xref" href="general-setup/index.html">General Setup Page</a> — the page that hosts the branch above, and the rest of the equipment
@@ -45,6 +45,9 @@
<li>
<a href="legacy-controller.html" name="" title="Legacy Controller (HardNcEnv)">Legacy Controller (HardNcEnv)</a>
</li>
<li>
<a href="legacy-controller-settings.html" name="" title="Legacy Controller Settings">Legacy Controller Settings</a>
</li>
<li>
<a href="by-source/index.html" name="by-source/toc.html" title="By Source Directory">By Source Directory</a>
</li>
+1 -1
View File
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Conventions","href":"conventions/index.html","tocHref":"conventions/toc.html","topicHref":"conventions/index.html","homepage":"conventions/index.html"},{"name":"Platform","href":"platform/index.html","tocHref":"platform/toc.html","topicHref":"platform/index.html","homepage":"platform/index.html"},{"name":"App Shell","href":"shell/index.html","tocHref":"shell/toc.html","topicHref":"shell/index.html","homepage":"shell/index.html"},{"name":"Widgets","href":"widget/index.html","tocHref":"widget/toc.html","topicHref":"widget/index.html","homepage":"widget/index.html"},{"name":"Geometry Panels","href":"geom/index.html","tocHref":"geom/toc.html","topicHref":"geom/index.html","homepage":"geom/index.html"},{"name":"Execution Page","href":"execution/index.html","tocHref":"execution/toc.html","topicHref":"execution/index.html","homepage":"execution/index.html"},{"name":"General Setup Page","href":"general-setup/index.html","tocHref":"general-setup/toc.html","topicHref":"general-setup/index.html","homepage":"general-setup/index.html"},{"name":"Tool House Page","href":"tool-house/index.html","tocHref":"tool-house/toc.html","topicHref":"tool-house/index.html","homepage":"tool-house/index.html"},{"name":"Utility Pages","href":"util/index.html","tocHref":"util/toc.html","topicHref":"util/index.html","homepage":"util/index.html"},{"name":"Legacy Controller (HardNcEnv)","href":"legacy-controller.html","topicHref":"legacy-controller.html"},{"name":"By Source Directory","href":"by-source/index.html","tocHref":"by-source/toc.html","topicHref":"by-source/index.html","homepage":"by-source/index.html"}]}
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Conventions","href":"conventions/index.html","tocHref":"conventions/toc.html","topicHref":"conventions/index.html","homepage":"conventions/index.html"},{"name":"Platform","href":"platform/index.html","tocHref":"platform/toc.html","topicHref":"platform/index.html","homepage":"platform/index.html"},{"name":"App Shell","href":"shell/index.html","tocHref":"shell/toc.html","topicHref":"shell/index.html","homepage":"shell/index.html"},{"name":"Widgets","href":"widget/index.html","tocHref":"widget/toc.html","topicHref":"widget/index.html","homepage":"widget/index.html"},{"name":"Geometry Panels","href":"geom/index.html","tocHref":"geom/toc.html","topicHref":"geom/index.html","homepage":"geom/index.html"},{"name":"Execution Page","href":"execution/index.html","tocHref":"execution/toc.html","topicHref":"execution/index.html","homepage":"execution/index.html"},{"name":"General Setup Page","href":"general-setup/index.html","tocHref":"general-setup/toc.html","topicHref":"general-setup/index.html","homepage":"general-setup/index.html"},{"name":"Tool House Page","href":"tool-house/index.html","tocHref":"tool-house/toc.html","topicHref":"tool-house/index.html","homepage":"tool-house/index.html"},{"name":"Utility Pages","href":"util/index.html","tocHref":"util/toc.html","topicHref":"util/index.html","homepage":"util/index.html"},{"name":"Legacy Controller (HardNcEnv)","href":"legacy-controller.html","topicHref":"legacy-controller.html"},{"name":"Legacy Controller Settings","href":"legacy-controller-settings.html","topicHref":"legacy-controller-settings.html"},{"name":"By Source Directory","href":"by-source/index.html","tocHref":"by-source/toc.html","topicHref":"by-source/index.html","homepage":"by-source/index.html"}]}
@@ -235,7 +235,7 @@ Manages <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html
<ul>
<li>Intro caption</li>
<li>Warnings Banner — one orange banner per geometry issue the backend reports, e.g. an ExtendedCylinder beam whose FullLength sits below the flute top</li>
<li><a class="xref" href="../../geom/geom-manage-control.html">Geometry Management Control</a>, limited to the six <a class="xref" href="../../../api/Hi.Geom.IGetStl.html">IGetStl</a> kinds an upper beam can be
<li><a class="xref" href="../../geom/geometry-editor.html">Geometry Management Control</a>, limited to the six <a class="xref" href="../../../api/Hi.Geom.IGetStl.html">IGetStl</a> kinds an upper beam can be
<ul>
<li><a class="xref" href="../../../api/Hi.Geom.Cylindroid.html">Cylindroid</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.ExtendedCylinder.html">ExtendedCylinder</a></li>
@@ -312,7 +312,7 @@ Manages <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../geom/extended-cylinder-panel.html">Extended Cylinder Panel</a> — the Upper Beam's kind that exists
<li><a class="xref" href="../../geom/extended-cylinder-editor.html">ExtendedCylinder Editor</a> — the Upper Beam's kind that exists
for this cutter, and the one surface that gives it a start section</li>
</ul>
@@ -94,7 +94,7 @@
<ul>
<li>Geometry Section
<ul>
<li><a class="xref" href="../../geom/cylindroid-control.html">Cylindroid Panel</a> — the reusable Z-R pair table, driven by a model key</li>
<li><a class="xref" href="../../geom/cylindroid-editor.html">Cylindroid Panel</a> — the reusable Z-R pair table, driven by a model key</li>
<li>Initializing Caption — stands in for the editor until the holder's cylindroid has been published under a key</li>
</ul>
</li>
@@ -126,7 +126,7 @@
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../widget/polar-resolution-2d-panel.html">Polar Resolution 2D Panel</a> — the resolution editor this panel embeds</li>
<li><a class="xref" href="../../geom/cylindroid-control.html">Cylindroid Control</a> — the shape editor this panel's Geometry surface
<li><a class="xref" href="../../geom/cylindroid-editor.html">Cylindroid Editor</a> — the shape editor this panel's Geometry surface
embeds, and the shape whose tessellation the Resolution surface governs</li>
</ul>
@@ -188,7 +188,7 @@
<ul>
<li><a class="xref" href="../general-setup/fixture.html">Fixture Page</a> — parent-aware <code>onCreate</code> transformer rebind pattern reused for Branch.</li>
<li><a class="xref" href="../geom/transformer-panel.html">Transformers</a> — the shared 7-transformer switchboard.</li>
<li><a class="xref" href="../geom/geom-manage-control.html">Geometry Management Control</a> — embedded under the anchor editor.</li>
<li><a class="xref" href="../geom/geometry-editor.html">Geometry Management Control</a> — embedded under the anchor editor.</li>
<li><a class="xref" href="../general-setup/machine-tool.html">Machine Tool</a> — where a project's chain is loaded, replaced and previewed, next to this user-scoped builder.</li>
<li><a href="file-explorer.html">File Explorer</a> — the server-side browser this page's Load and Save As dialogs are built on.</li>
<li><a class="xref" href="../general-setup/spindle-capability.html">Spindle Capability Page</a> — the project-scoped editor with the same Load / Reload / Save As pattern.</li>
@@ -175,7 +175,7 @@ engine's home view and the render cache cleared, and the geometry the commit rep
afterwards, so the render thread never spends a frame on a dead reference.</p>
<p>The response carries the triangle count, the bounding box, the connection's origin-axes flag and
the transform key. The pane reads all of those except the bounding box, which it ignores — the
bounding-box readout a reader sees belongs to the STL File Control's info dialog, not to this pane.</p>
bounding-box readout a reader sees belongs to the StlFile Editor's info dialog, not to this pane.</p>
<p>A rejected load — unknown or unavailable root, a path escaping the root, a missing file, an
unreadable file — answers a non-2xx status carrying the server's message, and the shared response
helper folds the status into the text; that composite is what the banner shows. The message itself
@@ -399,7 +399,7 @@ sub-transformers.</li>
<ul>
<li><a href="file-explorer.html">File Explorer</a> — the one screen that mounts this pane, and the editor column it
takes over</li>
<li><a class="xref" href="../geom/stlfile-control.html">STL File Control</a> — the geometry editor whose file picker is where this preview is
<li><a class="xref" href="../geom/stlfile-editor.html">StlFile Editor</a> — the geometry editor whose file picker is where this preview is
most often met, and the surface that owns the bounding-box readout this pane does not show</li>
<li><a class="xref" href="../widget/renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a> — the <code>View ▾</code> and <code>Scene ▾</code> menus the preview bar embeds</li>
<li><a class="xref" href="../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service Application</a> — the hub connection the pane opens, and the