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
@@ -87,6 +87,113 @@
<article data-uid="">
<h1 id="release-note">Release Note</h1>
<h2 id="hinc-packages-version-3226">HiNc Packages Version 3.2.26</h2>
<p>Rotary-axis correctness on SoftNc, cutting forces that no longer depend on how the geometry kernel
tiled the contact surface, and a process that survives a host without OpenGL. The 3.1.175 → 3.2 line
jump is the 3.2.7 entry below; the long form is still
<a href="upgrading-to-3.2/index.html">Upgrading from 3.1.175 to 3.2</a>.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p><strong>Adoption status.</strong> Verification is still in progress across most areas.</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, serviced as
<code>3.1.175.&lt;patch&gt;</code>. The Blazor front end tracks the 3.2 packages, so it is not a way
to stay on the 3.1 behaviour.</p>
<p>The 3.2.24 hold on SoftNc canned cycles that index a rotary axis is <strong>lifted</strong> — see the
first entry below.</p>
</div>
<ul>
<li><strong>SoftNc canned cycles take rotary axis words.</strong> A G81G89 repeat block carrying an A / B / C
word indexes the table and drills again — the standard bolt-circle shape — where 3.2.24 either
skipped the hole or drilled it at the previous angle: 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 <code>G68.2</code> without RTCP the feature frame stays pinned in machine space so the hole stays put
while the workpiece turns. Under <code>G91</code> only the words the block itself spoke are increments, so
an X-pitch repeat no longer doubles Y. Hole bottoms match the HardNc replay of a customer's
bolt-circle program to 0.000 mm on all twelve C-indexed blocks, and setting
<a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_EnableSoftNcRunner">EnableSoftNcRunner</a> <code>false</code> is no longer needed for
such programs. See
<a href="upgrading-to-3.2/brand-nc-language-coverage.html#fanuc-and-iso-common">Brand NC language coverage</a>
and <a href="../technique/nc-dialects/controller-iso.html#canned-cycles">ISO core</a></li>
<li><strong>A rotary word under modal <code>G91</code> is an increment on SoftNc.</strong> <code>G91 … C20.</code> followed by <code>C20.</code>
leaves the table at 40, not 20; a per-word directive (<code>C=AC(90)</code>, <code>ACP</code> / <code>ACN</code>, <code>IC()</code>) still
wins over 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 (<code>G91 G28 C10.</code> from
C90 passes through 100, then returns home) instead of on zero. HardNc keeps its documented
absolute reading of a rotary word under <code>G91</code> and warns. The programmed deltas are recorded on
the block 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. See
<a href="upgrading-to-3.2/results-that-change-on-upgrade.html">Results that change on upgrade</a></li>
<li><strong>Rotary IK no longer reports failure from a pole seed.</strong> Every solve attempt now runs its
coarse stage and its polish, so a small tilt with a large azimuth that used to run out of
iterations a few milliradians short — and was then refused by <code>G53.1</code>, leaving the table at
A = C = 0 with the tilt still active and the whole path rotated off the part — solves to
1e-8 rad. On a Fanuc IJK grid from the pole seed, 54 / 69 failures per A/C chain become 0; on a
CL program 44 dropped endpoints of 536 become 0. The happy path is unchanged bit for bit; only a
failed attempt pays one extra polish</li>
<li><strong>Rotary travel picks the reachable IK branch.</strong> When the nearest solution lies outside an axis'
configured travel, the axial solve searches the other branches (sign, half-turn and supplement
combinations) and keeps the admissible one nearest the entry; <code>G53.1</code>, <code>G68.2</code>, <code>CYCLE800</code>,
<code>PLANE SPATIAL</code> and the <code>LN</code> vector syntax pass the travel through the new admissibility overloads
of <a class="xref" href="../api/Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a> and
<a class="xref" href="../api/Hi.NcParsers.Dependencys.StrokeLimitUtil.html#Hi_NcParsers_Dependencys_StrokeLimitUtil_RotaryAdmissibility_">RotaryAdmissibility</a>. The travel itself now
reaches SoftNc from every project: a stroke limit declared only in the legacy machine-limits
boxes is copied into the controller parameter table on load for the axes carrying no end there
(explicit rows win), where 3.2.24 checked such a project against nothing. Both stroke checks
apply <a class="xref" href="../api/Hi.NcParsers.Dependencys.StrokeLimitUtil.html#Hi_NcParsers_Dependencys_StrokeLimitUtil_Tolerance">Tolerance</a>, so an axis parked exactly on its
limit is not reported. See
<a href="../anatomy/general-setup/controller/machine/per-axis-tables.html">Per-axis tables</a></li>
<li><strong>A rapid traverse that removes stock is reported.</strong> <code>Play-RapidCut--Detected</code> folds the G00
steps of one NC line that touched the workpiece into one validation warning, anchored on the
line's first cutting step and carrying the line's removed volume (geometry only), its
touching-step count and its largest cutting depth. The line total is gated by the project-level
<a class="xref" href="../api/Hi.MachiningProcs.MachiningActRunnerConfig.html#Hi_MachiningProcs_MachiningActRunnerConfig_RapidCutVolumeThreshold_mm3">RapidCutVolumeThreshold_mm3</a> (default 0: any
contact reports); a step with the spindle stopped is left to collision detection while that is
on. <a class="xref" href="../api/Hi.MachiningSteps.MachineMotionStep.html#Hi_MachiningSteps_MachineMotionStep_IsRapid">IsRapid</a> marks the step. See
<a href="upgrading-to-3.2/new-diagnostics.html">New diagnostics</a></li>
<li><strong>Cutterworkpiece engagement no longer depends on how the contact surface was tiled.</strong> The scan
that turns a step's contact contours into the engaged angle ranges of
<a class="xref" href="../api/Hi.Milling.Engagements.LayerMillingEngagement.html">LayerMillingEngagement</a> dropped its dense-step bounding-box shortcut
and its winding dependence; a cylinder wall and a flat floor sector reproduce their analytic arcs
to 1e-9 rad at four tessellations, and the managed and native paths stay bit-identical.
<strong>Re-running an existing program moves the forces</strong> on most engaged steps — floors that used to
register as empty and side ranges fragmented by phantom 1° gaps move the most — and coefficient
sets trained before this build embed the old engagement. See
<a href="upgrading-to-3.2/results-that-change-on-upgrade.html">Results that change on upgrade</a></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, so 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. On a 1000-move CL replay the node count drops 17%
and the peak working set 8%; the meshed-geometry writer and the fly-piece remover now tolerate a
fold landing under them mid-cut instead of crashing. See
<a href="upgrading-to-3.2/geometry-rendering-and-stability.html">Geometry, rendering and native stability</a></li>
<li><strong>A host with no usable OpenGL no longer aborts the process.</strong> Where the native display
initialiser used to kill the process at startup — every service on a machine whose graphics
driver and kernel module disagree — it now reports, and NC play, physics and training run
without 3D. <a class="xref" href="../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_IsGlAvailable">IsGlAvailable</a> carries the verdict and HiNc logs it once at
startup; a host must not obtain a <a class="xref" href="../api/Hi.Disp.DispEngine.html">DispEngine</a> while it is <code>false</code>. See
<a href="../product/system-requirements.html">System requirements</a></li>
<li><strong>Packaging.</strong> The Linux licence-key native library in the HiDisp package ships stripped: the
protected file no longer carries debug information</li>
</ul>
<p><strong>Committed after the 3.2.26 pack — these ship in the next package build:</strong></p>
<ul>
<li><strong><code>BackgroundTemperature</code> renames to <code>AmbientTemperature</code>.</strong>
<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>) name 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. A <code>.hincproj</code> now writes <code>&lt;AmbientTemperature_C&gt;</code> and
still reads the legacy element and the 2019 wrapper, so no project needs editing. See
<a href="../manual/setup/coolant.html">Coolant</a> and
<a href="upgrading-to-3.2/breaking-changes.html#7-signature-and-shape-changes">Breaking changes</a></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> share one seam that drops the runner session
state and the NC diagnostics and raises
<a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_OnNcPipelineReset">OnNcPipelineReset</a> before the next file's pieces
arrive, so a consumer keyed by file / sentence index drops its stale index in step instead of
merging the next file into the previous file's numbers. See
<a href="upgrading-to-3.2/session-project-and-commands.html">Session, project and commands</a></li>
</ul>
<h2 id="hinc-packages-version-3224">HiNc Packages Version 3.2.24</h2>
<p>Correctness and coverage that landed after 3.2.7. The 3.1.175 → 3.2 line jump is the
3.2.7 entry below; the long form is still
@@ -258,11 +258,21 @@ extended table (P1P48). 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 G73G89 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 G73G89 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 G81G89 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