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
@@ -3493,7 +3493,10 @@ only after mutating the runtime face outside the service.</p>
</h3>
<div class="markdown level1 summary"><p>Updates the ideal milling tool offset table based on the current tool house configuration.</p>
<div class="markdown level1 summary"><p>Updates the ideal milling tool offset table based on the current tool
house configuration. The radius column follows the project's
<a class="xref" href="Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_RadiusOffsetBasis">RadiusOffsetBasis</a> so a
zero-based (tool-centre path) program keeps its D rows at wear only.</p>
</div>
<div class="markdown level1 conceptual"></div>
@@ -591,6 +591,46 @@ from the tool house geometry before simulation.</p>
<a id="Hi_MachiningProcs_MachiningActRunnerConfig_RadiusOffsetBasis_" data-uid="Hi.MachiningProcs.MachiningActRunnerConfig.RadiusOffsetBasis*"></a>
<h3 id="Hi_MachiningProcs_MachiningActRunnerConfig_RadiusOffsetBasis" data-uid="Hi.MachiningProcs.MachiningActRunnerConfig.RadiusOffsetBasis">
RadiusOffsetBasis
</h3>
<div class="markdown level1 summary"><p>Gets or sets which cutter-radius compensation strategy the NC program
was posted for. Decides what a tool-house refresh (the play-time
refresh under <a class="xref" href="Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_IsIdealOffsetDependentOnToolHouse">IsIdealOffsetDependentOnToolHouse</a> and the
explicit refresh commands) writes into the ideal radius of a milling
cutter's offset row: the cutter's max profile radius under
<a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_CutterRadius">CutterRadius</a>, 0 under
<a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_ZeroBased">ZeroBased</a>. Heights and wear are
unaffected. Project level because it changes the simulated path.
Default <a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_CutterRadius">CutterRadius</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public RadiusOffsetBasis RadiusOffsetBasis { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html">RadiusOffsetBasis</a></dt>
<dd></dd>
</dl>
<a id="Hi_MachiningProcs_MachiningActRunnerConfig_XName_" data-uid="Hi.MachiningProcs.MachiningActRunnerConfig.XName*"></a>
<h3 id="Hi_MachiningProcs_MachiningActRunnerConfig_XName" data-uid="Hi.MachiningProcs.MachiningActRunnerConfig.XName">
@@ -2479,7 +2479,7 @@ geometry — the settings that used to surface only as an opaque per-step
<a class="xref" href="Hi.Geom.ExtendedCylinder.html#Hi_Geom_ExtendedCylinder_FullLength">FullLength</a> is below the flute height, so the
shank solid inverts and <span class="xref">Hi.Milling.Cutters.MillingCutter.GetShankThermalZrList()</span> cannot build).
Returns <code>(Id, Message)</code> pairs following the structured-id convention of
the <code>IMessage</code> channel (e.g. <code>Cutter-UpperBeam&ndash;BelowFluteHeight</code>);
the <code>IMessage</code> channel (e.g. <code>Cutter-UpperBeam&ndash;ExtendedCylinderFullLengthTooShort</code>);
empty when no upper beam is configured (a legal state — physics runs without
a shank) or the beam is consistent. Shared by the physics runner (tool-change
<code>ConfigurationError</code>) and the web API (post-edit validation warnings).</p>
@@ -0,0 +1,200 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Enum RadiusOffsetBasis | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Enum RadiusOffsetBasis | HiAPI-C# 2025 ">
<meta name="description" content="Which cutter-radius compensation strategy the NC program was posted for — decides what a tool-house refresh writes into the radius (D) column of a tool offset table. The height (H) column is refreshed the same way under both strategies. This is an output-affecting, project-level choice: the user or agent picks it after confirming how the NC program was posted, because a refresh under the wrong basis silently offsets the tool by a full cutter radius.">
<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="ManagedReference">
<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="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis">
<h1 id="Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis" data-uid="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis" class="text-break">
Enum RadiusOffsetBasis
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="Hi.html">Hi</a>.<a class="xref" href="Hi.NcParsers.html">NcParsers</a>.<a class="xref" href="Hi.NcParsers.Dependencys.html">Dependencys</a>.<a class="xref" href="Hi.NcParsers.Dependencys.Generic.html">Generic</a></dd></dl>
<dl><dt>Assembly</dt><dd>HiMech.dll</dd></dl>
</div>
<div class="markdown summary"><p>Which cutter-radius compensation strategy the NC program was posted
for — decides what a tool-house refresh writes into the radius
(D) column of a tool offset table. The height (H) column is refreshed
the same way under both strategies. This is an output-affecting,
project-level choice: the user or agent picks it after confirming how
the NC program was posted, because a refresh under the wrong basis
silently offsets the tool by a full cutter radius.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public enum RadiusOffsetBasis</code></pre>
</div>
<dl class="typelist extensionMethods">
<dt>Extension Methods</dt>
<dd>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__1___0_System_Action___0__">InvokeUtil.SelfInvoke&lt;TSrc&gt;(TSrc, Action&lt;TSrc&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__2___0_System_Func___0___1__">InvokeUtil.SelfInvoke&lt;TSrc, TDst&gt;(TSrc, Func&lt;TSrc, TDst&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Common.MaskUtil.html#Hi_Common_MaskUtil_GetMaskedValue__1___0___0_System_Boolean_">MaskUtil.GetMaskedValue&lt;T&gt;(T, T, bool)</a>
</div>
<div>
<a class="xref" href="Hi.Common.MaskUtil.html#Hi_Common_MaskUtil_SetMask__1___0____0_System_Boolean_">MaskUtil.SetMask&lt;T&gt;(ref T, T, bool)</a>
</div>
<div>
<a class="xref" href="Hi.Coloring.ColorUtil.html#Hi_Coloring_ColorUtil_GetGloomyColor_System_Object_System_Double_System_Double_">ColorUtil.GetGloomyColor(object, double, double)</a>
</div>
<div>
<a class="xref" href="Hi.Common.NameUtil.html#Hi_Common_NameUtil_GetSelectionName_System_Object_">NameUtil.GetSelectionName(object)</a>
</div>
<div>
<a class="xref" href="Hi.Common.StringUtil.html#Hi_Common_StringUtil_GetPropertyStringIfToStringNotOverloaded_System_Object_System_Boolean_System_Boolean_">StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool)</a>
</div>
<div>
<a class="xref" href="Hi.Parallels.LockUtil.html#Hi_Parallels_LockUtil_Lock_System_Object_">LockUtil.Lock(object)</a>
</div>
</dd></dl>
<h2 id="fields">Fields
</h2>
<dl class="parameters">
<dt id="Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_CutterRadius"><code>CutterRadius = 0</code></dt>
<dd><p>Cutter-radius: the NC contour is the part contour, and the
controller offsets it by the D row at run time. The D row holds the
cutter's geometry radius plus wear, so a tool-house refresh writes
the cutter profile's max radius into the ideal radius and leaves
the radial wear untouched. This is the default and the only
behaviour before the basis existed.</p>
</dd>
<dt id="Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_ZeroBased"><code>ZeroBased = 1</code></dt>
<dd><p>Zero-based: the NC path is already the tool-centre path (CAM
applied the offset), while <code>G41</code>/<code>G42 D..</code> stays in the
program so the operator can dial in wear. The D row therefore holds
the wear only, and a tool-house refresh writes 0 into the ideal
radius and leaves the radial wear untouched. Refreshing such a
program under <a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_CutterRadius">CutterRadius</a> would push the tool a full
cutter radius into the wall.</p>
</dd>
</dl>
</article>
<div class="contribution d-print-none">
</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>
@@ -619,16 +619,18 @@ no configured row (see <a class="xref" href="Hi.NcParsers.Dependencys.IToolOffse
<a id="Hi_NcParsers_Dependencys_Generic_ToolOffsetTable_UpdateIdealByToolHouse_" data-uid="Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse*"></a>
<h3 id="Hi_NcParsers_Dependencys_Generic_ToolOffsetTable_UpdateIdealByToolHouse_Hi_Machining_MachiningToolHouse_" data-uid="Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse(Hi.Machining.MachiningToolHouse)">
UpdateIdealByToolHouse(MachiningToolHouse)
<h3 id="Hi_NcParsers_Dependencys_Generic_ToolOffsetTable_UpdateIdealByToolHouse_Hi_Machining_MachiningToolHouse_Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_" data-uid="Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse(Hi.Machining.MachiningToolHouse,Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis)">
UpdateIdealByToolHouse(MachiningToolHouse, RadiusOffsetBasis)
</h3>
<div class="markdown level1 summary"><p>Refreshes the ideal (geometry) components from the tool house — ideal
height = the tool's spindle-buckle→tool-tip length, ideal radius = the
cutter profile's max radius — preserving accumulated wear, and drops
rows whose tool id no longer exists in the house. Offset number maps
1:1 to the tool id. Mirrors the HardNc
height = the tool's spindle-buckle→tool-tip length, ideal radius of a
milling-cutter row = the cutter profile's max radius under
<a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_CutterRadius">CutterRadius</a> or 0 under
<a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_ZeroBased">ZeroBased</a> — preserving accumulated
wear, and drops rows whose tool id no longer exists in the house.
Offset number maps 1:1 to the tool id. Mirrors the HardNc
<code>MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse</code>
semantics so H/D offsets follow the tool house when the project's
<code>IsIdealOffsetDependentOnToolHouse</code> is on.</p>
@@ -636,13 +638,18 @@ semantics so H/D offsets follow the tool house when the project's
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void UpdateIdealByToolHouse(MachiningToolHouse toolHouse)</code></pre>
<pre><code class="lang-csharp hljs">public void UpdateIdealByToolHouse(MachiningToolHouse toolHouse, RadiusOffsetBasis radiusBasis = RadiusOffsetBasis.CutterRadius)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>toolHouse</code> <a class="xref" href="Hi.Machining.MachiningToolHouse.html">MachiningToolHouse</a></dt>
<dd><p>Source tool house; no-op when null.</p>
</dd>
<dt><code>radiusBasis</code> <a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html">RadiusOffsetBasis</a></dt>
<dd><p>The project's cutter-radius compensation
strategy; decides the ideal radius written for milling-cutter rows.
Heights are refreshed the same way under both.</p>
</dd>
</dl>
@@ -214,6 +214,20 @@ holds only this proxy, never the offset data.</p>
Not a standard Fanuc parameter — in real Fanuc, tool change motion
is programmed in the macro program (O9006).
Each axis value: a position to move to, or <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double.nan">NaN</a> to stay.</p>
</dd>
</dl>
<h3 id="enums">
Enums
</h3>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html">RadiusOffsetBasis</a></dt>
<dd><p>Which cutter-radius compensation strategy the NC program was posted
for — decides what a tool-house refresh writes into the radius
(D) column of a tool offset table. The height (H) column is refreshed
the same way under both strategies. This is an output-affecting,
project-level choice: the user or agent picks it after confirming how
the NC program was posted, because a refresh under the wrong basis
silently offsets the tool by a full cutter radius.</p>
</dd>
</dl>
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class HeidenhainToolChangeSyntax | HiAPI-C# 2025 ">
<meta name="description" content="Heidenhain-specific: consumes the Parsing[&amp;ldquo;TOOL CALL&amp;rdquo;] record (written by ) into the shared section so fires the tooling act. A klartext TOOL CALL always performs the change — no separate M06 trigger exists — so is always true with Term = &amp;ldquo;TOOL CALL&amp;rdquo;. The spindle-speed word (S) is relocated to the root of so the shared — which must run after this syntax in the Logic bundle — records it modally. Numeric tool ids are written as ints (the act chain is int-keyed); non-numeric ids stay strings and resolve (or warn) at the semantic layer. P0 limits recorded as diagnostics: non-Z tool axis (ToolChange--AxisUnsupported), non-zero DL/DR deltas (ToolChange--DeltaUnsupported; zero deltas are consumed silently), and a TOOL CALL without a tool id (ToolChange--MissingToolId, e.g. a variable tool number the parser could not capture). Known P2 limitation: a quoted tool NAME that happens to spell a Q token (TOOL CALL &quot;Q1&quot; Z) loses its quotes at capture, so the evaluator substitutes the Q parameter&#39;s value and the numeric branch below treats it as a tool number. Corpus-zero (real names are &quot;B40R&quot;-style); fixing it needs the capture to preserve the quoted-ness, which would change the P0-pinned record shape.">
<meta name="description" content="Heidenhain-specific: consumes the Parsing[&amp;ldquo;TOOL CALL&amp;rdquo;] record (written by ) into the shared section so fires the tooling act. A klartext TOOL CALL always performs the change — no separate M06 trigger exists — so is always true with Term = &amp;ldquo;TOOL CALL&amp;rdquo;. The spindle-speed word (S) is relocated to the root of so the shared — which must run after this syntax in the Logic bundle — records it modally. Numeric tool ids are written as ints (the act chain is int-keyed); non-numeric ids stay strings and resolve (or warn) at the semantic layer. P0 limits recorded as diagnostics: non-Z tool axis (ToolChange--AxisUnsupported), non-zero DL/DR deltas (ToolChange--DeltaUnsupported; zero deltas are consumed silently, and a delta that is not a literal value is ignored as ToolChange--DeltaNotLiteral), and a TOOL CALL without a tool id (ToolChange--MissingToolId, e.g. a variable tool number the parser could not capture). Known P2 limitation: a quoted tool NAME that happens to spell a Q token (TOOL CALL &quot;Q1&quot; Z) loses its quotes at capture, so the evaluator substitutes the Q parameter&#39;s value and the numeric branch below treats it as a tool number. Corpus-zero (real names are &quot;B40R&quot;-style); fixing it needs the capture to preserve the quoted-ness, which would change the P0-pinned record shape.">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
@@ -116,7 +116,8 @@ resolve (or warn) at the semantic layer.
P0 limits recorded as diagnostics: non-Z tool axis
(<code>ToolChange--AxisUnsupported</code>), non-zero DL/DR deltas
(<code>ToolChange--DeltaUnsupported</code>; zero deltas are consumed
silently), and a TOOL CALL without a tool id
silently, and a delta that is not a literal value is ignored as
<code>ToolChange--DeltaNotLiteral</code>), and a TOOL CALL without a tool id
(<code>ToolChange--MissingToolId</code>, e.g. a variable tool number the
parser could not capture).
</p>
@@ -619,7 +619,8 @@ resolve (or warn) at the semantic layer.
P0 limits recorded as diagnostics: non-Z tool axis
(<code>ToolChange--AxisUnsupported</code>), non-zero DL/DR deltas
(<code>ToolChange--DeltaUnsupported</code>; zero deltas are consumed
silently), and a TOOL CALL without a tool id
silently, and a delta that is not a literal value is ignored as
<code>ToolChange--DeltaNotLiteral</code>), and a TOOL CALL without a tool id
(<code>ToolChange--MissingToolId</code>, e.g. a variable tool number the
parser could not capture).
</p>
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class SiemensCycle800TiltSyntax | HiAPI-C# 2025 ">
<meta name="description" content="Siemens CYCLE800 (swivel cycle): resolves the tilted work plane from the positional arguments captured by and composes it into as the shared entry — the Siemens sibling of its XmlDoc promises. Unlike Fanuc G68.2 (plane only), CYCLE800 also positions the rotary axes implicitly (the G53.1 half): with wired, the tilt normal is solved to machine ABC and written into , and the block gets a non-modal rapid with Term = &amp;ldquo;CYCLE800&amp;rdquo; (mirroring ). Argument layout (HardNc reference NcArgCycle800): CYCLE800(FR, TC, ST, MODE, X0, Y0, Z0, A, B, C, X1, Y1, Z1, DIR [, FR_I, DMODE]) — 15- and 16-arg post variants both occur in the corpus. MODE is bit-coded: bits 7-6 select the swivel mode (00 axis-by-axis, 01 solid angle, 10 projection angle, 11 direct rotary), bit pairs 1-0/3-2/5-4 select each angle&#39;s axis (01=X, 10=Y, 11=Z). The motion-convention matrix is T(X1,Y1,Z1) &#183; R &#183; T(X0,Y0,Z0) (row-vector; the post-rotation zero offset applies innermost). ST units digit 1 composes additively onto the current programmable frame; FR/FR_I retraction and DIR solution preference are recorded in the section but not simulated (DIR = 0 suppresses the rotary positioning, per the control&#39;s frame-only variant). Cancel forms — bare CYCLE800, empty parentheses, the single-argument CYCLE800(0), or swivel-data-record name TC = &quot;0&quot; — reset the tilt to the shared inactive sentinel (Term = &quot;G69&quot; + identity entry, HardNc&#39;s convention). An in-between argument count (19 with a live TC) is treated as a truncated/unmodeled capture, not a cancel — warning + visible residue, so a mis-parsed call can never silently drop an active swivel. The rotary axes are not re-positioned on cancel: the retract/re-orient behavior depends on the machine&#39;s swivel data record, which does not exist offline; corpus programs follow the cancel with explicit G0 A.. C.. moves anyway. Fail-soft: a non-numeric argument (machine-runtime variable) leaves the Parsing.CYCLE800 residue visible and applies no transform (Coord-Tilt--003); an IK failure keeps the euler tilt and skips positioning (Coord-Tilt--004); a rotating CYCLE800 on a machine without kinematics/rotary axes keeps the tilt and warns (Coord-Tilt--005). Must run before (which owns the once-per-block modal carry and composes additive AROT/ATRANS onto this cycle&#39;s fresh matrix) and before the coordinate-offset syntaxes (chain order: frame entry ahead of CoordinateOffset).">
<meta name="description" content="Siemens CYCLE800 (swivel cycle): resolves the tilted work plane from the positional arguments captured by and composes it into as the shared entry — the Siemens sibling of its XmlDoc promises. Unlike Fanuc G68.2 (plane only), CYCLE800 also positions the rotary axes implicitly (the G53.1 half): with wired, the tilt normal is solved to machine ABC and written into , and the block gets a non-modal rapid with Term = &amp;ldquo;CYCLE800&amp;rdquo; (mirroring ). Argument layout (HardNc reference NcArgCycle800): CYCLE800(FR, TC, ST, MODE, X0, Y0, Z0, A, B, C, X1, Y1, Z1, DIR [, FR_I, DMODE]) — 15- and 16-arg post variants both occur in the corpus. MODE is bit-coded: bits 7-6 select the swivel mode (00 axis-by-axis, 01 solid angle, 10 projection angle, 11 direct rotary), bit pairs 1-0/3-2/5-4 select each angle&#39;s axis (01=X, 10=Y, 11=Z). The motion-convention matrix is T(X1,Y1,Z1) &#183; R &#183; T(X0,Y0,Z0) (row-vector; the post-rotation zero offset applies innermost). ST units digit 1 composes additively onto the current programmable frame; FR/FR_I retraction and DIR solution preference are recorded in the section but not simulated (DIR = 0 suppresses the rotary positioning, per the control&#39;s frame-only variant). Cancel forms — bare CYCLE800, empty parentheses, the single-argument CYCLE800(0), or swivel-data-record name TC = &quot;0&quot; — reset the tilt to the shared inactive sentinel (Term = &quot;G69&quot; + identity entry, HardNc&#39;s convention). An in-between argument count (19 with a live TC) is treated as a truncated/unmodeled capture, not a cancel — warning + visible residue, so a mis-parsed call can never silently drop an active swivel. The rotary axes are not re-positioned on cancel: the retract/re-orient behavior depends on the machine&#39;s swivel data record, which does not exist offline; corpus programs follow the cancel with explicit G0 A.. C.. moves anyway. Fail-soft: a non-numeric argument (machine-runtime variable) leaves the Parsing.CYCLE800 residue visible and applies no transform (Coord-Tilt--Cycle800NonNumericArgument; an undocumented 19 argument spelling is left as residue the same way, as Coord-Tilt--003); an IK failure keeps the euler tilt and skips positioning (Coord-Tilt--004); a rotating CYCLE800 on a machine without kinematics/rotary axes keeps the tilt and warns (Coord-Tilt--005). Must run before (which owns the once-per-block modal carry and composes additive AROT/ATRANS onto this cycle&#39;s fresh matrix) and before the coordinate-offset syntaxes (chain order: frame entry ahead of CoordinateOffset).">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
@@ -142,7 +142,9 @@ cancel with explicit <code>G0 A.. C..</code> moves anyway.
<p>
Fail-soft: a non-numeric argument (machine-runtime variable) leaves
the <code>Parsing.CYCLE800</code> residue visible and applies no transform
(<code>Coord-Tilt--003</code>); an IK failure keeps the euler tilt and
(<code>Coord-Tilt--Cycle800NonNumericArgument</code>; an undocumented 19
argument spelling is left as residue the same way, as
<code>Coord-Tilt--003</code>); an IK failure keeps the euler tilt and
skips positioning (<code>Coord-Tilt--004</code>); a rotating CYCLE800 on a
machine without kinematics/rotary axes keeps the tilt and warns
(<code>Coord-Tilt--005</code>).
@@ -209,7 +209,9 @@ cancel with explicit <code>G0 A.. C..</code> moves anyway.
<p>
Fail-soft: a non-numeric argument (machine-runtime variable) leaves
the <code>Parsing.CYCLE800</code> residue visible and applies no transform
(<code>Coord-Tilt--003</code>); an IK failure keeps the euler tilt and
(<code>Coord-Tilt--Cycle800NonNumericArgument</code>; an undocumented 19
argument spelling is left as residue the same way, as
<code>Coord-Tilt--003</code>); an IK failure keeps the euler tilt and
skips positioning (<code>Coord-Tilt--004</code>); a rotating CYCLE800 on a
machine without kinematics/rotary axes keeps the tilt and warns
(<code>Coord-Tilt--005</code>).
@@ -0,0 +1,402 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class RadiusCompInterference | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class RadiusCompInterference | HiAPI-C# 2025 ">
<meta name="description" content="Classifies cutter-compensation interference — the case a real control refuses under G41/G42: the compensated tool path runs against the programmed direction because the offset radius is larger than the inner feature it has to follow (an inner arc smaller than the offset, a groove bottom narrower than the tool). Fanuc stops with alarm PS0041 INTERFERENCE IN CUTTER COMPENSATION; Heidenhain and Siemens have equivalents. The simulation has no interference check and keeps running the swapped-side path — so a program that simulates cleanly can still stop on the machine, and a wrongly filled D row (the tool radius entered against a tool-centre CAM path that expects wear only) shows up as an overcut instead of an alarm. The diagnostics built from this class exist to close that gap; they never change the path. Today the gate is meaningful on the XY plane (G17) only: both compensation engines build the perpendicular as Z &#215; axis whatever plane is selected, so a G18/G19 region is neither compensated in its own plane nor checked here — the planeNormalDir parameters are ready for the day the engines pass the selected plane through.">
<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="ManagedReference">
<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="Hi.NcParsers.RadiusCompInterference">
<h1 id="Hi_NcParsers_RadiusCompInterference" data-uid="Hi.NcParsers.RadiusCompInterference" class="text-break">
Class RadiusCompInterference
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="Hi.html">Hi</a>.<a class="xref" href="Hi.NcParsers.html">NcParsers</a></dd></dl>
<dl><dt>Assembly</dt><dd>HiMech.dll</dd></dl>
</div>
<div class="markdown summary"><p>Classifies cutter-compensation interference — the case a real control
refuses under G41/G42: the compensated tool path runs against the
programmed direction because the offset radius is larger than the
inner feature it has to follow (an inner arc smaller than the offset,
a groove bottom narrower than the tool). Fanuc stops with alarm
PS0041 INTERFERENCE IN CUTTER COMPENSATION; Heidenhain and Siemens
have equivalents. The simulation has no interference check and keeps
running the swapped-side path — so a program that simulates cleanly
can still stop on the machine, and a wrongly filled D row (the tool
radius entered against a tool-centre CAM path that expects wear only)
shows up as an overcut instead of an alarm. The diagnostics built from
this class exist to close that gap; they never change the path.</p>
<p>
Today the gate is meaningful on the XY plane (G17) only: both
compensation engines build the perpendicular as <code>Z × axis</code>
whatever plane is selected, so a G18/G19 region is neither compensated
in its own plane nor checked here — the <code>planeNormalDir</code> parameters
are ready for the day the engines pass the selected plane through.
</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static class RadiusCompInterference</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">RadiusCompInterference</span></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone">object.MemberwiseClone()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
</dd></dl>
<h2 class="section" id="fields">Fields
</h2>
<h3 id="Hi_NcParsers_RadiusCompInterference_ArcTolerance_mm" data-uid="Hi.NcParsers.RadiusCompInterference.ArcTolerance_mm">
ArcTolerance_mm
</h3>
<div class="markdown level1 summary"><p>How far (mm) the compensated arc end must sit beyond the arc centre
before an arc counts as interfering. An offset equal to the inner
radius collapses the compensated arc to a point — the tool exactly
fills the corner, no overcut — and CAM rounding puts such end points
a fraction of a micrometre on either side of the centre, so exact
equality stays silent instead of flickering with the last decimal.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public const double ArcTolerance_mm = 0.001</code></pre>
</div>
<h4 class="section">Field Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<h3 id="Hi_NcParsers_RadiusCompInterference_DiagnosticId" data-uid="Hi.NcParsers.RadiusCompInterference.DiagnosticId">
DiagnosticId
</h3>
<div class="markdown level1 summary"><p>Diagnostic id shared by the SoftNc and HardNc compensation walks.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public const string DiagnosticId = &quot;RadiusComp--Interference&quot;</code></pre>
</div>
<h4 class="section">Field Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="Hi_NcParsers_RadiusCompInterference_TryDescribeArc_" data-uid="Hi.NcParsers.RadiusCompInterference.TryDescribeArc*"></a>
<h3 id="Hi_NcParsers_RadiusCompInterference_TryDescribeArc_Hi_Geom_Vec3d_Hi_Geom_Vec3d_Hi_Geom_Vec3d_System_Int32_System_Double_System_Int32_System_String__System_Collections_Generic_Dictionary_System_String_System_Object___" data-uid="Hi.NcParsers.RadiusCompInterference.TryDescribeArc(Hi.Geom.Vec3d,Hi.Geom.Vec3d,Hi.Geom.Vec3d,System.Int32,System.Double,System.Int32,System.String@,System.Collections.Generic.Dictionary{System.String,System.Object}@)">
TryDescribeArc(Vec3d, Vec3d, Vec3d, int, double, int, out string, out Dictionary&lt;string, object&gt;)
</h3>
<div class="markdown level1 summary"><p>Classifies an arc block of a compensation region. Interference means
the perpendicular offset of the arc's end point sits on the far side
of the arc centre from the programmed end point, on the compensation
plane — the compensated arc then runs against the programmed
direction. Returns false for a degenerate programmed radius and for
an offset equal to the inner radius within
<a class="xref" href="Hi.NcParsers.RadiusCompInterference.html#Hi_NcParsers_RadiusCompInterference_ArcTolerance_mm">ArcTolerance_mm</a> (the compensated arc collapses to a
point rather than reversing); returns true with a constant
notification <code class="paramref">text</code> and a value-carrying
<code class="paramref">detail</code> on interference.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static bool TryDescribeArc(Vec3d programEnd, Vec3d compensatedEnd, Vec3d center, int planeNormalDir, double offsetRadius_mm, int offsetId, out string text, out Dictionary&lt;string, object&gt; detail)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>programEnd</code> <a class="xref" href="Hi.Geom.Vec3d.html">Vec3d</a></dt>
<dd><p>Programmed (nominal) end point of the arc.</p>
</dd>
<dt><code>compensatedEnd</code> <a class="xref" href="Hi.Geom.Vec3d.html">Vec3d</a></dt>
<dd><p>Perpendicular offset of the arc end (the arc's own transient end, not
the corner intersection with the next block).</p>
</dd>
<dt><code>center</code> <a class="xref" href="Hi.Geom.Vec3d.html">Vec3d</a></dt>
<dd><p>Arc centre in program coordinates.</p>
</dd>
<dt><code>planeNormalDir</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd><p>Index (0/1/2) of the compensation plane's normal axis.</p>
</dd>
<dt><code>offsetRadius_mm</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd><p>Unsigned offset radius applied by the region.</p>
</dd>
<dt><code>offsetId</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd><p>The D row the region resolves its radius from.</p>
</dd>
<dt><code>text</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p>Constant notification text (fold-stable), or null.</p>
</dd>
<dt><code>detail</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>, <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a>&gt;</dt>
<dd><p>Offset radius, programmed arc radius and D row, or null.</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="Hi_NcParsers_RadiusCompInterference_TryDescribeLinear_" data-uid="Hi.NcParsers.RadiusCompInterference.TryDescribeLinear*"></a>
<h3 id="Hi_NcParsers_RadiusCompInterference_TryDescribeLinear_Hi_Geom_Vec3d_Hi_Geom_Vec3d_System_Int32_System_Double_System_Int32_System_String__System_Collections_Generic_Dictionary_System_String_System_Object___" data-uid="Hi.NcParsers.RadiusCompInterference.TryDescribeLinear(Hi.Geom.Vec3d,Hi.Geom.Vec3d,System.Int32,System.Double,System.Int32,System.String@,System.Collections.Generic.Dictionary{System.String,System.Object}@)">
TryDescribeLinear(Vec3d, Vec3d, int, double, int, out string, out Dictionary&lt;string, object&gt;)
</h3>
<div class="markdown level1 summary"><p>Classifies a straight block of a compensation region (not the
start-up block). Interference means the compensated displacement —
from the previous compensated position to this block's compensated
position — runs against the programmed displacement on the
compensation plane: the corner intersections on either side of a
step narrower than the offset radius cross over. Returns false for a
collapsed (zero-length) compensated move; returns true with a
constant notification <code class="paramref">text</code> and a value-carrying
<code class="paramref">detail</code> on interference.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static bool TryDescribeLinear(Vec3d programDisplacement, Vec3d compensatedDisplacement, int planeNormalDir, double offsetRadius_mm, int offsetId, out string text, out Dictionary&lt;string, object&gt; detail)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>programDisplacement</code> <a class="xref" href="Hi.Geom.Vec3d.html">Vec3d</a></dt>
<dd><p>Nominal displacement of the block.</p>
</dd>
<dt><code>compensatedDisplacement</code> <a class="xref" href="Hi.Geom.Vec3d.html">Vec3d</a></dt>
<dd><p>Displacement between the compensated end points of the previous block and this block.</p>
</dd>
<dt><code>planeNormalDir</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd><p>Index (0/1/2) of the compensation plane's normal axis.</p>
</dd>
<dt><code>offsetRadius_mm</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd><p>Unsigned offset radius applied by the region.</p>
</dd>
<dt><code>offsetId</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd><p>The D row the region resolves its radius from.</p>
</dd>
<dt><code>text</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p>Constant notification text (fold-stable), or null.</p>
</dd>
<dt><code>detail</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>, <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a>&gt;</dt>
<dd><p>Offset radius, programmed and compensated lengths and D row, or null.</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
</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>
@@ -200,6 +200,29 @@ project serializes the suit's two members <em>flat</em> in the project XML,
keeping the per-workpiece <a class="xref" href="Hi.NcParsers.NcRunnerSuit.html#Hi_NcParsers_NcRunnerSuit_PerCaseNcDependencyList">PerCaseNcDependencyList</a> project-local
rather than a shared side file.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.RadiusCompInterference.html">RadiusCompInterference</a></dt>
<dd><p>Classifies cutter-compensation interference — the case a real control
refuses under G41/G42: the compensated tool path runs against the
programmed direction because the offset radius is larger than the
inner feature it has to follow (an inner arc smaller than the offset,
a groove bottom narrower than the tool). Fanuc stops with alarm
PS0041 INTERFERENCE IN CUTTER COMPENSATION; Heidenhain and Siemens
have equivalents. The simulation has no interference check and keeps
running the swapped-side path — so a program that simulates cleanly
can still stop on the machine, and a wrongly filled D row (the tool
radius entered against a tool-centre CAM path that expects wear only)
shows up as an overcut instead of an alarm. The diagnostics built from
this class exist to close that gap; they never change the path.</p>
<p>
Today the gate is meaningful on the XY plane (G17) only: both
compensation engines build the perpendicular as <code>Z × axis</code>
whatever plane is selected, so a G18/G19 region is neither compensated
in its own plane nor checked here — the <code>planeNormalDir</code> parameters
are ready for the day the engines pass the selected plane through.
</p>
</dd>
</dl>
<dl class="jumplist">
@@ -489,23 +489,32 @@ The key is Offset ID (H or D in NC code).</p>
<a id="Hi_Numerical_MillingToolOffsetTable_UpdateIdealMillingToolOffsetTableByToolHouse_" data-uid="Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse*"></a>
<h3 id="Hi_Numerical_MillingToolOffsetTable_UpdateIdealMillingToolOffsetTableByToolHouse_Hi_Machining_MachiningToolHouse_" data-uid="Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(Hi.Machining.MachiningToolHouse)">
UpdateIdealMillingToolOffsetTableByToolHouse(MachiningToolHouse)
<h3 id="Hi_Numerical_MillingToolOffsetTable_UpdateIdealMillingToolOffsetTableByToolHouse_Hi_Machining_MachiningToolHouse_Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_" data-uid="Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(Hi.Machining.MachiningToolHouse,Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis)">
UpdateIdealMillingToolOffsetTableByToolHouse(MachiningToolHouse, RadiusOffsetBasis)
</h3>
<div class="markdown level1 summary"><p>Updates the ideal tool offsets in this table based on a tool house.</p>
<div class="markdown level1 summary"><p>Updates the ideal tool offsets in this table based on a tool house:
ideal height = spindle-buckle-to-tool-tip length; ideal radius of a
milling-cutter row = the cutter profile's max radius under
<a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_CutterRadius">CutterRadius</a> or 0 under
<a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_ZeroBased">ZeroBased</a>. Wear is preserved and rows
for tools no longer in the house are dropped.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void UpdateIdealMillingToolOffsetTableByToolHouse(MachiningToolHouse millingToolHouse)</code></pre>
<pre><code class="lang-csharp hljs">public void UpdateIdealMillingToolOffsetTableByToolHouse(MachiningToolHouse millingToolHouse, RadiusOffsetBasis radiusBasis = RadiusOffsetBasis.CutterRadius)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>millingToolHouse</code> <a class="xref" href="Hi.Machining.MachiningToolHouse.html">MachiningToolHouse</a></dt>
<dd><p>The machining tool house containing tool information.</p>
</dd>
<dt><code>radiusBasis</code> <a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html">RadiusOffsetBasis</a></dt>
<dd><p>The project's cutter-radius compensation
strategy; decides the ideal radius written for milling-cutter rows.</p>
</dd>
</dl>
+6
View File
@@ -2440,6 +2440,9 @@
<li>
<a href="Hi.NcParsers.NcRunnerSuit.html" name="" title="NcRunnerSuit">NcRunnerSuit</a>
</li>
<li>
<a href="Hi.NcParsers.RadiusCompInterference.html" name="" title="RadiusCompInterference">RadiusCompInterference</a>
</li>
<li>
<a href="Hi.NcParsers.Sentence.html" name="" title="Sentence">Sentence</a>
</li>
@@ -2587,6 +2590,9 @@
<li>
<a href="Hi.NcParsers.Dependencys.Generic.MachineAxisConfig.html" name="" title="MachineAxisConfig">MachineAxisConfig</a>
</li>
<li>
<a href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html" name="" title="RadiusOffsetBasis">RadiusOffsetBasis</a>
</li>
<li>
<a href="Hi.NcParsers.Dependencys.Generic.SubProgramFolderConfig.html" name="" title="SubProgramFolderConfig">SubProgramFolderConfig</a>
</li>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

