This commit is contained in:
2026-09-09 17:35:23 +08:00
parent 2a98ae7556
commit 161af68fe3
1271 changed files with 58251 additions and 98639 deletions
@@ -87,7 +87,7 @@
<article data-uid="">
<h1 id="release-note">Release Note</h1>
<h2 id="hinc-packages-version-326">HiNc Packages Version 3.2.6</h2>
<h2 id="hinc-packages-32">HiNc Packages 3.2</h2>
<h3 id="at-a-glance">At a glance</h3>
<p>3.2 is largely one piece of work: the NC interpreter that reads a controller program is now composed
from configurable parts rather than written into one class, and most of this release is the brand
@@ -125,38 +125,42 @@ program we have not seen:</p>
<p>Syntec and Mazak run on the Fanuc-family vocabulary; their brand-specific syntax has not been worked
through and they are not covered by the figures above. The per-construct picture — including what is
recognized and deliberately <em>not</em> simulated — is in the
<a href="../fundamentals/nc-parsing/index.html#brand-support">brand support matrix</a>.</p>
<a href="../technique/nc-dialects/nc-parsing.html#brand-support">brand support matrix</a>.</p>
<p><strong>Failures say what went wrong.</strong> The class of defect this release spent most effort on is the
silent one: a Siemens tool offset with no table row that resolved to zero and machined a whole
program one tool length low, a G68 rotation that did nothing while reporting itself active, a tilted
plane the machine could not reach. Each of those is now a named, searchable diagnostic rather than a
plausible-looking wrong result — see the <a href="upgrading-to-3.2.html#new-diagnostics-you-may-now-see">diagnostic id
plausible-looking wrong result — see the <a href="upgrading-to-3.2/new-diagnostics.html">diagnostic id
table</a>.</p>
<p><strong>Simulation is faster and holds a bigger program.</strong> Physics moved into the native kernel (a paired
play: 59.3 s / 16.1 GB allocated → 40.6 s / 3.4 GB), building the topology of a large STL is linear
rather than quadratic in triangle count, and a long program no longer degrades as it plays. Figures
and their conditions are under
<a href="upgrading-to-3.2.html#performance-and-footprint">Performance and footprint</a>.</p>
<p><strong>The application product moves to the web API.</strong> From 3.2 the shipped application is the web
service, and its source is the same <code>HiNC-2025-webservice</code> sample we publish — what you read there is
what the product runs. The Blazor front end is not on this line.</p>
<a href="upgrading-to-3.2/performance-and-footprint.html">Performance and footprint</a>.</p>
<p><strong>The application product moves to the web API.</strong> The web service is the application the product
line is built on, and its source is the same <a href="../technique/api-foundations/packages-and-samples.html#hiapi-sample-code"><code>HiNC-2025-webservice</code></a>
sample we publish — what you read there is what the product runs. A Windows desktop client ships
alongside it on the same packages, and no new feature work targets it. The Blazor front end builds
against the same 3.2 packages but is not published as a product.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p><strong>Adoption status.</strong> This drop is published for review. Verification is still in progress across
most areas, and the coverage figures above are the honest state of it.</p>
<p><strong>Do not put 3.2 NC optimization into production.</strong> It is not finished on this line. Work that
depends on optimization should stay on the 3.1 line, which is serviced as <code>3.1.175.&lt;patch&gt;</code>. The
Blazor front end likewise remains on 3.1.</p>
Blazor front end tracks the 3.2 packages, so it is not a way to stay on the 3.1 behaviour.</p>
</div>
<h3 id="what-changed">What changed</h3>
<p><strong>This one entry covers everything since 3.1.175.</strong> The 3.1 line is closed at the 3.1.175 package
set and is serviced only as <code>3.1.175.&lt;patch&gt;</code>; <code>master</code> moved all ten packages onto the <strong>3.2</strong> line
on 2026-07-26 and restarted their build counters. So a 3.2 build number starts low<code>3.2.6</code> is
newer than <code>3.1.204</code>, the two counters are not comparable, and the gap between them is expected
rather than a missing upload. The versions in between were never published as a release set, which
is why they are merged here rather than listed separately.</p>
on 2026-08-24 and restarted their build counters. So a 3.2 build number starts low, the two
counters are not comparable, and the gap between the last 3.1 number a feed served and the first
3.2 one is expected rather than a missing upload. The versions in between were never published as a
release set, which is why they are merged here rather than listed separately. Each package's build
counter advances on its own, so no single number is common to all ten; a set is named by its HiNc
package version — see <a href="upgrading-to-3.2/the-package-line.html">The package line</a>.</p>
<p>Everything below therefore lands at once on a caller moving a 3.1.175 reference to 3.2.
<strong>See <a href="upgrading-to-3.2.html">Upgrading from 3.1.175 to 3.2</a> for the full detail</strong> — the summary here
<strong>See <a href="upgrading-to-3.2/index.html">Upgrading from 3.1.175 to 3.2</a> for the full detail</strong> — the summary here
is the shape of the upgrade, not the whole of it.</p>
<h3 id="breaking-changes">Breaking changes</h3>
<p>In the order they will bite. Full table with replacements on the upgrade page.</p>
@@ -211,7 +215,7 @@ HiNcRcl drops the inert <code>HiNC:DisplayEngine:FontFile</code> key</li>
silent no-op, blank lines resetting G90/G91, Heidenhain absolute arc centres, five-axis IK about
1000× tighter, and MC-linear moves stepping by euclidean tip travel. They are listed with their
symptoms under
<a href="upgrading-to-3.2.html#results-that-change-on-upgrade">Results that change on upgrade</a>.</p>
<a href="upgrading-to-3.2/results-that-change-on-upgrade.html">Results that change on upgrade</a>.</p>
<h3 id="new-in-this-release">New in this release</h3>
<ul>
<li><strong>Siemens SINUMERIK programs replay end to end</strong> — real <code>.mpf</code> / <code>.spf</code> files rather than an ISO
@@ -227,7 +231,7 @@ without separators; and the DIN/ISO dialect with its absolute <code>I</code> / <
<code>M98</code> / <code>M99</code> subprograms and <code>G65</code> / <code>G66</code> macro calls; <code>G12.1</code> / <code>G13.1</code> polar coordinate
interpolation with <code>G41</code> / <code>G42</code> compensation on the hypothetical plane</li>
<li><strong><a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> is the default NC pipeline.</strong> See
<a href="../fundamentals/nc-parsing/index.html">NC Parsing Engine</a> for its architecture and the per-brand
<a class="xref" href="../technique/nc-dialects/nc-parsing.html">NC Parsing Engine</a> for its architecture and the per-brand
support matrix</li>
<li><strong>NC optimization runs on that pipeline</strong><em>not finished on this line, see Adoption status above</em>
— regenerating text as anchored token edits over the verbatim source block, so lines the optimizer
@@ -264,7 +268,7 @@ instead of quadratic in triangle count (18.7× at 300k triangles, and it was 99.
re-triangulating after a cut is about 2.2× faster; and a long program no longer exhausts client
memory (session retention on a 25,000-block play: 406 MB → 142 MB). Every figure with its
conditions — including the two things that cost more on purpose — is under
<a href="upgrading-to-3.2.html#performance-and-footprint">Performance and footprint</a></li>
<a href="upgrading-to-3.2/performance-and-footprint.html">Performance and footprint</a></li>
<li><strong>Stability and data integrity</strong> — the native crashes from disposing a display or geometry object
still in use, the intermittent &ldquo;No cut / No data for step&rdquo; on freshly-simulated steps, the
project-file race between a Load and a Save, and non-reproducible milling-force waveforms are all
@@ -279,11 +283,11 @@ fixed; large geometry now builds its display topology off-thread instead of free
<ul>
<li>Improve <a class="xref" href="../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_Mrr_mm3ds">Mrr_mm3ds</a> precision: the material-removal-rate now sums each cut contour's signed area-vector (fan triangulation, skipping non-finite triangles) projected on the feed direction, replacing the per-contour bounding-box area that over-estimated the cut cross-section</li>
<li>Add <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_AlignWorkpieceProgramZeroToIso_">AlignWorkpieceProgramZeroToIso</a> script command: resolves a G54/G55/… entry from the project ISO coordinate table and places workpiece + fixture so the program zero coincides with that machine coordinate (topology math delegated to the new <a class="xref" href="../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipmentUtil.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipmentUtil_AlignWorkpieceProgramZeroToIso_">AlignWorkpieceProgramZeroToIso</a> extension)</li>
<li>Drop gRPC plumbing from the HiNc package: remove <code>Hi.Grpcs.*</code> ClStrip/Player service runners and protos, <code>MachiningProjectGrpcServer</code>, <code>MonitoringPlayer</code>, and <code>UniversalNcMonitorClient</code>; fold <code>CsvRunnerConfig</code> back into <code>CsvRunner0</code> (gRPC services now ship in HiNcRcl / UJoinRcl)</li>
<li>Drop gRPC plumbing from the HiNc package: remove <code>Hi.Grpcs.*</code> ClStrip/Player service runners and protos, <code>MachiningProjectGrpcServer</code>, <code>MonitoringPlayer</code>, and <code>UniversalNcMonitorClient</code>; fold <code>CsvRunnerConfig</code> back into <code>CsvRunner0</code> (gRPC services now ship in HiNcRcl and a downstream RCL package)</li>
</ul>
<h2 id="hinc-packages-version-31172">HiNc Packages Version 3.1.172</h2>
<ul>
<li>Replace implicit XFactory registration (private <code>static &lt;ClassName&gt;()</code> constructors + <code>_ = X.XName</code> wake-up touches) with explicit <code>public static void Reg(XFactory factory = null)</code> methods across ~270 classes. <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> becomes an instance class with a process-wide <code>Default</code> singleton; <code>Generators</code> is renamed from <code>Regs</code> and now an instance property; the delegate type is renamed <code>XGeneratorDelegate</code> from <code>GenByXElementDelegate</code>. Composite types chain <code>X.Reg(factory)</code> on dependents in place of the old wake-up touches; multi-name (legacy alias) registrations keep the current XName first and group aliases under a <code>//legacy aliases</code> comment. Entry points (web service, win-desktop, test fixtures) <strong>must call <a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Reg_">Reg</a> once at startup before any project XML is deserialized</strong> — registration no longer happens by accident when the type is first touched. See <a href="../fundamentals/common/xml-io.html">XML IO</a>.</li>
<li>Replace implicit XFactory registration (private <code>static &lt;ClassName&gt;()</code> constructors + <code>_ = X.XName</code> wake-up touches) with explicit <code>public static void Reg(XFactory factory = null)</code> methods across ~270 classes. <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> becomes an instance class with a process-wide <code>Default</code> singleton; <code>Generators</code> is renamed from <code>Regs</code> and now an instance property; the delegate type is renamed <code>XGeneratorDelegate</code> from <code>GenByXElementDelegate</code>. Composite types chain <code>X.Reg(factory)</code> on dependents in place of the old wake-up touches; multi-name (legacy alias) registrations keep the current XName first and group aliases under a <code>//legacy aliases</code> comment. Entry points (web service, win-desktop, test fixtures) <strong>must call <a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Reg_">Reg</a> once at startup before any project XML is deserialized</strong> — registration no longer happens by accident when the type is first touched. See <a class="xref" href="../technique/api-foundations/xml-io.html">XML IO</a>.</li>
</ul>
<h2 id="hinc-packages-version-31171">HiNc Packages Version 3.1.171</h2>
<ul>
@@ -294,15 +298,15 @@ fixed; large geometry now builds its display topology off-thread instead of free
</ul>
<h2 id="hinc-packages-version-31167">HiNc Packages Version 3.1.167</h2>
<ul>
<li>Introduce <a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> as a pluggable NC parser/runner replacing the legacy <code>HardNcRunner</code>, opt-in at the time via <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableSoftNcRunner">EnableSoftNcRunner</a>. It became the default pipeline in 3.2 — see <a href="../fundamentals/nc-parsing/index.html">NC Parsing Engine</a></li>
<li>Introduce <a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> as a pluggable NC parser/runner replacing the legacy <code>HardNcRunner</code>, opt-in at the time via <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableSoftNcRunner">EnableSoftNcRunner</a>. It became the default pipeline in 3.2 — see <a class="xref" href="../technique/nc-dialects/nc-parsing.html">NC Parsing Engine</a></li>
<li>Extend coolant model to <a class="xref" href="../api/Hi.Numerical.CoolantMode.html">CoolantMode</a> Flood/Mist/Off and refactor <a class="xref" href="../api/Hi.Physics.CoolantHeatCondition.html">CoolantHeatCondition</a> / <code>MillingTemperatureUtil</code> for multi-mode coolant</li>
<li>Bind session events to <a class="xref" href="../api/Hi.MachiningProcs.MachiningSession.html">MachiningSession</a> lifetime: <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionStepBuilt">SessionStepBuilt</a>, <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionStepSelected">SessionStepSelected</a>, <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionSyntaxPieceRan">SessionSyntaxPieceRan</a>, <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionSourcedActEntry">SessionSourcedActEntry</a> (legacy aliases kept as <code>[Obsolete]</code>); add <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RegisterWriteSyntaxPieces_">RegisterWriteSyntaxPieces</a> / <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RegisterWriteSyntaxPiecesWithActs_">RegisterWriteSyntaxPiecesWithActs</a> for syntax-piece debug tracing</li>
<li>Add <a class="xref" href="../api/Hi.Common.XmlUtils.ProjectApiVersion.html">ProjectApiVersion</a> carrier through <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> deserialization for project-XML version negotiation; resolve <a class="xref" href="../api/Hi.NcMech.Workpieces.Workpiece.html">Workpiece</a> through a lazy <code>Func</code> getter in <a class="xref" href="../api/Hi.NcMech.Workpieces.WorkpieceService.html">WorkpieceService</a></li>
</ul>
<h2 id="hinc-packages-version-31162">HiNc Packages Version 3.1.162</h2>
<ul>
<li>Refactor message management into three independent categories: <strong>Diagnostic</strong> (<code>IProgress&lt;object&gt;</code>), <strong>UI Notification</strong> (<code>MessageBoardUtil</code>), <strong>App Log</strong> (<code>ILogger</code>); remove <code>MessageUtil</code> class entirely and remove <code>ExceptionUtil.ShowException</code> / <code>ExceptionUtil.OnShown</code> (see <a href="../fundamentals/common/message-management.html">Message Management</a>)</li>
<li>Thread <code>IProgress&lt;object&gt;</code> through <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> deserialization chain and <a class="xref" href="../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> loading; remove <code>GenMode</code> enum entirely (see <a href="../fundamentals/common/xml-io.html">XML IO</a>)</li>
<li>Refactor message management into three independent categories: <strong>Diagnostic</strong> (<code>IProgress&lt;object&gt;</code>), <strong>UI Notification</strong> (<code>MessageBoardUtil</code>), <strong>App Log</strong> (<code>ILogger</code>); remove <code>MessageUtil</code> class entirely and remove <code>ExceptionUtil.ShowException</code> / <code>ExceptionUtil.OnShown</code> (see <a class="xref" href="../technique/api-foundations/message-management.html">Message Management</a>)</li>
<li>Thread <code>IProgress&lt;object&gt;</code> through <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> deserialization chain and <a class="xref" href="../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> loading; remove <code>GenMode</code> enum entirely (see <a class="xref" href="../technique/api-foundations/xml-io.html">XML IO</a>)</li>
<li>Add <a class="xref" href="../api/Hi.Common.Messages.ActionProgress-1.html">ActionProgress&lt;T&gt;</a>.<a class="xref" href="../api/Hi.Common.Messages.ActionProgress-1.html#Hi_Common_Messages_ActionProgress_1_FromLogger_">FromLogger</a> to bridge <code>IProgress&lt;object&gt;</code> APIs to <code>ILogger</code></li>
<li>Rename <code>ShowIfCatched</code><a class="xref" href="../api/Hi.Common.Messages.ExceptionUtil.html#Hi_Common_Messages_ExceptionUtil_CatchExceptions_">CatchExceptions</a> with explicit <code>Action&lt;Exception&gt;</code> handler; remove <code>RoutineBlocker0</code></li>
<li>Extract <a class="xref" href="../api/Hi.NcMech.Workpieces.WorkpieceService.html">WorkpieceService</a> from <a class="xref" href="../api/Hi.NcMech.Workpieces.Workpiece.html">Workpiece</a> for runtime geometry operations</li>
@@ -16,7 +16,7 @@
<a href="index.html" name="" title="Release Note">Release Note</a>
</li>
<li>
<a href="upgrading-to-3.2.html" name="" title="Upgrading from 3.1.175 to 3.2">Upgrading from 3.1.175 to 3.2</a>
<a href="upgrading-to-3.2/index.html" name="upgrading-to-3.2/toc.html" title="Upgrading from 3.1.175 to 3.2">Upgrading from 3.1.175 to 3.2</a>
</li>
</ul>
</div>
@@ -1,2 +1,2 @@
{"items":[{"name":"Release Note","href":"index.html","topicHref":"index.html"},{"name":"Upgrading from 3.1.175 to 3.2","href":"upgrading-to-3.2.html","topicHref":"upgrading-to-3.2.html"}]}
{"items":[{"name":"Release Note","href":"index.html","topicHref":"index.html"},{"name":"Upgrading from 3.1.175 to 3.2","href":"upgrading-to-3.2/index.html","tocHref":"upgrading-to-3.2/toc.html","topicHref":"upgrading-to-3.2/index.html","homepage":"upgrading-to-3.2/index.html"}]}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,295 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Brand NC language coverage | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Brand NC language coverage | 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="Release-Upgrading-BrandCoverage">
<h1 id="brand-nc-language-coverage">Brand NC language coverage</h1>
<p>The SoftNc pipeline is the default NC engine, and this is where most of the release went.</p>
<h2 id="siemens-sinumerik">Siemens SINUMERIK</h2>
<p>Real <code>.mpf</code> / <code>.spf</code> programs replay end to end, not an ISO subset. At 3.1.175 a program that declared
its tool as <code>T=&quot;NAME&quot;</code>, shifted with <code>SUPA</code>, computed with R-parameters, called L-subprograms or
looped with <code>WHILE</code> was not interpreted past that point.</p>
<ul>
<li><strong>Modal vocabulary</strong><code>SUPA</code> / <code>G153</code> suppress all frames for one block; <code>T=&quot;NAME&quot;</code> string tool
calls with <code>D</code> cutting-edge offsets resolved through
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensToolOffsetTable.html">SiemensToolOffsetTable</a> (<code>$TC_DP</code> lengths and radius plus
additive wear); <code>G70</code> / <code>G71</code> units; path smoothing (<code>G60x</code> / <code>G64x</code>, <code>FNORM</code> / <code>SOFT</code> / <code>FFWON</code> /
<code>COMP*</code> / <code>UPATH</code>, <code>CYCLE832</code>); <code>MSG()</code> and <code>STOPRE</code>; <code>CR=</code> and <code>TURN=</code> arcs. Tail comments became
quote-aware, so a <code>;</code> inside <code>MSG(&quot;A;B&quot;)</code> no longer truncates the block, and the preset stops
misreading <code>L</code> and <code>G74</code> as Fanuc-family codes.</li>
<li><strong>Evaluation</strong><a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensExpressionParser.html">SiemensExpressionParser</a> feeds the
shared expression engine, so <code>Z=R63+150</code> and <code>X=SIN(R10)*20</code> drive motion.
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensRParameterTable.html">SiemensRParameterTable</a> holds R0R999 as per-case project
data, <code>DEF REAL/INT</code> declarations lower into assignments, and <code>$P_UIFR[n,axis,TR]</code> binds both ways
to <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensFrameTable.html">SiemensFrameTable</a>. Any other <code>$</code>-variable is recorded
with an unsupported note rather than dropped.</li>
<li><strong>Five axis</strong><a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensProgrammableFrameSyntax.html">SiemensProgrammableFrameSyntax</a> simulates
<code>TRANS</code> / <code>ATRANS</code> / <code>ROT</code> / <code>AROT</code> (with <code>RPL=</code>) into the tilt-transform chain in Sinumerik RPY
order; <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensTraoriSyntax.html">SiemensTraoriSyntax</a> makes <code>TRAORI</code> a real RTCP mode,
the sibling of ISO G43.4, with <code>TRAFOOF</code> handing the offset back;
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensCycle800TiltSyntax.html">SiemensCycle800TiltSyntax</a> decodes <code>CYCLE800</code>'s MODE bits for
all four swivel modes. <code>ROTS</code> / <code>SCALE</code> / <code>MIRROR</code> are recognized and reported, not simulated.</li>
<li><strong>Calls</strong> — L-prefixed and named subprogram calls resolve against
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Generic.SubProgramFolderConfig.html">SubProgramFolderConfig</a> (<code>{name}.SPF</code>, then <code>.MPF</code>, then the
bare name) and inline with their <code>P</code> repetition count; <code>M17</code> / <code>RET</code> pop a frame; <code>REPEAT</code> re-runs a
labelled slice; <code>MCALL CYCLE81/82/83/85</code> maps onto the shared canned-cycle machinery; <code>PROC</code> headers
and labels are claimed whole.</li>
<li><strong>Control flow</strong><code>GOTOF</code> / <code>GOTOB</code>, <code>IF</code> / <code>ELSE</code> / <code>ENDIF</code>, and <code>WHILE</code> / <code>FOR</code> / <code>REPEAT-UNTIL</code> /
<code>LOOP</code>. Runaway programs are bounded rather than hanging the session:
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensGotoIterationDependency.html">SiemensGotoIterationDependency</a> caps jumps per (file, label)
and <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensLoopIterationDependency.html">SiemensLoopIterationDependency</a> caps iterations per
(file, loop-entry line); over the cap the construct warns and falls through.</li>
<li><strong>Per-word coordinate functions</strong><code>AC()</code> / <code>IC()</code> / <code>DC()</code> / <code>ACP()</code> / <code>ACN()</code>, including on
<code>I</code> / <code>J</code> / <code>K</code> circle centres. <code>G90 C=IC(360/17)</code> is one incremental index inside an absolute
program. Direction resolution lives in <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a>:
<code>ACP()</code> takes the <code>[anchor, anchor+360)</code> window, <code>ACN()</code> the <code>(anchor-360, anchor]</code> window, <code>DC()</code>
the shortest swing, with the exact 180° tie going negative.</li>
<li><strong>Coded positions</strong><code>CAC</code> / <code>CIC</code> / <code>CDC</code> / <code>CACP</code> / <code>CACN</code> take a 1-based indexing position
number rather than a coordinate, resolved against <a class="xref" href="../../api/Hi.NcParsers.Dependencys.IIndexingPositionConfig.html">IIndexingPositionConfig</a>,
implemented by <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html">SiemensMachineDataTable</a> from the real machine
data (the MD30500 axis assignment, the MD10910 / MD10930 position tables, the equidistant
MD3050130503 definition).</li>
<li><strong><code>G74</code> / <code>G75</code> fixed-point return</strong> is claimed as a whole block, so its dummy axis values no longer
mint a rapid to the coordinates written in the block and its <code>F</code> never reaches the modal feedrate.</li>
<li><strong>OEM auxiliary M-codes</strong> — the preset declares <code>M12</code> / <code>M13</code> / <code>M22</code> / <code>M23</code> and <code>M330</code> / <code>M331</code>
note-only, so each occurrence voices <code>DeclaredMCode--UnmodeledEffects</code> instead of an unknown-code
warning, without inventing simulated effects. A machine's own table overrides a declaration when the
real effects are known.</li>
</ul>
<h2 id="heidenhain">Heidenhain</h2>
<p>Both dialects play on one preset, <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_HeidenhainNcRunner">HeidenhainNcRunner</a>.</p>
<ul>
<li><strong>Klartext motion and setup</strong> — the <code>L</code> statement and its axis words, <code>FMAX</code>, <code>M91</code> as a one-shot
machine-coordinate move, <code>TOOL CALL</code> wired to tool change and spindle speed with the table height
and <code>DL</code>. Datum handling follows TNC semantics: <code>CYCL DEF 247</code> sets the preset and <code>CYCL DEF 7</code> is an
<em>additive</em> shift on top of it, composing as separate transform-chain entries instead of replacing
each other, resolved against <a class="xref" href="../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTable.html">HeidenhainDatumTable</a>. Arcs (<code>CC</code> pole
plus <code>C</code> statement, <code>DR-</code> = CW, closed arc = full circle), <code>RL</code> / <code>RR</code> / <code>R0</code> radius compensation,
the <code>M126</code> / <code>M127</code> rotary-wrap state, <code>M140 MB</code> retract, and <code>CYCL DEF 32 TOLERANCE</code>. A <code>C</code> block
never states its own centre: each in-plane component comes from the <code>CC</code> block's own axis word,
else from the previous <code>CC</code> section's same axis, else from the arc's own start point. A bare <code>CC</code>
is the one spelling that states all of them at once — it takes the last programmed position, read
at the <code>CC</code> block, and replaces the modal centre rather than inheriting it. A centre that lands on
the arc's own start point leaves the block with no radius, so it warns
<code>Arc-CircleCenter--OnStartPoint</code> and is degraded to a linear move to the endpoint.</li>
<li><strong>Q-parameters</strong><a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser.html">HeidenhainExpressionParser</a> lexes
<code>Q</code> / <code>QR</code> / <code>QL</code> / <code>QS</code>, the <code>DIV</code> keyword of FN 4 and the prefix <code>SQRT</code> of FN 5, so <code>FQ1</code> reaches
the feedrate, <code>L X+Q2</code> reaches the program XYZ and <code>TOOL CALL SQ3</code> reaches the spindle speed.
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Heidenhain.HeidenhainQParameterTable.html">HeidenhainQParameterTable</a> holds Q0Q99 free and QR0QR499
permanent parameters as per-case project data. Unimplemented opcodes (FN 14 / 16 / 18…) are claimed
and reported rather than half-read, so an <code>FN 18 SYSREAD</code> target stays vacant instead of taking a
fabricated value. <strong>FN 912 conditional jumps execute</strong>, with a (file, label)-keyed iteration cap.</li>
<li><strong>Tilt and RTCP</strong><code>PLANE</code> (SPATIAL fully composed with <code>SEQ</code> / <code>COORD ROT</code> / <code>TABLE ROT</code> and
<code>STAY</code> / <code>MOVE</code> / <code>TURN</code> positioning; VECTOR structurally captured; EULER / POINTS / RELATIV /
AXIAL / PROJECTED consumed and warned with the previous tilt retained, so a <code>PLANE AXIAL B+45</code> B
word can never be mistaken for a rotary axis command), <code>FUNCTION TCPM</code>, and real <code>M128</code> / <code>M129</code>
tool-centre-point control.</li>
<li><strong>Cycles and calls</strong><code>CYCL DEF 2xx</code> bodies with their Q parameters mirrored into the block
assignments, cycles 200 / 232 / 251 / 252 / 253 mapped onto the shared G81 / G82 / G83 slots,
<code>CYCL CALL</code> / <code>CYCL CALL POS</code> / <code>M99</code> / <code>M89</code> splitting call-once from modal firing, <code>CALL LBL</code>
inlining up to <code>LBL 0</code>, <code>CALL LBL n REP m</code> as a section repeat, and <code>CALL PGM</code> resolved by file
name. The multi-line tilde continuation form is joined at segmentation
(<a class="xref" href="../../api/Hi.NcParsers.Segmenters.HeidenhainSegmenter.html#Hi_NcParsers_Segmenters_HeidenhainSegmenter_JoinTildeContinuations">JoinTildeContinuations</a>, on by default).</li>
<li><strong>Post-processed spellings</strong> — some post-processors write a whole klartext body with no separators
at all, which used to yield zero motion. Glued line shapes (<code>LX-26.3Y+43.1</code>, <code>FMAXM03M08</code>,
<code>…R0FMAX</code>) and the detached feed spelling (<code>F 20000</code>) now parse, with <code>M140</code>, <code>M128</code> and
<code>PLANE MOVE</code> widening their own <code>F</code> capture so a retract or feed-limit value cannot leak into the
modal feedrate. <code>BLK FORM</code> is recorded as a brand-neutral stock declaration without replacing the
project workpiece setup, and the klartext <code>STOP</code> word joins <code>M00</code> / <code>M01</code>.</li>
<li><strong>DIN/ISO dialect</strong><code>%</code> tape header, <code>N</code> block numbers, <code>T</code> + <code>M06</code>, absolute <code>I</code> / <code>J</code> / <code>K</code> arc
centres with the modal pole carried forward, the ISO label family (<code>G98 L&lt;n&gt;</code> definitions and the
head-anchored <code>L&lt;n&gt;,&lt;m&gt;</code> call mapping the comma count onto <code>REP</code>), <code>G247 Q339</code> stamping the same
datum preset as <code>CYCL DEF 247</code>, <code>G54</code> with axis words read as a datum-shift declaration, and
<code>G70</code> / <code>G71</code>.</li>
</ul>
<h2 id="fanuc-and-iso-common">Fanuc and ISO common</h2>
<ul>
<li><strong>Polar coordinate interpolation</strong><code>G12.1</code> / <code>G13.1</code> on the SoftNc pipeline. Before this a polar
section parsed silently wrong: the <code>X</code> word (a diameter) and the <code>C</code> word (a hypothetical Cartesian
axis in mm) were consumed as ordinary XYZ and rotary degrees.
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.ProgramRxczSyntax.html">ProgramRxczSyntax</a> halves <code>X</code> from diameter, resolves G90/G91, writes
the polar and derived Cartesian positions and the machine C angle, and classifies motion into polar
linear and polar arc — the latter emitting <a class="xref" href="../../api/Hi.Numerical.Acts.ActMcPolarSpiralContour.html">ActMcPolarSpiralContour</a>, which
keeps spiral geometry in central polar coordinates and stays continuous across ±180°. <code>G41</code> / <code>G42</code>
compensation is resolved on the hypothetical plane, a C-axis speed clamp applies, and YA / ZB axis
pairs are supported. <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.PolarGCodeCheckSyntax.html">PolarGCodeCheckSyntax</a> scans for incompatible G
codes before the mode syntaxes consume them.</li>
<li><strong>Custom Macro B</strong><code>#var</code> assignment with range-routed stores (<code>#1</code><code>#33</code> local per macro frame,
<code>#100</code><code>#499</code> volatile cleared on M02/M30, <code>#500</code><code>#999</code> retained and persisted in the project,
<code>#3000</code><code>#3999</code> system-control), boolean and logical operators, <code>IF[..]GOTO n</code>, <code>IF[..]THEN &lt;stmt&gt;</code>,
<code>WHILE[..]DO m / END m</code> with a bounded-loop watchdog, and position and tool-offset system variables.
<code>M98 P_ L_</code>, <code>M198</code> external call, <code>M99</code> return and <code>M99 P{seq}</code> early return; <code>G65</code> one-shot macro
call with AZ → <code>#1</code><code>#26</code> argument binding, and <code>G66</code> / <code>G67</code> modal macro.</li>
</ul>
<h2 id="cross-brand">Cross-brand</h2>
<ul>
<li><strong>A shared <code>DwellSyntax</code></strong> consumes <code>G4</code> and <code>G04</code> with the dialect held on the instance:
Fanuc-family <code>X</code> / <code>U</code> seconds, <code>P</code> milliseconds, <code>S</code> spindle revolutions; the Siemens instance reads
<code>F</code> seconds and <code>S</code> revolutions. Capturing the <code>G04</code> spelling fixes a real defect — the un-captured
spelling fell through to the flag and axis syntaxes, where a Fanuc <code>G04 X0.5</code> dwell time became a
ghost X motion word.</li>
<li><strong>Machine-declared M-codes</strong><a class="xref" href="../../api/Hi.NcParsers.Dependencys.IMCodeDeclarationConfig.html">IMCodeDeclarationConfig</a> and
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.MCodeEffects.html">MCodeEffects</a> let a machine state what its own OEM codes do (composite
spindle+coolant codes, a tool-change trigger, turret <code>T</code>-word semantics), and
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.MCodeExpansionSyntax.html">MCodeExpansionSyntax</a> expands a declared code into the canonical ISO
flags the shared consumers already understand.</li>
<li><strong>Custom spindle M-codes</strong> drive the spindle direction through a machine-level
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.ISpindleControlConfig.html">ISpindleControlConfig</a>; ISO <code>M03</code> / <code>M04</code> / <code>M05</code> remain the built-in
fallback. An <code>S</code> greater than zero with no direction ever issued assumes clockwise and emits
<code>SpindleDirection--AssumedCw</code>, so the physics gate no longer silently produces zero mechanics for a
whole file.</li>
<li><strong>Tool changes synthesize their axis travel.</strong>
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.ToolChangeMotionSyntax.html">ToolChangeMotionSyntax</a> overlays the per-axis tooling position from
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.IToolingMcConfig.html">IToolingMcConfig</a> onto the current pose (a NaN or missing axis stays
put) and stamps a one-item rapid compound motion, and
<a class="xref" href="../../api/Hi.NcParsers.Semantics.ToolChangeSemantic.html">ToolChangeSemantic</a> moves behind
<a class="xref" href="../../api/Hi.NcParsers.Semantics.CompoundMotionSemantic.html">CompoundMotionSemantic</a> so the tooling step lands at the tooling point.
Programs that retract on their own overlay to a zero-length move and emit nothing extra.</li>
<li><strong>Per-brand pivot gates.</strong> <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.html">PivotTransformationSyntax</a> reverts to the
ISO/Fanuc vocabulary (G43.4 plus the G68.x family),
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensPivotTransformationSyntax.html">SiemensPivotTransformationSyntax</a> gates TRAORI / CYCLE800, and
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Heidenhain.HeidenhainPivotTransformationSyntax.html">HeidenhainPivotTransformationSyntax</a> gates the M128 /
PLANE vocabulary. All three compose the identical entry through the shared
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.PivotTransformUtil.html">PivotTransformUtil</a>. <strong>Exactly one brand gate belongs in a pipeline
list — never register two.</strong></li>
<li><strong>Controller presets are writable and shipped.</strong> A controller resource file is one serialized
<a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> — the whole pipeline that decides how a brand's NC code is
interpreted. <a class="xref" href="../../api/Hi.NcParsers.ControllerPresetWriter.html">ControllerPresetWriter</a> serializes the built-in brand presets
(<code>CreateBrandPreset</code>, <code>WriteBrandPresetFile</code>, <a class="xref" href="../../api/Hi.NcParsers.ControllerPresetWriter.html#Hi_NcParsers_ControllerPresetWriter_WriteAllBrandPresetFiles_">WriteAllBrandPresetFiles</a>)
under <code>Resource/Controller/</code> with the <code>.Controller</code> extension, and HiNc-Resource ships all five so the
load browser starts populated. The static brand properties remain the source of truth; the files are
regenerable snapshots. Writing needs no <code>XFactory</code> registration — reading one back does, because the
loader drops unregistered pipeline entries silently rather than failing the load.</li>
<li><strong>Saved pipelines back-fill their system-wired dependencies on load.</strong> A project saved before a
system-wired dependency existed never self-healed by round-tripping, because re-saving stamped a
fresh API version on the same incomplete list. The <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> XML constructor
now appends the missing ones after the legacy version patches. A runner rehydrated from an older
file still keeps the <em>syntax</em> list it was saved with, though — take the regenerated preset, or a
fresh <a class="xref" href="../../api/Hi.NcParsers.NcRunnerSuit.html">NcRunnerSuit</a> built from it, rather than expecting an old file to grow new
syntaxes.</li>
<li><strong>Machine-coordinate and tilted-plane failures report.</strong> G53 and G53.1 record their source G-code
on the parsed block and emit <code>Coord-MachCoord--005</code> / <code>--006</code> / <code>--007</code> on paths that used to fail
silently. A G68.2 tilted plane the machine cannot reach emits <code>Coord-Tilt--001</code> / <code>--002</code>, with a
tool-axis-only IK retry that avoids a spurious warning on a machine with fewer than three rotary
axes.</li>
<li><strong>Session-global sentence indexing.</strong> <code>SyntaxPiece.SentenceIndex</code> used to be assigned by two
independent sequences, so indices collided as soon as a call was inlined mid-stream. The new
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.SystemWired.SentenceIndexCounterDependency.html">SentenceIndexCounterDependency</a> supplies every index at
one chokepoint, so values are session-globally unique and strictly increasing in execution order,
including nested and repeated calls.</li>
<li><strong>Inline plays can loop and jump, and playing a file no longer holds it open.</strong> Inline NC-code plays
stamp their pieces with the command title as a pseudo-path, and every control-flow re-segmentation
re-read the host file by that path — the existence check always failed, so loops fell through
without looping. <code>RunNc</code> now registers the raw lines on
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.SystemWired.NcLineSourceDependency.html">NcLineSourceDependency</a> and
<a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.LabelScanUtil.html">LabelScanUtil</a> reads memory first, disk second.</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>
@@ -0,0 +1,422 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Breaking changes | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Breaking changes | 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="Release-Upgrading-BreakingChanges">
<h1 id="breaking-changes">Breaking changes</h1>
<p>In the order they will bite an upgrading host.</p>
<h2 id="1-registration-before-anything-else">1. Registration, before anything else</h2>
<p><code>XFactory.Generators</code> changes from a plain <code>Dictionary</code> to a <code>ConcurrentDictionary</code>, so parallel
<code>Reg()</code> calls no longer corrupt the registration map. The property is public, so a caller that
declares its type explicitly stops compiling.</p>
<p>Carried over from 3.1.172 and still the first thing an upgrading host hits:
<a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Reg_">Reg</a> must be called once at startup, <strong>before any
project XML is deserialized</strong>. Registration no longer happens by accident when a type is first
touched. See <a class="xref" href="../../technique/api-foundations/xml-io.html">XML IO</a>.</p>
<h2 id="2-the-message-channel">2. The message channel</h2>
<p>Message reporting is rebuilt on a unified model. Every notification carries a
<a class="xref" href="../../api/Hi.Common.Messages.Severity.html">Severity</a>, a <a class="xref" href="../../api/Hi.Common.Messages.Category.html">Category</a> and a filterable id
(<a class="xref" href="../../api/Hi.Common.Messages.SimpleMessage.html">SimpleMessage</a>), and arrives on one of three <strong>typed sinks</strong>:
<a class="xref" href="../../api/Hi.MachiningProcs.ShellProgress.html">ShellProgress</a> for session-lifecycle messages,
<a class="xref" href="../../api/Hi.MachiningProcs.StepDiagnosticProgress.html">StepDiagnosticProgress</a> for step-anchored diagnostics, and
<a class="xref" href="../../api/Hi.NcParsers.NcDiagnosticProgress.html">NcDiagnosticProgress</a> for NC-parsing diagnostics.</p>
<p><code>MixedProgress0</code>, <code>MultiTagMessage</code> and <code>MultiTagMessageUtil</code> are removed. Every message parameter
across the API — the <a class="xref" href="../../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> deserialization chain included — is retyped
from <code>IProgress&lt;object&gt;</code> to <code>IProgress&lt;IMessage&gt;</code>. <code>Category.General</code> is deleted,
<a class="xref" href="../../api/Hi.Common.Messages.MessageUtil.html">MessageUtil</a> becomes id-first <code>{Category}{Severity}</code>, and
<code>NcDiagnostic.Text</code> renames to <a class="xref" href="../../api/Hi.NcParsers.NcDiagnostic.html#Hi_NcParsers_NcDiagnostic_Notification">Notification</a>. See
<a class="xref" href="../../technique/api-foundations/message-management.html">Message Management</a>.</p>
<h2 id="3-the-session-surface">3. The session surface</h2>
<p><code>LocalProjectService.SessionShell</code> is created by <code>BeginSession()</code> and nulled at <code>EndSession()</code> — it
is <strong>null outside a session</strong> and no longer lazily created. <a class="xref" href="../../api/Hi.MachiningProcs.ShellProgress.html">ShellProgress</a>
is recreated per session, so hold no long-lived reference to either: subscribe once through
<a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_OnShellMessageAdded">OnShellMessageAdded</a> /
<a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_OnShellMessageCleared">OnShellMessageCleared</a>, or buffer one call's messages
with <a class="xref" href="../../api/Hi.Common.Messages.MessageCollector.html">MessageCollector</a>.</p>
<p><a class="xref" href="../../api/Hi.MachiningProcs.MachiningSession.html">MachiningSession</a> takes an injected <a class="xref" href="../../api/Hi.MachiningSteps.IMachiningService.html">IMachiningService</a>
host in its constructor, and <code>IMachiningService</code> replaces <code>PlayerCancellationToken</code> / <code>PausePlayer</code>
with a single <a class="xref" href="../../api/Hi.Common.PacePlayer.html">PacePlayer</a> property.</p>
<h2 id="4-the-play-verbs">4. The play verbs</h2>
<p><code>Nc</code> becomes the umbrella term for any playable control program, and <code>BrandNc</code> names the
famous-brand controller-code group as a sibling of <code>Cl</code> and <code>Csv</code>.</p>
<table>
<thead>
<tr>
<th>Was</th>
<th>Is now</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>PlayNcFile(file)</code> — brand G-code only</td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayNcFile_">PlayNcFile</a><code>(file, NcKind kind = NcKind.Auto)</code></td>
</tr>
<tr>
<td><code>RunNcFile(file)</code></td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RunNcFile_">RunNcFile</a><code>(file, NcKind kind = NcKind.Auto)</code></td>
</tr>
<tr>
<td>the narrow brand-only file verbs</td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayBrandNcFile_">PlayBrandNcFile</a> / <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RunBrandNcFile_">RunBrandNcFile</a></td>
</tr>
<tr>
<td><code>IControlRunner</code></td>
<td><code>Hi.Numerical.INcRunner</code></td>
</tr>
<tr>
<td><code>RunControlLines</code></td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.MachiningSession.html#Hi_MachiningProcs_MachiningSession_RunNcLines_">RunNcLines</a></td>
</tr>
<tr>
<td><code>ControlKind</code></td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.NcKind.html">NcKind</a></td>
</tr>
<tr>
<td><code>IsRunningControlLines</code> / <code>BeginControlRunner</code></td>
<td><code>IsRunningNcLines</code> / <code>BeginNcRunner</code></td>
</tr>
<tr>
<td>the interim <code>PlayControlFile</code> / <code>RunControlFile</code> mirrors</td>
<td>removed</td>
</tr>
</tbody>
</table>
<p>The same rename applies on <code>LocalProjectService</code>, <code>SessionShellController</code> and <code>MachiningSession</code>.
Only <code>.cl</code> / <code>.cls</code> / <code>.clsf</code> / <code>.csv</code> arguments change meaning —
<a class="xref" href="../../api/Hi.MachiningProcs.NcKindUtil.html#Hi_MachiningProcs_NcKindUtil_DetectByPath_">DetectByPath</a> treats those as closed extension sets and
everything else falls back to brand G-code, so an exotic brand extension can never be misrouted.</p>
<h2 id="5-renames-with-no-shim">5. Renames with no shim</h2>
<table>
<thead>
<tr>
<th>Was</th>
<th>Is now</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>WorkpieceService.GetRuntimeGeom</code> / <code>ReadRuntimeGeom</code> / <code>WriteRuntimeGeom</code> / <code>SetRuntimeGeom</code> / <code>ResetRuntimeGeom</code> / <code>IsRuntimeGeomInit</code> / <code>ScanRuntimeGeomInfDefect</code></td>
<td><a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceService.html#Hi_NcMech_Workpieces_WorkpieceService_GetOrBuildMeshedGeom_">GetOrBuildMeshedGeom</a> / <a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceService.html#Hi_NcMech_Workpieces_WorkpieceService_ReadMeshedGeom_">ReadMeshedGeom</a> / <a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceService.html#Hi_NcMech_Workpieces_WorkpieceService_WriteMeshedGeom_">WriteMeshedGeom</a> / <a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceService.html#Hi_NcMech_Workpieces_WorkpieceService_SetMeshedGeom_">SetMeshedGeom</a> / <a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceService.html#Hi_NcMech_Workpieces_WorkpieceService_ResetMeshedGeom_">ResetMeshedGeom</a> / <a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceService.html#Hi_NcMech_Workpieces_WorkpieceService_IsMeshedGeomInit">IsMeshedGeomInit</a> / <a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceService.html#Hi_NcMech_Workpieces_WorkpieceService_ScanMeshedGeomInfDefect_">ScanMeshedGeomInfDefect</a></td>
</tr>
<tr>
<td><code>MachiningEquipmentCollisionIndex.WorkpieceRuntimeGeomGetter</code></td>
<td><a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipmentCollisionIndex.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipmentCollisionIndex_WorkpieceMeshedGeomGetter">WorkpieceMeshedGeomGetter</a></td>
</tr>
<tr>
<td><code>IContourTray</code> / <code>UniformContourTray</code> / <code>FreeContourTray</code></td>
<td><a class="xref" href="../../api/Hi.Milling.FluteContours.IFluting.html">IFluting</a> / <a class="xref" href="../../api/Hi.Milling.FluteContours.UniformFluting.html">UniformFluting</a> / <a class="xref" href="../../api/Hi.Milling.FluteContours.FreeFluting.html">FreeFluting</a></td>
</tr>
<tr>
<td><code>MillingCutter.FluteContourTray</code></td>
<td><a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_Fluting">Fluting</a></td>
</tr>
<tr>
<td><code>Hi.Common.ResourceUtil</code> (the HiNc one)</td>
<td><a class="xref" href="../../api/Hi.Common.ResourceLayout.html">ResourceLayout</a></td>
</tr>
<tr>
<td><code>NativeTopoStld</code> / <code>NativeTopoStlfr</code> / <code>NativeCarveTopoStl3wfr</code></td>
<td><a class="xref" href="../../api/Hi.Geom.Topo.NativeTopoStl3d.html">NativeTopoStl3d</a> / <a class="xref" href="../../api/Hi.Geom.Topo.NativeTopoStl3wfr.html">NativeTopoStl3wfr</a> / <a class="xref" href="../../api/Hi.Geom.Topo.CarveStl.html">CarveStl</a></td>
</tr>
<tr>
<td><code>Solid.NativeSmoothTopoStl</code> / <code>Sweptable.NativeTopoStl</code></td>
<td><a class="xref" href="../../api/Hi.NcMech.Solids.Solid.html#Hi_NcMech_Solids_Solid_SmoothTopoStl3d">SmoothTopoStl3d</a> / <a class="xref" href="../../api/Hi.Machining.Sweptable.html#Hi_Machining_Sweptable_NativeTopoStl3d">NativeTopoStl3d</a></td>
</tr>
<tr>
<td><code>ITimeGetter</code> and its <code>Time</code> member</td>
<td><code>Hi.Physics.ITimecoded</code> and <code>Timecode</code></td>
</tr>
<tr>
<td><code>ClStrip.DrawingRefreshing</code></td>
<td><code>ClStrip.DrawingRefreshed</code></td>
</tr>
<tr>
<td><code>CbtrPickable.CleanLinked*</code></td>
<td><code>CbtrPickable.CleanAttached*</code></td>
</tr>
<tr>
<td><code>SoftNcRunner.NcDependencyList</code></td>
<td><a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_PipelineNcDependencyList">PipelineNcDependencyList</a></td>
</tr>
<tr>
<td><code>StateActRunner.Feedrate_mmds</code> / <code>Feedrate_mmdmin</code>, <code>ActFeedrate.Feedrate_mmds</code> / <code>Feedrate_mmdmin</code> (and <code>ActRapid</code>), <code>MachineMotionStep.Feedrate_mmds</code>, the <code>MachineMotionStep</code> constructor's <code>feedrate_mmds</code> parameter</td>
<td><a class="xref" href="../../api/Hi.Numerical.Acts.StateActRunner.html#Hi_Numerical_Acts_StateActRunner_CommandedClFeedrate_mmds">CommandedClFeedrate_mmds</a> / <a class="xref" href="../../api/Hi.Numerical.Acts.StateActRunner.html#Hi_Numerical_Acts_StateActRunner_CommandedClFeedrate_mmdmin">CommandedClFeedrate_mmdmin</a>, <a class="xref" href="../../api/Hi.Numerical.Acts.ActFeedrate.html#Hi_Numerical_Acts_ActFeedrate_CommandedClFeedrate_mmds">CommandedClFeedrate_mmds</a> / <a class="xref" href="../../api/Hi.Numerical.Acts.ActFeedrate.html#Hi_Numerical_Acts_ActFeedrate_CommandedClFeedrate_mmdmin">CommandedClFeedrate_mmdmin</a>, <a class="xref" href="../../api/Hi.MachiningSteps.MachineMotionStep.html#Hi_MachiningSteps_MachineMotionStep_CommandedClFeedrate_mmds">CommandedClFeedrate_mmds</a>, <code>commandedClFeedrate_mmds</code></td>
</tr>
</tbody>
</table>
<p>Four notes on that table.</p>
<p>The <code>SessionShell</code> <strong>script</strong> names for meshed geometry keep hidden <code>[Obsolete]</code> aliases so existing
player scripts still run; the service-level members do not. <code>WorkpieceService.ResetRuntimeGeom</code> also
drops its <code>ClStrip</code> parameter.</p>
<p><code>ClStrip.DrawingRefreshed</code> was renamed because both invocations always fired <em>after</em> the work — the
<code>-ing</code> name told subscribers the opposite of when they are called. A subscriber that misses the
rename silently detaches.</p>
<p>Project and cutter files written before the fluting rename keep loading: each <code>Reg()</code> registers the
<code>ContourTray</code>-era XName beside the older aliases, and the cutter element reader tries <code>Fluting</code>, then
<code>FluteContourTray</code>, then <code>FluteContourTrackTray</code>. A cutter that nevertheless fails to resolve its
fluting machines as a plain bounding shape rather than failing loudly, so verify the load rather than
assuming it.</p>
<p>The feedrate members were renamed because the value is the controller's <strong>commanded feedrate of
the CL point</strong> &ndash; the F word after G94/G95/G93 conversion, or for a rapid the CL path over the act
duration &ndash; and not the equipped tool's tip feedrate; under RTCP with a tool-length offset that does
not describe the equipped tool the two differ. The step now also carries
<a class="xref" href="../../api/Hi.MachiningSteps.MachineMotionStep.html#Hi_MachiningSteps_MachineMotionStep_ActualTipFeedrate_mmds">ActualTipFeedrate_mmds</a> (client key
<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ActualTipFeedrate_mmdmin">ActualTipFeedrate_mmdmin</a>), which the physics reads. The client key
<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_Feedrate_mmdmin">Feedrate_mmdmin</a> keeps its historical name.</p>
<p><code>SoftNcRunner.PipelineNcDependencyList</code> is the raw list; machine-config consumers read the resolved
view through <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_GetEffectiveNcDependencyList_">GetEffectiveNcDependencyList</a>. Legacy
<code>&lt;NcDependencyList&gt;</code> XML still loads and migrates.</p>
<h2 id="6-removals">6. Removals</h2>
<ul>
<li><strong>CSV</strong><code>CsvRunner0</code>, <code>LocalProjectService.EnableSoftCsvRunner</code>, and the earlier <code>RawCsvRunner</code>
and <code>CsvRowSemantic</code>. CSV playback has one path, <a class="xref" href="../../api/Hi.Numerical.CsvParsers.GeneralCsvRunner.html">GeneralCsvRunner</a>,
and <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_CsvRunner">CsvRunner</a> returns the CSV suit's
<a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> directly.</li>
<li><strong>Carriers</strong><code>IndexedSentence</code> (wrap a bare <code>Sentence</code> in your own
<a class="xref" href="../../api/Hi.NcParsers.ISentenceCarrier.html">ISentenceCarrier</a> if you passed one as a <code>sourceCommand</code>),
<code>SimpleSessionCommand</code>, HiCbtr's <code>[Obsolete] LsStl</code>. The packed <code>MixedIndex</code> file-line key is
replaced by typed <a class="xref" href="../../api/Hi.Common.FileLines.FileLineIndex.html">FileLineIndex</a> comparison, so file and line positions
compare by type rather than through a packed integer.</li>
<li><strong>GUI-layer composition</strong><code>MachiningProjectDisplayee</code>, <code>IsoCoordinateEntryDisplayee</code>,
<code>HeidenhainCoordinateEntryDisplayee</code>, <code>UserConfig</code>, <code>UserService</code>, <code>PlayerDivConfig</code>. Construct
<a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> with the <code>ILogger</code>-only constructor and copy the
displayees from any app project — <code>Hi.Sample.Wpf/Disp/</code> ships them. They compose only public API
(<a class="xref" href="../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> over <code>LocalProjectService</code>), so tailoring them is the point.</li>
<li><strong>Managed physics kernel types</strong> — the class <code>FluteZData</code>, <code>MillingForceUtil.RuntimePack</code> /
<code>LayerPack</code> / <code>AnglePack</code>, the <code>LayerMillingEngagement</code> constructor that built an engagement from a
z-to-dz list (the default and <code>BinaryReader</code> constructors stay), and
<code>MillingPhysicsBrief.YieldStressMinHeight_mm</code>.</li>
<li><strong>Culture declaration</strong><code>CultureUtil.SupportedCultureNames</code> and
<code>CultureUtil.SetCurrentCulture(string)</code>, deleted outright with no <code>[Obsolete]</code> shim. What remains is
<a class="xref" href="../../api/Hi.Common.CultureUtil.html#Hi_Common_CultureUtil_English">English</a> and <a class="xref" href="../../api/Hi.Common.CultureUtil.html#Hi_Common_CultureUtil_SetCurrentCultureEn_">SetCurrentCultureEn</a>. A host
that enumerated supported cultures must enumerate its own manual or resource folders instead.</li>
<li><strong>Dead P/Invoke declarations</strong> — eight <code>gl*</code> methods on HiDisp's public <code>GL</code> class (<code>glFenceSync</code>,
<code>glGetDoublev</code>, <code>glGetDoublei_v</code>, <code>glGetDoubleIndexedvEXT</code>, <code>glIglooInterfaceSGIX</code>,
<code>glPNTrianglesfATI</code>, <code>glPNTrianglesiATI</code>, and the already-commented <code>glDebugMessageCallbackAMD</code>).
They had no backing export and threw <code>EntryPointNotFoundException</code> when called.</li>
<li><strong><code>NcFileListCommand</code></strong> — a list of NC files is just a List of Program File commands, so
the dedicated type is gone. Loading a project that contains one converts it in place: each <code>&lt;File&gt;</code>
entry becomes a single-file <a class="xref" href="../../api/Hi.SessionCommands.NcFileCommand.html">NcFileCommand</a> (kind <code>Auto</code>, the same
per-file extension dispatch) inside a <a class="xref" href="../../api/Hi.SessionCommands.ListCommand.html">ListCommand</a>, and re-saving
persists the converted form.</li>
<li><strong>Post-Execution meshed-geometry output</strong><code>PostExecutionCommand</code> loses <code>EnableWriteMeshedGeom</code>
and <code>MeshedGeomFileTemplate</code> (and their pre-rename <code>…RuntimeGeom…</code> spellings) together with the
<code>enable-write-meshed-geom</code> and <code>meshed-geom-file-path</code> routes. A geometry snapshot can be taken at
any time-spot, unlike the run-derived outputs that command manages, so the carriers are now the
placeable <a class="xref" href="../../api/Hi.SessionCommands.RecordMeshedGeomCommand.html">RecordMeshedGeomCommand</a> and
<a class="xref" href="../../api/Hi.SessionCommands.ExportMeshedGeomToStlCommand.html">ExportMeshedGeomToStlCommand</a>. Loading an old project with the pair
enabled emits <code>PostExecution--MeshedGeomOutputRetired</code>, and re-saving drops the elements.</li>
<li><strong>Cutter tessellation resolution</strong> — mesh resolution is runtime data, not authored cutter data, so
the seam that let a live object be &ldquo;the resolution&rdquo; is gone: <code>MillingCutter</code> no longer implements
<code>IPolarResolution2d</code> and loses <code>LinearResolution_mm</code> / <code>AngleResolution_rad</code> /
<code>AngleResolution_deg</code> and <code>UpperBeamPolarResolution2dSource</code>; the <code>Func</code>-based
<code>IPolarResolution2dSourceProperty</code> interface is deleted together with the
<code>PolarResolution2dSource</code> properties on <code>Solid</code>, <code>AptProfile</code> and <code>CustomSpinningProfile</code>. A
<a class="xref" href="../../api/Hi.NcMech.Solids.Solid.html">Solid</a> now holds the immutable resolution it was built with — pass it to
the <code>Solid(IGetStl, PolarResolution2d)</code> constructor — and changing resolution means building a
new solid: play paths go through <a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_SetShaperStlResolution_">SetShaperStlResolution</a>
and <a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_SetStrutStlResolution_">SetStrutStlResolution</a> (the runner calls both for
you, so the strut/upper-beam mesh follows the runtime value during a play too), holders re-mesh
when you assign their <code>PolarResolution2d</code> property, and a fresh cutter's shaper solid is born
with <a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_DefaultShaperStlResolution">DefaultShaperStlResolution</a> while the strut solid is
born on the geometry's own default. Cutter files keep loading
whether or not they carry the old <code>&lt;LinearResolution_mm&gt;</code> / <code>&lt;AngleResolution_deg&gt;</code> elements;
the values in them were only ever the residue of the last play and are ignored, and 3.2 no
longer writes them — a 3.1 install needs a support-line build carrying the guarded cutter
reader (HiMech 3.1.157.2 / HiNc 3.1.175.5, shipped 2026-08-29) to open a 3.2-saved cutter
file.</li>
<li><strong>Parameterless profile meshing</strong><code>IShaperProfile</code> no longer extends <code>IGetStl</code>, and the
<code>GetStl()</code> convenience methods on <code>AptProfile</code>, <code>ConstRatioProfile</code>, <code>FluteDependentRatioProfile</code>
and <code>CustomSpinningProfile</code> are gone. Profile mesh access is resolution-explicit: pass your value
through <code>GenStl(resolution)</code>, or state the profile's own default with <code>GenStl(null)</code>. Geometry
types that serialize as an STL source (<code>Cylindroid</code>, <code>GeomCombination</code>, <code>TransformationGeom</code>,
<code>ExtendedCylinder</code>) keep <code>GetStl()</code> as their <code>IGetStl</code> contract; it is documented as, and
equivalent to, <code>GenStl(null)</code>.</li>
<li><strong>Bounds queries never mesh</strong> — expanding a bounding box is a rough, quick operation (view
fitting), so it no longer triggers STL generation anywhere. <code>TransformationGeom.ExpandToBox3d</code>
transforms the geometry's own box corner-wise — a conservative superset of the transformed
geometry's true bounds — instead of meshing, and <code>GeomCombination</code> now implements
<code>IExpandToBox3d</code> by folding its sources' boxes. A geometry without <code>IExpandToBox3d</code> support
contributes nothing to a bounds query; generate the mesh yourself if you need its true extent.
<code>MillingCutter</code>'s cutter-height bookkeeping likewise reads the profile's ZR contour and the
upper beam's box instead of meshing both on every cache clear.</li>
</ul>
<h2 id="7-signature-and-shape-changes">7. Signature and shape changes</h2>
<ul>
<li><a class="xref" href="../../api/Hi.Machining.MachiningToolHouse.html">MachiningToolHouse</a> derives from <code>Dictionary&lt;int, IMachiningTool&gt;</code>:
<a class="xref" href="../../api/Hi.Machining.MachiningToolHouse.html#Hi_Machining_MachiningToolHouse_SetToolId_">SetToolId</a> takes an <code>int</code> and
<a class="xref" href="../../api/Hi.Machining.MachiningToolHouse.html#Hi_Machining_MachiningToolHouse_CreateStickMillingTool_">CreateStickMillingTool</a> returns
<code>KeyValuePair&lt;int, MillingTool&gt;</code>. Any <code>(int)entry.Key</code> cast stops compiling. Siemens <code>T=&quot;name&quot;</code>
string tool calls are unaffected — they still resolve to an <code>int</code> at the semantic layer.</li>
<li><a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ActualTimecode">ActualTimecode</a> and
<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ActualDateTime">ActualDateTime</a> become get-only views onto the new optional
<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ActualTime">ActualTime</a> (<a class="xref" href="../../api/Hi.MachiningSteps.StepActualTime.html">StepActualTime</a>) — their
setters are gone. <code>AccumulatedTime</code> is superseded by
<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_EndTimecode">EndTimecode</a>, kept as an <code>[Obsolete]</code> alias; step CSVs write
the new header and still read the old.</li>
<li><a class="xref" href="../../api/Hi.SessionCommands.PreSettingCommand.html">PreSettingCommand</a> becomes a legacy bundle. A saved bundle expands on load
into <a class="xref" href="../../api/Hi.SessionCommands.MachiningResolutionCommand.html">MachiningResolutionCommand</a>,
<a class="xref" href="../../api/Hi.SessionCommands.MachiningMotionResolutionCommand.html">MachiningMotionResolutionCommand</a>,
<a class="xref" href="../../api/Hi.SessionCommands.CollisionDetectionCommand.html">CollisionDetectionCommand</a>,
<a class="xref" href="../../api/Hi.SessionCommands.PauseOnFailureCommand.html">PauseOnFailureCommand</a> and <a class="xref" href="../../api/Hi.SessionCommands.PhysicsCommand.html">PhysicsCommand</a> (plus a
Read-mode <code>RecordMeshedGeomCommand</code>), and is never written back. Anything that located the bundle
element in a saved <code>.hincproj</code> must look for the split commands.</li>
<li><code>ToPresentDto</code> wire keys change with the obfuscation fix: geometry DTOs use <code>Type</code> / <code>Min</code> / <code>Max</code> /
<code>PairZrs</code> / <code>Z</code> / <code>R</code> / <code>SourceFile</code> / <code>FileIndex</code> / <code>LineIndex</code> (<code>Vec3d</code> keeps lowercase <code>x</code> / <code>y</code> /
<code>z</code>), transformer DTOs use <code>Trans</code>, <code>Angle_deg</code>, <code>CosTheta</code> / <code>SinTheta</code>, <code>Axis</code>, <code>Pivot</code>, <code>Scale</code>,
<code>Rotation</code>, <code>Translation</code>, <code>Step</code>, <code>Stack</code>, <code>Matrix</code>. A front-end reading those payloads must be
updated in lockstep.</li>
<li><a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_defaultFontFile">defaultFontFile</a> changes value from <code>&quot;Font/WCL06.ttf&quot;</code> to <code>&quot;(embedded)&quot;</code>.
It is a public <code>const</code>, so an assembly compiled against 3.1.175 already carries the old literal and
keeps passing it — <code>Init</code> still accepts it — but a rebuild changes what it passes, and no font file
is extracted to the working directory any more.</li>
</ul>
<h2 id="8-defaults-and-gates-that-changed">8. Defaults and gates that changed</h2>
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_EnableSoftNcRunner">EnableSoftNcRunner</a> defaults to <code>true</code>. The SoftNc
pipeline is the NC engine; <a class="xref" href="../../api/Hi.Numerical.FilePlayers.HardNcRunner.html">HardNcRunner</a> is the opt-out fallback for
the shrinking set of features still bound to it.</li>
<li><a class="xref" href="../../api/Hi.MillingForces.MillingForceUtil.html#Hi_MillingForces_MillingForceUtil_EnableNativeMillingPhysics">EnableNativeMillingPhysics</a> defaults to <code>true</code>, and in a
<strong>shipping build</strong> setting it to <code>false</code> throws <code>InvalidOperationException</code> at the setter — the
managed reference implementation lives only in a non-shipping assembly. Code that flipped it off for
an A/B comparison now fails at configuration time.</li>
<li><a class="xref" href="../../api/Hi.MillingForces.MillingPhysicsBrief.html#Hi_MillingForces_MillingPhysicsBrief_YieldingStressRatio">YieldingStressRatio</a> and
<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_YieldingStressRatio">YieldingStressRatio</a> report <strong><code>NaN</code></strong> instead of <code>0</code> when no
beam section qualifies. A caller treating <code>0</code> as &ldquo;no yielding constraint&rdquo; — as both feed solvers did
— must add a <code>NaN</code> branch or it will pass <code>NaN</code> into downstream queries.</li>
<li><strong>New licence feature <code>NcComposition</code> (id 22).</strong> Registering any non-built-in processing unit into a
<a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> pipeline, or executing an NC-embedded C# script, requires it.
Degradation is silent and functional: external units are skipped for the session with one
<code>Composition--NotLicensed</code> naming them, an external segmenter falls back to <code>SingleLineSegmenter</code>,
and scripts are skipped with <code>Script--NotLicensed</code>. An unlicensed installation therefore produces a
<em>different simulation</em>, not an error. Calling the public API from your own application or session
script needs no extra licence; composing the interpretation pipeline does. See
<a class="xref" href="../../technique/nc-dialects/nc-parsing.html">NC Parsing Engine</a>.</li>
<li>The four <code>SnapshotSyntax</code> entries in the Fanuc preset default to <code>IsEnabled = false</code>, so projects
stop serializing enabled debug snapshots. A project saved by an earlier build keeps what it
serialized until its pipeline list is refreshed from the current preset.</li>
<li><strong>Server side</strong>: HiNcServer pins request localization to <a class="xref" href="../../api/Hi.Common.CultureUtil.html#Hi_Common_CultureUtil_English">English</a>, so an
<code>Accept-Language: zh-Hant</code> request falls back to <code>en</code>. HiNcRcl removes the
<code>HiNC:DisplayEngine:FontFile</code> configuration key, which never had any effect — delete it from
<code>appsettings</code>. <a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_FontFile">FontFile</a> remains for a custom font.</li>
<li><strong>Localization</strong>: HiMech's <code>MachiningStep.zh-Hant</code> / <code>.zh-Hans</code> resx are deleted. Step presentation
strings now come from the HiNc-Resource present catalog (<code>catalog.en.json</code>, <code>catalog.zh-Hant.json</code>,
<code>catalog.zh-Hans.json</code>) that a host overlays; a host that ships neither loses the localized step
labels it used to get for free.</li>
<li><strong>Packaging is x64-only</strong>: HiDisp drops the <code>win-x86</code> runtime identifier and its Sentinel payload,
HiNc-Resource drops the x86 platform.</li>
<li><strong>The shipped machine-tool packages are renamed.</strong> They now carry the <code>.default</code> marker and neutral
names: <code>MachineTool/Table-B1.default</code> and <code>MachineTool/CT-350.default</code>. The table-type package was
renamed outright — its <code>.mt</code>, its <code>.general-mech</code> and its STL headers travel with it — and the
duplicated nested STL set inside the CT-350 package is deleted. A project, script or <code>.mt</code> that
refers to a shipped machine-tool package by its earlier path must be repointed at the name above.</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>
@@ -0,0 +1,166 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Cutter-location (CL) playback and CL-to-NC | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Cutter-location (CL) playback and CL-to-NC | 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="Release-Upgrading-ClPlayback">
<h1 id="cutter-location-cl-playback-and-cl-to-nc">Cutter-location (CL) playback and CL-to-NC</h1>
<ul>
<li><strong>Replay an NX CLSF / APT-source toolpath directly.</strong>
<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayClFile_">PlayClFile</a> reads <code>MSYS</code> / <code>FROM</code> / <code>GOTO</code> / <code>CIRCLE</code> /
<code>RAPID</code> / <code>FEDRAT</code> / <code>SPINDL</code> / <code>COOLNT</code> / <code>TLDATA</code> / <code>LOAD</code>. The parser is the
<a class="xref" href="../../api/Hi.Numerical.ClsfParsers.NxClRunner.html">NxClRunner</a> preset — a <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> composition —
and the project holds a third runner suit <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_ClsfRunnerSuit">ClsfRunnerSuit</a>
beside the NC and CSV suits. A <code>TLDATA</code> record creates the tool geometry when the tool house has no
matching id. Run-ops are first class: <a class="xref" href="../../api/Hi.MachiningSteps.IMachiningService.html#Hi_MachiningSteps_IMachiningService_ClRunner">ClRunner</a>,
<code>MachiningSession.PlayClFile</code> / <code>RunClFile</code>. See
<a class="xref" href="../../technique/scripting/cutter-location-playback.html">Cutter-Location (CL) Playback</a>.</li>
<li><strong>A CL file can now drive a machine-tool chain</strong>, not only a
<a class="xref" href="../../api/HiMachining.Milling.ClMillingDevice.html">ClMillingDevice</a>. When the pipeline's kinematics dependency resolves to a
live solver, <a class="xref" href="../../api/Hi.Numerical.ClsfParsers.ClToMcTransformSyntax.html">ClToMcTransformSyntax</a> inverse-solves every CLSF motion
endpoint at parse time and expresses the result in the same <code>ProgramToMcTransform</code> vocabulary the NC
pipeline uses — a tool-height entry from the active tool, a pivot entry anchored to the workpiece
frame, and the solved rotary axes in raw degrees for the cyclic wrap tail-pass — so <code>McLinear</code> and
the wrap are reused unchanged. Played onto a <code>ClMillingDevice</code> the same file is still pure
cutter-location motion, which is what you want for verifying a CAM toolpath before any post-processor
is involved.</li>
<li><strong>CL moves resample along the true path.</strong> <a class="xref" href="../../api/Hi.Numerical.Acts.ActUtil.html#Hi_Numerical_Acts_ActUtil_GetClSteps_">GetClSteps</a> walks
<code>IClPath.At</code> for each intermediate step rather than linearly interpolating between the path's begin
and end, so a CL arc actually curves and the tool axis rotates <em>along</em> the path instead of through
it. <a class="xref" href="../../api/Hi.CutterLocations.ClPath.ClLinear.html">ClLinear</a> gained two guards on the same path: the near-parallel
begin/end normal case short-circuits instead of falling into a degenerate cross product that yielded
a NaN rotation axis, and the interpolation reads its rotation delta through the lazily-built property
rather than a still-null backing field.</li>
<li><strong>CL tool changes teleport instead of stepping.</strong> A stepping change stamps collision detection and
volume removal at the chain's current pose, and at CL session start that pose is identity — the tool
sitting at program zero inside the workpiece. The CSV pipeline's teleporting semantic is promoted to
the shared <a class="xref" href="../../api/Hi.NcParsers.Semantics.ToolingTeleportSemantic.html">ToolingTeleportSemantic</a> (the old <code>CsvToolingTeleportSemantic</code>
element name is kept as a load-only alias), and the first <code>GOTO</code> after a <code>LOAD</code> / <code>TOOL</code> is forced
into a reposition so a new tool never sweeps a cut from the previous operation's endpoint.</li>
<li><strong>Convert a played CL program into Fanuc NC files.</strong>
<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ConvertClToNcFiles_">ConvertClToNcFiles</a>, its HTTP action, and the
<code>LocalProjectService</code> / <code>MachiningSession</code> entry points walk the session's final syntax-piece layer,
group pieces per source file and write one NC file per source, template-substituting <code>[NcName]</code>
(default <code>Output/[NcName].nc</code>). It requires a prior play on a machine chain — a pure-CL device leaves
no machine-solved sections to serialize — and reports <code>ConvertClToNc--NoPlay</code> otherwise. Stage-one
results are retained in <a class="xref" href="../../api/Hi.MachiningProcs.MachiningSession.html#Hi_MachiningProcs_MachiningSession_NcConversions">NcConversions</a> as the hook for
source↔output cross-navigation. A mission can declare the writeback through
<a class="xref" href="../../api/Hi.SessionCommands.PostExecutionCommand.html#Hi_SessionCommands_PostExecutionCommand_EnableConvertClToNcFiles">EnableConvertClToNcFiles</a> and
<a class="xref" href="../../api/Hi.SessionCommands.PostExecutionCommand.html#Hi_SessionCommands_PostExecutionCommand_ClToNcFileTemplate">ClToNcFileTemplate</a>.</li>
<li><strong>CL→MC hardening.</strong> Tool-offset resolution walked back to the distant <code>LOAD</code> block for every motion
(O(N²) on production-scale files) and is now O(1) through a modal active-tool section; the
documentary program-to-Pn stamp is stamped once per run rather than walked per motion; the
program-zero query no longer deep-clones the whole equipment assembly per motion block; the
warned-tool-id set is run-scoped, so the <code>ClToMc--NoToolOffset</code> warning is no longer suppressed on
every run after the first; and <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Generic.MachineAxisConfig.html">MachineAxisConfig</a> gains a
public <code>Clear()</code> so a machine switch rebuilds the axis table instead of accumulating stale rotary
axes.</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>
@@ -0,0 +1,149 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Geometry, rendering and native stability | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Geometry, rendering and native stability | 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="Release-Upgrading-GeometryRendering">
<h1 id="geometry-rendering-and-native-stability">Geometry, rendering and native stability</h1>
<ul>
<li><strong>Disposing a display or geometry object still in use no longer crashes the process.</strong> A client
disconnect, a meshed-geometry reset or an app shutdown could take the process down with an access
violation. <a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a> and <a class="xref" href="../../api/Hi.Cbtr.CubeTree.html">CubeTree</a> native calls are now gated against
a concurrent dispose, and disposals run serialized on a single background chain —
<a class="xref" href="../../api/Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_IsDisposed">IsDisposed</a> reports the state and
<a class="xref" href="../../api/Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DisposeBackground_">DisposeBackground</a> enqueues a tree, or a collection of its attachments,
onto that chain.</li>
<li><strong>Large geometry no longer freezes the UI.</strong> <a class="xref" href="../../api/Hi.NcMech.Solids.Solid.html">Solid</a> builds its display
topology off-thread and draws a wire bounding box with a &ldquo;Loading&rdquo; mark until it is ready.</li>
<li><strong><a class="xref" href="../../api/Hi.CutterLocations.ClStrips.ClStrip.html">ClStrip</a> raises a <code>Cleared</code> event after <code>Clear</code></strong>, pairing with
the existing <code>PosAdded</code>.</li>
<li><strong>A P/Invoke correctness sweep</strong> reconciled the managed declarations against the real export table.
It fixed a non-existent export (<code>substraction_ExpandToBox3d</code>), two <code>void</code> natives declared as
struct returns (a garbage register read), two <code>ToString</code> marshals that made the CLR free foreign
memory, and a log-callback delegate nothing rooted against GC — native could call a dead thunk long
after the P/Invoke returned. These are the crashes a user reports as &ldquo;it crashes randomly&rdquo;.</li>
<li><strong>Milled step colours no longer go stale at random.</strong> Step colours are baked into the native cube-tree
attachment, but the refresh only flagged the strip while the display cache was freed immediately, so a
frame landing in that window rebuilt the cache from stale colours and nothing cleaned it again. The
service now cleans the cache once more after the re-stamp. A paired fix stops an empty strip display
window swallowing a pending recolor indefinitely.</li>
<li><strong>The dimension bar reads on any background.</strong> It was a single hard-coded near-black stroke left over
from the light-host era, invisible once the front end went dark. It is now drawn as a wider dark halo
under a white main stroke, with the halo pushed back whole depth steps rather than the white pass
nudged forward by half a depth LSB — which intermittently lost the depth test.</li>
<li><strong>New geometry API.</strong> <a class="xref" href="../../api/Hi.Geom.Topo.CarveStl.html">CarveStl</a> is the managed face of the native exact
triangle-CSG container. <a class="xref" href="../../api/Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_Add_">Add</a> is the boolean-union counterpart of <code>Substract</code>,
returning <a class="xref" href="../../api/Hi.Cbtr.UnmanagedAddition.html">UnmanagedAddition</a>, and <a class="xref" href="../../api/Hi.Machining.SweptableUtil.html#Hi_Machining_SweptableUtil_AddBySweepingVolume_">AddBySweepingVolume</a>
mirrors <code>RemoveBySweepingVolume</code> — the geometry-layer symmetric point for additive processes. There is
no deposition step in the machining runner yet, so this is a geometry-level API only.</li>
<li><strong><a class="xref" href="../../api/Hi.Milling.FluteContours.FreeformBottomContour.html">FreeformBottomContour</a></strong> is the user-editable point-list bottom
contour, mirroring the side contour with the key axis switched to radius.</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>
@@ -0,0 +1,145 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Upgrading from 3.1.175 to 3.2 | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Upgrading from 3.1.175 to 3.2 | 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="Release-Upgrading-To-3.2">
<h1 id="upgrading-from-31175-to-32">Upgrading from 3.1.175 to 3.2</h1>
<p>These pages are the long form of the <a href="../index.html">3.2 release-note entry</a>. They exist because 3.2 is not
an increment on the last release most callers hold — it is the accumulation of everything that
landed after the 3.1.175 package set, delivered in one step.</p>
<p>Read them in order the first time. The two sections that decide whether an upgrade is a recompile or
an afternoon are <a href="breaking-changes.html">Breaking changes</a> and
<a href="results-that-change-on-upgrade.html">Results that change on upgrade</a>; everything after them is new
capability you can adopt when you need it.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p>Read the <strong>Adoption status</strong> note on the <a href="../index.html">release-note page</a> before planning around this.
The short version: 3.2 is published for review, verification is still in progress across most
areas, and <strong>NC optimization is not finished on this line</strong> — work that depends on it should stay
on 3.1, serviced as <code>3.1.175.&lt;patch&gt;</code>.</p>
</div>
<h2 id="pages">Pages</h2>
<p>Ordered the way to read them: what the package numbers mean, then the two sections that decide whether the upgrade is a recompile or an afternoon, then the new capability, adopted when needed.</p>
<ul>
<li><a href="the-package-line.html">The package line</a> — Why a 3.2 build number starts low, which ten packages moved together, and what that means for a mixed reference set</li>
<li><a href="breaking-changes.html">Breaking changes</a> — The eight groups that stop a build, in the order they bite — registration, messages, the session surface, the play verbs, renames with no shim, removals, signature changes, changed defaults</li>
<li><a href="results-that-change-on-upgrade.html">Results that change on upgrade</a> — What a simulation produces differently afterwards — usually because 3.1.175 was wrong — and why a byte-for-byte comparison will differ</li>
<li><a href="brand-nc-language-coverage.html">Brand NC language coverage</a> — Where most of the release went: Siemens, Heidenhain, Fanuc and ISO common, and the cross-brand work behind them</li>
<li><a href="nc-optimization-and-writeback.html">NC optimization and writeback</a> — The optimization leg as it stands on this line — published for review, not for production</li>
<li><a href="milling-physics-and-training.html">Milling physics, training and measured data</a> — Physics in the native kernel, and what changed in training and in the handling of measured signals</li>
<li><a href="cl-playback.html">Cutter-location (CL) playback and CL-to-NC</a> — Replaying an NX CLSF / APT-source toolpath directly, and writing one out as NC</li>
<li><a href="session-project-and-commands.html">Session, project and command model</a> — Runner suits, the three the project holds, and the command model a script and the app share</li>
<li><a href="geometry-rendering-and-stability.html">Geometry, rendering and native stability</a> — Disposal crashes that no longer take the process down, and the geometry and rendering changes behind them</li>
<li><a href="performance-and-footprint.html">Performance and footprint</a> — Every figure with its conditions stated, including the places the release spent time on purpose to buy correctness</li>
<li><a href="packaging-and-hosting.html">Packaging, resources and hosting</a> — The <code>.default</code> ownership marker, resource seeding, and what a host has to change</li>
<li><a href="new-diagnostics.html">New diagnostics you may now see</a> — The searchable ids for failure modes that used to be silent</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>
@@ -0,0 +1,214 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Milling physics, training and measured data | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Milling physics, training and measured data | 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="Release-Upgrading-MillingPhysics">
<h1 id="milling-physics-training-and-measured-data">Milling physics, training and measured data</h1>
<ul>
<li><strong>Physics runs in the native kernel.</strong> The per-step milling physics migrated into <code>core.dll</code> in
stages: the engagement is scan-converted natively at the substraction completion point, the force
kernel is reached through the same handle with no managed marshal, and the sequential
cutting-temperature and wear chain runs from a native thermal session held per (tool, cutting
parameter) pack. The switch is
<a class="xref" href="../../api/Hi.MillingForces.MillingForceUtil.html#Hi_MillingForces_MillingForceUtil_EnableNativeMillingPhysics">EnableNativeMillingPhysics</a>, surfaced runtime-only (not
persisted to project XML) as <a class="xref" href="../../api/Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_EnableNativeMillingPhysics">EnableNativeMillingPhysics</a>
and <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableNativeMillingPhysics">EnableNativeMillingPhysics</a>, and it now defaults to <code>true</code>.
Public entry points that used to reach the managed kernel still work: without a session pack they
build an ad-hoc physics pack per live (cutting parameter, tool) pair and run natively.</li>
<li><strong><a class="xref" href="../../api/Hi.Milling.MillingTools.MillingToolPhysicsPack.html">MillingToolPhysicsPack</a></strong> is an immutable record holding one tool's
scalar derivations for one cutting-parameter set — spindle-buckle-to-tip length, observation height,
effective cutting diameter, the bending/Z-deflection pair, the simplified rake angle, the minimum
uncut chip thickness. <a class="xref" href="../../api/Hi.MachiningProcs.MachiningSession.html">MachiningSession</a> owns the packs keyed by tool id
(<a class="xref" href="../../api/Hi.MachiningProcs.MachiningSession.html#Hi_MachiningProcs_MachiningSession_GetToolPhysicsPack_">GetToolPhysicsPack</a>) and invalidation is <strong>explicit</strong> at
the points that know the state changed: every run-op start and the tool-change act, plus
<a class="xref" href="../../api/Hi.MachiningProcs.MachiningSession.html#Hi_MachiningProcs_MachiningSession_InvalidateToolPhysicsPacks_">InvalidateToolPhysicsPacks</a>. The corresponding
<code>MillingTool</code> / <code>MillingCutter</code> members are now deliberately uncached pure computations.</li>
<li><strong>Milling-force waveforms are reproducible again.</strong> The parallel per-step force build read lazily
built scalar caches on the shared tool objects; a thread could pass a cache guard and then read a
value a concurrent writer had stored in between, so two plays of the same NC exported different
forces in the thin-chip window of each tooth pass. The caches were first republished as single
immutable references and then removed in favour of the frozen session pack.</li>
<li><strong>Thermal gating and seeding.</strong> The sequential cutting-temperature and wear build now checks
<a class="xref" href="../../api/Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_EnablePhysics">EnablePhysics</a> (spindle temperature deliberately
keeps running), and the tool-change thermal seeding re-arms whenever the incoming chain state has no
flute temperature list — which covers fault and cancel re-seeds, stop-then-replay residue, and
<code>EnablePhysics</code> being switched on mid-session. The shank temperature list is seeded to the exact node
count the thermal FEM builds, so trailing shank nodes no longer sit at 0 K after a tool change.</li>
<li><strong>Cutter geometry is validated up front.</strong>
<a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_GetUpperBeamGeometryIssues_">GetUpperBeamGeometryIssues</a> collects upper-beam and shank
configuration problems as keyed messages — for example an extended-cylinder beam whose full length
sits below the flute height (<code>Cutter-UpperBeam--BelowFluteHeight</code>), which inverts the shank solid and
makes the shank thermal model unbuildable. They are reported once per tool at <code>BeginSession</code> and at
each tool change, instead of surfacing later as a null-reference cascade inside the thermal physics
with nothing naming the beam.</li>
<li><strong><code>RakeFaceCuttingPara3d</code> no longer throws on a six-field parameter string</strong> (the guard read the
seventh element behind a <code>&gt;= 6</code> check), and the published coefficient index mappings are corrected:
the <code>LocalProfileMillingPara(Vec3d, Vec3d)</code> constructor maps (x,y,z) to (Ksr, Kst, Ksa) /
(Kpr, Kpt, Kpa), and the 2d element index range is 03 with 0=Ksc, 1=Ksn, 2=Kpc, 3=Kpn.</li>
<li><strong>Training diagnostics name their cause.</strong> The per-step warnings split into
<code>Train-StepLuggage--Unreadable</code> (the step luggage row could not be read back) and
<code>Train-StepEngagement--Missing</code> (the row is present but the engagement was never built because
physics was inactive at simulation time). The gather pass counts both against the eligible steps:
silent at zero, one summary warning at or below
<a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html#Hi_MillingForces_Training_MillingTraining_MissingEngagementAbortRatio">MissingEngagementAbortRatio</a> (default 0.25), and a
configuration error above it. A gather pass that produces no samples at all now reports immediately
rather than throwing inside the SVD solve, separating &ldquo;not one step touched the workpiece&rdquo; from
&ldquo;touched steps whose mapped force data yielded no usable shots&rdquo;.</li>
<li><strong>New training knobs.</strong> <a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html#Hi_MillingForces_Training_MillingTraining_EnableDesignMatrixSolver">EnableDesignMatrixSolver</a>
(default false) solves the least squares on a thin QR of the design matrix instead of forming the
normal equations, which square the condition number;
<a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html#Hi_MillingForces_Training_MillingTraining_DesignMatrixSvdRelativeTol">DesignMatrixSvdRelativeTol</a> is its truncation cutoff.
<a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html#Hi_MillingForces_Training_MillingTraining_EnableCwePhasePairing">EnableCwePhasePairing</a> (default false) determines each
step's rotation phase with a cutter-workpiece-engagement block-pairing detector instead of the
self-bootstrapped lead parameter, for one-flute and symmetric two-flute cutters in light radial side
cuts. <a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html#Hi_MillingForces_Training_MillingTraining_ReTrainAnchorOutputScale">ReTrainAnchorOutputScale</a> exposes the virtual
anchor weight.
<a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_LastMillingParaTrainResult">LastMillingParaTrainResult</a> captures the outcome — kind,
sample flags, outlier ratio, success, output file, parameter name and note, correlation R, filtered
sample count, parameter XML, timestamp — so a caller reads it without re-opening the <code>.mp</code> file.</li>
<li><strong>Time mapping is reworked around absolute wall-clock time.</strong>
<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_AddTimeDataByFile_">AddTimeDataByFile</a> accepts <code>DateTime</code> windows, stored as
<a class="xref" href="../../api/Hi.Mappings.IFileTimeSection.html">IFileTimeSection</a> forms, and the project-scoped
<a class="xref" href="../../api/Hi.Mapping.TimeMapping.html#Hi_Mapping_TimeMapping_MappingAnchorDateTime">MappingAnchorDateTime</a> — seeded set-once from the date of the first
controller instant seen — converts controller timestamps onto one run-relative axis.
<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_EndTimecode">EndTimecode</a> replaces <code>AccumulatedTime</code> as the canonical
end-of-step time.</li>
<li><strong>CSV timing survives midnight.</strong> Step durations derive from full date-bearing instants, so a
multi-day recording no longer produces negative durations and a negative chart time axis, and a
non-physical duration from a spliced recording is clamped with a validation warning instead of
stalling physics evaluation.</li>
<li><strong>Wall-clock time is dense.</strong> The trio moved into one optional sub-object,
<a class="xref" href="../../api/Hi.MachiningSteps.StepActualTime.html">StepActualTime</a> (<code>Timecode</code> / <code>Instant</code> / <code>IsInterpolated</code>), reached through
<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ActualTime">ActualTime</a>. On CSV plays every built step is stamped: steps
built from a controller row re-anchor, and the steps between extrapolate along the machine timeline
and are marked interpolated, which makes the actual-time mapper window per-step exact instead of
sparse-anchor scaled. Pure NC plays keep null stamps.</li>
<li><strong>An empty step-shot pairing window is a data gap, not something to interpolate across.</strong> The window
builder used to expand outward to the rows bracketing the gap, silently pairing such steps with force
values that were never measured — a training run over a file whose transients had been carved out
produced a plausible correlation and a full set of coefficients derived entirely from fabricated
rows. Such a window now skips its step and one <code>Map-ShotGap--StepsSkipped</code> warning per mapping call
carries the count; a window-edge row is interpolated only when its bracketing rows span at most two
spindle revolutions.</li>
<li><strong>&ldquo;No cut / No data for step&rdquo; on freshly-simulated steps is fixed.</strong> The bulk step-data readers
cached the <em>absence</em> of rows the writer had not committed yet, so a step that had just been
simulated could report no data until the program was re-run. A covered-but-missing index now drops
the stale segment and re-reads.</li>
<li><strong>New end-of-play warnings</strong>, each once per session: <code>Play-Touch--None</code> (the play finished without any
step touching the workpiece), <code>Tool-FluteCount--Zero</code> (physics is on and a milling cutter resolves to
zero flutes, so feed per tooth is undefined), and <code>Play-Physics--None</code> (physics is on and at least one
step touched the workpiece but no touched step carries a physics brief — naming the three things that
gate it: a tool bound to the spindle, the spindle actually rotating, and the workpiece cutting
parameter). That last state previously surfaced one process later, as a training run gathering zero
samples.</li>
<li><strong>Performance</strong> is collected in its own section below.</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>
@@ -0,0 +1,205 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>NC optimization and writeback | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="NC optimization and writeback | 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="Release-Upgrading-NcOptimization">
<h1 id="nc-optimization-and-writeback">NC optimization and writeback</h1>
<div class="IMPORTANT">
<h5>Important</h5>
<p><strong>NC optimization is not finished on the 3.2 line.</strong> What follows describes the leg as it stands,
and it is published for review, not for production. Work that depends on optimized output should
stay on the 3.1 line, serviced as <code>3.1.175.&lt;patch&gt;</code>.</p>
</div>
<ul>
<li><strong>The optimizer runs on the SoftNc pipeline by default.</strong>
<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptimizeToFiles_">OptimizeToFiles</a> keeps its signature, its script snippet and
its HTTP route, but when <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_EnableSoftNcRunner">EnableSoftNcRunner</a> is on and
the session holds played <a class="xref" href="../../api/Hi.MachiningProcs.NcRunnerSessionState.html#Hi_MachiningProcs_NcRunnerSessionState_SyntaxPieceLayers">SyntaxPieceLayers</a>, it
delegates to the new <a class="xref" href="../../api/Hi.MachiningProcs.MachiningSession.html#Hi_MachiningProcs_MachiningSession_OptimizeNcFiles_">OptimizeNcFiles</a>; otherwise the frozen
HardNc path runs unchanged. The new leg classifies the final
<a class="xref" href="../../api/Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a> layer, solves the per-step feed adjustments from milling
physics, and regenerates text as anchored token edits over the verbatim source block — <strong>lines the
optimizer does not touch round-trip byte-identically</strong> instead of being re-synthesized. Per-file
results are retained in <a class="xref" href="../../api/Hi.MachiningProcs.MachiningSession.html#Hi_MachiningProcs_MachiningSession_NcOptimizations">NcOptimizations</a>.
<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableIndividualStepAdjustmentLog">EnableIndividualStepAdjustmentLog</a> drives both legs.</li>
<li><strong>Depth splition re-interpolates through a planned fragment path</strong>, with separate modal chains for
the pre-build feed and the emission endpoint, per-step machine-to-program-frame inversion, and
per-fragment arc IJK recomputation — including R-to-IJK conversion — wherever the arc block itself
carries the centre. An arc whose centre lives on a preceding modal block is exempt: its fragments
keep the source block's arc words and share that upstream centre line unchanged, so only their
endpoint and <code>F</code> words move. Two cases where the frozen HardNc optimizer is silently wrong are
downgraded to a non-split rewrite rather than reproduced: a <code>G91</code> incremental block (the old
fragment rewrite always emitted absolute coordinates), and a klartext <code>C … DR±</code> arc whose modal
<code>CC</code> chain left one of the two in-plane axes unstated, so the block's own start point supplied
that component — since every fragment would re-derive the centre from its own start. A klartext
<code>C</code> block whose centre lands entirely on its own start point never reaches that guard: its radius
is zero, so play degrades it to a chord under a validation warning of its own.
<strong>Neither the controller brand nor klartext as such refuses a split</strong>: a klartext <code>L</code> block
re-interpolates like an ISO one.</li>
<li><strong>The compensation stage is no longer dead on the SoftNc leg.</strong> The HardNc baseline wrote the
compensation into the step contexts while its output read the piece packs, so it never emitted a
compensated coordinate at all. Each fragment endpoint is now offset — XYZ only, rotary words
untouched — by the tool-tip deflection rotated into the leaf program frame the endpoint lives in, so
a G68.2 tilted setup is compensated in the right direction. It is consumed on re-interpolated
splition fragments only, and <a class="xref" href="../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_CompensationMask">CompensationMask</a> defaults to 0, so with no
mask set the stage is a strict no-op.</li>
<li><strong>Output follows the source's decimal digits.</strong> Both legs used to write coordinates through a fixed
<code>F4</code> and every F word through <code>F2</code>, so a program stated to three decimals could come back with a
fourth — an alarm on controllers strict about their least input increment. Digit counts are now
scanned per word family over the played source texts with comment spans masked, floored at 3/3/0 and
capped at 9, and threaded through the whole write path. The word-suppression tolerances and the F
comparison grid derive from the resolved digits instead of the old fixed literals.</li>
<li><strong>Optimized NC is written back in the source file's encoding.</strong> NC play reads and optimized writes go
through <a class="xref" href="../../api/Hi.Common.FileLines.FileUtil.html#Hi_Common_FileLines_FileUtil_DetectRoundTripEncoding_">DetectRoundTripEncoding</a> — BOM, then strict UTF-8, then
Latin-1 — so an ANSI-family file (GBK, Big5, Shift-JIS) re-encodes to its original bytes instead of
having every undecodable byte replaced. Comments in those encodings survive the round trip.</li>
<li><strong>A feed change no longer mints a one-step carrier fragment.</strong> Under an arc split that fragment is a
degenerate arc whose start and end nearly coincide, which an incremental-IJK reader — or a control
that treats begin == end as a full turn — expands into a full circle. An <code>F</code> re-statement is now
handed to the feed run's next emitted fragment, the one that actually runs at that feed.</li>
<li><strong>A splition fragment at the head of the stream writes only the axis words the source stated</strong>, so it
can no longer invent a <code>Z0.</code> whose value under the source's silence is just the home-fallback modal.</li>
<li><strong>Unparsable NC lines survive.</strong> A line the parser could not read used to be dropped from the runner's
line list, so the optimized file silently lost it. <code>HardNcRunner</code> now rebuilds a parse-failed line as
an opaque no-op — the empty-text parse inherits modal state like a blank line, and the raw text is
restored for writers — and the optimizer mirrors the fallback, so <code>IF</code> blocks, <code>#</code>-variable macros,
<code>G68 R#</code> and <code>GOTO</code> come through verbatim. A <code>BuildNcLines--ParseFailed</code> diagnostic still reports the
line, and the line stays un-simulated. The output writer is also closed in a <code>finally</code>, so an
exception can no longer leave a half-written file locked. First delivered on the 3.1.175.x service
line.</li>
<li><strong>A Siemens <code>CYCLE800</code> swivel counts as a macro line</strong> in the piece classifier, so it is preserved
rather than treated as an optimizable motion block.</li>
<li><strong>The host key <code>HiNC:OptCoreNum</code> governs both legs again.</strong> It used to set only the legacy
<code>NcOptProc.CoreNum</code>; once the SoftNc optimizer became the default path the key silently stopped
governing anything. It now assigns both (0 = derive from the processor count).</li>
<li><strong>NC text writeback</strong> regenerates NC from a program that has already been played, in two stages over
the session's finished syntax pieces: a converter turns the source piece stream into a destination
stream plus a bidirectional source↔destination map keyed by sentence index, and a reverse segmenter
serializes that stream back to lines. The data→text seam is a brand-agnostic sentence composer, first
implemented for Fanuc. A patch-mode writer performs positional token edits — <code>NaN</code> deletes a word
absorbing one separator space, insertion follows conventional order, trailing zeros trim keeping the
dot — and refuses to rewrite variable, bracket and keyword values rather than corrupting them,
reporting <code>Writeback-Patch--VariableValue</code>, <code>--KeywordValue</code>, <code>--CommentOnlyText</code> and
<code>--EditUnmatched</code>. <strong>Five of its choices follow the dialect rather than the convention</strong>: the
variable prefix it recognizes and refuses (<code>Q</code> on klartext, <code>R</code> on Siemens, <code>#</code> elsewhere), the
keyword feed values it refuses (klartext's <code>FMAX</code> and <code>FAUTO</code>), the comment spans it protects
(klartext's <code>;</code> and <code>//</code> as well as the parenthesized span), and two that show in the written
text. On a klartext file an inserted <code>F</code> lands after the rightmost of <code>DR+</code>/<code>DR-</code> and
<code>RL</code>/<code>RR</code>/<code>R0</code> as well as after its conventional predecessor coordinate words, so the patched
block keeps the element order a TNC enforces — coordinates, rotation direction, radius
compensation, <code>F</code>, <code>M</code>. And a trailing comment is wrapped in the file's own grammar, the Fanuc
family's <code>(text)</code> against klartext's <code>;text</code>, so the optimizer's embedded source note leaves a
klartext program valid instead of handing a control a parenthesis it would read as code.</li>
<li><strong>A second diagnostic home.</strong> <a class="xref" href="../../api/Hi.MachiningSteps.IMachiningService.html#Hi_MachiningSteps_IMachiningService_NcManipulationDiagnosticProgress">NcManipulationDiagnosticProgress</a>
is a sibling of the play-time <code>NcDiagnosticProgress</code>, dedicated to NC-rework operations — writeback
conversion and optimization — so a play reset never discards manipulation results and vice versa.</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>
@@ -0,0 +1,227 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>New diagnostics you may now see | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="New diagnostics you may now see | 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="Release-Upgrading-Diagnostics">
<h1 id="new-diagnostics-you-may-now-see">New diagnostics you may now see</h1>
<p>Several failure modes that used to be silent now report. These ids are searchable and filterable —
they are the fastest way to find out what a run actually did.</p>
<table>
<thead>
<tr>
<th>Id</th>
<th>Means</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Play-Touch--None</code></td>
<td>the play finished without any step touching the workpiece</td>
</tr>
<tr>
<td><code>Play-Physics--None</code></td>
<td>physics is on and steps touched, but no touched step carries a physics brief</td>
</tr>
<tr>
<td><code>Tool-FluteCount--Zero</code></td>
<td>physics is on and a milling cutter resolves to zero flutes</td>
</tr>
<tr>
<td><code>SpindleDirection--AssumedCw</code></td>
<td>an S word greater than zero with no direction ever issued</td>
</tr>
<tr>
<td><code>Composition--NotLicensed</code></td>
<td>external pipeline units were skipped for this session</td>
</tr>
<tr>
<td><code>Script--NotLicensed</code></td>
<td>an NC-embedded C# script was skipped</td>
</tr>
<tr>
<td><code>SiemensToolOffset--TcdpRowMissing</code></td>
<td>a Siemens (T, D) pair had no <code>$TC_DP</code> row; the generic tool height was used</td>
</tr>
<tr>
<td><code>Comp-ToolHeight--001</code></td>
<td>a G43.4 H word could not be resolved</td>
</tr>
<tr>
<td><code>Coord-WorkOffset--AdditionalZero</code></td>
<td>a Fanuc-family additional work coordinate system (<code>G54.1 Pn</code>, also written <code>G54 Pn</code>) was selected but no offset has been entered for it; the program runs on the machine origin</td>
</tr>
<tr>
<td><code>Coord-WorkOffset--NoTableEntry</code></td>
<td>a work coordinate word (e.g. a <code>G59.x</code> on a controller carrying no brand-neutral table beside its brand table) that no coordinate table on the controller resolves; a zero offset is used</td>
</tr>
<tr>
<td><code>Coord-WorkOffset--IndexUnresolved</code></td>
<td>the P word of a <code>G54.1</code> / <code>G54 P</code> selection is not a positive integer; the active work coordinate system is kept</td>
</tr>
<tr>
<td><code>Coord-MachCoord--005</code> / <code>--006</code> / <code>--007</code></td>
<td>a G53 or G53.1 machine-coordinate move failed on a path that used to fail silently</td>
</tr>
<tr>
<td><code>Coord-Tilt--001</code> / <code>--002</code></td>
<td>a G68.2 tilted plane the machine cannot reach</td>
</tr>
<tr>
<td><code>BuildNcLines--ParseFailed</code></td>
<td>a line could not be parsed; it survives verbatim but is not simulated</td>
</tr>
<tr>
<td><code>RunNcLines--RunnerMismatch</code></td>
<td>a second runner kind was attempted inside one session</td>
</tr>
<tr>
<td><code>ReadNcRunnerSuit--Refused</code></td>
<td>a suit switch was attempted while a program was playing</td>
</tr>
<tr>
<td><code>PostExecution--MeshedGeomOutputRetired</code></td>
<td>an old project still carries the retired meshed-geom output pair</td>
</tr>
<tr>
<td><code>ConvertClToNc--NoPlay</code></td>
<td>CL-to-NC conversion ran with no prior play on a machine chain</td>
</tr>
<tr>
<td><code>ClToMc--NoToolOffset</code></td>
<td>a CL motion resolved no tool offset</td>
</tr>
<tr>
<td><code>Map-ShotGap--StepsSkipped</code></td>
<td>steps were skipped because their shot pairing window held no measured row</td>
</tr>
<tr>
<td><code>Train-StepEngagement--Missing</code></td>
<td>a step's row is present but its engagement was never built</td>
</tr>
<tr>
<td><code>Train-StepLuggage--Unreadable</code></td>
<td>a step's luggage row could not be read back</td>
</tr>
<tr>
<td><code>Writeback-Patch--*</code></td>
<td>a writeback edit refused a variable, keyword or comment-only value, or matched nothing</td>
</tr>
<tr>
<td><code>HeidenhainPlane--Unsupported</code> / <code>SiemensFrame--Unsupported</code> / <code>HeidenhainCycl--Unsupported</code></td>
<td>the construct is recognized and consumed safely, but not simulated</td>
</tr>
<tr>
<td><code>DeclaredMCode--UnmodeledEffects</code></td>
<td>a machine-declared OEM M-code occurred; no effects are simulated for it</td>
</tr>
</tbody>
</table>
</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>
@@ -0,0 +1,154 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Packaging, resources and hosting | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Packaging, resources and hosting | 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="Release-Upgrading-Packaging">
<h1 id="packaging-resources-and-hosting">Packaging, resources and hosting</h1>
<ul>
<li><strong>Shipped resources carry an ownership marker.</strong> <a class="xref" href="../../api/Hi.Common.ResourceDefaultMarker.html">ResourceDefaultMarker</a> introduces the
<code>.default</code> convention: files carry the marker before the final extension
(<code>AlTiBN.default.CoatingMaterial</code>) and machine-tool packages carry it on the folder
(<code>MachineTool/Table-B1.default/</code>). Marked items are system territory the seeder may refresh or delete;
unmarked items belong to the user and are never touched. <a class="xref" href="../../api/Hi.HiNcKits.ResourceSeeder.html#Hi_HiNcKits_ResourceSeeder_Seed_">Seed</a>
copies the shipped defaults into the admin resource root at startup — anchored on the application base
directory rather than the process working directory, version-stamped so steady-state boots do no work.
A save-as flow must strip the marker so a user file cannot masquerade as a shipped default.</li>
<li><strong>HiNc-Resource ships more presets</strong>: <code>Resource/Controller/&lt;Brand&gt;.default.Controller</code> for all five
brands, and <code>StandardForcedAir</code> / <code>StandardWaterSolubleCoolant</code> / <code>StandardOilBasedCoolant</code> coolant
conditions, so those load browsers start populated instead of empty.</li>
<li><strong><a class="xref" href="../../api/Hi.Physics.CoolantHeatCondition.html">CoolantHeatCondition</a></strong> gains name/note, the three static presets, preset
find/match/apply, and side-file IO following the workpiece-material pattern —
<a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_CoolantHeatConditionFile">CoolantHeatConditionFile</a> externalizes
the condition to a <code>.CoolantHeatCondition</code> file.</li>
<li><strong>Obfuscation-safe DTOs.</strong> Obfuscar renames compiler-generated anonymous types and strips their
constructor parameter names, so <code>System.Text.Json</code> threw on every <code>ToPresentDto</code> serialization in
released assemblies — the geometry, cutter and transformer editors all returned HTTP 500 while Debug
builds were fine. Every implementation now returns <code>Dictionary&lt;string, object&gt;</code> with <code>nameof</code> keys,
which compile to string literals obfuscation cannot touch, and
<a class="xref" href="../../api/Hi.Common.IToPresentDto.html">IToPresentDto</a> documents the rule. See the wire-key list under
<a href="breaking-changes.html#7-signature-and-shape-changes">Signature and shape changes</a>.</li>
<li><strong>The embedded default font is Noto Sans CJK TC</strong> (SIL OFL 1.1) in place of the Big5-only HanWang
WCL06, fed to the native engine from memory instead of writing an 11 MB <code>Font/WCL06.ttf</code> into the
process working directory. Traditional, simplified and kana render from one face with zh-Hant glyph
conventions. Explicit font paths still go through the file route.</li>
<li><strong>Third-party notices</strong> ship with the two packages that actually redistribute third-party bits: HiDisp
(the native files under <code>runtimes/</code> and the embedded font) and HiNc-Resource (the offline
documentation site among its content files). HiLicense gained a real package description.</li>
<li><strong>Dependency updates</strong><code>SQLitePCLRaw.bundle_e_sqlite3</code> is pinned to 3.0.3 (SQLite
CVE-2025-6965), <code>Microsoft.Data.Sqlite</code> to 10.0.9 and <code>Dapper</code> to 2.1.79.</li>
<li><strong>Small public additions</strong><a class="xref" href="../../api/Hi.Common.FileLines.FileUtil.html#Hi_Common_FileLines_FileUtil_DetectRoundTripEncoding_">DetectRoundTripEncoding</a>,
<a class="xref" href="../../api/Hi.Common.JsonUtil.html#Hi_Common_JsonUtil_CompactNanOptions">CompactNanOptions</a> and named float literals in
<a class="xref" href="../../api/Hi.Common.JsonUtil.html#Hi_Common_JsonUtil_GetDouble_">GetDouble</a>, <a class="xref" href="../../api/Hi.Geom.MathUtil.html#Hi_Geom_MathUtil_CycleUpperInclusive_">CycleUpperInclusive</a> (the <code>(l,u]</code>
cyclic window the existing overloads could not express), and
<a class="xref" href="../../api/Hi.Common.Collections.SynList-1.html#Hi_Common_Collections_SynList_1_AddAndGetIndex_">AddAndGetIndex</a>. <a class="xref" href="../../api/Hi.Common.IndexSegment.html">IndexSegment</a> no longer leaves
an open run end when the match sits at either edge of the list.</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>
@@ -0,0 +1,341 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Performance and footprint | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Performance and footprint | 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="Release-Upgrading-Performance">
<h1 id="performance-and-footprint">Performance and footprint</h1>
<p>Every figure below is a measurement with its conditions stated, and where a change cost time to buy
correctness that is said too. Read the ratios rather than the absolute times: several campaigns were
run on Debug builds or on small machines, deliberately, because a paired A/B on one machine answers
&ldquo;did this get faster&rdquo; far more reliably than an unpaired Release number on a fast one.</p>
<h2 id="milling-physics-in-the-native-kernel">Milling physics in the native kernel</h2>
<p>The per-step physics moved into <code>core.dll</code> in stages — engagement scan conversion, the force kernel,
then the sequential temperature and wear chain. Measured as a same-day paired A/B, managed leg
against native leg, on one circular test program:</p>
<table>
<thead>
<tr>
<th>Per touched step</th>
<th>managed</th>
<th>native</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>Engagement build</td>
<td>46.0 ms</td>
<td><strong>5.03 ms</strong></td>
<td>~9×</td>
</tr>
<tr>
<td>Force (<code>GetMillingFoce</code>)</td>
<td>17.1 ms</td>
<td><strong>0.75 ms</strong></td>
<td>~20×</td>
</tr>
<tr>
<td>Temperature and wear chain</td>
<td>3.97 ms</td>
<td><strong>0.24 ms</strong></td>
<td>~16×</td>
</tr>
<tr>
<td><strong>Whole play</strong></td>
<td><strong>59.3 s / 16.1 GB allocated</strong></td>
<td><strong>40.6 s / 3.4 GB allocated</strong></td>
<td>32% wall, 79% allocation</td>
</tr>
</tbody>
</table>
<p>Allocation is where the migration bites hardest: engagement construction alone fell from about
5.2 GB to 29 MB per step.</p>
<blockquote>
<p><strong>Conditions.</strong> Debug x64, <code>EnablePhysics</code> on, collision off, one force worker, a two-core /
four-thread laptop, ±10% thermal-throttle noise, single paired run per leg. Absolute times are not
representative of a customer machine — the ratios are the claim.</p>
</blockquote>
<blockquote>
<p><strong>Numerical parity.</strong> Engagement, force and brief are bit-identical between the two legs <strong>on
Windows</strong>. The Linux build is not bit-identical (different libm), so a cross-platform comparison
should use a tolerance, not equality.</p>
</blockquote>
<h2 id="playing-a-long-program-stays-linear">Playing a long program stays linear</h2>
<p><code>NcOptOption.Equals</code> ended on a null-propagating comparison of a dictionary that is created on
demand and is null on virtually every option, so the whole comparison collapsed to <code>false</code> — an
option compared unequal even to a copy of itself. Both record-on-change guards built on it were
therefore dead: the session appended an option-map entry for <strong>every played act</strong> instead of only at
change points, and the step rewrote unchanged entries. Reading the last recorded option through a
LINQ <code>LastOrDefault</code> over a <code>SortedList&lt;,&gt;</code> — which has no indexed fast path — then walked the whole
map each time, so the two defects together made a long play quadratic.</p>
<blockquote>
<p>Measured on a 2.35-million-line Siemens program: the option map now holds <strong>1 entry instead of one
per line</strong>, and the per-100,000-line rate stays <strong>flat</strong> instead of degrading from 73 s at the
start of the file to about 11 minutes by 1.9 million lines.</p>
</blockquote>
<p>This applies to <strong>every</strong> runner and to sessions doing no optimization at all, because the call site
is the session-level play loop. <code>GetHashCode</code> drops the dictionary in the same change, since it
hashed by reference and would otherwise disagree with <code>Equals</code> — relevant if you use <code>NcOptOption</code>
as a dictionary key.</p>
<h2 id="where-the-time-actually-goes">Where the time actually goes</h2>
<p>Worth knowing before you tune anything. After the migration, on the measured workload the <strong>whole
parallel physics stage is about 3.3% of wall time</strong>, while the <strong>single-worker volume subtraction is
about 77%</strong> — and that subtraction is single-worker as a correctness requirement, not as an
oversight. Raising the force-worker count therefore buys nothing on any machine; the bottleneck
moved rather than disappearing.</p>
<p>What did change in the worker derivation is narrower than it sounds. An unmeasured six-core ceiling
was removed, but it only ever governed the sweep workers, and only machines with <strong>nine or more
logical processors</strong> see a different count; force workers are unchanged everywhere. The throughput
benefit on such a machine has <strong>not</strong> been measured — the development machines are smaller — so this
is a ceiling removal, not a claimed speedup.</p>
<p>Queue depths became fixed item budgets (120 geometry, 3840 physics) rather than scaling with the core
count, because those queues bound per-item memory: uncapped, a 64-core machine would have been handed
40,960-deep physics queues. On machines with fewer than six cores this is a small <em>increase</em> in
bounded-queue memory (from 80 / 2560), which is the honest cost of the change.</p>
<h2 id="loading-a-large-stl-workpiece">Loading a large STL workpiece</h2>
<p>Building the topology from an STL was quadratic in triangle count — a pointer-derived hash collapsed
into a handful of buckets, so lookups degenerated into linear scans. On one 935,000-triangle binary
STL, topology construction was <strong>99.6%</strong> of the entire load; reading the file off disk was 0.16% of
it. With a multiplicative hash mix the build is linear:</p>
<table>
<thead>
<tr>
<th>Triangles</th>
<th>before</th>
<th>after</th>
<th></th>
<th>worst bucket</th>
</tr>
</thead>
<tbody>
<tr>
<td>100,000</td>
<td>8,711 ms</td>
<td><strong>1,305 ms</strong></td>
<td>6.7×</td>
<td>2,245 → 21</td>
</tr>
<tr>
<td>300,000</td>
<td>89,036 ms</td>
<td><strong>4,750 ms</strong></td>
<td>18.7×</td>
<td>6,593 → 23</td>
</tr>
</tbody>
</table>
<p>Per-triangle cost is now flat (0.013 → 0.016 ms/tri across a 3× size increase), which is the real
result: the cost grows with the mesh instead of with its square. Extrapolated to the full
935,000-triangle mesh that is roughly <strong>14 minutes → 15 seconds</strong>.</p>
<p>Deduplication and the resulting topology are unchanged — the equality predicate was not touched, and
the 300,000-triangle case produces an identical 899,997 lines before and after. Separately, the
managed-to-native STL handoff dropped from three full copies of the buffer (about 86 MB each, plus
around twenty doubling reallocations) to two.</p>
<blockquote>
<p><strong>Conditions.</strong> Native test harness, debug CRT — which inflates container-operation constants, so
the absolute milliseconds are an upper bound. The composition breakdown and the complexity change
are build-configuration independent. The full-mesh figure is an extrapolation, not a measured run.</p>
</blockquote>
<h2 id="re-triangulating-after-a-cut">Re-triangulating after a cut</h2>
<p>The marching-cubes step gained a lookup table, and produces fewer triangles for the same surface:</p>
<table>
<thead>
<tr>
<th>Tree</th>
<th>before</th>
<th>after</th>
<th></th>
<th>triangles</th>
</tr>
</thead>
<tbody>
<tr>
<td>17 MB diagnostic</td>
<td>0.63 s</td>
<td>0.29 s</td>
<td>2.17×</td>
<td>35%</td>
</tr>
<tr>
<td>30 MB demo</td>
<td>1.29 s</td>
<td>0.60 s</td>
<td>2.15×</td>
<td>35%</td>
</tr>
<tr>
<td><strong>309 MB customer part</strong></td>
<td><strong>14.68 s</strong></td>
<td><strong>6.51 s</strong></td>
<td><strong>2.25×</strong></td>
<td><strong>43%</strong></td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>Scope.</strong> This lands on the rebuild burst after a cut invalidates cached geometry, <strong>not</strong> on
steady-state rendering, which draws from the display cache and is unchanged.</p>
</blockquote>
<p>It is also an approximation change, not purely a speedup: a non-finite cut drops its triangles, so a
sub-voxel feature vanishes at that level of detail instead of being capped. That is what fixed the
broken-face slabs seen on RTCP paths. The contact-loop extraction used by milling physics
deliberately still uses the previous walk, so physics results are untouched.</p>
<h2 id="session-memory-a-long-program-no-longer-exhausts-the-client">Session memory: a long program no longer exhausts the client</h2>
<p>A session retains every executed NC block for its whole lifetime. Once a block leaves the executing
window its piece is now frozen to compact UTF-8.</p>
<blockquote>
<p>Measured on a 25,018-block play: <strong>session retention 406 MB → 142 MB</strong>, about 2.9×.</p>
</blockquote>
<p>The encoding itself is smaller than that ratio suggests — roughly 12 KB per line live against 1.6 KB
frozen, about 12.9× — because a retained piece carries more than its JSON. The 2.9× is the figure
that matters for whether a program fits in memory.</p>
<p>The trade is explicit: after the freeze the <code>JsonObject</code> getter re-parses on every call and returns a
fresh read-only snapshot, with no caching and no write-back. Code that reads the same piece
repeatedly should hold the snapshot in a local. The switch is
<a class="xref" href="../../api/Hi.MachiningProcs.NcRunnerSessionState.html#Hi_MachiningProcs_NcRunnerSessionState_FreezeExecutedPieces">FreezeExecutedPieces</a>, on by default.</p>
<h2 id="sizing-a-meshed-workpiece">Sizing a meshed workpiece</h2>
<p>A cube tree costs roughly <strong>3.2× its file size in RAM</strong> while loaded — a 10 GB <code>.wct</code> at 0.125 mm
resolution is about 95 million nodes, holding around 25 GB of tree plus 6 GB of index. Tearing down a
tree that size used to block the caller for over two minutes; disposal now runs serialized on a
background chain, so the thread that dropped it does not wait. The remaining cost is genuine work:
the live renderer must not be left showing geometry that no longer exists.</p>
<h2 id="cutter-location-files-at-production-scale">Cutter-location files at production scale</h2>
<p>Three costs were removed from the CL-to-machine path, and on a production-scale file they are the
difference between replaying and appearing to hang: tool-offset resolution walked back to the distant
<code>LOAD</code> block for every motion (O(N²), now O(1) through a modal section), the documentary
program-to-Pn stamp did the same walk (now stamped once per run), and the program-zero query
deep-cloned the whole equipment assembly on every motion block (now a cached per-run matrix over the
live assembly). These are complexity changes; they have not been separately timed.</p>
<h2 id="smaller-footprint">Smaller footprint</h2>
<p>The embedded default font is handed to the display engine from memory, so an <strong>11 MB</strong> <code>.ttf</code> is no
longer written into the process working directory on startup. The packages are x64-only, and
HiNc-Resource no longer ships a duplicated nested copy of the CT-350 STL set.</p>
<h2 id="things-that-cost-more-on-purpose">Things that cost more, on purpose</h2>
<p><strong>Five-axis inverse kinematics.</strong> Tightening the orientation envelope from about 1.4e-3 rad to about
1e-6 rad — measured maxima 1.5e-8 rad on the hot path and 2.1e-8 on teleport, a tip deviation of
0.05 µm on a 50 mm tool — costs roughly eleven solver iterations where one used to do, so a
posture-changing call went from about 23 µs to about 251 µs, and a teleport from 418 µs to 1607 µs.
Only posture-changing RTCP and arc steps pay it: three-axis programs and constant-posture segments
are exempt through the <code>McLinear</code> downgrade. In absolute terms a 1,432-step five-axis replay spends
about 0.36 s in the solver. (Debug build including measurement overhead, so those microseconds are an
upper bound.)</p>
<p><strong>Machine-coordinate linear stepping.</strong> <a class="xref" href="../../api/Hi.Numerical.Acts.ActMcXyzLinearContour.html">ActMcXyzLinearContour</a> derives its
step count from the <strong>euclidean</strong> length of the machine XYZ delta rather than the largest single-axis
component, so <code>LinearResolution_mm</code> caps actual tool-tip travel per step. A diagonal move therefore
produces up to √3× more steps than before at the same setting — more work, for a sampling density
that now means what the setting says. Lower the resolution if the old step count was what you were
budgeting for.</p>
<h2 id="a-tuning-cliff-worth-knowing-about">A tuning cliff worth knowing about</h2>
<p><code>MillingCycleDivisionNum</code> saturates. Raising it past roughly 180 buys no additional training accuracy
while the cost keeps climbing: a training run that takes about four minutes at 180 takes hours at 720
and needs on the order of 100 GB of RAM to do it. The default of 36 is for ordinary simulation; raise
it for training, but not past the point where the curve flattens.</p>
</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>
@@ -0,0 +1,229 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Results that change on upgrade | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Results that change on upgrade | 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="Release-Upgrading-ResultsThatChange">
<h1 id="results-that-change-on-upgrade">Results that change on upgrade</h1>
<p>None of the following breaks a build. All of them change what a simulation produces, so a
byte-for-byte comparison against 3.1.175 output will differ — usually because 3.1.175 was wrong.</p>
<p><strong>Silent wrong geometry, now fixed.</strong> Each of these produced a plausible-looking simulation of the
wrong thing.</p>
<ul>
<li><strong>The kinematic pivot anchor.</strong> The pivot-transform chain entry was built as <code>K(0)·K(abc)⁻¹</code>,
folding the whole machine-zero forward kinematic — its linear part included — into the pre-pivot
anchor. That linear part encodes each axis' motion sense and tool/workpiece-side ownership, so it
mirrored the program components of every workpiece-side linear axis before the IK ran. On a
table-side chain whose machine-zero linear part is <code>diag(1,1,-1)</code>, every program Z was mirrored and
a near-180° swing amplified it into metres of machine-Z error, floating the toolpath above the
workpiece. The anchor is now the translation alone, matching what HardNc has always kept. Machines
whose linear axes all ride the tool side are unaffected.</li>
<li><strong>G68 2D coordinate rotation was a silent no-op.</strong> <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.TiltTransformUtil.html">TiltTransformUtil</a>
judged the active mode from the current block but always took the matrix from the previous one, so
every G68 activation past the first block had its freshly authored rotation overwritten with an
identity that then propagated. G68 rotation did nothing at all while the block's term still read
<code>G68</code>, and the simulation machined the unrotated pattern. Re-running an existing G68 program now
gives different — correct — geometry.</li>
<li><strong>A blank line reset G90/G91.</strong> A piece with no parsing section — a blank line, a comment-only line,
<code>%</code>, an O-number — left the next block's single-step lookback empty, and it fell back to the G90
default. A program that was incremental throughout silently flipped to absolute mid-file. Such
pieces now carry the positioning section forward like every other modal syntax.</li>
<li><strong>A Siemens D offset with no <code>$TC_DP</code> row resolved to zero length, in silence.</strong> A whole TRAORI
program machined one tool length low. The read point now falls back to the generic tool-number-keyed
height and emits <code>SiemensToolOffset--TcdpRowMissing</code>.</li>
<li><strong>G43.4 with an unresolvable H word activated RTCP with a zero-length tool.</strong> It now reports
<code>Comp-ToolHeight--001</code> as a warning and keeps processing the block. An absent H stays silent —
re-activating G43.4 on the modal offset id is legitimate input.</li>
<li><strong>Heidenhain DIN/ISO arc centres.</strong> <code>I</code> / <code>J</code> / <code>K</code> are <strong>absolute</strong> circle centres on Heidenhain —
the ISO face of the klartext <code>CC</code> pole — not start-to-centre offsets. Reading them incrementally
turned arcs into near-full phantom circles. Fixed in all three engines: the HardNc reader
(<a class="xref" href="../../api/Hi.Numerical.NcArgs.ArcNcArg.html#Hi_Numerical_NcArgs_ArcNcArg_IsIjkAbsolute">IsIjkAbsolute</a>), the SoftNc reader
(<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.html#Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_IsIjkAbsolute">IsIjkAbsolute</a>) and the optimizer's write-back.
<code>G91</code> is the exception: an incremental block switches the words back to start-to-centre offsets, so
an arc programmed under <code>G91</code> is unaffected by this change. Also delivered on the 3.1.175.x service
line.</li>
<li><strong>Feed per tooth, MRR and cutting forces follow the equipped tool's tip, not the controller's F
word.</strong> The physics used to read the commanded CL feedrate. It now reads the step's real tip
feedrate (<a class="xref" href="../../api/Hi.MachiningSteps.MachineMotionStep.html#Hi_MachiningSteps_MachineMotionStep_ActualTipFeedrate_mmds">ActualTipFeedrate_mmds</a>, client key
<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ActualTipFeedrate_mmdmin">ActualTipFeedrate_mmdmin</a>): the tip's displacement relative
to the workpiece over the step duration. On XYZ moves, CL files and RTCP with the equipped tool's own
offset the two agree (the recomputation moves forces by at most about 1e-4 relative, from the
<code>TimeSpan</code>-quantised step duration); they part under RTCP with a tool-length offset that does not
describe the equipped tool, on rotary-axis-limited simultaneous five-axis blocks (the tip is slower
than F, up to a few percent), and wherever the commanded value was stale. One such stale case is
fixed alongside: a feed block that repeats the current position (<code>X.. Y.. Z.. F1600.</code> right after
the same point at <code>F800.</code>) lost its F word, so every following block showed and cut at the old
feed; its <code>ActFeedrate</code> now lands.</li>
<li><strong>A <code>K0</code> word on a HardNc G02/G03 saturated the turn count.</strong> Under the default G17 plane a
written-but-zero plane-normal word divided the axial travel by zero, the additional-turn count
saturated to <code>int.MaxValue</code>, and one arc block became a spiral act of roughly 302 simulated years —
the play appeared to hang on a single NC line. The reading now falls back to the closed-circle rule
for a zero pace, matching the guard the SoftNc side already had.</li>
<li><strong>Indexed-rotary programs folded the pivot into plain moves.</strong> A block with no active G68.2 or
G43.4 no longer folds the kinematic pivot transform into a plain XYZ move, which is what a real
controller does with a table-side rotary program.</li>
<li><strong>The radius-compensation arc transient cache landed on the wrong block.</strong> Any non-motion line
between the corner and the arc orphaned the cache, so the arc lost its leading linear bridge and
began at the corner intersection instead of on the offset arc.</li>
<li><strong>The G68.2 tool-axis IK fallback probed the mirrored tool axis.</strong> Both normal-only fallbacks in
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.IsoG68p2TiltSyntax.html">IsoG68p2TiltSyntax</a> read the transposed third column instead of the
third row. On the no-hint path this only skewed a warning gate, but the explicit A/B/C path seeds
its hint blend from that solve, so a machine with fewer than three rotary axes composed a mirrored
tilted plane.</li>
<li><strong>A Fanuc <code>WHILE</code> forward jump bound to the wrong <code>END</code>.</strong> Sequential loops idiomatically reuse
<code>DO 1</code>, so a second <code>WHILE</code>'s falsy-condition exit bound to the <em>first</em> loop's <code>END 1</code> and
redirected execution to a point before the second <code>WHILE</code> — an unbounded loop the iteration
watchdog cannot see, because it only ticks on <code>END</code> reverse jumps. The jump now uses the anchored
label scan the Siemens loop family already used.</li>
<li><strong>Heidenhain G28 is MIRROR IMAGE, not a reference-point return.</strong> On the Heidenhain preset the
shared pipeline had been reading it as the Fanuc reference return, so a <code>G28 X</code> block minted a
phantom rapid to home while the mirror silently vanished. It is now simulated as a program-to-MC
transform, <code>ReferenceReturnSyntax</code> leaves the Heidenhain logic list, and klartext <code>CYCL DEF 8</code>
records the same mirror statement so one program mirrors identically in either dialect. <strong>HardNc
keeps the Fanuc reading</strong>, so the two engines are deliberately divergent on Heidenhain G28 files and
any parity comparison must account for it.</li>
<li><strong><code>MathUtil.Convert_inchdmin_To_mmds</code> returned mm/min, not mm/s.</strong> The body multiplied by 25.4 and
never divided by 60, so a caller trusting the name got a 60× feedrate; the sibling
<code>Convert_mmdmin_To_mmds</code> divides as its name demands. No shipped path called it — the CL/APT
feedrate route converts inches-per-minute to mm/min itself — so this changes nothing inside the
product, but a caller who had compensated for the old behaviour must remove that compensation.</li>
<li><strong><code>GetRByZ(List&lt;PairZr&gt;)</code> never interpolated.</strong> The list overload looked up its ceiling node with
the floor lookup, so floor equalled ceiling and the method degenerated into a step function. For a
sharp cone whose inner-beam ZR list has no node between apex and rim, that pinned the inner radius
to 0 across the whole cone face and produced NaN flute vertices — the root cause of the transparent
cone-tip flute that 3.1.180 addressed at the display layer. It affects every consumer of
radius-by-Z interpolation, force geometry included.</li>
</ul>
<p><strong>Numerical results move even where nothing was renamed.</strong></p>
<ul>
<li>Five-axis IK is roughly <strong>1000× tighter</strong>. The rotary solver behind
<a class="xref" href="../../api/Hi.Numerical.Xyzabc.XyzabcSolver.html">XyzabcSolver</a> now runs coarse→polish: the coarse stage keeps the
original dot residual so solve success and failure
semantics are unchanged, then a <code>[dot, cross, rr-per-axis]</code> system polishes. The dot criterion is
quadratically blind to angle error — an envelope of about 1.4e-3 rad, and the resulting tip error is
that envelope times the tool length — so adding the cross term restores quadratic convergence and
drops the envelope to about 1e-6 rad. Failed solves no longer pollute the implicit seed, and the
measure-zero perfect-saddle case is escaped by a deterministic retry offset instead of by leftover
seed pollution.</li>
<li><a class="xref" href="../../api/Hi.Numerical.Acts.ActMcXyzLinearContour.html">ActMcXyzLinearContour</a> steps by <strong>euclidean</strong> tip travel instead of the
largest per-axis component, so <code>LinearResolution_mm</code> now caps actual tool-tip travel per step and a
diagonal move produces up to √3× more steps at the same setting.</li>
<li>The SoftNc pipeline is the default engine.</li>
<li>Executed <code>SyntaxPiece</code>s freeze to UTF-8 (below), so their <code>JsonObject</code> is a fresh read-only snapshot
per call rather than a retained live graph.</li>
<li><code>SyntaxPiece.SentenceIndex</code> becomes a session-global execution-order counter and is no longer
contiguous per file.</li>
<li>Repeated NC diagnostics fold into per-run summaries at the run boundaries.</li>
<li><strong>HardNc tool changes</strong> fire on M06 / Heidenhain <code>TOOL CALL</code> rather than on a changed <code>T</code> word — a
bare <code>T</code> is magazine pre-selection, and a same-tool M06 still runs the changer cycle — and unset
<code>HardNcEnv</code> tooling defaults become the three-axis shape (XYZ = NaN, NaN, 0; ABC all NaN). The old
defaults swung all three rotary axes home on every M06, which no post expects.</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>
@@ -0,0 +1,207 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Session, project and command model | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Session, project and command model | 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="Release-Upgrading-SessionModel">
<h1 id="session-project-and-command-model">Session, project and command model</h1>
<ul>
<li><strong>A parser and its per-case data travel as one file.</strong> <a class="xref" href="../../api/Hi.NcParsers.NcRunnerSuit.html">NcRunnerSuit</a> bundles a
runner with the dependency data a particular job needs, as a single file-loadable unit. The project
holds three suits — <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_NcRunnerSuit">NcRunnerSuit</a>,
<a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_CsvRunnerSuit">CsvRunnerSuit</a> and
<a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_ClsfRunnerSuit">ClsfRunnerSuit</a> — and
<a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_ReadNcRunnerSuit_">ReadNcRunnerSuit</a> /
<a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_WriteNcRunnerSuit_">WriteNcRunnerSuit</a> switch the active parser mid-project
from a suit file. A switch attempted while a program is playing is refused with
<code>ReadNcRunnerSuit--Refused</code>.</li>
<li><strong>One NC runner configuration is shareable across projects.</strong> Per-case data — tool offsets,
work-coordinate offsets, Siemens frames, Heidenhain datums, retained macro variables, seeded brand
parameter tables — travels as proxy placeholders inside <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> and
resolves against the owning project's per-case list, so a controller configuration is no longer
welded to the job it was first built for. Machine-config consumers read the resolved view through
<a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_GetEffectiveNcDependencyList_">GetEffectiveNcDependencyList</a>; legacy <code>&lt;NcDependencyList&gt;</code> XML and
<code>NcEnv</code>-based projects still load and migrate automatically.</li>
<li><strong>HTTP guards and one envelope.</strong> <a class="xref" href="../../api/Hi.MachiningProcs.RequireActiveSessionAttribute.html">RequireActiveSessionAttribute</a> answers a
session-scoped action with HTTP 409 and an <code>ApiActionResult.NoActiveSession()</code> body when no session is
active, instead of the previous null-reference 500;
<a class="xref" href="../../api/Hi.MachiningProcs.RequireLoadedProjectAttribute.html">RequireLoadedProjectAttribute</a> does the same for the project-level controller.
Both are applied at the controller level and honour opt-out markers
(<a class="xref" href="../../api/Hi.MachiningProcs.AllowNoActiveSessionAttribute.html">AllowNoActiveSessionAttribute</a>,
<a class="xref" href="../../api/Hi.MachiningProcs.AllowNoLoadedProjectAttribute.html">AllowNoLoadedProjectAttribute</a>). Mutating actions inject a fresh
<a class="xref" href="../../api/Hi.Common.Messages.MessageCollector.html">MessageCollector</a> and return the collected notifications inline in the
shared <a class="xref" href="../../api/Hi.MachiningProcs.ApiActionResult.html">ApiActionResult</a> envelope, so a REST or AI caller sees progress,
success and error messages in the response instead of only out of band.
<a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectServiceController.html">LocalProjectServiceController</a> exposes the project-level (session-independent)
surface parallel to <a class="xref" href="../../api/Hi.MachiningProcs.SessionShellController.html">SessionShellController</a>.</li>
<li><strong>Session commands declare themselves.</strong> <a class="xref" href="../../api/Hi.SessionCommands.CommandCatalogAttribute.html">CommandCatalogAttribute</a> marks an
<a class="xref" href="../../api/Hi.SessionCommands.ISessionCommand.html">ISessionCommand</a> as user-addable and places it in a
<a class="xref" href="../../api/Hi.SessionCommands.CommandCategory.html">CommandCategory</a> (Setup / Program / Optimization / Output / Flow, declaration
order = display order) with an <code>Order</code> sort key and an optional wire kind (default: the class name
minus the <code>Command</code> suffix, lower-cased). <a class="xref" href="../../api/Hi.SessionCommands.CommandFieldAttribute.html">CommandFieldAttribute</a> marks a
bool / int / double / string property as a directly editable scalar with an optional label, unit and
physics-licence flag, so a generic editor renders and updates it without a hand-written form. A
command without the catalog attribute stays loadable from project files but is not offered for
creation.</li>
<li><strong>Program File dispatches by kind.</strong> <a class="xref" href="../../api/Hi.SessionCommands.NcFileCommand.html">NcFileCommand</a> gains an <code>NcKind</code>
property (XML element <code>NcKind</code>, absent = <code>Auto</code> for legacy projects) and its mission label becomes
&ldquo;Program File&rdquo;; each command resolves its own file, so a List of Program Files can mix
brand NC, CL and CSV.</li>
<li><strong>Two session commands saved but could never be read back.</strong> <code>ListCommand.Reg</code> chained every type
except <a class="xref" href="../../api/Hi.SessionCommands.NcOptOptionCommand.html">NcOptOptionCommand</a> and
<a class="xref" href="../../api/Hi.SessionCommands.RecordMeshedGeomCommand.html">RecordMeshedGeomCommand</a>, so any XML round-trip of an entry holding one threw
<code>KeyNotFoundException</code> out of the <a class="xref" href="../../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> generator lookup — reloading a
saved project containing an NC Optimization Config command failed. Both are now chained.</li>
<li><strong>Naming.</strong> <a class="xref" href="../../api/Hi.SessionCommands.ListCommand.html#Hi_SessionCommands_ListCommand_Title">Title</a> is an optional name shown in place of the type
name, so nested command lists can be named in the mission tree. <code>PreSettingCommand</code> displays as
&ldquo;General Config&rdquo; and <code>NcOptOptionCommand</code> as &ldquo;NC Optimization Config&rdquo; — display strings only, so
serialization and endpoints are untouched. A bare non-list <code>PlayerCommand</code> root is normalized on read
into a single enabled entry of the default <code>ListCommand</code>. Command titles, catalog categories and field
labels are now localized, and a zh-Hans resource set was created (none existed before). Default-script
template keys stay untranslated on purpose — they compose the C# comments and script title written
into the user's <code>.hincproj</code>, which travels to other machines.</li>
<li><strong>Script faults are keyed errors.</strong> A <code>CompilationErrorException</code> or a faulted script task used to
surface as an anonymous warning; <a class="xref" href="../../api/Hi.SessionCommands.ScriptCommand.html">ScriptCommand</a> now reports
<code>ScriptCommand-Compile--Failed</code> with the full diagnostic list and <code>ScriptCommand-Run--Fault</code> with the
exception, both at Error severity.</li>
<li><strong>A fresh session re-homes the machining chain.</strong> <code>ResetRuntime</code> wrote the configured XYZ home but
hard-coded ABC to 0, and it only ran on project switch or pace-player reset — never before a plain
Play. A freshly loaded project therefore started from whatever pose the <code>.mt</code> happened to serialize,
while the act stream interpolated from the home seed, so the first contour swept from a pose the
machine was never at and cut along the way. The re-home now reads the rotary homes from the same home
configuration and also runs at <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_BeginSession_">BeginSession</a>; a
mid-session replay is untouched.</li>
<li><strong>What a reset actually resets.</strong> <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ResetRuntime_">ResetRuntime</a> now also
rewinds the NC-runner session state, so the next play restarts file and line indexing from scratch
the way <code>PowerReset</code> does, and it resets the CL device pose to identity. It no longer clobbers
<code>MachiningResolution_mm</code>: the runtime resolution is seeded from the workpiece's initial resolution
only when a project loads, so an explicit override survives a runtime reset and a workpiece swap.</li>
<li><strong>Mixed runner kinds in one session are refused.</strong> <code>NcRunnerSessionState</code> remembers the runner that
initialised it and <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_RunNcLines_">RunNcLines</a> refuses a different one with
<code>RunNcLines--RunnerMismatch</code> — reachable now that <code>NcKind.Auto</code> makes mixed-kind missions a
first-class flow.</li>
<li><strong>Stale state on a chain or project switch.</strong> Building the coordinate converter nulls the rotary
solver when the chain is not an <code>IXyzabcChain</code>, so a solver built for the old machine no longer keeps
converting after a switch to a CL device; and
<a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceService.html#Hi_NcMech_Workpieces_WorkpieceService_ClearCache_">ClearCache</a> now also calls
<a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceService.html#Hi_NcMech_Workpieces_WorkpieceService_ClearIdealGeomCache_">ClearIdealGeomCache</a>, so loading another project stops
rendering the previous project's target geometry.</li>
<li><strong>Project-file operations are serialized through a zero-wait gate.</strong> A New / Load / Save / Reload
arriving while another is in progress throws <a class="xref" href="../../api/Hi.MachiningProcs.ProjectFileBusyException.html">ProjectFileBusyException</a>
immediately instead of racing into a file-in-use <code>IOException</code>.</li>
<li><strong><a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipmentUtil.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipmentUtil_AlignWorkpieceProgramZeroToIso_">AlignWorkpieceProgramZeroToIso</a>
computes in the machine-zero state.</strong> It reflects the assembly and zeroes every dynamic axis before
querying displacements, so the alignment is correct even when the live machine's axes are
displaced.</li>
<li><strong><a class="xref" href="../../api/Hi.Common.PacePlayer.html#Hi_Common_PacePlayer_RunCount">RunCount</a></strong> counts runs started, incremented synchronously before the
run's task launches and never reset. Pairing it with <code>IsFinished</code> in one snapshot lets a polling
client distinguish &ldquo;the run I started has finished&rdquo; from a stale Finished left by a previous run.</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>
@@ -0,0 +1,140 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>The package line | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="The package line | 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="Release-Upgrading-PackageLine">
<h1 id="the-package-line">The package line</h1>
<p><code>master</code> develops the <strong>3.2</strong> package line as of 2026-08-24. All ten packages — HiGeom, HiLicense,
HiDisp, Hi.WinForm, Hi.WpfPlus, HiCbtr, HiMech, HiUniNc, HiNc, HiNc-Resource — moved to 3.2
together and <strong>restarted their build counters</strong>.</p>
<p>Four consequences worth stating plainly:</p>
<ul>
<li>A 3.2 build number starts low, and the two counters are not comparable. The gap between the last
3.1 number a feed served and the first 3.2 one is expected rather than a missing upload.</li>
<li><strong>The ten counters are independent.</strong> They did not restart at a common value and they do not
advance together: a package's counter moves only when that package is rebuilt, so the ten numbers
spread apart and stay spread. Where two of them happen to agree it is coincidence, not a shared
set number. A set is named by its <strong>HiNc</strong> package version — the top of the library stack, and the
number the application shows as its own version mark — while the nine packages under it carry
their own builds.</li>
<li>The published packages reference one another with a floating <code>3.2.*</code>, so restoring HiNc pulls the
newest 3.2 build of each dependency rather than a fixed, reproducible set. A build that has to be
reproducible pins each package explicitly.</li>
<li>The <strong>3.1 line is closed at the 3.1.175 set</strong> and is serviced only as patches on that set. A
package on the service line keeps the 3.1 build it was frozen at and gains a fourth segment of its
own, so the set is quoted as <code>3.1.175.&lt;patch&gt;</code> after its HiNc package while the packages beneath
it publish under their own frozen builds — looking on the feed for every package at <code>3.1.175.x</code>
finds only HiNc. A reference left on that set receives correctness fixes for it and none of the
capability on this page. The 3.1 builds above 3.1.175 were never published as a release set —
which is why the release note carries one 3.2 entry where it might have carried a dozen: for a
caller moving off 3.1.175, they were never separate releases.</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>
@@ -0,0 +1,58 @@
<div id="sidetoggle">
<div>
<div class="sidefilter">
<form class="toc-filter">
<span class="glyphicon glyphicon-filter filter-icon"></span>
<span class="glyphicon glyphicon-remove clear-icon" id="toc_filter_clear"></span>
<input type="text" id="toc_filter_input" placeholder="Filter by title" onkeypress="if(event.keyCode==13) {return false;}">
</form>
</div>
<div class="sidetoc">
<div class="toc" id="toc">
<ul class="nav level1">
<li>
<a href="index.html" name="" title="Upgrading from 3.1.175 to 3.2">Upgrading from 3.1.175 to 3.2</a>
</li>
<li>
<a href="the-package-line.html" name="" title="The package line">The package line</a>
</li>
<li>
<a href="breaking-changes.html" name="" title="Breaking changes">Breaking changes</a>
</li>
<li>
<a href="results-that-change-on-upgrade.html" name="" title="Results that change on upgrade">Results that change on upgrade</a>
</li>
<li>
<a href="brand-nc-language-coverage.html" name="" title="Brand NC language coverage">Brand NC language coverage</a>
</li>
<li>
<a href="nc-optimization-and-writeback.html" name="" title="NC optimization and writeback">NC optimization and writeback</a>
</li>
<li>
<a href="milling-physics-and-training.html" name="" title="Milling physics, training and measured data">Milling physics, training and measured data</a>
</li>
<li>
<a href="cl-playback.html" name="" title="Cutter-location (CL) playback and CL-to-NC">Cutter-location (CL) playback and CL-to-NC</a>
</li>
<li>
<a href="session-project-and-commands.html" name="" title="Session, project and command model">Session, project and command model</a>
</li>
<li>
<a href="geometry-rendering-and-stability.html" name="" title="Geometry, rendering and native stability">Geometry, rendering and native stability</a>
</li>
<li>
<a href="performance-and-footprint.html" name="" title="Performance and footprint">Performance and footprint</a>
</li>
<li>
<a href="packaging-and-hosting.html" name="" title="Packaging, resources and hosting">Packaging, resources and hosting</a>
</li>
<li>
<a href="new-diagnostics.html" name="" title="New diagnostics you may now see">New diagnostics you may now see</a>
</li>
</ul>
</div>
</div>
</div>
</div>
@@ -0,0 +1,2 @@
{"items":[{"name":"Upgrading from 3.1.175 to 3.2","href":"index.html","topicHref":"index.html"},{"name":"The package line","href":"the-package-line.html","topicHref":"the-package-line.html"},{"name":"Breaking changes","href":"breaking-changes.html","topicHref":"breaking-changes.html"},{"name":"Results that change on upgrade","href":"results-that-change-on-upgrade.html","topicHref":"results-that-change-on-upgrade.html"},{"name":"Brand NC language coverage","href":"brand-nc-language-coverage.html","topicHref":"brand-nc-language-coverage.html"},{"name":"NC optimization and writeback","href":"nc-optimization-and-writeback.html","topicHref":"nc-optimization-and-writeback.html"},{"name":"Milling physics, training and measured data","href":"milling-physics-and-training.html","topicHref":"milling-physics-and-training.html"},{"name":"Cutter-location (CL) playback and CL-to-NC","href":"cl-playback.html","topicHref":"cl-playback.html"},{"name":"Session, project and command model","href":"session-project-and-commands.html","topicHref":"session-project-and-commands.html"},{"name":"Geometry, rendering and native stability","href":"geometry-rendering-and-stability.html","topicHref":"geometry-rendering-and-stability.html"},{"name":"Performance and footprint","href":"performance-and-footprint.html","topicHref":"performance-and-footprint.html"},{"name":"Packaging, resources and hosting","href":"packaging-and-hosting.html","topicHref":"packaging-and-hosting.html"},{"name":"New diagnostics you may now see","href":"new-diagnostics.html","topicHref":"new-diagnostics.html"}]}