This commit is contained in:
2026-09-16 00:00:49 +08:00
parent 1a75503105
commit bfa3106a69
60 changed files with 696 additions and 268 deletions
@@ -258,11 +258,21 @@ extended table (P1–P48). A selected row nobody has entered reports <code>Coord
spelling of <code>G20</code> and reports <code>Unit--InchNotSupported</code> rather than silently switching units.
<code>G05.1 Q1</code> / <code>Q0</code> is AICC / Nano Smoothing (recognized). Bare <code>G05 P{n}</code> is a different feature
(HPCC) and is consumed without changing programmed coordinates, reported under the <code>Hpcc--*</code> ids.</li>
<li><strong>Canned-cycle repeats do not take rotary words on SoftNc.</strong> The G73–G89 family expands XYZ / R /
Q / F / P / K strokes. An A / B / C word on a repeat is not taken: a rotary-only repeat does not
fire the cycle, a mixed block drops the rotary word, and under G68.2 the hole follows the table.
<em>Not finished on this line, see Adoption status on the <a href="../index.html">release-note page</a>.</em> The
HardNc fallback indexes those blocks the way a control does.</li>
<li><strong>Canned-cycle repeats take rotary words on SoftNc.</strong> The G73–G89 family expands XYZ / R / Q /
F / P / K strokes, and a repeat block carrying an A / B / C word indexes the table and drills
again, the way a control does: a rotary-only repeat fires the cycle, a mixed block pre-positions
XYZ and the table in one simultaneous move before the strokes, and under G68.2 without RTCP the
feature frame stays pinned in machine space so the hole stays put while the workpiece turns. Under
G91 only the words the block itself spoke are increments. The hold that 3.2.24 placed on these
programs is lifted; <code>EnableSoftNcRunner = false</code> is no longer needed for them.</li>
<li><strong>A rotary word under modal G91 is an increment on SoftNc.</strong> A bare A / B / C word follows the
block's modal positioning onto the same anchor + delta path as Siemens <code>IC()</code> and klartext <code>IC+</code>:
<code>G91 … C20.</code> then <code>C20.</code> leaves the table at 40. A per-word directive (<code>C=AC(90)</code>, <code>ACP</code> / <code>ACN</code>,
<code>IC()</code>) still beats the modal state, and a spoken <code>G91 B270.</code> stays a +270° traverse instead of
folding to −90°. A <code>G91 G28</code> rotary intermediate anchors on the previous modal angle, then
returns home. HardNc keeps its absolute reading of a rotary word under G91 and warns. The
programmed deltas are recorded in <a class="xref" href="../../api/Hi.NcParsers.Keywords.IncrementalWords.html">IncrementalWords</a>, beside the
<a class="xref" href="../../api/Hi.NcParsers.Keywords.RotaryWords.html">RotaryWords</a> the block spoke.</li>
</ul>
<h2 id="cross-brand">Cross-brand</h2>
<ul>
@@ -386,6 +386,13 @@ the authored one — the only face a project file persists, reached as
physics, collision and execution display read; it is rebuilt from the authored face at project
assignment and at session boundaries, so a value written onto it is discarded rather than saved.
See <a href="../../technique/api-foundations/getting-started.html">Getting started</a>.</li>
<li><code>BackgroundTemperature_C</code> / <code>_K</code> on both equipment faces rename to
<a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_AmbientTemperature_C">AmbientTemperature_C</a> /
<a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_AmbientTemperature_K">AmbientTemperature_K</a> (and the same pair
on <a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html">MachiningEquipment</a>): the shop-floor temperature the
workpiece, cutter, chips and spindle start at and the spindle cools toward. The old names remain
as <code>[Obsolete]</code> delegates, so nothing stops compiling. A <code>.hincproj</code> now writes
<code>&lt;AmbientTemperature_C&gt;</code>; the reader still accepts the legacy element and the 2019 wrapper.</li>
</ul>
<h2 id="8-defaults-and-gates-that-changed">8. Defaults and gates that changed</h2>
<ul>
@@ -120,6 +120,22 @@ mirrors <code>RemoveBySweepingVolume</code> — the geometry-layer symmetric poi
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>
<li><strong>A host with no usable OpenGL no longer aborts the process.</strong> The native display initialiser
used to end the whole process when the GL loader failed — before any NC play, physics or training,
none of which need GL — which is what made every service on a machine whose graphics driver and
kernel module disagree unstartable, and kept it dead until the driver was fixed. It now reports
and returns; <a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_IsGlAvailable">IsGlAvailable</a> carries the verdict, <code>ContextProjDepth</code> reads
0 in that state, and HiNc logs one line at startup saying so. The contract is that a host must
not obtain a <a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a> while <code>IsGlAvailable</code> is <code>false</code>, rather than guard
individual draw calls.</li>
<li><strong>The cube tree folds a re-cut flat region again.</strong> A comparison in the simplification gate had
been inverted since 2023: it demanded the marching-cubes ambiguous face pattern instead of
forbidding it, so almost no cell reached the reproduction test and a floor roughened by one pass
and re-cut flat by a later one stayed at its finest level for the life of the tree. 128 of the 256
corner masks now pass, the 1e-9 reproduction test behind the gate is unchanged. On a 1000-move CL
replay the node count drops 17% and the peak working set 8%. Because folds are now routine, the
meshed-geometry writer and the fly-piece remover tolerate a child array folded away under them
while a cut runs on another thread — a snapshot taken mid-cut stays torn, but no longer crashes.</li>
</ul>
</article>
@@ -88,7 +88,7 @@
<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 3.1.175 → 3.2 line — the 3.2.7 entry and the
<a href="../index.html">3.2.24</a> incremental drop. They exist because 3.2 is not
<a href="../index.html">3.2.24 and 3.2.26</a> incremental drops. 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
@@ -99,9 +99,9 @@ capability you can adopt when you need it.</p>
<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, <strong>NC optimization is not finished on this line</strong>, and <strong>SoftNc canned-cycle indexing
with rotary A/B/C words is not finished</strong> — work that depends on either should stay on 3.1,
serviced as <code>3.1.175.&lt;patch&gt;</code>, or run with SoftNc off for the rotary-cycle case.</p>
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>. The 3.2.24 hold on SoftNc canned cycles that index a
rotary axis is lifted in 3.2.26.</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>
@@ -191,6 +191,10 @@ step touched the workpiece but no touched step carries a physics brief — namin
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>Engagement is tessellation-invariant.</strong> The scan that turns a step's contact contours into
the engaged angle ranges no longer depends on how many polygons the geometry kernel cut the
contact surface into; forces on existing programs move accordingly — see
<a href="results-that-change-on-upgrade.html">Results that change on upgrade</a>.</li>
<li><strong>Performance</strong> is collected in its own section below.</li>
</ul>
@@ -242,6 +242,31 @@ them on the bench fixtures); the largest moves are floors that used to register
whole bottom disc dropped out — and side ranges that were fragmented into pieces separated by
phantom 1° gaps. Coefficient sets trained before this change embed the old engagement of their
training program; retrain on a replay if that fit matters.</li>
<li><strong>SoftNc canned cycles index a rotary axis.</strong> A G81–G89 repeat block carrying an A / B / C word
used to skip the hole (rotary-only repeat), drill it at the previous angle (mixed block) or let it
follow the table under <code>G68.2</code>. It now indexes the table and drills again, pre-positioning XYZ and
the table in one move, and under <code>G68.2</code> without RTCP the feature frame stays pinned in machine
space. Under <code>G91</code> only the words the block itself spoke are increments — an X-pitch repeat used
to add the previous cycle's Y a second time and drill upward. A bolt-circle program that ran
short of holes, or drilled them in the wrong place, now matches the HardNc replay.</li>
<li><strong>A rotary word under modal <code>G91</code> is an increment.</strong> <code>G91 … C20.</code> then <code>C20.</code> left the table at
20; it is 40 now. A spoken <code>G91 B270.</code> stays a +270° traverse instead of folding to −90°, and a
<code>G91 G28</code> rotary intermediate anchors on the previous modal angle instead of on zero (<code>G91 G28 C0</code> from C90 now holds the table and returns home instead of swinging to 0 first). Per-word
directives (<code>C=AC(90)</code>, <code>ACP</code> / <code>ACN</code>, <code>IC()</code>) are unchanged. HardNc keeps its absolute reading
and warns.</li>
<li><strong>Rotary IK from a pole seed.</strong> Every solve attempt now runs coarse then polish, so a small tilt
with a large azimuth that ran out of iterations a few milliradians short — and was refused by
<code>G53.1</code>, leaving the table at A = C = 0 with the tilt active and the path rotated off the part —
now solves to 1e-8 rad. On a Fanuc IJK grid from the pole seed 54 / 69 failures per A/C chain
become 0; a CL program goes from 44 dropped endpoints of 536 to 0.</li>
<li><strong>The rotary branch inside the travel wins.</strong> When the nearest IK solution lies outside an axis'
configured travel, <code>G53.1</code>, <code>G68.2</code>, <code>CYCLE800</code>, <code>PLANE SPATIAL</code> and <code>LN</code> now take the admissible
branch nearest the entry (sign, half-turn and supplement combinations are searched); a posture
the cradle cannot take is no longer commanded silently. This needs the travel to be known, and
it now is on every project: stroke limits declared only in the legacy machine-limits boxes are
copied into the controller parameter table on load for the axes carrying no end there, where they
used to be checked against nothing on SoftNc. An axis parked exactly on its limit is no longer
reported (<a class="xref" href="../../api/Hi.NcParsers.Dependencys.StrokeLimitUtil.html#Hi_NcParsers_Dependencys_StrokeLimitUtil_Tolerance">Tolerance</a>).</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>
@@ -158,6 +158,13 @@ rewinds the NC-runner session state, so the next play restarts file and line ind
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>Every NC-pipeline rewind raises one event.</strong> Suit rewiring, <code>PowerReset</code> and
<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ResetRuntime_">ResetRuntime</a> each dropped the runner session state on their
own with no notification, so the file / sentence counters restarted at 0 on the next play while
the session and its subscribers lived on — a consumer keyed by file index merged the next NC file
into the previous file's numbers. One seam now performs the reset (session state and the NC
diagnostics) and raises <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_OnNcPipelineReset">OnNcPipelineReset</a>, an
app-lifetime event, before the next file's pieces arrive.</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