@@ -169,10 +169,10 @@ one, or handing one to somebody else means taking the folder.</p>
beside the page name, is set to <strong>Project</strong> — the root that exists only while a project is open, and
that resolves to the folder holding the open project file — and the path field reads <code>.</code>, the root
folder itself. Three folders sit at the top, <strong>MachineTool</strong>, <strong>NC</strong> and <strong>Output</strong>, and five files
below them: the cutting parameters and the workpiece material, the project file itself at about
135 KB, the spindle capability, and a cutter material. The right-hand pane is the explorer's text
below them: the cutting parameters and the workpiece material, the project file itself at
138.1 KB, the spindle capability, and a cutter material. The right-hand pane is the explorer's text
editor, waiting on a file to be given to it.</p>
<p><img src="projects-img/project-folder.en.png" alt="The File Explorer showing the open project's folder under the Project root: the folders MachineTool, NC and Output above five files with their sizes, among them the project file at 135.2 KB and four side files named for a cutting parameter set, a workpiece material, a spindle capability and a cutter material, with the empty text editor pane on the right"></p>
<p><img src="projects-img/project-folder.en.png" alt="The File Explorer showing the open project's folder under the Project root: the folders MachineTool, NC and Output above five files with their sizes, among them the project file at 138.1 KB and four side files named for a cutting parameter set, a workpiece material, a spindle capability and a cutter material, with the empty text editor pane on the right"></p>
<div class="WARNING">
<h5>Warning</h5>
<p><strong>A Save As into a new folder can produce a project that finds none of its programs.</strong> Save As
@@ -131,7 +131,7 @@ is placeable anywhere, and <a href="building-a-mission.html">Building a Mission<
<td>5</td>
<td><strong>Record Meshed Geometry</strong></td>
<td>Output</td>
<td><code>Cache/&lt;stage&gt;-init.wct</code> — the stock, meshed once; drop this row where the stock is already a recorded mesh</td>
<td><code>Cache/&lt;stage&gt;-init.wct</code> — the stock, meshed once. Keep this row whenever the stock is an STL; drop it where the stock is procedural, or is already a recorded mesh (<a href="#the-stage-0-cache-goes-stale-silently">which, and why</a>)</td>
</tr>
<tr>
<td>6</td>
@@ -234,12 +234,49 @@ what the run starts from — so <strong>changing the workpiece geometry, its ini
Machining Resolution has no effect until the cache is cleared.</strong> Nothing warns you: the run simply
reproduces the previous one. After changing any of those three, Reset the stage-0 record (or delete
its file) before reading anything into the result.</p>
<p><strong>Give a stage a stage-0 record only when the stock costs real time to mesh</strong> — a large mesh or a
solid the kernel has to build. Where a stage's stock is itself a recorded mesh, as it is for the
second operation in a chained pair, a stage-0 record buys no time at all and freezes the chain: the
upstream stage can be re-run all it likes and this one keeps reading the copy it took the first
time. There, the previous stage's own end-of-stage file is already the cache, and the stage needs
no record above its program.</p>
<p><strong>Give a stage a stage-0 record when the stock costs real time to mesh, and not otherwise.</strong> The
test is what the workpiece's initial geometry actually is:</p>
<table>
<thead>
<tr>
<th>Stock geometry</th>
<th>Stage-0 record</th>
<th>Why</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>An STL of any size that is not trivial</strong> — a CAD export, a scanned blank, anything with more than a few thousand triangles</td>
<td><strong>Yes</strong></td>
<td>meshing it is a fixed, single-threaded cost paid on every play, and it does not shrink with a shorter program</td>
</tr>
<tr>
<td>A box, a cylindroid, or another procedural solid</td>
<td>No</td>
<td>the kernel builds it in moments; the record would cost more than it saves</td>
</tr>
<tr>
<td>A mesh recorded by an earlier stage</td>
<td><strong>No</strong> — see below</td>
<td>it is already a cache</td>
</tr>
</tbody>
</table>
<p>The first row is the case worth spelling out, because the cost does not look like it belongs to the
geometry. A stock STL is meshed into the cube tree when the first program plays, so the time lands
inside the run and reads as if the NC were slow. It is not: it is a constant. One measured example
is a 8.9 MB stock STL whose mesh build was <strong>168 s of every play, unchanged when the program was
swapped for a 4.8 KB one</strong> — on a 193 s run, 168 s of it was the stock. Recording that mesh once
turns the second and every later play into a file read of a few hundredths of a second.</p>
<p>The cost climbs steeply with triangle count, so the finer the tessellation the more a stage-0 record
is worth: a 1.17-million-triangle stock at 0.125 mm had still not finished meshing after 268 s.</p>
<p>Where a stage's stock is itself a recorded mesh, as it is for the second operation in a chained
pair, a stage-0 record buys no time at all and freezes the chain: the upstream stage can be re-run
all it likes and this one keeps reading the copy it took the first time. There, the previous
stage's own end-of-stage file is already the cache, and the stage needs no record above its program.</p>
<p>One thing the record does not do is make a stock that the kernel cannot mesh meshable. The record
writes what the build produced; if the build itself fails, there is nothing to write, and the
mission fails in the same place on every run.</p>
<h2 id="resuming-then-cutting-finer">Resuming, then cutting finer</h2>
<p>A record freezes the workpiece <strong>as meshed at the width in force when it ran</strong>. Reading one back
does not pin the rest of the run to that width: put a finer Machining Resolution below the record
Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 128 KiB

