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
File diff suppressed because it is too large Load Diff
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+75 -75
View File
@@ -11,9 +11,9 @@
"dependencies": { "dependencies": {
"AvalonEdit": "6.3.0.90", "AvalonEdit": "6.3.0.90",
"FontAwesome.Sharp": "6.3.0", "FontAwesome.Sharp": "6.3.0",
"Hi.WpfPlus": "3.2.21", "Hi.WpfPlus": "3.2.22",
"HiNc": "3.2.22", "HiNc": "3.2.23",
"HiNc-Resource": "3.2.19", "HiNc-Resource": "3.2.20",
"Serilog.Extensions.Hosting": "10.0.0", "Serilog.Extensions.Hosting": "10.0.0",
"Serilog.Sinks.Console": "6.1.1", "Serilog.Sinks.Console": "6.1.1",
"Serilog.Sinks.File": "7.0.0", "Serilog.Sinks.File": "7.0.0",
@@ -1598,36 +1598,36 @@
} }
} }
}, },
"Hi.WpfPlus/3.2.21": { "Hi.WpfPlus/3.2.22": {
"dependencies": { "dependencies": {
"HiDisp": "3.2.28" "HiDisp": "3.2.29"
}, },
"runtime": { "runtime": {
"lib/net10.0-windows7.0/Hi.WpfPlus.dll": { "lib/net10.0-windows7.0/Hi.WpfPlus.dll": {
"assemblyVersion": "3.2.21.0", "assemblyVersion": "3.2.22.0",
"fileVersion": "3.2.21.0" "fileVersion": "3.2.22.0"
} }
} }
}, },
"HiCbtr/3.2.24": { "HiCbtr/3.2.25": {
"dependencies": { "dependencies": {
"HiDisp": "3.2.28" "HiDisp": "3.2.29"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiCbtr.dll": { "lib/net10.0/HiCbtr.dll": {
"assemblyVersion": "3.2.24.0", "assemblyVersion": "3.2.25.0",
"fileVersion": "3.2.24.0" "fileVersion": "3.2.25.0"
} }
} }
}, },
"HiDisp/3.2.28": { "HiDisp/3.2.29": {
"dependencies": { "dependencies": {
"HiGeom": "3.2.20" "HiGeom": "3.2.21"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiDisp.dll": { "lib/net10.0/HiDisp.dll": {
"assemblyVersion": "3.2.28.0", "assemblyVersion": "3.2.29.0",
"fileVersion": "3.2.28.0" "fileVersion": "3.2.29.0"
} }
}, },
"native": { "native": {
@@ -1645,15 +1645,15 @@
} }
} }
}, },
"HiGeom/3.2.20": { "HiGeom/3.2.21": {
"dependencies": { "dependencies": {
"MathNet.Numerics": "5.0.0", "MathNet.Numerics": "5.0.0",
"Microsoft.CodeAnalysis.Scripting.Common": "5.9.0" "Microsoft.CodeAnalysis.Scripting.Common": "5.9.0"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiGeom.dll": { "lib/net10.0/HiGeom.dll": {
"assemblyVersion": "3.2.20.0", "assemblyVersion": "3.2.21.0",
"fileVersion": "3.2.20.0" "fileVersion": "3.2.21.0"
} }
}, },
"resources": { "resources": {
@@ -1665,27 +1665,27 @@
} }
} }
}, },
"HiLicense/3.2.21": { "HiLicense/3.2.22": {
"dependencies": { "dependencies": {
"HiGeom": "3.2.20" "HiGeom": "3.2.21"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiLicense.dll": { "lib/net10.0/HiLicense.dll": {
"assemblyVersion": "3.2.21.0", "assemblyVersion": "3.2.22.0",
"fileVersion": "3.2.21.0" "fileVersion": "3.2.22.0"
} }
} }
}, },
"HiMech/3.2.25": { "HiMech/3.2.26": {
"dependencies": { "dependencies": {
"CommandLineParser": "2.9.1", "CommandLineParser": "2.9.1",
"HiCbtr": "3.2.24", "HiCbtr": "3.2.25",
"Microsoft.CodeAnalysis.CSharp.Scripting": "5.9.0" "Microsoft.CodeAnalysis.CSharp.Scripting": "5.9.0"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiMech.dll": { "lib/net10.0/HiMech.dll": {
"assemblyVersion": "3.2.25.0", "assemblyVersion": "3.2.26.0",
"fileVersion": "3.2.25.0" "fileVersion": "3.2.26.0"
} }
}, },
"resources": { "resources": {
@@ -1694,19 +1694,19 @@
} }
} }
}, },
"HiNc/3.2.22": { "HiNc/3.2.23": {
"dependencies": { "dependencies": {
"Dapper": "2.1.79", "Dapper": "2.1.79",
"HiLicense": "3.2.21", "HiLicense": "3.2.22",
"HiMech": "3.2.25", "HiMech": "3.2.26",
"HiUniNc": "3.2.23", "HiUniNc": "3.2.24",
"Microsoft.Data.Sqlite": "10.0.9", "Microsoft.Data.Sqlite": "10.0.9",
"SQLitePCLRaw.bundle_e_sqlite3": "3.0.3" "SQLitePCLRaw.bundle_e_sqlite3": "3.0.3"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiNc.dll": { "lib/net10.0/HiNc.dll": {
"assemblyVersion": "3.2.22.0", "assemblyVersion": "3.2.23.0",
"fileVersion": "3.2.22.0" "fileVersion": "3.2.23.0"
} }
}, },
"resources": { "resources": {
@@ -1718,22 +1718,22 @@
} }
} }
}, },
"HiNc-Resource/3.2.19": { "HiNc-Resource/3.2.20": {
"runtime": { "runtime": {
"lib/net10.0/HiNc-Resource.dll": { "lib/net10.0/HiNc-Resource.dll": {
"assemblyVersion": "3.2.19.0", "assemblyVersion": "3.2.20.0",
"fileVersion": "3.2.19.0" "fileVersion": "3.2.20.0"
} }
} }
}, },
"HiUniNc/3.2.23": { "HiUniNc/3.2.24": {
"dependencies": { "dependencies": {
"HiMech": "3.2.25" "HiMech": "3.2.26"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiUniNc.dll": { "lib/net10.0/HiUniNc.dll": {
"assemblyVersion": "3.2.23.0", "assemblyVersion": "3.2.24.0",
"fileVersion": "3.2.23.0" "fileVersion": "3.2.24.0"
} }
} }
}, },
@@ -2117,68 +2117,68 @@
"path": "fontawesome.sharp/6.3.0", "path": "fontawesome.sharp/6.3.0",
"hashPath": "fontawesome.sharp.6.3.0.nupkg.sha512" "hashPath": "fontawesome.sharp.6.3.0.nupkg.sha512"
}, },
"Hi.WpfPlus/3.2.21": { "Hi.WpfPlus/3.2.22": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-nLTm8mAHaZyzNM4CZnpwDDX1Qg1Niz4L6uUVvds+fVRhKzBsMmA88RPN20rpUKLkfnMKLvbCWZgEfhN3BBJ0AA==", "sha512": "sha512-Ccbuy5UYWhRje54RoSaufdGQHx8j0HwtuDri6kDbj9r8cTq/PMkH+nMnC5H84QkXn7cWAAztoxGTl+L3igjCTg==",
"path": "hi.wpfplus/3.2.21", "path": "hi.wpfplus/3.2.22",
"hashPath": "hi.wpfplus.3.2.21.nupkg.sha512" "hashPath": "hi.wpfplus.3.2.22.nupkg.sha512"
}, },
"HiCbtr/3.2.24": { "HiCbtr/3.2.25": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-MiHd2UMiQfjFr9dV9Ihj6UYLFzyqMiLBhCaaL5OaXSxFLcBVaIMWBDCSgVHsyBdDIIu8N+PhjRWYo1XqkfD8og==", "sha512": "sha512-vpVBenFALewpm86CSmnj6VmK5Z+GW3UXHeWxC/5/ClqGIaozy646vCiTpewRsYpGO2qr5Zkgz01doxU2tQ52bA==",
"path": "hicbtr/3.2.24", "path": "hicbtr/3.2.25",
"hashPath": "hicbtr.3.2.24.nupkg.sha512" "hashPath": "hicbtr.3.2.25.nupkg.sha512"
}, },
"HiDisp/3.2.28": { "HiDisp/3.2.29": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-zIVgXR4jB/2qikqXDZXmM/S5m0ptHo4dny0YxZMuo2yMid4JKodNeVuHi++EUWLA7hM6DvA2H++gF2jhruHrjA==", "sha512": "sha512-xkpdAIcLQd5XkXhJxDpsYhRzWbj/LGNHB7hBGNiGl9SQd8inbBYr4KsoZfIoCgUvIM0tcnMxXy2x8gHLEQNnGQ==",
"path": "hidisp/3.2.28", "path": "hidisp/3.2.29",
"hashPath": "hidisp.3.2.28.nupkg.sha512" "hashPath": "hidisp.3.2.29.nupkg.sha512"
}, },
"HiGeom/3.2.20": { "HiGeom/3.2.21": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-/tE3/44ZSIrDpovhoNB+VNQ7gQLICWSRYHWflwgdaW2/JZ7fqA0TPbQWnD2hgVUBngkxq/LVbxaCH0zsuFvSmA==", "sha512": "sha512-ufv3sFzP0/fF9nCkqtGbtjh+CgqMO4k1807nyI6mwp5hNnoyhb70FcWoXLHrrHPK7kkxFsev7pCL1VGEERDnTg==",
"path": "higeom/3.2.20", "path": "higeom/3.2.21",
"hashPath": "higeom.3.2.20.nupkg.sha512" "hashPath": "higeom.3.2.21.nupkg.sha512"
}, },
"HiLicense/3.2.21": { "HiLicense/3.2.22": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-P5/WRyvk7CAYhiGQ7URtJcL1KgvMuEIshtn/J0rcPl5kIOTztQgDlGSTYbChSBndf4sIZU6Lay0kB+nT8HA6hw==", "sha512": "sha512-lyIt6BOh2I6yrRm9I+/qxP7KUOShOgItybDcmMjAkqWB5/ChEgCvwxgurehDAf1AgpdlJshbOeR3SUgQXr57hw==",
"path": "hilicense/3.2.21", "path": "hilicense/3.2.22",
"hashPath": "hilicense.3.2.21.nupkg.sha512" "hashPath": "hilicense.3.2.22.nupkg.sha512"
}, },
"HiMech/3.2.25": { "HiMech/3.2.26": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-E7Z1tn7mZIoJxLxmfPqvYdYULz/Ubq506wtHNxjh5BqTg9uPkkdGu+NN5Pj/poNO0pON3VSx22EVL+lzUMMmZg==", "sha512": "sha512-79VRbnja56CPobbk30f6gmTJuGoUvtvEv6qEo5DqCKBKoTYJwvSwYRtV31nydWCMnIlD3XZnLTmMHSav2gVPkA==",
"path": "himech/3.2.25", "path": "himech/3.2.26",
"hashPath": "himech.3.2.25.nupkg.sha512" "hashPath": "himech.3.2.26.nupkg.sha512"
}, },
"HiNc/3.2.22": { "HiNc/3.2.23": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-eCw5R6OPddpplyKIqjHiJapc0bGC4P5mIpD1a8RSMSNXEA12UynFtrVr7rPJiFnTOL9+ojq9XcS58V2q3/k+ww==", "sha512": "sha512-AI9bcj0jYY+qrVs1dawA/0ivnaL1PG/0y/liaBPPG+mqJYOBUai9P4tQt58j+yhzIJz4BgKIyZI2l8pPwDOebA==",
"path": "hinc/3.2.22", "path": "hinc/3.2.23",
"hashPath": "hinc.3.2.22.nupkg.sha512" "hashPath": "hinc.3.2.23.nupkg.sha512"
}, },
"HiNc-Resource/3.2.19": { "HiNc-Resource/3.2.20": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-s1/DhSX8AQdFv9KD1Lmcc5TnjJh56e8Tfz00Q6keUnOMdRYirtdfSQKV4OnhqiBWTNOOL+QgQ8DqUE1d3+r+lg==", "sha512": "sha512-sGoPktBf8Il9ivB6iIYnph1VuDug9nBQCr6SHT1BOyxVlcBmmZmhfYl7wvE+J83RpUP6nb872RSEDDmu2wP8zQ==",
"path": "hinc-resource/3.2.19", "path": "hinc-resource/3.2.20",
"hashPath": "hinc-resource.3.2.19.nupkg.sha512" "hashPath": "hinc-resource.3.2.20.nupkg.sha512"
}, },
"HiUniNc/3.2.23": { "HiUniNc/3.2.24": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-PWxYAbqidkbRl4LboPXBnzXxI0L7Ik2awVHJUJhg44TCjPqzFio7jmDdTnfi3k/yZ2B/6+ryKZEk+WgROp0huA==", "sha512": "sha512-Ak2y16XYtzj31Ke4L5dS435Em2Y94ueFrAgiuJn60EL0V2V0TSe5lCTpsWyqjVdGWs84aJO6LSDLvwjOiWJ5kQ==",
"path": "hiuninc/3.2.23", "path": "hiuninc/3.2.24",
"hashPath": "hiuninc.3.2.23.nupkg.sha512" "hashPath": "hiuninc.3.2.24.nupkg.sha512"
}, },
"MathNet.Numerics/5.0.0": { "MathNet.Numerics/5.0.0": {
"type": "package", "type": "package",
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"engineVersion": "3.2.25.0", "engineVersion": "3.2.26.0",
"recordCount": 98, "recordCount": 98,
"records": [ "records": [
{ {
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
@@ -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> <p>Ordered the way a request travels: the front end first, then the process that serves it.</p>
<h2 id="directories">Directories</h2> <h2 id="directories">Directories</h2>
<ul> <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 <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> 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> a filename, why folder nesting does not predict a route, and which declared hub is never mapped</li>
</ul> </ul>
<h2 id="what-this-layer-is-for">What This Layer Is For</h2> <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> <h2 id="see-also">See Also</h2>
<ul> <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="../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-spa.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-backend.html">Web Service Backend Source Tree</a> — the process that
serves it</li> serves it</li>
<li><a class="xref" href="../platform/index.html">Platform</a> — the machinery under every screen, entered by mechanism rather <li><a class="xref" href="../platform/index.html">Platform</a> — the machinery under every screen, entered by mechanism rather
than by directory</li> than by directory</li>
@@ -16,10 +16,10 @@
<a href="index.html" name="" title="Overview">Overview</a> <a href="index.html" name="" title="Overview">Overview</a>
</li> </li>
<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>
<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> </li>
</ul> </ul>
</div> </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 "> <meta name="title" content="Web Service Backend Source Tree | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css"> <link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css"> <link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html"> <meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" 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:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF"> <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> <script>
const theme = localStorage.getItem('theme') || 'auto' const theme = localStorage.getItem('theme') || 'auto'
@@ -43,8 +43,8 @@
<header class="bg-body border-bottom"> <header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation"> <nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap"> <div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../index.html"> <a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../../img/HiAPI.logo.png" alt=""> <img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a> </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"> <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 <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> the sibling HiNc engine repository, not here.</li>
</ul> </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> <h2 id="execution">Execution</h2>
<p><code>Execution/</code> is the run cockpit's whole backend: playback control, the strip and cycle-line charts, <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> 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 canvas. A reader looking for &ldquo;the hub behind the Execution page&rdquo; by name will find this file first
and be wrong.</p> and be wrong.</p>
</div> </div>
<p>Documented in <a class="xref" href="../../execution/index.html">Execution Page</a>, <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/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/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> <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> <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 <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 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> loaded project actually plays them. No SignalR hub lives here.</p>
<ul> <ul>
<li><code>Mech/MechBuilder/</code> — the standalone mechanism-building session, held by a process-wide singleton <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 <li><code>Mech/Topo/</code> — one thin controller per transformer kind, each editing an instance held in the
keyed object store. Documented in 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 <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 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/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/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 <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 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> </ul>
<p>Documented in <a class="xref" href="../../general-setup/index.html">General Setup Page</a> and <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> <a class="xref" href="../tool-house/index.html">Tool House Page</a> and the panels beneath them.</p>
<h2 id="missions">Missions</h2> <h2 id="missions">Missions</h2>
<p><code>Missions/</code> is the mission command tree's backend. Two things here surprise readers:</p> <p><code>Missions/</code> is the mission command tree's backend. Two things here surprise readers:</p>
<ul> <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 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 <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> 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> <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 <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 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 <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 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> 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>, <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 <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 — <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> <h2 id="environments">Environments</h2>
<p><code>Environments/</code> is session and environment scope: the project lifecycle, per-user preference <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 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 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> 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>, <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="../platform/session-state.html">Session State</a>,
<a class="xref" href="../../shell/preference-menu.html">Preference Menu Dropdown</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/i18n.html">Internationalization</a>,
<a class="xref" href="../../platform/log-viewer.html">Log Viewer Page</a> and <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> <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> <h2 id="common-geom-and-widget">Common, Geom and Widget</h2>
<ul> <ul>
<li><code>Common/</code> — cross-cutting infrastructure with no single domain owner: the optional login gate, the <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>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 <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 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/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="../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/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="../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 <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, <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 the 4×4 matrix, and the object-management surface that handles file operations, XML editing and
copy-paste for indexed objects. Documented in 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/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/vec3d-control.html">Vec3dControl Component</a> and
<a class="xref" href="../../widget/mat4d-control.html">Mat4dControl Component</a>.</li> <a class="xref" href="../widget/mat4d-control.html">Mat4dControl Component</a>.</li>
</ul> </ul>
<h2 id="controller-and-demo">Controller and Demo</h2> <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 <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 <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 — <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 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> how to extend the engine, not as part of the shipped behaviour.</p>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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> 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> serves and answers</li>
</ul> </ul>
@@ -7,13 +7,13 @@
<meta name="title" content="Web Service SPA Source Tree | HiAPI-C# 2025 "> <meta name="title" content="Web Service SPA Source Tree | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css"> <link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css"> <link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html"> <meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" 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:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF"> <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> <script>
const theme = localStorage.getItem('theme') || 'auto' const theme = localStorage.getItem('theme') || 'auto'
@@ -43,8 +43,8 @@
<header class="bg-body border-bottom"> <header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation"> <nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap"> <div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../index.html"> <a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../../img/HiAPI.logo.png" alt=""> <img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a> </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"> <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 <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 that subscribes the project store to the execution-status hub. The real shell is
<code>wwwroot-src/src/layouts/MainLayout.vue</code>. Documented in <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>, <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 <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 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 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 boot file patches the shared notify helper so every toast is mirrored into the footer history
without touching a call site. Documented in 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/login-and-auth.html">Login and Authentication</a> and
<a class="xref" href="../../platform/i18n.html">Internationalization</a>.</li> <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. <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 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 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 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> <a class="xref" href="../platform/session-state.html">Session State</a>.</li>
</ul> </ul>
<h2 id="the-rest-edge">The REST Edge</h2> <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 <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> 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 <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. 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> </ul>
<h2 id="components">Components</h2> <h2 id="components">Components</h2>
<ul> <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 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. frames, which is why several pages each own a canvas bound to a different backend scene.
Documented in Documented in
<a class="xref" href="../../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service</a>, <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 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="../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 <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. 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 <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 — 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 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. 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 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="../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="../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 <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 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 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 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> <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 <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, confuse with <code>wwwroot-src/src/components/toolhouse/</code>: these are the panels the registry mounts,
that folder holds 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: 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 <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 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/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/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 <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 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 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 <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, 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. 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 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> <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 <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 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 <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 expansion panel and the resizable stack whose registration contract produces the &ldquo;rows collapse in
place&rdquo; behaviour the tree pages describe. Documented 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/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/session-state.html">Session State</a> for the keep-mounted flag that decides whether a
collapse unmounts its content.</li> collapse unmounts its content.</li>
<li><code>wwwroot-src/src/components/mission/</code>, <code>.../toolhouse/</code>, <code>.../spindle/</code>, <code>.../preference/</code>, <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 <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 <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 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 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 <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 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 <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 <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 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. 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. <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 <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 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. 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 Documented in <a class="xref" href="../platform/i18n.html">Internationalization</a> and
<a class="xref" href="../../conventions/translation-remarks.html">Translation Remarks</a>.</li> <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 <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 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> 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> </ul>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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> 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> serves this application and answers its REST and hub traffic</li>
</ul> </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="../../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 <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> 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> </ul>
</article> </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 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 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 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 Heidenhain. <strong>The piece classifier does not read it</strong>: neither of its re-interpolation guards is keyed
keyed on the brand, and the guard that singles a klartext arc out is keyed on where the arc's on the brand — one keys on where the arc's centre came from, the other on the piece's own
centre came from. So an arc centred on a modal <code>CC</code> line splits like any other, and the one incremental words. So a klartext arc centred on a
refused (<code>NcOpt--SplitionStartPointCenterUnsupported</code>) is the arc whose <code>CC</code> chain left an modal <code>CC</code> line splits like any other, provided the chain supplies both in-plane centre coordinates
in-plane coordinate for its own start point to supply. An arc whose centre falls entirely on its and the <code>C</code> block states its own words absolutely; an incomplete chain
start point never reaches that guard: with no radius it is not an arc at all, so it warns (<code>NcOpt--SplitionStartPointCenterUnsupported</code>) and an incremental word on the block itself
<code>Arc-CircleCenter--OnStartPoint</code> and is degraded to a chord as the program is read.</p> (<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 <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 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 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 <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> 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 <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 <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> 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> 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 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 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. 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 <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 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 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> <a class="xref" href="../editing-contract.html">Editing Contract</a>.</p>
<h2 id="what-a-row-holds">What a Row Holds</h2> <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 <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> <table>
<thead> <thead>
<tr> <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 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 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 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 answer 0 for it and the program plays on with a zero compensation — each side reports the miss
is a zero-length compensation that plays to the end of the program without a warning.</p> 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"> <div class="WARNING">
<h5>Warning</h5> <h5>Warning</h5>
<p><strong>The neighbouring Siemens ledger uses the opposite convention.</strong> On <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 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 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> 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> <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 <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 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 <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> grey em dash. A <strong>Refresh from Tool House</strong> button appears next to the toggle in their place.</li>
</ul> </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> <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 <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 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 <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 — 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 <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 radius by the <a href="#the-radius-basis">radius basis</a>: the largest radius on its cutter profile under
none. <strong>It then deletes every row whose number is not in the library.</strong> The wear columns are never <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> touched.</p>
<p>The engine carries the same three steps of its own, as <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>, <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> <ul>
<li><strong>Set ideal offset dependent on tool house</strong> Toggle</li> <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>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> <li><strong>Add</strong> Button — primary, add icon, right-aligned; only while the dependence is off</li>
</ul> </ul>
</li> </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 <li>Offset Table — dense, flat, bordered
<ul> <ul>
<li>Header Row — <strong>Tool #</strong>, <strong>Ideal Height (mm)</strong>, <strong>Axial Wear (mm)</strong>, <strong>Ideal Radius (mm)</strong>, <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>
<li><code>equipment/fixture/geometry</code>&ldquo;Geometry&rdquo;, a Geometry slot backing <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="../../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>, 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 <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> 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 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="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 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> </ul>
</article> </article>
@@ -108,16 +108,16 @@ geometry, anchors, mesh and material are all edited through the child items belo
</li> </li>
<li><code>equipment/workpiece/raw-geometry</code>&ldquo;Raw Geometry&rdquo;, a Geometry slot backing <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="../../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>, 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>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 <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 — 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 one still shows. The source
choice folds into that one picker — picking the voxel <code>CubeTreeFile</code>, which the picker shows as 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 <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 <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>, <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 <code>TransformationGeom</code>, plus None. The target must satisfy <code>IGetStl</code>, so <code>CubeTreeFile</code> is not among
@@ -2,9 +2,9 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <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="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"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div> </div>
<article data-uid="Anatomy-Box3dControl"> <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, <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 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> </ul>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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> hosts this editor</li>
</ul> </ul>
@@ -2,9 +2,9 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <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="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"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div> </div>
<article data-uid="Anatomy-CylindroidControl"> <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 <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 (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> </ul>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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> 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 <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> that owns the tessellation resolution</li>
@@ -2,9 +2,9 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <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="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"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div> </div>
<article data-uid="Anatomy-ExtendedCylinderPanel"> <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 <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 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> </ul>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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> 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 <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> editor's real home, and the one surface that supplies a start section</li>
@@ -2,9 +2,9 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <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="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"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div> </div>
<article data-uid="Anatomy-GeomCombinationControl"> <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 <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 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> </ul>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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> the panel each child card embeds</li>
</ul> </ul>
@@ -2,9 +2,9 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <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="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"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div> </div>
<article data-uid="Anatomy-GeomManageControl"> <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 <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 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> <ul>
<li><a class="xref" href="../util/mech-builder.html">Mechanism Builder Page</a> — embeds this control under its anchor <li><a class="xref" href="../util/mech-builder.html">Mechanism Builder Page</a> — embeds this control under its anchor
editor</li> editor</li>
<li><a href="box3d-control.html">Box3d Control</a> — the kind editors this switchboard resolves</li> <li><a href="box3d-editor.html">Box3d Editor</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="cylindroid-editor.html">Cylindroid Editor</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="extended-cylinder-editor.html">ExtendedCylinder Editor</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="stlfile-editor.html">StlFile Editor</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="meshed-geom-file-editor.html">MeshedGeomFile Editor</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="transformation-geom-editor.html">TransformationGeom Editor</a> — one of the container kinds
this panel offers, and why picking it replaces rather than wraps</li> 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> every child embeds this panel again</li>
</ul> </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 <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 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 hosts that kind's editor, and the <a href="transformer-panel.html">Transformer Select Panel</a> does the same for
a transformer.</p> a transformer.</p>
<p>On the shipped SPA a Control Tree is where both switchboards are usually met. A <strong>Geometry slot</strong> or <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 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 — 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 by <a href="transformation-geom-editor.html">TransformationGeom Editor</a> for its inner geometry and inner
transformer, by <a href="geom-combination-control.html">Geometry Combination Control</a> for each child, by the 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> 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 <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 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> </thead>
<tbody> <tbody>
<tr> <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> <td>A 3D box defined by min/max coordinates</td>
</tr> </tr>
<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> <td>A cylindroid with radius values along the Z axis</td>
</tr> </tr>
<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> <td>An <a class="xref" href="../../api/Hi.Geom.ExtendedCylinder.html">ExtendedCylinder</a> and its full length</td>
</tr> </tr>
<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> <td>An <a class="xref" href="../../api/Hi.Geom.IStlSource.html">IStlSource</a> loaded from an STL file</td>
</tr> </tr>
<tr> <tr>
<td><a href="meshed-geom-panel.html">Meshed Geometry Panel</a></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 shows it as <code>MeshedGeomFile</code></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>
<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> <td>An inner geometry plus the transformer that places it</td>
</tr> </tr>
<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> <td>Several geometries combined into one</td>
</tr> </tr>
</tbody> </tbody>
@@ -157,7 +157,7 @@ own model accepts, so <code>CubeTreeFile</code> reaches only the workpiece's raw
</thead> </thead>
<tbody> <tbody>
<tr> <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> <td>The geometry kind picker and the picked kind's editor</td>
</tr> </tr>
<tr> <tr>
@@ -2,9 +2,9 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <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="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"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div> </div>
<article data-uid="Anatomy-MeshedGeomPanel"> <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 <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 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> </ul>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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> 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> beside it</li>
</ul> </ul>
@@ -2,9 +2,9 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <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="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"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div> </div>
<article data-uid="Anatomy-StlFileControl"> <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 <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 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> </ul>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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> 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> 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 <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> before the pick is confirmed</li>
@@ -16,31 +16,31 @@
<a href="index.html" name="" title="Overview">Overview</a> <a href="index.html" name="" title="Overview">Overview</a>
</li> </li>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<li> <li>
<a href="transformer-panel.html" name="" title="Transformer Panel">Transformer Panel</a> <a href="transformer-panel.html" name="" title="Transformer Panel">Transformer Panel</a>
</li> </li>
<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> </li>
</ul> </ul>
</div> </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> <html>
<head> <head>
<meta charset="utf-8"> <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="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"> <link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,7 +85,7 @@
</div> </div>
<article data-uid="Anatomy-TransformationGeomControl"> <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 <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, 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 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 there. There is no operation anywhere that wraps an existing geometry into a transformation
geometry, or extracts it back out — see 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> </div>
<h2 id="layout">Layout</h2> <h2 id="layout">Layout</h2>
<h3 id="the-embedded-editor">The embedded editor</h3> <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 <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> transformer applied to a geometry means:</p>
<ul> <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 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 TransformationGeom and GeomCombination — which is what makes recursion and nesting legal — plus a
<strong>None (unset)</strong> entry.</li> <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> <h2 id="see-also">See Also</h2>
<ul> <ul>
<li><a class="xref" href="../../technique/mechanism/transformers.html">Transformers</a></li> <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> 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 <li><a class="xref" href="transformer-panel.html">Transformer Select Panel</a> — the inner-transformer picker and its seven
kinds</li> 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> <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> <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 (<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> <h2 id="layout">Layout</h2>
<ul> <ul>
<li>Transformer Select Panel <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> <h2 id="see-also">See Also</h2>
<ul> <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 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> transformer, with no kind restriction at all</li>
</ul> </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="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="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.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="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> <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> </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 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> an older value resolving is described in <a class="xref" href="platform/tree-ids-and-routes.html">Tree Ids and Routes</a>.</p>
</div> </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 model this screen edits — what <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> holds, the three settings it
<p>The project carries both models side by side and serializes both. <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> is owns alone, what it shares with the branch, and the engine files behind all of it — is
loaded from the project's own <code>NcEnv</code> element unconditionally; <a class="xref" href="../api/Hi.NcParsers.NcRunnerSuit.html">NcRunnerSuit</a> — the <a class="xref" href="legacy-controller-settings.html">Legacy Controller Settings</a>.</p>
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>
<h2 id="the-tabs">The Tabs</h2> <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: <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 <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> </ul>
<h3 id="hiapi-engine">HiAPI Engine</h3> <h3 id="hiapi-engine">HiAPI Engine</h3>
<ul> <ul>
<li><code>HiUniNc/Numerical/HardNcEnv.cs</code> — the model this page edits: the coordinate, datum and offset <li><code>HiUniNc/Numerical/HardNcEnv.cs</code> — the model behind the tab table above: the coordinate, datum and
tables, the stroke boxes that construct infinite, the rapid rate and tooling time, the offset tables, the two stroke boxes that construct infinite, and the rapid rate and tooling time
shortest-rotary flag with its Heidenhain exclusion, and the master-axis character over its integer the Machine tab writes.</li>
direction.</li>
<li><code>HiGeom/Geom/Box3d.cs</code> — the box the two stroke limits are, its infinite construction, and the <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> 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 <li><code>HiUniNc/Numerical/MillingToolOffsetTable.cs</code> — the offset table the Offset Table tab edits: a
shortest-rotary path application and the <code>SEQ</code> solve that reads the master-axis direction.</li> dictionary keyed on the offset id, which is the key a row rename moves an entry to.</li>
<li><code>HiUniNc/Numerical/MillingToolOffsetTable.cs</code> — the offset table and the tool-house recompute the <li><code>HiNc/MachiningProcs/LocalProjectService.cs</code> — the per-step stroke check that falls back to the
Refresh button calls.</li> legacy boxes when no runner-side stroke config resolves, which is what makes a regrouped box
<li><code>HiMech/NcParsers/Dependencys/Generic/IsoCoordinateTable.cs</code> — the coordinate table type and the observable.</li>
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>
</ul> </ul>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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, <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> 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 <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> <li>
<a href="legacy-controller.html" name="" title="Legacy Controller (HardNcEnv)">Legacy Controller (HardNcEnv)</a> <a href="legacy-controller.html" name="" title="Legacy Controller (HardNcEnv)">Legacy Controller (HardNcEnv)</a>
</li> </li>
<li>
<a href="legacy-controller-settings.html" name="" title="Legacy Controller Settings">Legacy Controller Settings</a>
</li>
<li> <li>
<a href="by-source/index.html" name="by-source/toc.html" title="By Source Directory">By Source Directory</a> <a href="by-source/index.html" name="by-source/toc.html" title="By Source Directory">By Source Directory</a>
</li> </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> <ul>
<li>Intro caption</li> <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>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> <ul>
<li><a class="xref" href="../../../api/Hi.Geom.Cylindroid.html">Cylindroid</a></li> <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> <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> </ul>
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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> for this cutter, and the one surface that gives it a start section</li>
</ul> </ul>
@@ -94,7 +94,7 @@
<ul> <ul>
<li>Geometry Section <li>Geometry Section
<ul> <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> <li>Initializing Caption — stands in for the editor until the holder's cylindroid has been published under a key</li>
</ul> </ul>
</li> </li>
@@ -126,7 +126,7 @@
<h2 id="see-also">See Also</h2> <h2 id="see-also">See Also</h2>
<ul> <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="../../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> embeds, and the shape whose tessellation the Resolution surface governs</li>
</ul> </ul>
@@ -188,7 +188,7 @@
<ul> <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="../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/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 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 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> <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> 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 <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 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 <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 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 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> <ul>
<li><a href="file-explorer.html">File Explorer</a> — the one screen that mounts this pane, and the editor column it <li><a href="file-explorer.html">File Explorer</a> — the one screen that mounts this pane, and the editor column it
takes over</li> 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> 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="../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 <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> </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>
<div class="markdown level1 conceptual"></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> <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"> <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 <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). 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 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 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 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> <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> <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)"> <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) UpdateIdealByToolHouse(MachiningToolHouse, RadiusOffsetBasis)
</h3> </h3>
<div class="markdown level1 summary"><p>Refreshes the ideal (geometry) components from the tool house — ideal <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 height = the tool's spindle-buckle→tool-tip length, ideal radius of a
cutter profile's max radius — preserving accumulated wear, and drops milling-cutter row = the cutter profile's max radius under
rows whose tool id no longer exists in the house. Offset number maps <a class="xref" href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html#Hi_NcParsers_Dependencys_Generic_RadiusOffsetBasis_CutterRadius">CutterRadius</a> or 0 under
1:1 to the tool id. Mirrors the HardNc <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> <code>MillingToolOffsetTable.UpdateIdealMillingToolOffsetTableByToolHouse</code>
semantics so H/D offsets follow the tool house when the project's semantics so H/D offsets follow the tool house when the project's
<code>IsIdealOffsetDependentOnToolHouse</code> is on.</p> <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="markdown level1 conceptual"></div>
<div class="codewrapper"> <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> </div>
<h4 class="section">Parameters</h4> <h4 class="section">Parameters</h4>
<dl class="parameters"> <dl class="parameters">
<dt><code>toolHouse</code> <a class="xref" href="Hi.Machining.MachiningToolHouse.html">MachiningToolHouse</a></dt> <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><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> </dd>
</dl> </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 Not a standard Fanuc parameter — in real Fanuc, tool change motion
is programmed in the macro program (O9006). 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> 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> </dd>
</dl> </dl>
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class HeidenhainToolChangeSyntax | HiAPI-C# 2025 "> <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="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css"> <link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.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 P0 limits recorded as diagnostics: non-Z tool axis
(<code>ToolChange--AxisUnsupported</code>), non-zero DL/DR deltas (<code>ToolChange--AxisUnsupported</code>), non-zero DL/DR deltas
(<code>ToolChange--DeltaUnsupported</code>; zero deltas are consumed (<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 (<code>ToolChange--MissingToolId</code>, e.g. a variable tool number the
parser could not capture). parser could not capture).
</p> </p>
@@ -619,7 +619,8 @@ resolve (or warn) at the semantic layer.
P0 limits recorded as diagnostics: non-Z tool axis P0 limits recorded as diagnostics: non-Z tool axis
(<code>ToolChange--AxisUnsupported</code>), non-zero DL/DR deltas (<code>ToolChange--AxisUnsupported</code>), non-zero DL/DR deltas
(<code>ToolChange--DeltaUnsupported</code>; zero deltas are consumed (<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 (<code>ToolChange--MissingToolId</code>, e.g. a variable tool number the
parser could not capture). parser could not capture).
</p> </p>
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class SiemensCycle800TiltSyntax | HiAPI-C# 2025 "> <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="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css"> <link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css"> <link rel="stylesheet" href="../public/main.css">
@@ -142,7 +142,9 @@ cancel with explicit <code>G0 A.. C..</code> moves anyway.
<p> <p>
Fail-soft: a non-numeric argument (machine-runtime variable) leaves Fail-soft: a non-numeric argument (machine-runtime variable) leaves
the <code>Parsing.CYCLE800</code> residue visible and applies no transform 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 skips positioning (<code>Coord-Tilt--004</code>); a rotating CYCLE800 on a
machine without kinematics/rotary axes keeps the tilt and warns machine without kinematics/rotary axes keeps the tilt and warns
(<code>Coord-Tilt--005</code>). (<code>Coord-Tilt--005</code>).
@@ -209,7 +209,9 @@ cancel with explicit <code>G0 A.. C..</code> moves anyway.
<p> <p>
Fail-soft: a non-numeric argument (machine-runtime variable) leaves Fail-soft: a non-numeric argument (machine-runtime variable) leaves
the <code>Parsing.CYCLE800</code> residue visible and applies no transform 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 skips positioning (<code>Coord-Tilt--004</code>); a rotating CYCLE800 on a
machine without kinematics/rotary axes keeps the tilt and warns machine without kinematics/rotary axes keeps the tilt and warns
(<code>Coord-Tilt--005</code>). (<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 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. rather than a shared side file.
</p> </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> </dd>
</dl> </dl>
<dl class="jumplist"> <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> <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)"> <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) UpdateIdealMillingToolOffsetTableByToolHouse(MachiningToolHouse, RadiusOffsetBasis)
</h3> </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>
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
<div class="codewrapper"> <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> </div>
<h4 class="section">Parameters</h4> <h4 class="section">Parameters</h4>
<dl class="parameters"> <dl class="parameters">
<dt><code>millingToolHouse</code> <a class="xref" href="Hi.Machining.MachiningToolHouse.html">MachiningToolHouse</a></dt> <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><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> </dd>
</dl> </dl>
+6
View File
@@ -2440,6 +2440,9 @@
<li> <li>
<a href="Hi.NcParsers.NcRunnerSuit.html" name="" title="NcRunnerSuit">NcRunnerSuit</a> <a href="Hi.NcParsers.NcRunnerSuit.html" name="" title="NcRunnerSuit">NcRunnerSuit</a>
</li> </li>
<li>
<a href="Hi.NcParsers.RadiusCompInterference.html" name="" title="RadiusCompInterference">RadiusCompInterference</a>
</li>
<li> <li>
<a href="Hi.NcParsers.Sentence.html" name="" title="Sentence">Sentence</a> <a href="Hi.NcParsers.Sentence.html" name="" title="Sentence">Sentence</a>
</li> </li>
@@ -2587,6 +2590,9 @@
<li> <li>
<a href="Hi.NcParsers.Dependencys.Generic.MachineAxisConfig.html" name="" title="MachineAxisConfig">MachineAxisConfig</a> <a href="Hi.NcParsers.Dependencys.Generic.MachineAxisConfig.html" name="" title="MachineAxisConfig">MachineAxisConfig</a>
</li> </li>
<li>
<a href="Hi.NcParsers.Dependencys.Generic.RadiusOffsetBasis.html" name="" title="RadiusOffsetBasis">RadiusOffsetBasis</a>
</li>
<li> <li>
<a href="Hi.NcParsers.Dependencys.Generic.SubProgramFolderConfig.html" name="" title="SubProgramFolderConfig">SubProgramFolderConfig</a> <a href="Hi.NcParsers.Dependencys.Generic.SubProgramFolderConfig.html" name="" title="SubProgramFolderConfig">SubProgramFolderConfig</a>
</li> </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 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 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 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 below them: the cutting parameters and the workpiece material, the project file itself at
135 KB, the spindle capability, and a cutter material. The right-hand pane is the explorer's text 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> 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"> <div class="WARNING">
<h5>Warning</h5> <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 <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>5</td>
<td><strong>Record Meshed Geometry</strong></td> <td><strong>Record Meshed Geometry</strong></td>
<td>Output</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>
<tr> <tr>
<td>6</td> <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 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 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> 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 <p><strong>Give a stage a stage-0 record when the stock costs real time to mesh, and not otherwise.</strong> The
solid the kernel has to build. Where a stage's stock is itself a recorded mesh, as it is for the test is what the workpiece's initial geometry actually is:</p>
second operation in a chained pair, a stage-0 record buys no time at all and freezes the chain: the <table>
upstream stage can be re-run all it likes and this one keeps reading the copy it took the first <thead>
time. There, the previous stage's own end-of-stage file is already the cache, and the stage needs <tr>
no record above its program.</p> <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> <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 <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 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> <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 <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 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 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/facing.ptp]</code>, <code>Machining Resolution [0.25 mm]</code>, 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> <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 <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 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 <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 <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> 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 <p>The demo mission at <code>/execution?tree=execution/mission</code>: two groups and seven loose entries. The
tree above shows <strong>List [Setup]</strong> opened, with the three settings commands inside it bracketing tree above shows <strong>List [Roughing]</strong> and <strong>List [Finishing]</strong> opened, with the two Program File
their values; the editor below shows the same seven entries as rows. The greyed <strong>Script</strong> row is an entries inside each bracketing their files; the editor below shows the same nine root entries as
entry left in place with its checkbox cleared — part of the mission, and not run.</p> rows. The greyed <strong>Program File</strong> and <strong>Post-Execution</strong> rows are entries left in place with their
<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> 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> <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 <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> 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 <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, 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> 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> <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 <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 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 <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 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> <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 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> 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> <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 <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 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 <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. 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 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 under it are counting what the run has reported: <strong>Shell</strong> is badged with the eleven messages the
what the red line in the footer and the number on <strong>Step Diagnostics</strong> are saying.</p> load and the run have written between them and <strong>NC Diagnostics</strong> with the one the parser raised,
<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> 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> <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 <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 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 <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 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> 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 <strong>Enable Depth Splition</strong> and <strong>Enable Interpolation</strong> — and the values live on five child nodes
beneath it:</p> beneath it:</p>
<table> <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 <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 means, and why an optimized result can look wrong, is
<a href="../../technique/nc-optimization/index.html">NC Optimization</a>.</p> <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 <p>The demo mission's optimizer command, at <code>/execution?tree=execution/mission/7</code>. In this mission it
two program groups it governs. The four switches are on the command's own panel; the five value sits below both program groups rather than above them, so the ordering rule at the top of this
nodes are indented under it in the tree.</p> section is what decides how much of the run it reaches. The five switches are on the command's own
<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> 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> <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 <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> <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 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> 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 <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 checkbox — that tick is what switches the output on — and the template field for the selected one
sits in the panel below.</p> 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> <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 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 <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> 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, <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> because two Program File commands named the same file.</em></p>
<div class="IMPORTANT"> <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 <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> list. Looking in the wrong one reads as silence.</p>
<h2 id="reading-a-row">Reading a row</h2> <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, <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> 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 <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="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/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 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> </ul>
</article> </article>
+1 -1
View File
@@ -96,7 +96,7 @@ and neither reprints the other.</p>
<ul> <ul>
<li><a href="about.html">About</a> — About Tech Coordinate and contact information</li> <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="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> </ul>
<h2 id="getting-started">Getting Started</h2> <h2 id="getting-started">Getting Started</h2>
<ul> <ul>
@@ -7,13 +7,13 @@
<meta name="title" content="HiNC User Terms | HiAPI-C# 2025 "> <meta name="title" content="HiNC User Terms | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico"> <link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css"> <link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css"> <link rel="stylesheet" href="../public/main.css">
<meta name="docfx:navrel" content="../../toc.html"> <meta name="docfx:navrel" content="../toc.html">
<meta name="docfx:tocrel" 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:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF"> <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> <script>
const theme = localStorage.getItem('theme') || 'auto' const theme = localStorage.getItem('theme') || 'auto'
@@ -43,8 +43,8 @@
<header class="bg-body border-bottom"> <header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation"> <nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap"> <div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html"> <a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt=""> <img id="logo" class="svg" src="../img/HiAPI.logo.png" alt="">
</a> </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"> <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> <a href="system-requirements.html" name="" title="System Requirements">System Requirements</a>
</li> </li>
<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>
<li> <li>
<span class="expand-stub"></span> <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 <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>: 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> <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 <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>, 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 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 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 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> <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 <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 <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. 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> <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 <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 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 sits below the flute height (<code>Cutter-UpperBeam--ExtendedCylinderFullLengthTooShort</code>), which
makes the shank thermal model unbuildable. They are reported once per tool at <code>BeginSession</code> and at 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 each tool change, instead of surfacing later as a null-reference cascade inside the thermal physics
with nothing naming the beam.</li> 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 <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: physics was inactive at simulation time). The gather pass counts both against the eligible steps:
silent at zero, one summary warning at or below 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 <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 configuration error above it. <strong>The breakdown in that summary is the diagnosis</strong>: misses sitting on
rather than throwing inside the SVD solve, separating &ldquo;not one step touched the workpiece&rdquo; from the engagement level mean the play itself ran with physics inactive, while a scattered few on the
&ldquo;touched steps whose mapped force data yielded no usable shots&rdquo;.</li> 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> <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 (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; 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 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 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 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 downgraded to a non-split rewrite rather than reproduced, each warned once per run. The first is
fragment rewrite always emitted absolute coordinates), and a klartext <code>C … DR±</code> arc whose modal an incremental block, and it is now taken by both of its spellings: <code>G91</code> modal state, <strong>or</strong> a
<code>CC</code> chain left one of the two in-plane axes unstated, so the block's own start point supplied block whose modal state is absolute while individual axis words carry a per-word incremental
that component — since every fragment would re-derive the centre from its own start. A klartext 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 <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. 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 <strong>Neither the controller brand nor klartext as such refuses a split</strong>: a klartext <code>L</code> block

Some files were not shown because too many files have changed in this diff Show More