@@ -144,8 +144,8 @@ is what narrows them, and the first result is highlighted ready for <kbd>Enter</
<h2 id="read-a-row">Read a row</h2>
<p>Each row shows the command's kind followed by the detail that identifies it, in brackets. Where you
can name a command that detail is the title you typed, so a row still says what it is after it has
been named: <code>List [Roughing]</code>, <code>NC Code [Face check]</code>. Where you cannot, the command brackets what
it holds instead — <code>Program File [NC/facing.ptp]</code>, <code>Machining Resolution [0.25 mm]</code>,
been named: <code>List [Roughing]</code>, <code>NC Code [Inline finishing pass]</code>. Where you cannot, the command brackets what
it holds instead — <code>Program File [NC/circle.ptp]</code>, <code>Machining Resolution [1 mm]</code>,
<code>Collision Detection [On]</code> — so a mission is readable without opening anything.</p>
<p>Beside the label sit four buttons — <strong>up</strong>, <strong>down</strong>, <strong>duplicate</strong> and <strong>delete</strong>. Up and down are
disabled at the ends of the list. Delete asks first, in a dialog naming the command. Duplicate is a
@@ -165,11 +165,12 @@ mission can be grouped by operation rather than left flat.</p>
<p>A list carries an optional title, entered on its own node above the embedded editor. The row reads
<code>List</code> while the title is empty and <code>List [title]</code> once it says something; a title of nothing but
spaces counts as unset. The Mission root is the one list with no title field — it reads <strong>Mission</strong>.</p>
<p>The demo mission at <code>/execution?tree=execution/mission</code>: three groups and four loose entries. The
tree above shows <strong>List [Setup]</strong> opened, with the three settings commands inside it bracketing
their values; the editor below shows the same seven entries as rows. The greyed <strong>Script</strong> row is an
entry left in place with its checkbox cleared — part of the mission, and not run.</p>
<p><img src="building-a-mission-img/grouped-mission.en.png" alt="The Mission branch of the Control Tree with List Setup expanded over Machining Resolution 0.25 mm, Collision Detection On and Physics On, then NC Optimization Config, List Roughing, List Finishing, NC Code Face check, Post-Execution and a greyed Script Export result row with its checkbox cleared; below it the list editor shows the same seven entries, each with up, down, duplicate and delete buttons, above the line reading that commands run top-down"></p>
<p>The demo mission at <code>/execution?tree=execution/mission</code>: two groups and seven loose entries. The
tree above shows <strong>List [Roughing]</strong> and <strong>List [Finishing]</strong> opened, with the two Program File
entries inside each bracketing their files; the editor below shows the same nine root entries as
rows. The greyed <strong>Program File</strong> and <strong>Post-Execution</strong> rows are entries left in place with their
checkboxes cleared — part of the mission, and not run.</p>
<p><img src="building-a-mission-img/grouped-mission.en.png" alt="The Mission branch of the Control Tree showing Machining Resolution 1 mm and Collision Detection On, then List Roughing expanded over Program File NC/circle.ptp and Program File NC/drill_slot.ptp, List Finishing expanded over Program File NC/side.ptp and Program File NC/slide.ptp, then Program File NC/circle.ptp, NC Code Inline finishing pass, a greyed Program File NC/slide-test-resolution-script.ptp with its checkbox cleared, NC Optimization Config and a greyed Post-Execution with its checkbox cleared; below it the list editor shows the same nine root entries under an Add Command button and a Commands badge reading 9, each row with up, down, duplicate and delete buttons, above the line reading that commands run top-down"></p>
<h2 id="reorder-and-move-in-and-out">Reorder, and move in and out</h2>
<p>Up and down move an entry within its own list and never change which list owns it. Dragging does
more, and where you drop decides which:</p>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 119 KiB

@@ -177,7 +177,7 @@ the cutter was touching there&rdquo; become one picture rather than two.</p>
<p>The column with the demo mission paused and a step selected: Sentence Syntax at the top, the step
badge on the bar below it, then Step Properties, CWE and the two simulated cycle charts. The two sensor charts are folded away at the bottom — this project carries no measured data,
so nothing is lost by leaving them shut.</p>
<p><img src="inspecting-a-step-img/step-info.en.png" alt="The Execution page's Step Info column filled: a Sentence Syntax panel showing an NC block and its parsed form, a group bar carrying a step number badge, a Step Properties list of named values, a CWE panel showing the cut footprint in a small 3D view, and two cycle charts plotting force and moment against spindle angle"></p>
<p><img src="inspecting-a-step-img/step-info.en.png" alt="The Execution page's Step Info column filled: a Sentence Syntax panel showing the arc block N0120 G02 I0.0 J11. above its parsed form, a group bar badged step #500, a Step Properties list reading FileNo 1, LineNo 13, FilePath NC/circle.ptp and a Time of four seconds, a CWE panel whose small 3D view draws the cutter's flute contours against an orange contact patch on the workpiece, and two cycle charts carrying X, Y and Z traces of cutting force and spindle moment across a full 0 to 360 degree spindle revolution"></p>
<h2 id="choosing-what-step-properties-shows">Choosing what Step Properties shows</h2>
<p>Step Properties does not show everything a step carries — it shows what you asked for, out of a much
longer list. The small button on that panel's header opens the chooser, beside the list it
Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 124 KiB

@@ -207,10 +207,10 @@ counts sit below it and follow what you type.</p>
<p><strong>Nothing is checked while you type.</strong> The text is stored exactly as written, and a mistake in it
surfaces when the mission plays it — in <strong>NC Diagnostics</strong>, see
<a href="when-something-goes-wrong.html">When Something Goes Wrong</a>.</p>
<p>The demo mission's short hand-written pass, at <code>/execution?tree=execution/mission/4</code>. The title
<p>The demo mission's short hand-written pass, at <code>/execution?tree=execution/mission/5</code>. The title
above the editor is what the row brackets, and the line and character counts below it are the whole
of the feedback this editor gives.</p>
<p><img src="playing-a-program-img/nc-code.en.png" alt="The NC Code command panel: a Title field reading Face check above a monospace text area holding a short NC program, with line and character counts and the Trim Blank Lines and Clear buttons below it"></p>
<p><img src="playing-a-program-img/nc-code.en.png" alt="The NC Code command panel: a Title field reading Inline finishing pass above a monospace text area holding a short NC program, with line and character counts and the Trim Blank Lines and Clear buttons below it"></p>
<h2 id="after-it-has-played">After it has played</h2>
<p>Every program a session read appears under the <strong>Program</strong> branch, with the passes that went over it
and the marks the run left on each line. That is where you see what happened to a line, as opposed
Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 61 KiB

@@ -205,9 +205,10 @@ transport. The footer along the bottom of the window carries the session's own m
<p>The same page with the mission paused part way through. The badge now reads <em>paused</em> in orange, Pause
has gone grey, and Stop has joined the live ones — so the bar alone tells you a run is open and held.
On the canvas the tool path the run has laid down so far is now drawn over the block, and the tabs
under it are counting what the run has reported: this mission trips the collision check, which is
what the red line in the footer and the number on <strong>Step Diagnostics</strong> are saying.</p>
<p><img src="running-a-simulation-img/transport-paused.en.png" alt="The Execution page with the Control Tree on the left, its Execution item carrying an orange paused badge, the transport row above the editor panel with the pause button greyed and the rest live, the 3D canvas showing the block with the covered tool path drawn over it, and a footer line reporting a collision"></p>
under it are counting what the run has reported: <strong>Shell</strong> is badged with the eleven messages the
load and the run have written between them and <strong>NC Diagnostics</strong> with the one the parser raised,
while <strong>Step Diagnostics</strong> and <strong>NC Manipulation</strong> carry no badge at all.</p>
<p><img src="running-a-simulation-img/transport-paused.en.png" alt="The Execution page with the Control Tree on the left, its Execution item carrying an orange paused badge, the transport row above the editor panel with the pause button greyed and the rest live, the 3D canvas showing a gold disc cutter sunk into the top face of the white block on its grey fixture with a single thin green tool path entering from the upper left and dropping to it, and a footer reading Ready"></p>
<h2 id="the-keys-and-where-they-stop">The keys, and where they stop</h2>
<p><kbd>F5</kbd> to <kbd>F8</kbd> are bound only while the Execution page is the one on screen. On every
other page <kbd>F5</kbd> is the browser's own reload, and the same is true here in two cases: when
Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 108 KiB

@@ -152,7 +152,7 @@ add and nothing to look for.</p>
<p><strong>NC Optimization Config</strong> is the Optimization category's one command, and it exists so the
optimizer's settings sit at a point in the run rather than over all of it. Everything played below
it optimizes under those values, and a second one further down re-points them mid-mission.</p>
<p>Its own node carries four switches<strong>Enable Optimization</strong>, <strong>Enable Feedrate Optimization</strong>,
<p>Its own node carries five switches. The fifth, <strong>Omit Leading Zero in Output (.348, not 0.348)</strong>, only formats the numbers written out; the other four steer the optimizer<strong>Enable Optimization</strong>, <strong>Enable Feedrate Optimization</strong>,
<strong>Enable Depth Splition</strong> and <strong>Enable Interpolation</strong> — and the values live on five child nodes
beneath it:</p>
<table>
@@ -191,10 +191,11 @@ optimizer is on, which is the first switch on its panel.</p>
<p>The command takes no title: its row always reads <strong>NC Optimization Config</strong>. What each quantity
means, and why an optimized result can look wrong, is
<a href="../../technique/nc-optimization/index.html">NC Optimization</a>.</p>
<p>The demo mission's optimizer command, at <code>/execution?tree=execution/mission/1</code>, sitting above the
two program groups it governs. The four switches are on the command's own panel; the five value
nodes are indented under it in the tree.</p>
<p><img src="the-other-commands-img/nc-optimization-config.en.png" alt="The NC Optimization Config command selected in the Mission branch, with Distances, Feedrate, Motion Dynamics, Force and Safety and Compensation child nodes listed beneath it, and the panel below showing the Enable Optimization, Enable Feedrate Optimization, Enable Depth Splition and Enable Interpolation checkboxes"></p>
<p>The demo mission's optimizer command, at <code>/execution?tree=execution/mission/7</code>. In this mission it
sits below both program groups rather than above them, so the ordering rule at the top of this
section is what decides how much of the run it reaches. The five switches are on the command's own
panel; the five value nodes are indented under it in the tree.</p>
<p><img src="the-other-commands-img/nc-optimization-config.en.png" alt="The NC Optimization Config command selected in the Mission branch, with Distances, Feedrate, Motion Dynamics, Force and Safety and Compensation child nodes listed beneath it, and the panel below showing the Enable Optimization, Enable Feedrate Optimization, Enable Depth Splition and Enable Interpolation checkboxes ticked above an unticked Omit Leading Zero in Output checkbox"></p>
<h2 id="writing-out-what-the-run-produced">Writing out what the run produced</h2>
<p>The <strong>Output</strong> category holds three commands: <strong>Post-Execution</strong>, <strong>Record Meshed Geometry</strong> and
<strong>Export Meshed Geometry (STL)</strong>.</p>
@@ -257,7 +258,7 @@ not what can be prepared. The outputs are written in an order of the command's o
step files, optimization, the writeback, then the geometry difference — which is not the order the
tree lists them in, and which matters only if you are reading their timestamps.</p>
<p>The demo mission's Post-Execution command with <strong>Step Files Output</strong> selected, at
<code>/execution?tree=execution/mission/5/step-files</code>. Each output is a child node with its own
<code>/execution?tree=execution/mission/8/step-files</code>. Each output is a child node with its own
checkbox — that tick is what switches the output on — and the template field for the selected one
sits in the panel below.</p>
<p><img src="the-other-commands-img/post-execution.en.png" alt="The Post-Execution command in the Mission branch with its five child nodes, each carrying its own checkbox, and the Step File Template field in the panel below"></p>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

@@ -116,7 +116,7 @@ command has one, under its title.</em></p>
not name — a subprogram call nests its callee under the caller. The panel's badge changes from
<em>not run yet</em> to <em>run data</em>, and a file the run made more than one pass over takes a <code>×</code> and a
count in its tree label.</p>
<p><img src="the-program-branch-img/program-after-run.en.png" alt="The same page after the run has finished: the Execution root badge reads finished, the first Program node now reads circle.ptp ×2, the branch panel is badged run data beside 5 files, and the Session Messages tabs carry counts — Shell 10 and NC Diagnostics 7, with Step Diagnostics and NC Manipulation still unbadged"></p>
<p><img src="the-program-branch-img/program-after-run.en.png" alt="The same page after the run has finished: the Execution root badge reads finished, the first Program node now reads circle.ptp ×2, the branch panel is badged run data beside 5 files, and the Session Messages tabs carry counts — Shell 11 and NC Diagnostics 7, with Step Diagnostics and NC Manipulation still unbadged"></p>
<p><em>The same deep link once the run has finished. <code>circle.ptp ×2</code> is one node holding two passes,
because two Program File commands named the same file.</em></p>
<div class="IMPORTANT">
Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

@@ -120,7 +120,7 @@ account of itself is on <strong>Shell</strong>.</li>
<p>A message about a <code>G</code> word and a message about a move are different problems, and they never share a
list. Looking in the wrong one reads as silence.</p>
<h2 id="reading-a-row">Reading a row</h2>
<p><img src="when-something-goes-wrong-img/nc-diagnostics.en.png" alt="The Execution page with the left and right columns switched off: the canvas above, and below it the Session Messages panel with the NC Diagnostics tab selected. The tab row shows Shell badged 10 and NC Diagnostics badged 7, with Step Diagnostics and NC Manipulation carrying no badge at all. Under a filter toolbar of Severity, Category, a text box, Reset and Export, seven rows are listed: six System rows reading Sys-Init&ndash;FileLines with each file and its line count, and one warning row whose anchor column reads Sn 2105, category Unsupported, id Parsing&ndash;Unconsumed, text Unconsumed Parsing entries: G02"></p>
<p><img src="when-something-goes-wrong-img/nc-diagnostics.en.png" alt="The Execution page with the left and right columns switched off: the canvas above, and below it the Session Messages panel with the NC Diagnostics tab selected. The tab row shows Shell badged 11 and NC Diagnostics badged 7, with Step Diagnostics and NC Manipulation carrying no badge at all. Under a filter toolbar of Severity, Category, a text box, Reset and Export, seven rows are listed: six System rows reading Sys-Init&ndash;FileLines with each file and its line count, and one warning row whose anchor column reads Sn 2105, category Unsupported, id Parsing&ndash;Unconsumed, text Unconsumed Parsing entries: G02"></p>
<p><em>The four lists at <code>/execution</code>, with NC Diagnostics selected. Two of the four tabs carry no badge,
which is how an empty sink looks.</em></p>
<p>A row carries, left to right, the position it is about, the category, the message's own id, and its
@@ -178,7 +178,7 @@ failure to draw.</p>
<li><a href="mech-builder.html">Mechanism Builder</a> — another of the supporting screens the Page menu lists, for assembling a machine chain</li>
<li><a href="../setup/controller.html">Controller</a> — the branch that owns controller setup for a project, and every setting this screen does not exclusively hold</li>
<li><a href="../setup/program-zero-alignment.html">Program Zero Alignment</a> — which direction an alignment runs, where program zero sits on the workpiece, and why this screen's table is not the one a run reads</li>
<li><a class="xref" href="../../anatomy/legacy-controller.html">Legacy Controller Page</a> — the component behind this page: its seven tabs, the model it edits and the one it does not</li>
<li><a class="xref" href="../../anatomy/legacy-controller.html">Legacy Controller Page</a> — the component behind this page: its seven tabs, how an edit commits, and its viewer</li>
</ul>
</article>
+1 -1
View File
@@ -96,7 +96,7 @@ and neither reprints the other.</p>
<ul>
<li><a href="about.html">About</a> — About Tech Coordinate and contact information</li>
<li><a href="system-requirements.html">System Requirements</a> — Supported operating systems, and what a high-resolution simulation actually needs from CPU, memory, GPU and disk</li>
<li><a href="license/index.html">License Terms</a> — HiNC user terms</li>
<li><a href="license.html">License Terms</a> — HiNC user terms</li>
</ul>
<h2 id="getting-started">Getting Started</h2>
<ul>
@@ -7,13 +7,13 @@
<meta name="title" content="HiNC User Terms | 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">
+1 -1
View File
@@ -22,7 +22,7 @@
<a href="system-requirements.html" name="" title="System Requirements">System Requirements</a>
</li>
<li>
<a href="license/index.html" name="" title="License Terms">License Terms</a>
<a href="license.html" name="" title="License Terms">License Terms</a>
</li>
<li>
<span class="expand-stub"></span>
+1 -1
View File
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"About","href":"about.html","topicHref":"about.html"},{"name":"System Requirements","href":"system-requirements.html","topicHref":"system-requirements.html"},{"name":"License Terms","href":"license/index.html","topicHref":"license/index.html"},{"name":"Getting Started","items":[{"name":"Windows Activation","href":"startup/windows.html","topicHref":"startup/windows.html"},{"name":"License Update","href":"startup/license-update.html","topicHref":"startup/license-update.html"},{"name":"Multi-Station Setup","href":"startup/multi-station.html","topicHref":"startup/multi-station.html"},{"name":"Delegated Authorization","href":"startup/delegate-auth.html","topicHref":"startup/delegate-auth.html"},{"name":"Tutorial Videos","href":"startup/tutorial.html","topicHref":"startup/tutorial.html"}]}]}
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"About","href":"about.html","topicHref":"about.html"},{"name":"System Requirements","href":"system-requirements.html","topicHref":"system-requirements.html"},{"name":"License Terms","href":"license.html","topicHref":"license.html"},{"name":"Getting Started","items":[{"name":"Windows Activation","href":"startup/windows.html","topicHref":"startup/windows.html"},{"name":"License Update","href":"startup/license-update.html","topicHref":"startup/license-update.html"},{"name":"Multi-Station Setup","href":"startup/multi-station.html","topicHref":"startup/multi-station.html"},{"name":"Delegated Authorization","href":"startup/delegate-auth.html","topicHref":"startup/delegate-auth.html"},{"name":"Tutorial Videos","href":"startup/tutorial.html","topicHref":"startup/tutorial.html"}]}]}
@@ -126,7 +126,14 @@ and <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensLoop
<code>I</code> / <code>J</code> / <code>K</code> circle centres. <code>G90 C=IC(360/17)</code> is one incremental index inside an absolute
program. Direction resolution lives in <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a>:
<code>ACP()</code> takes the <code>[anchor, anchor+360)</code> window, <code>ACN()</code> the <code>(anchor-360, anchor]</code> window, <code>DC()</code>
the shortest swing, with the exact 180° tie going negative.</li>
the shortest swing, with the exact 180° tie going negative. On a machine-coordinate block the
increment is a distance in the <em>machine</em> frame, because
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html">MachineCoordSelectSyntax</a> is ordered ahead of
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> in all five brand presets — Fanuc,
Mazak, Syntec, Siemens and Heidenhain — so <code>G53 X=IC(10)</code> and <code>SUPA Y=IC(-10)</code> add the raw word to
the previous machine position rather than being re-based through the program frame first. That
order is not something a saved-file patch can express: a project saved before 3.2.21 keeps the old
order for that block shape until its pipeline is re-created from the brand preset.</li>
<li><strong>Coded positions</strong><code>CAC</code> / <code>CIC</code> / <code>CDC</code> / <code>CACP</code> / <code>CACN</code> take a 1-based indexing position
number rather than a coordinate, resolved against <a class="xref" href="../../api/Hi.NcParsers.Dependencys.IIndexingPositionConfig.html">IIndexingPositionConfig</a>,
implemented by <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html">SiemensMachineDataTable</a> from the real machine
@@ -155,6 +162,37 @@ is the one spelling that states all of them at once — it takes the last progra
at the <code>CC</code> block, and replaces the modal centre rather than inheriting it. A centre that lands on
the arc's own start point leaves the block with no radius, so it warns
<code>Arc-CircleCenter--OnStartPoint</code> and is degraded to a linear move to the endpoint.</li>
<li><strong>Klartext incremental axis words</strong> — the <code>I</code>-prefixed word (<code>IX+20</code>, <code>IY-15</code>, rotary <code>IC+90</code>) is
the same axis word as its absolute twin, read as a distance from the last programmed position. It
is per word rather than per block: <code>L X+60 IY-10</code> mixes an absolute X with an incremental Y and
stamps only the Y. One shared grab serves five statement heads — <code>L</code>, <code>C</code>, <code>CC</code>, <code>LN</code> and
<code>CYCL CALL POS</code> — each writing the value under the <em>plain</em> axis key of its own section plus a
<code>&quot;PositioningOverride&quot;: { &quot;Y&quot;: &quot;Incremental&quot; }</code> entry on the block root. That is the same per-word
section the Siemens <code>IC()</code> wrapper writes, so the existing resolve consumers convert it and no
second incremental mechanism exists. Coverage differs by head: <code>L</code>, <code>C</code> and <code>LN</code> take the whole
axis tag list, rotary included, while <code>CC</code> and <code>CYCL CALL POS</code> take <code>X</code> / <code>Y</code> / <code>Z</code> only — a <code>CC</code>
never positions a rotary axis, and the stamp is keyed by axis on the block root, where a rotary
letter would read as a rotary word of the block. The sign is optional (<code>L IX5</code>), a <code>Q</code> reference
resolves behind the prefix (<code>L IZ+Q2</code>), and the glued post-processed run <code>LIX+20IY-15</code> parses.
Before these words were read the plain grab could not see the <code>X</code> inside <code>IX</code> — its prefix guard
demands a word boundary, a digit or whitespace before the tag, and <code>I</code> is a word character — so
<code>L X+60 IY-10</code> took the X and dropped the Y: a motion to the wrong place, not a missing one.</li>
<li><strong>What an incremental word is measured from</strong> depends on the statement. An <code>L</code> / <code>C</code> / <code>LN</code>
endpoint and a <code>CC</code> centre are distances from the last programmed tool position, so
<code>CC IX+0 IY+11</code> is a stated centre resolved against that position — never against the previous
centre — and it is no longer the spelling whose coordinates the parser could not read.
<code>CYCL CALL POS</code> has its own reference: an <code>IX</code> / <code>IY</code> / <code>IZ</code> word there is a distance from the
coordinates the <em>previous</em> <code>CYCL CALL POS</code> programmed, which is the control's own rule behind its
error 1A0-0108. An axis that no earlier call programmed has no reference: the control refuses the
call, and the simulation warns <code>HeidenhainCyclCall--IncrementalNoReference</code> and falls back to the
last programmed position. A tool move between the two calls makes the two candidate references
differ, and that divergence warns <code>HeidenhainCyclCall--IncrementalAfterMove</code>, the control's stated
reference winning. With <code>M91</code> on the block the increment is a machine-frame distance, per the
ordering note under Siemens above. A rotary increment is a signed traverse the wrap pass keeps
verbatim — <code>IC+270</code> from 75° stays 345° instead of folding into the ±180° shortest-path window,
while an absolute rotary word on the same block still folds. The <code>CYCL DEF 7</code> datum-shift <code>I</code>
words are a different mechanism: <code>CYCL DEF 7.2 IY+5</code> shifts by the value on top of the shift last
valid, stays under prefixed keys in the cycle's own record, and writes no per-word stamp at all.</li>
<li><strong>Q-parameters</strong><a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser.html">HeidenhainExpressionParser</a> lexes
<code>Q</code> / <code>QR</code> / <code>QL</code> / <code>QS</code>, the <code>DIV</code> keyword of FN 4 and the prefix <code>SQRT</code> of FN 5, so <code>FQ1</code> reaches
the feedrate, <code>L X+Q2</code> reaches the program XYZ and <code>TOOL CALL SQ3</code> reaches the spindle speed.
@@ -120,8 +120,8 @@ count the thermal FEM builds, so trailing shank nodes no longer sit at 0 K after
<li><strong>Cutter geometry is validated up front.</strong>
<a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_GetUpperBeamGeometryIssues_">GetUpperBeamGeometryIssues</a> collects upper-beam and shank
configuration problems as keyed messages — for example an extended-cylinder beam whose full length
sits below the flute height (<code>Cutter-UpperBeam--BelowFluteHeight</code>), which inverts the shank solid and
makes the shank thermal model unbuildable. They are reported once per tool at <code>BeginSession</code> and at
sits below the flute height (<code>Cutter-UpperBeam--ExtendedCylinderFullLengthTooShort</code>), which
inverts the shank solid and makes the shank thermal model unbuildable. They are reported once per tool at <code>BeginSession</code> and at
each tool change, instead of surfacing later as a null-reference cascade inside the thermal physics
with nothing naming the beam.</li>
<li><strong><code>RakeFaceCuttingPara3d</code> no longer throws on a six-field parameter string</strong> (the guard read the
@@ -134,9 +134,16 @@ the <code>LocalProfileMillingPara(Vec3d, Vec3d)</code> constructor maps (x,y,z)
physics was inactive at simulation time). The gather pass counts both against the eligible steps:
silent at zero, one summary warning at or below
<a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html#Hi_MillingForces_Training_MillingTraining_MissingEngagementAbortRatio">MissingEngagementAbortRatio</a> (default 0.25), and a
configuration error above it. A gather pass that produces no samples at all now reports immediately
rather than throwing inside the SVD solve, separating &ldquo;not one step touched the workpiece&rdquo; from
&ldquo;touched steps whose mapped force data yielded no usable shots&rdquo;.</li>
configuration error above it. <strong>The breakdown in that summary is the diagnosis</strong>: misses sitting on
the engagement level mean the play itself ran with physics inactive, while a scattered few on the
luggage level are the read-back path, where a segment that covers a step but lacks its row is
dropped and answers null once before the next read rebuilds it. Above the ratio the training
aborts instead of continuing on what is left, because a parameter file built from a fraction of
the play is indistinguishable from a sound one once it has been written — its coefficients are
read back later as a real effect. Set the ratio to <code>1</code> to never abort. A gather pass that produces
no samples at all now reports immediately rather than throwing inside the SVD solve, separating
&ldquo;not one step touched the workpiece&rdquo; from &ldquo;touched steps whose mapped force data yielded no usable
shots&rdquo;.</li>
<li><strong>New training knobs.</strong> <a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html#Hi_MillingForces_Training_MillingTraining_EnableDesignMatrixSolver">EnableDesignMatrixSolver</a>
(default false) solves the least squares on a thin QR of the design matrix instead of forming the
normal equations, which square the condition number;
@@ -111,10 +111,20 @@ per-fragment arc IJK recomputation — including R-to-IJK conversion — whereve
carries the centre. An arc whose centre lives on a preceding modal block is exempt: its fragments
keep the source block's arc words and share that upstream centre line unchanged, so only their
endpoint and <code>F</code> words move. Two cases where the frozen HardNc optimizer is silently wrong are
downgraded to a non-split rewrite rather than reproduced: a <code>G91</code> incremental block (the old
fragment rewrite always emitted absolute coordinates), and a klartext <code>C … DR±</code> arc whose modal
<code>CC</code> chain left one of the two in-plane axes unstated, so the block's own start point supplied
that component — since every fragment would re-derive the centre from its own start. A klartext
downgraded to a non-split rewrite rather than reproduced, each warned once per run. The first is
an incremental block, and it is now taken by both of its spellings: <code>G91</code> modal state, <strong>or</strong> a
block whose modal state is absolute while individual axis words carry a per-word incremental
override — Siemens <code>X=IC(10)</code> and the coded <code>CIC()</code>, klartext <code>IX+20</code> and <code>IC+90</code>. The frozen
fragment rewrite carries no <code>G90</code>/<code>G91</code> handling at all and always re-emits a coordinate as an
absolute program value, so it splits both shapes and is wrong on each in its own way: the <code>G91</code>
line comes back stating an absolute number the control still reads as a distance, and the
per-word line keeps its incremental source word, so every fragment re-applies the same distance
from its own start. Both now stop at <code>NcOpt--SplitionIncrementalUnsupported</code>. The per-word
spelling is also the only one that can reach klartext: that dialect has no modal <code>G90</code>/<code>G91</code>
word, so a stamped axis word is the only incremental form it produces. The second case is a
klartext <code>C … DR±</code> arc whose modal <code>CC</code> chain left one of the two in-plane axes unstated, so the
block's own start point supplied that component — since every fragment would re-derive the centre
from its own start; that one reports <code>NcOpt--SplitionStartPointCenterUnsupported</code>. A klartext
<code>C</code> block whose centre lands entirely on its own start point never reaches that guard: its radius
is zero, so play degrades it to a chord under a validation warning of its own.
<strong>Neither the controller brand nor klartext as such refuses a split</strong>: a klartext <code>L</code> block
@@ -126,10 +126,18 @@ they are the fastest way to find out what a run actually did.</p>
<td>a Siemens (T, D) pair had no <code>$TC_DP</code> row; the generic tool height was used</td>
</tr>
<tr>
<td><code>SiemensToolOffset--TcdpRowMissingGenericHeightNaN</code></td>
<td>a Siemens (T, D) pair had no <code>$TC_DP</code> row and the generic tool height was NaN too; the D activation resolved to offset 0</td>
</tr>
<tr>
<td><code>Comp-ToolHeight--001</code></td>
<td>a G43.4 H word could not be resolved</td>
</tr>
<tr>
<td><code>RadiusComp--Interference</code></td>
<td>a G41/G42 block whose compensated path runs against the programmed direction (an inner arc or groove smaller than the offset radius); a real control stops there with an interference alarm (Fanuc PS0041) while the simulation continues on the swapped-side path — on a tool-centre CAM path the radius offset row (D row) must hold the wear only, not the tool radius</td>
</tr>
<tr>
<td><code>Coord-WorkOffset--AdditionalZero</code></td>
<td>a Fanuc-family additional work coordinate system (<code>G54.1 Pn</code>, also written <code>G54 Pn</code>) was selected but no offset has been entered for it; the program runs on the machine origin</td>
</tr>
@@ -174,6 +182,10 @@ they are the fastest way to find out what a run actually did.</p>
<td>a CL motion resolved no tool offset</td>
</tr>
<tr>
<td><code>CsvStepDurationClamped</code></td>
<td>a replayed CSV row's recorded step gap exceeded the single-step duration limit and was capped at it; such a gap is normally the seam where two recordings were concatenated</td>
</tr>
<tr>
<td><code>Map-ShotGap--StepsSkipped</code></td>
<td>steps were skipped because their shot pairing window held no measured row</td>
</tr>
@@ -95,6 +95,10 @@
<li>T2 Drill bit, diameter unrestricted</li>
</ul>
<p>Click to download <a href="smart-holder-training-img/train.nc">NC code</a>.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p><strong>What this set determines, and what it does not.</strong> Both <a href="#shape-ii">Shape II</a> passes run T1, so the milling passes span two feeds per tooth — 0.1 and 0.05 — at a single helix angle. That is a spread in the right variable, and a narrow one: it works on the slopeintercept collinearity between the shear and the ploughing coefficients. Nothing in the set works on the other degeneracy, the bending-moment plane null: one combination of the edge and normal shear coefficients stays unobservable, and a set of symmetric four-flute passes carries no cutter phase of its own. Which way the run then fails depends on the channels measured — with the axial torque channel present (<code>IsMzEnabled</code>, see <a class="xref" href="../../workflows/force-training.html">Force Training</a>) the fit converges and reports a high correlation over shear values orders of magnitude too large; without it the fit collapses rather than degrading. Repeating <a href="#shape-ii">Shape II</a> with an end mill of a clearly different helix angle removes the plane null, but does not on its own make the set determined — a wider chip-load range across the passes is the other half. See <a href="training-cut-set-design.html">Designing a Training Cut Set</a>.</p>
</div>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Adjusting Machining Method</strong></p>
@@ -136,9 +136,23 @@ not by the magnitude of any one coefficient.</p>
</div>
<h2 id="flute-count-is-not-a-lever">Flute Count Is Not a Lever</h2>
<p>Adding more passes with the same symmetric multi-flute cutter buys nothing, at any feed. That
sample subspace is degenerate, and more of it stays degenerate: a set made only of symmetric
four-flute passes cannot derive its own cutter phase, and the fit collapses rather than degrading.
What buys identifiability is spread — in helix angle, and in feed per tooth.</p>
sample subspace is degenerate, and more of it stays degenerate. Evenly spaced flutes also cancel
the rotation-averaged transverse moment a run derives its own cutter phase from, so a set made only
of symmetric passes carries no phase reference of its own. Which way it then fails depends on the
channels measured: with the axial torque channel present the fit still converges and reports a high
correlation over shear coefficients orders of magnitude too large; without it the fit collapses
rather than degrading. Neither outcome is usable, and adding passes repairs neither. What buys
identifiability is spread — in helix angle, and in feed per tooth.</p>
<p>Supplying the phase from outside removes that half of the problem and nothing else.
<a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html#Hi_MillingForces_Training_MillingTraining_EnableCwePhasePairing">EnableCwePhasePairing</a> <small>(API)</small> reads
each step's phase from the engagement blocks instead of bootstrapping it from the samples, for
one-flute and symmetric two-flute cutters in light radial side cuts; outside those preconditions the
training falls back to the bootstrapped path with a warning, so a four-flute set is not rescued by
it. The null a single helix angle leaves is untouched either way.</p>
<p>The shipped smart-holder cut set has exactly this shape: its milling passes are one symmetric
four-flute end mill at two feeds, so the set is spread in feed per tooth alone and does not
determine its own edge and normal shear values — see
<a href="smart-holder-training.html">Smart Holder Training</a>.</p>
<p>Symmetric off-the-shelf cutters are nonetheless sufficient. Custom single-flute grinding is not
required for either fix; a pair of stock two-flute cutters ground at different helix angles carries
the same identifiability, and is what a shop can actually obtain.</p>
@@ -174,7 +174,7 @@ Trans.x \cdot Step &amp; Trans.y \cdot Step &amp; Trans.z \cdot Step &amp; 1
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="topology.html">Kinematic Topology</a> — the anchors and branches these matrices move</li>
<li><a href="../../anatomy/geom/transformation-geom-control.html">TransformationGeomControl</a> — the app panel that wraps a geometry in one of these transforms</li>
<li><a href="../../anatomy/geom/transformation-geom-editor.html">TransformationGeomControl</a> — the app panel that wraps a geometry in one of these transforms</li>
</ul>
</article>
@@ -157,7 +157,7 @@ tip), so it includes the flute span</strong> — it is <em>not</em> the remainin
the flute top to the exposed end. It must therefore be <strong>larger than the flute
height</strong>: e.g. flute height 20 mm and 10 mm of shank above it → <code>FullLength = 30</code>, not 10. A value at or below the flute height inverts the beam solid;
thermal physics then cannot build its shank shell layers and reports a
<code>Cutter-UpperBeam--BelowFluteHeight</code> configuration error at tool change (the
<code>Cutter-UpperBeam--ExtendedCylinderFullLengthTooShort</code> configuration error at tool change (the
web editor rejects such a value outright).</p>
</li>
</ul>
@@ -125,11 +125,11 @@ statement it is.</p>
<tbody>
<tr>
<td><code>L</code></td>
<td>Straight-line motion with its axis words.</td>
<td>Straight-line motion with its axis words, absolute or <code>I</code>-prefixed incremental. See <a href="#incremental-axis-words-i-prefix">Incremental axis words</a>.</td>
</tr>
<tr>
<td><code>LN</code></td>
<td>Surface-normal block — a straight line carrying the endpoint plus up to two normalized vectors, in the fixed element order <code>X,Y,Z</code><code>NX,NY,NZ</code><code>TX,TY,TZ</code>. See <a href="#vector-blocks-ln">Vector blocks</a>.</td>
<td>Surface-normal block — a straight line carrying the endpoint plus up to two normalized vectors, in the fixed element order <code>X,Y,Z</code><code>NX,NY,NZ</code><code>TX,TY,TZ</code>. The endpoint words take the <code>I</code> prefix; the vector words have no incremental form. See <a href="#vector-blocks-ln">Vector blocks</a>.</td>
</tr>
<tr>
<td><code>FMAX</code></td>
@@ -137,7 +137,7 @@ statement it is.</p>
</tr>
<tr>
<td><code>CC</code> / <code>C</code></td>
<td>Circular motion — <code>CC</code> sets the pole, <code>C</code> states the end point. <code>DR-</code> is clockwise and <code>DR+</code> counter-clockwise, the centre always comes from the modal <code>CC</code> rather than from the <code>C</code> block, and an arc that closes on its start point is a full circle. See <a href="#arc-centres-cc">Arc centres</a>.</td>
<td>Circular motion — <code>CC</code> sets the pole, <code>C</code> states the end point. <code>DR-</code> is clockwise and <code>DR+</code> counter-clockwise, the centre always comes from the modal <code>CC</code> rather than from the <code>C</code> block, and an arc that closes on its start point is a full circle. Both heads accept <code>I</code>-prefixed words — an incremental pole on <code>CC</code>, an incremental end point on <code>C</code>. See <a href="#arc-centres-cc">Arc centres</a>.</td>
</tr>
<tr>
<td><code>RL</code> / <code>RR</code> / <code>R0</code></td>
@@ -149,7 +149,7 @@ statement it is.</p>
</tr>
<tr>
<td><code>M126</code> / <code>M127</code></td>
<td>Shortest-path rotary traverse on / off. With neither stated, shortest path is the default.</td>
<td>Shortest-path rotary traverse on / off. With neither stated, shortest path is the default. An <code>I</code>-prefixed rotary word is exempt either way — see <a href="#incremental-axis-words-i-prefix">Incremental axis words</a>.</td>
</tr>
<tr>
<td><code>M140 MB+n</code> / <code>M140 MB MAX</code></td>
@@ -169,6 +169,35 @@ statement it is.</p>
</tr>
</tbody>
</table>
<h3 id="incremental-axis-words-i-prefix">Incremental axis words (<code>I</code> prefix)</h3>
<p>An axis word may carry the <code>I</code> prefix — <code>IX+20</code>, <code>IY-15</code>, rotary <code>IC+90</code> — and is then a relative
value rather than a coordinate. Five statement heads read the prefix: <code>L</code>, <code>C</code>, <code>CC</code>, <code>LN</code> and
<code>CYCL CALL POS</code>. On the first four it is a distance from the last programmed position; <code>CYCL CALL POS</code> spells it the same way but measures from the coordinates of the previous <code>CYCL CALL POS</code>, and
is described under <a href="#cycles-and-calls">Cycles and calls</a>. <code>L</code>, <code>C</code> and <code>LN</code> take the full axis set,
rotary letters included; <code>CC</code> and <code>CYCL CALL POS</code> take <code>X</code> / <code>Y</code> / <code>Z</code> only, because neither
positions a rotary axis.</p>
<p>The prefix is per word, not a mode — klartext has no modal <code>G90</code> / <code>G91</code> counterpart, and only the
<code>I</code>-marked words of a block are read as distances. Absolute and incremental words therefore mix
freely inside one block.</p>
<blockquote>
<p>Parsed:</p>
<ul>
<li><code>L IX+20 IY-15</code> — both axes relative</li>
<li><code>L X+60 IY-10</code> — to X 60, and by 10 in Y</li>
<li><code>LIX+20IY-15</code> — glued, exactly as the separator-free absolute form parses</li>
<li><code>L IX5</code> — the sign is optional</li>
<li><code>L IZ+Q2</code> and <code>L IY-Q2</code> — the value grammar behind the prefix is the shared one, so a <code>Q</code>
parameter or a bracket expression reaches it like any other value</li>
</ul>
</blockquote>
<p>A rotary <code>I</code> word is a chain dimension — a signed traverse — and keeps the value it accumulates
instead of being folded into the ±180° shortest-path window: <code>IC+270</code> from 75° ends at 345°, not at
15°. That exemption is per word and per block. It does not turn shortest path off for the rest of
the block: an absolute rotary word on the very same block is still taken the short way round, and
<code>M127</code> remains the modal switch.</p>
<p>One further <code>I</code> spelling on this control is <strong>not</strong> this mechanism at all: the <code>CYCL DEF 7</code>
datum-shift words shift the active datum rather than positioning an axis, and are described under
<a href="#datums">Datums</a>.</p>
<h3 id="arc-centres-cc">Arc centres (<code>CC</code>)</h3>
<p>A <code>C</code> block never states its own centre. Each in-plane component is resolved from the modal <code>CC</code>
section: the <code>CC</code> block's own axis word first, then the same axis of the previous <code>CC</code>, and last the
@@ -176,6 +205,13 @@ arc's own start point. A <code>CC</code> stating no coordinates is the one spell
once — it takes the last programmed position, read at the <code>CC</code> block rather than at the arc, and
replaces the modal centre instead of inheriting it. That is what makes the manual's own shape work:
<code>CC</code> on the centre, a move out to the arc start, then the <code>C</code> block.</p>
<p>An incremental centre is not that spelling. <code>CC IX+0 IY+11</code> <strong>states</strong> a centre — a distance from
the last programmed <strong>tool</strong> position, never from the previous centre — and it is absolute by the
time the arc consumes it. Nor is a <code>CC</code> whose coordinates cannot be read: it leaves residue and
reports <code>UnparsedText--Remaining</code>, and because it states no centre every axis falls through the
modal chain — to the same axis of the previous <code>CC</code> where there is one, and only otherwise to the
arc's own start point as below. Either way the position of the unreadable <code>CC</code> block is never
read as the centre.</p>
<p>A centre that lands on the arc's own start point leaves the block with no radius and so no arc
geometry: it reports <code>Arc-CircleCenter--OnStartPoint</code> and is degraded to a straight move to the
endpoint. One in-plane coordinate is enough to escape that — an arc whose modal chain still leaves
@@ -237,6 +273,8 @@ number or a quoted tool name is accepted.</p>
<li><code>DL</code> is a length delta — the effective tool height is the tool-table height <strong>plus</strong> <code>DL</code>.</li>
<li><code>DR</code> is read and recorded but <strong>not applied</strong>: radius compensation uses the tool-table radius as-is,
and the block reports <code>ToolChange--DeltaUnsupported</code>.</li>
<li>A <code>DL</code>/<code>DR</code> that is not a literal value — an unevaluated variable, for example — is ignored and
reports <code>ToolChange--DeltaNotLiteral</code>.</li>
<li>A tool axis other than <code>Z</code> reports <code>ToolChange--AxisUnsupported</code>.</li>
<li>A <code>TOOL CALL</code> whose tool number could not be captured — an unevaluated variable, for example —
reports <code>ToolChange--MissingToolId</code>.</li>
@@ -255,6 +293,12 @@ CYCL DEF 7.2 Y22.223
CYCL DEF 7.3 Z32.97
</code></pre>
</blockquote>
<p>A <code>CYCL DEF 7</code> axis word may itself carry the <code>I</code> prefix — <code>CYCL DEF 7.2 IY+5</code> shifts the datum by a
further 5 in Y on top of the shift last valid. Unlike the <code>L</code> / <code>C</code> / <code>CC</code> / <code>LN</code> words, this one is not a
distance from the tool position at all: it stays inside the cycle's own record and never becomes per-word
incremental positioning, so it can never reach the optimizer's incremental guard. Only <code>X</code> / <code>Y</code> /
<code>Z</code> are applied; a non-zero rotary word there, <code>IC+90</code> as much as <code>C+90</code>, is consumed and reported as
<code>Datum-Shift--Rotary</code>.</p>
<h2 id="q-parameters-and-fn">Q parameters and FN</h2>
<p><code>Q</code>, <code>QR</code>, <code>QL</code> and <code>QS</code> parameters are read wherever a value is expected, so <code>FQ1</code> reaches the
feedrate, <code>L X+Q2</code> reaches the program position and <code>TOOL CALL SQ3</code> reaches the spindle speed. <code>Q0</code><code>Q99</code>
@@ -344,6 +388,13 @@ and a <code>Q211</code> bottom dwell to dwell drilling.</li>
<code>HeidenhainCycl--Unsupported</code>.</li>
<li><strong><code>CYCL CALL</code></strong> and <strong><code>CYCL CALL POS</code></strong> fire the cycle once; <code>M99</code> fires once and <code>M89</code> arms modal
firing.</li>
<li>A <strong><code>CYCL CALL POS</code></strong> position word takes the <code>I</code> prefix, and its reference is the control's own:
the coordinates last programmed by a <strong>previous <code>CYCL CALL POS</code></strong>, not the current tool position.
With no earlier call for that axis the increment has no reference and the control refuses the block
(its error <code>1A0-0108</code>); the simulation reports <code>HeidenhainCyclCall--IncrementalNoReference</code> and
resolves against the last programmed position instead. When the tool moved between the two calls
the two candidate references differ — the control's stated one is used, and the divergence is
reported as <code>HeidenhainCyclCall--IncrementalAfterMove</code>.</li>
<li><strong><code>CALL LBL n</code></strong> inlines the label body up to <code>LBL 0</code>; <strong><code>CALL LBL n REP m</code></strong> repeats that section
<code>m</code> times.</li>
<li><strong><code>CALL PGM</code></strong> resolves the called program by file name.</li>
@@ -384,12 +435,22 @@ never a parenthesized one, because a TNC reads parentheses as code:</p>
<pre><code>120 L X+35 Y-11.7 R0 F500 ;src(LineNo: 140, StepIndex: 256)
</code></pre>
<p>Re-interpolation itself is not refused for being klartext. A <code>C … DR±</code> arc splits like any other
when the modal <code>CC</code> chain supplies both in-plane centre coordinates: no centre words are rebuilt,
and each fragment carries the block's own words with its own endpoint and feed, around the one <code>CC</code>
line they all share unchanged. The arc that is optimized whole instead is the one whose modal chain
left an in-plane coordinate unstated — no <code>CC</code> ever gave it, so the arc's own start point supplies
it, and every fragment would re-derive that centre from its own start. Such pieces are optimized as
whole lines under <code>NcOpt--SplitionStartPointCenterUnsupported</code>, raised once per run.</p>
when the modal <code>CC</code> chain supplies both in-plane centre coordinates <strong>and</strong> the <code>C</code> block states its
own words absolutely: no centre words are rebuilt, and each fragment carries the block's own words
with its own endpoint and feed, around the one <code>CC</code> line they all share unchanged. An incremental
<code>CC</code> does not disqualify the arc it feeds — the per-word mark sits on the <code>CC</code> block alone and never
carries forward, and the centre reaches the arc already resolved.</p>
<p>Two shapes are optimized as whole lines instead. Each reports its own id, once per run.</p>
<ul>
<li>The arc whose modal chain left an in-plane coordinate unstated — no <code>CC</code> ever gave it, so the arc's
own start point supplies it, and every fragment would re-derive that centre from its own start:
<code>NcOpt--SplitionStartPointCenterUnsupported</code>.</li>
<li>The piece that carries an incremental word of its own — a klartext <code>I</code>-prefixed word, as in the
legal and fully simulated <code>C IX+20 IY+0 DR-</code>, or a <code>G91</code> block in the DIN/ISO dialect. The fragment
rewrite emits absolute coordinates, so every fragment would re-apply the distance from its own
start: <code>NcOpt--SplitionIncrementalUnsupported</code>. The test reads the piece's own block only — the
state of the modal <code>CC</code> chain neither triggers this one nor exempts a piece from it.</li>
</ul>
<h2 id="not-supported">Not supported</h2>
<p><code>TOOL DEF</code>, <code>FK</code> free-contour programming, <code>SL</code> cycles, <code>PATTERN DEF</code>, and <code>TCH PROBE</code>. These are left
unconsumed, and the block that carried them reports <code>Parsing--Unconsumed</code> naming the words.</p>
@@ -262,6 +262,13 @@ carries motion is the last corner's partner instead, and the compensated path me
line at their intersection (Fanuc type B); the legacy interpreter
(<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableSoftNcRunner">EnableSoftNcRunner</a> set <code>false</code>) ends that case
perpendicular.</li>
<li><strong>The D row must match the program's strategy.</strong> A zero-based program (the CAM path is the
tool-centre path, <code>G41 D..</code> kept for wear only) needs a D row whose geometry radius is 0; a
cutter-radius program (the NC is the part contour) needs the tool radius there. An offset larger
than an inner arc or groove of the contour makes the compensated path run against the programmed
direction — a control stops with an interference alarm (Fanuc PS0041), HiNC reports
<code>RadiusComp--Interference</code> and keeps playing the swapped-side path. The radius basis of the
tool-house refresh is chosen on <a class="xref" href="../../anatomy/general-setup/controller/program-data/tool-offsets.html">Tool Offsets</a>.</li>
</ul>
<h3 id="rotation-tilted-planes-and-five-axis">Rotation, tilted planes and five-axis</h3>
<table>
@@ -396,13 +403,17 @@ the Fanuc, Syntec and Mazak presets:</p>
<td>High-speed cycle machining. The real machine executes cycle data pre-registered in its variable area, which is <strong>actual axis motion HiNC cannot see</strong>, so the simulated result misses that machining. Reports <code>Hpcc--HighSpeedCycleIgnored</code> as a warning.</td>
</tr>
<tr>
<td>anything else, or no <code>P</code> at all</td>
<td>anything else</td>
<td>Not supported offline and ignored, reported as <code>Hpcc--UnsupportedFunction</code>. Small <code>P</code> values select the high-speed remote buffer modes.</td>
</tr>
<tr>
<td>no <code>P</code> at all</td>
<td>Not supported offline and ignored, reported as <code>Hpcc--MissingFunctionWord</code>.</td>
</tr>
</tbody>
</table>
<p>An unevaluated macro variable or expression in <code>P</code> is tolerated — it reports
<code>Hpcc--UnsupportedFunction</code> rather than failing the block.</p>
<code>Hpcc--UnevaluatedFunction</code> rather than failing the block.</p>
<h3 id="m-codes">M codes</h3>
<table>
<thead>
@@ -375,7 +375,7 @@ misread as something else — a <code>PLANE AXIAL B+45</code> will not be mistak
<tr>
<td><strong>Fanuc</strong></td>
<td>ISO core, canned cycles G73G89, G41/G42, G43.4 RTCP, G53/G53.1, G68/G68.2/G69, G12.1/G13.1 polar with compensation, Custom Macro B (<code>#</code> variables, <code>IF</code>/<code>GOTO</code>, <code>WHILE</code>/<code>DO</code>), <code>M98</code>/<code>M99</code> subprograms, <code>G65</code>/<code>G66</code>/<code>G67</code> macro calls</td>
<td>bare <code>G05 P</code> HPCC selections (<code>Hpcc--NoOp</code>, <code>Hpcc--HighSpeedCycleIgnored</code>, <code>Hpcc--UnsupportedFunction</code>)</td>
<td>bare <code>G05 P</code> HPCC selections (<code>Hpcc--NoOp</code>, <code>Hpcc--HighSpeedCycleIgnored</code>, <code>Hpcc--UnsupportedFunction</code>, <code>Hpcc--UnevaluatedFunction</code>, <code>Hpcc--MissingFunctionWord</code>)</td>
<td><code>G10</code> programmable data setting, <code>G50</code> spindle limit, <code>G31</code> skip</td>
</tr>
<tr>
@@ -386,7 +386,7 @@ misread as something else — a <code>PLANE AXIAL B+45</code> will not be mistak
</tr>
<tr>
<td><strong>Heidenhain</strong></td>
<td>klartext motion and <code>FMAX</code>, <code>LN</code> surface-normal blocks resolved into the rotary axes, <code>M91</code>, <code>TOOL CALL</code> with <code>DL</code>/<code>DR</code>, <code>CYCL DEF 247</code> presets and <code>CYCL DEF 7</code> additive shifts, <code>CC</code>/<code>C</code> arcs, <code>RL</code>/<code>RR</code>/<code>R0</code>, <code>M126</code>/<code>M127</code>, <code>M140</code>, <code>CYCL DEF 32</code>, Q/QR parameters with the FN grammar and FN 912 jumps, <code>PLANE SPATIAL</code>, <code>FUNCTION TCPM</code>, <code>M128</code>/<code>M129</code>, machining cycles 200/232/251/252/253, <code>CYCL CALL</code>/<code>CYCL CALL POS</code>, <code>CALL LBL</code> with <code>REP</code>, <code>CALL PGM</code>, tilde continuation, <code>BLK FORM</code>, <code>STOP</code>, mirror image (<code>G28</code> and <code>CYCL DEF 8</code>), and the DIN/ISO dialect with absolute <code>I</code>/<code>J</code>/<code>K</code> centres, the ISO label family, <code>G247</code>, <code>G54</code> datum words and <code>G70</code>/<code>G71</code></td>
<td>klartext motion and <code>FMAX</code>, <code>LN</code> surface-normal blocks resolved into the rotary axes, <code>M91</code>, <code>TOOL CALL</code> with <code>DL</code>/<code>DR</code>, <code>CYCL DEF 247</code> presets and <code>CYCL DEF 7</code> additive shifts, <code>CC</code>/<code>C</code> arcs, <code>I</code>-prefixed incremental axis words on <code>L</code>/<code>LN</code>/<code>C</code> (rotary included) and on <code>CC</code>/<code>CYCL CALL POS</code> (<code>X</code>/<code>Y</code>/<code>Z</code> only), <code>RL</code>/<code>RR</code>/<code>R0</code>, <code>M126</code>/<code>M127</code> with an incremental rotary word exempt from the shortest-path fold, <code>M140</code>, <code>CYCL DEF 32</code>, Q/QR parameters with the FN grammar and FN 912 jumps, <code>PLANE SPATIAL</code>, <code>FUNCTION TCPM</code>, <code>M128</code>/<code>M129</code>, machining cycles 200/232/251/252/253, <code>CYCL CALL</code>/<code>CYCL CALL POS</code>, <code>CALL LBL</code> with <code>REP</code>, <code>CALL PGM</code>, tilde continuation, <code>BLK FORM</code>, <code>STOP</code>, mirror image (<code>G28</code> and <code>CYCL DEF 8</code>), and the DIN/ISO dialect with absolute <code>I</code>/<code>J</code>/<code>K</code> centres, the ISO label family, <code>G247</code>, <code>G54</code> datum words and <code>G70</code>/<code>G71</code></td>
<td><code>PLANE VECTOR</code> (captured), <code>PLANE EULER</code> / <code>POINTS</code> / <code>RELATIV</code> / <code>AXIAL</code> / <code>PROJECTED</code> (<code>HeidenhainPlane--Unsupported</code>), unimplemented <code>FN</code> opcodes such as <code>FN 18 SYSREAD</code>, unrecognized <code>CYCL DEF</code> bodies (<code>HeidenhainCycl--Unsupported</code>), center-referenced <code>FUNCTION TCPM REFPNT</code> (<code>Orientation-RefPoint--CntNotSimulated</code>), and 3D-ToolComp along the <code>LN</code> surface normal (<code>SurfaceNormal--CompNotSimulated</code>)</td>
<td><code>TOOL DEF</code>, <code>FK</code> free contour, <code>SL</code> cycles, <code>PATTERN DEF</code>, <code>TCH PROBE</code></td>
</tr>
@@ -410,6 +410,21 @@ misread as something else — a <code>PLANE AXIAL B+45</code> will not be mistak
and <code>ReferenceReturnSyntax</code> is not in that preset's Logic list. <code>HardNcRunner</code> keeps the Fanuc
reading, so the two engines are deliberately divergent on Heidenhain <code>G28</code> files.</p>
</div>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Per-word incremental positioning is one mechanism, shared across brands.</strong> The Siemens <code>IC()</code>
wrapper and the klartext <code>I</code> prefix both write the value under the plain axis key and stamp a
per-axis entry — <code>&quot;PositioningOverride&quot;: {&quot;Y&quot;:&quot;Incremental&quot;}</code> — on the block root, so absolute and
incremental words mix inside one block and only the marked axis is relative: on <code>IC()</code> and on the
klartext <code>L</code> / <code>LN</code> / <code>C</code> / <code>CC</code> heads, a distance from the last programmed position; on
<code>CYCL CALL POS</code>, from the coordinates of the previous <code>CYCL CALL POS</code>. The Siemens coded family
(<code>CAC()</code>, <code>CIC()</code> and the rest) stamps the same section with <code>CodedAbsolute</code> / <code>CodedIncremental</code>
instead of the plain pair, and the optimizer's incremental guard reads <code>CodedIncremental</code> too. That section is non-modal: it appears in no <code>ModalCarry</code> key
set and never reaches the next block. Klartext states no modal <code>G90</code>/<code>G91</code> at all — its
<code>Positioning</code> section stays at the <code>G90</code> default, and only the DIN/ISO dialect on that brand
carries the modal pair. The <code>CYCL DEF 7</code> datum-shift <code>I</code> words are a separate thing and write no
override entry: they shift the active datum rather than measure from the tool position.</p>
</div>
<h2 id="scope-and-testing">Scope and testing</h2>
<p>Two limits sit outside the per-brand table and apply to everything in it.</p>
<ul>
@@ -460,6 +460,14 @@ see <a href="../technique/measurement/training-cut-set-design.html">Designing a
<p>After training, the system reports three quality metrics:</p>
<h3 id="correlation-coefficient-r">Correlation Coefficient (R)</h3>
<p>A single value for the overall result. Ranges from 0 to 1; for new tools, expect 0.950.999.</p>
<p><strong>R measures waveform agreement after phase alignment, and does not rank the coefficients that
produced it.</strong> A cut set that leaves a coefficient combination unobservable still reports R above
0.95, over shear values orders of magnitude too large; and between two runs on the same
data, the one whose coefficients are closest to the truth can be the one with the lower R, because
an exact step-to-shot pairing window scores lower than a window wide enough to smear the waveform.
Read R as a floor the data has to clear, then judge the run by the force it reproduces over time.
What the set can determine at all is fixed before cutting — see
<a href="../technique/measurement/training-cut-set-design.html">Designing a Training Cut Set</a>.</p>
<h3 id="training-error-ratio-trainingerrratio">Training Error Ratio (TrainingErrRatio)</h3>
<p>A per-step variable registered automatically after training. Lower values indicate better step-level quality:</p>
<div class="math">
@@ -240,6 +240,13 @@
<td>Estimated/relative values work for evaluation; HiNC can set an assumed offset</td>
<td><a href="../manual/setup/program-zero-alignment.html">Program Zero Alignment</a></td>
</tr>
<tr>
<td>Controller</td>
<td>Cutter-compensation strategy: <strong>zero-based</strong> (NC is the tool-centre path, D rows hold wear only) or <strong>cutter-radius</strong> (NC is the part contour, D rows hold the tool radius)</td>
<td><strong>Required when the NC uses G41/G42</strong></td>
<td>The refresh from the tool house writes the radius column by this choice; the wrong basis is an overcut of one tool radius</td>
<td><a class="xref" href="../anatomy/general-setup/controller/program-data/tool-offsets.html">Tool Offsets</a></td>
</tr>
</tbody>
</table>
<hr>
@@ -308,6 +315,7 @@
<ul>
<li><strong>CNC brand/type</strong> — determines how the NC code is interpreted. <strong>Required.</strong></li>
<li><strong>NC / CL program(s)</strong> — the actual programs that run on the machine. <strong>Required.</strong></li>
<li><strong>Cutter-compensation strategy</strong> — when the NC uses <code>G41</code>/<code>G42</code>, say whether the shop programs <strong>zero-based</strong> (the CAM path is already the tool-centre path and the D register holds the wear only) or <strong>by cutter radius</strong> (the NC is the part contour and the D register holds the tool radius). <strong>Required with G41/G42.</strong> The program itself usually tells: a zero-based program has lead-in / lead-out arcs smaller than the tool radius and a finishing contour one tool radius inside the wall it makes. Set the matching radius basis in <a class="xref" href="../anatomy/general-setup/controller/program-data/tool-offsets.html">Tool Offsets</a> before refreshing the offset table from the tool house — the wrong basis compensates by a full tool radius and simulates an overcut (<code>RadiusComp--Interference</code>).</li>
<li><strong>Work offsets (G54…) and tool offset table</strong><strong>not required</strong> for evaluation/planning. Relative or estimated values work; HiNC can set a workable assumed tool offset for you. Provide the real values only when a high-fidelity match is needed.</li>
<li><strong>Stroke limits and machine-specific configuration parameters</strong><strong>optional</strong>.</li>
</ul>
+114 -30
View File
@@ -11,17 +11,17 @@ references:
name: Background / Coolant
href: anatomy/general-setup/background-coolant.html
- uid: Anatomy-Box3dControl
name: Box3d Control
href: anatomy/geom/box3d-control.html
name: Box3d Editor
href: anatomy/geom/box3d-editor.html
- uid: Anatomy-BySource
name: Anatomy by Source Directory
href: anatomy/by-source/index.html
- uid: Anatomy-BySource-WebserviceBackend
name: Web Service Backend Source Tree
href: anatomy/by-source/webservice-backend/index.html
href: anatomy/by-source/webservice-backend.html
- uid: Anatomy-BySource-WebserviceSpa
name: Web Service SPA Source Tree
href: anatomy/by-source/webservice-spa/index.html
href: anatomy/by-source/webservice-spa.html
- uid: Anatomy-ControlTree
name: Control Tree
href: anatomy/platform/control-tree.html
@@ -92,8 +92,8 @@ references:
name: Cycle-Line Charts
href: anatomy/execution/cycle-line-charts.html
- uid: Anatomy-CylindroidControl
name: Cylindroid Control
href: anatomy/geom/cylindroid-control.html
name: Cylindroid Editor
href: anatomy/geom/cylindroid-editor.html
- uid: Anatomy-CylindroidHolderPanel
name: Cylindroid Holder Panel
href: anatomy/tool-house/holder/cylindroid-holder-panel.html
@@ -110,8 +110,8 @@ references:
name: Execution Tool Bar
href: anatomy/execution/execution-tool-bar.html
- uid: Anatomy-ExtendedCylinderPanel
name: Extended Cylinder Panel
href: anatomy/geom/extended-cylinder-panel.html
name: ExtendedCylinder Editor
href: anatomy/geom/extended-cylinder-editor.html
- uid: Anatomy-Fixture
name: Fixture
href: anatomy/general-setup/fixture.html
@@ -131,11 +131,11 @@ references:
name: Geometry Panels
href: anatomy/geom/index.html
- uid: Anatomy-GeomCombinationControl
name: Geometry Combination Control
href: anatomy/geom/geom-combination-control.html
name: GeomCombination Editor
href: anatomy/geom/geom-combination-editor.html
- uid: Anatomy-GeomManageControl
name: Geometry Management Panel
href: anatomy/geom/geom-manage-control.html
name: Geometry Editor
href: anatomy/geom/geometry-editor.html
- uid: Anatomy-GraphicCacheMenu
name: Graphic-Cache SubMenu
href: anatomy/execution/graphic-cache-menu.html
@@ -157,6 +157,9 @@ references:
- uid: Anatomy-LanguageSelectionSubmenu
name: Language Selection SubMenu
href: anatomy/shell/language-selection-submenu.html
- uid: Anatomy-LegacyControllerSettings
name: Legacy Controller Settings
href: anatomy/legacy-controller-settings.html
- uid: Anatomy-ListCommandPanel
name: List Command Panel
href: anatomy/execution/mission/ListCommand-panel.html
@@ -179,8 +182,8 @@ references:
name: Mechanism Builder Page
href: anatomy/util/mech-builder.html
- uid: Anatomy-MeshedGeomPanel
name: Meshed Geometry Panel
href: anatomy/geom/meshed-geom-panel.html
name: MeshedGeomFile Editor
href: anatomy/geom/meshed-geom-file-editor.html
- uid: Anatomy-MessageSection
name: Bottom Message Bar
href: anatomy/shell/bottom-message-bar.html
@@ -263,8 +266,8 @@ references:
name: Stick Tool Panel
href: anatomy/tool-house/stick-tool-panel.html
- uid: Anatomy-StlFileControl
name: STL File Control
href: anatomy/geom/stlfile-control.html
name: StlFile Editor
href: anatomy/geom/stlfile-editor.html
- uid: Anatomy-StlPreviewPane
name: STL Preview Pane
href: anatomy/util/stl-preview-pane.html
@@ -275,8 +278,8 @@ references:
name: Tool House Page
href: anatomy/tool-house/index.html
- uid: Anatomy-TransformationGeomControl
name: Transformation Geometry Control
href: anatomy/geom/transformation-geom-control.html
name: TransformationGeom Editor
href: anatomy/geom/transformation-geom-editor.html
- uid: Anatomy-Transformers
name: Transformer Select Panel
href: anatomy/geom/transformer-panel.html
@@ -73288,6 +73291,19 @@ references:
isSpec: "True"
fullName: Hi.MachiningProcs.MachiningActRunnerConfig.MakeXmlSource
nameWithType: MachiningActRunnerConfig.MakeXmlSource
- uid: Hi.MachiningProcs.MachiningActRunnerConfig.RadiusOffsetBasis
name: RadiusOffsetBasis
href: api/Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_RadiusOffsetBasis
commentId: P:Hi.MachiningProcs.MachiningActRunnerConfig.RadiusOffsetBasis
fullName: Hi.MachiningProcs.MachiningActRunnerConfig.RadiusOffsetBasis
nameWithType: MachiningActRunnerConfig.RadiusOffsetBasis
- uid: Hi.MachiningProcs.MachiningActRunnerConfig.RadiusOffsetBasis*
name: RadiusOffsetBasis
href: api/Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_RadiusOffsetBasis_
commentId: Overload:Hi.MachiningProcs.MachiningActRunnerConfig.RadiusOffsetBasis
isSpec: "True"
fullName: Hi.MachiningProcs.MachiningActRunnerConfig.RadiusOffsetBasis
nameWithType: MachiningActRunnerConfig.RadiusOffsetBasis
- uid: Hi.MachiningProcs.MachiningActRunnerConfig.Reg(Hi.Common.XmlUtils.XFactory)
name: Reg(XFactory)
href: api/Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_Reg_Hi_Common_XmlUtils_XFactory_
@@ -114446,6 +114462,24 @@ references:
isSpec: "True"
fullName: Hi.NcParsers.Dependencys.Generic.MachineAxisConfig.XName
nameWithType: MachineAxisConfig.XName
- uid: Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis
name: RadiusOffsetBasis
href: api/Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html
commentId: T:Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis
fullName: Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis
nameWithType: RadiusOffsetBasis
- uid: Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.CutterRadius
name: CutterRadius
href: api/Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_CutterRadius
commentId: F:Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.CutterRadius
fullName: Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.CutterRadius
nameWithType: RadiusOffsetBasis.CutterRadius
- uid: Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.ZeroBased
name: ZeroBased
href: api/Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_ZeroBased
commentId: F:Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.ZeroBased
fullName: Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.ZeroBased
nameWithType: RadiusOffsetBasis.ZeroBased
- uid: Hi.NcParsers.Dependencys.Generic.SubProgramFolderConfig
name: SubProgramFolderConfig
href: api/Hi.NcParsers.Dependencys.Generic.SubProgramFolderConfig.html
@@ -114816,12 +114850,12 @@ references:
isSpec: "True"
fullName: Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.TryGetToolRadiusOffset_mm
nameWithType: ToolOffsetTable.TryGetToolRadiusOffset_mm
- uid: Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse(Hi.Machining.MachiningToolHouse)
name: UpdateIdealByToolHouse(MachiningToolHouse)
href: api/Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.html#Hi_NcParsers_Dependencys_Generic_ToolOffsetTable_UpdateIdealByToolHouse_Hi_Machining_MachiningToolHouse_
commentId: M:Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse(Hi.Machining.MachiningToolHouse)
fullName: Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse(Hi.Machining.MachiningToolHouse)
nameWithType: ToolOffsetTable.UpdateIdealByToolHouse(MachiningToolHouse)
- uid: Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse(Hi.Machining.MachiningToolHouse,Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis)
name: UpdateIdealByToolHouse(MachiningToolHouse, RadiusOffsetBasis)
href: api/Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.html#Hi_NcParsers_Dependencys_Generic_ToolOffsetTable_UpdateIdealByToolHouse_Hi_Machining_MachiningToolHouse_Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_
commentId: M:Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse(Hi.Machining.MachiningToolHouse,Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis)
fullName: Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse(Hi.Machining.MachiningToolHouse, Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis)
nameWithType: ToolOffsetTable.UpdateIdealByToolHouse(MachiningToolHouse, RadiusOffsetBasis)
- uid: Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.UpdateIdealByToolHouse*
name: UpdateIdealByToolHouse
href: api/Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.html#Hi_NcParsers_Dependencys_Generic_ToolOffsetTable_UpdateIdealByToolHouse_
@@ -148999,6 +149033,56 @@ references:
isSpec: "True"
fullName: Hi.NcParsers.PostLogicSyntaxs.RadiusCompensationSyntax.XName
nameWithType: RadiusCompensationSyntax.XName
- uid: Hi.NcParsers.RadiusCompInterference
name: RadiusCompInterference
href: api/Hi.NcParsers.RadiusCompInterference.html
commentId: T:Hi.NcParsers.RadiusCompInterference
fullName: Hi.NcParsers.RadiusCompInterference
nameWithType: RadiusCompInterference
- uid: Hi.NcParsers.RadiusCompInterference.ArcTolerance_mm
name: ArcTolerance_mm
href: api/Hi.NcParsers.RadiusCompInterference.html#Hi_NcParsers_RadiusCompInterference_ArcTolerance_mm
commentId: F:Hi.NcParsers.RadiusCompInterference.ArcTolerance_mm
fullName: Hi.NcParsers.RadiusCompInterference.ArcTolerance_mm
nameWithType: RadiusCompInterference.ArcTolerance_mm
- uid: Hi.NcParsers.RadiusCompInterference.DiagnosticId
name: DiagnosticId
href: api/Hi.NcParsers.RadiusCompInterference.html#Hi_NcParsers_RadiusCompInterference_DiagnosticId
commentId: F:Hi.NcParsers.RadiusCompInterference.DiagnosticId
fullName: Hi.NcParsers.RadiusCompInterference.DiagnosticId
nameWithType: RadiusCompInterference.DiagnosticId
- uid: Hi.NcParsers.RadiusCompInterference.TryDescribeArc(Hi.Geom.Vec3d,Hi.Geom.Vec3d,Hi.Geom.Vec3d,System.Int32,System.Double,System.Int32,System.String@,System.Collections.Generic.Dictionary{System.String,System.Object}@)
name: TryDescribeArc(Vec3d, Vec3d, Vec3d, int, double, int, out string, out Dictionary<string, object>)
href: api/Hi.NcParsers.RadiusCompInterference.html#Hi_NcParsers_RadiusCompInterference_TryDescribeArc_Hi_Geom_Vec3d_Hi_Geom_Vec3d_Hi_Geom_Vec3d_System_Int32_System_Double_System_Int32_System_String__System_Collections_Generic_Dictionary_System_String_System_Object___
commentId: M:Hi.NcParsers.RadiusCompInterference.TryDescribeArc(Hi.Geom.Vec3d,Hi.Geom.Vec3d,Hi.Geom.Vec3d,System.Int32,System.Double,System.Int32,System.String@,System.Collections.Generic.Dictionary{System.String,System.Object}@)
name.vb: TryDescribeArc(Vec3d, Vec3d, Vec3d, Integer, Double, Integer, String, Dictionary(Of String, Object))
fullName: Hi.NcParsers.RadiusCompInterference.TryDescribeArc(Hi.Geom.Vec3d, Hi.Geom.Vec3d, Hi.Geom.Vec3d, int, double, int, out string, out System.Collections.Generic.Dictionary<string, object>)
fullName.vb: Hi.NcParsers.RadiusCompInterference.TryDescribeArc(Hi.Geom.Vec3d, Hi.Geom.Vec3d, Hi.Geom.Vec3d, Integer, Double, Integer, String, System.Collections.Generic.Dictionary(Of String, Object))
nameWithType: RadiusCompInterference.TryDescribeArc(Vec3d, Vec3d, Vec3d, int, double, int, out string, out Dictionary<string, object>)
nameWithType.vb: RadiusCompInterference.TryDescribeArc(Vec3d, Vec3d, Vec3d, Integer, Double, Integer, String, Dictionary(Of String, Object))
- uid: Hi.NcParsers.RadiusCompInterference.TryDescribeArc*
name: TryDescribeArc
href: api/Hi.NcParsers.RadiusCompInterference.html#Hi_NcParsers_RadiusCompInterference_TryDescribeArc_
commentId: Overload:Hi.NcParsers.RadiusCompInterference.TryDescribeArc
isSpec: "True"
fullName: Hi.NcParsers.RadiusCompInterference.TryDescribeArc
nameWithType: RadiusCompInterference.TryDescribeArc
- uid: Hi.NcParsers.RadiusCompInterference.TryDescribeLinear(Hi.Geom.Vec3d,Hi.Geom.Vec3d,System.Int32,System.Double,System.Int32,System.String@,System.Collections.Generic.Dictionary{System.String,System.Object}@)
name: TryDescribeLinear(Vec3d, Vec3d, int, double, int, out string, out Dictionary<string, object>)
href: api/Hi.NcParsers.RadiusCompInterference.html#Hi_NcParsers_RadiusCompInterference_TryDescribeLinear_Hi_Geom_Vec3d_Hi_Geom_Vec3d_System_Int32_System_Double_System_Int32_System_String__System_Collections_Generic_Dictionary_System_String_System_Object___
commentId: M:Hi.NcParsers.RadiusCompInterference.TryDescribeLinear(Hi.Geom.Vec3d,Hi.Geom.Vec3d,System.Int32,System.Double,System.Int32,System.String@,System.Collections.Generic.Dictionary{System.String,System.Object}@)
name.vb: TryDescribeLinear(Vec3d, Vec3d, Integer, Double, Integer, String, Dictionary(Of String, Object))
fullName: Hi.NcParsers.RadiusCompInterference.TryDescribeLinear(Hi.Geom.Vec3d, Hi.Geom.Vec3d, int, double, int, out string, out System.Collections.Generic.Dictionary<string, object>)
fullName.vb: Hi.NcParsers.RadiusCompInterference.TryDescribeLinear(Hi.Geom.Vec3d, Hi.Geom.Vec3d, Integer, Double, Integer, String, System.Collections.Generic.Dictionary(Of String, Object))
nameWithType: RadiusCompInterference.TryDescribeLinear(Vec3d, Vec3d, int, double, int, out string, out Dictionary<string, object>)
nameWithType.vb: RadiusCompInterference.TryDescribeLinear(Vec3d, Vec3d, Integer, Double, Integer, String, Dictionary(Of String, Object))
- uid: Hi.NcParsers.RadiusCompInterference.TryDescribeLinear*
name: TryDescribeLinear
href: api/Hi.NcParsers.RadiusCompInterference.html#Hi_NcParsers_RadiusCompInterference_TryDescribeLinear_
commentId: Overload:Hi.NcParsers.RadiusCompInterference.TryDescribeLinear
isSpec: "True"
fullName: Hi.NcParsers.RadiusCompInterference.TryDescribeLinear
nameWithType: RadiusCompInterference.TryDescribeLinear
- uid: Hi.NcParsers.Segmenters
name: Hi.NcParsers.Segmenters
href: api/Hi.NcParsers.Segmenters.html
@@ -161596,12 +161680,12 @@ references:
isSpec: "True"
fullName: Hi.Numerical.MillingToolOffsetTable.Reg
nameWithType: MillingToolOffsetTable.Reg
- uid: Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(Hi.Machining.MachiningToolHouse)
name: UpdateIdealMillingToolOffsetTableByToolHouse(MachiningToolHouse)
href: api/Hi.Numerical.MillingToolOffsetTable.html#Hi_Numerical_MillingToolOffsetTable_UpdateIdealMillingToolOffsetTableByToolHouse_Hi_Machining_MachiningToolHouse_
commentId: M:Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(Hi.Machining.MachiningToolHouse)
fullName: Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(Hi.Machining.MachiningToolHouse)
nameWithType: MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(MachiningToolHouse)
- uid: Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(Hi.Machining.MachiningToolHouse,Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis)
name: UpdateIdealMillingToolOffsetTableByToolHouse(MachiningToolHouse, RadiusOffsetBasis)
href: api/Hi.Numerical.MillingToolOffsetTable.html#Hi_Numerical_MillingToolOffsetTable_UpdateIdealMillingToolOffsetTableByToolHouse_Hi_Machining_MachiningToolHouse_Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_
commentId: M:Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(Hi.Machining.MachiningToolHouse,Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis)
fullName: Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(Hi.Machining.MachiningToolHouse, Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis)
nameWithType: MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse(MachiningToolHouse, RadiusOffsetBasis)
- uid: Hi.Numerical.MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse*
name: UpdateIdealMillingToolOffsetTableByToolHouse
href: api/Hi.Numerical.MillingToolOffsetTable.html#Hi_Numerical_MillingToolOffsetTable_UpdateIdealMillingToolOffsetTableByToolHouse_