Release Note
HiNc Packages Version 3.2.6
At a glance
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 coverage that made possible. A Siemens or Heidenhain program that 3.1.175 could not interpret past its first computed coordinate or subprogram call now replays end to end.
Control-language coverage. The figure is how far our own verification has reached on that dialect — it is not the share of the language that is implemented, and it is not a guarantee for a program we have not seen:
| Control language | Verification reached |
|---|---|
| Cutter location (NX CLSF / APT source) | ~90% |
| Fanuc | ~80% |
| Siemens SINUMERIK | ~60% |
| Heidenhain (klartext and DIN/ISO) | ~40% |
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 not simulated — is in the brand support matrix.
Failures say what went wrong. 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 diagnostic id table.
Simulation is faster and holds a bigger program. 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 Performance and footprint.
The application product moves to the web API. From 3.2 the shipped application is the web
service, and its source is the same HiNC-2025-webservice sample we publish — what you read there is
what the product runs. The Blazor front end is not on this line.
Important
Adoption status. 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.
Do not put 3.2 NC optimization into production. It is not finished on this line. Work that
depends on optimization should stay on the 3.1 line, which is serviced as 3.1.175.<patch>. The
Blazor front end likewise remains on 3.1.
What changed
This one entry covers everything since 3.1.175. The 3.1 line is closed at the 3.1.175 package
set and is serviced only as 3.1.175.<patch>; master moved all ten packages onto the 3.2 line
on 2026-07-26 and restarted their build counters. So a 3.2 build number starts low — 3.2.6 is
newer than 3.1.204, 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.
Everything below therefore lands at once on a caller moving a 3.1.175 reference to 3.2. See Upgrading from 3.1.175 to 3.2 for the full detail — the summary here is the shape of the upgrade, not the whole of it.
Breaking changes
In the order they will bite. Full table with replacements on the upgrade page.
- Registration:
XFactory.Generatorsbecomes aConcurrentDictionary(a caller declaring the old type breaks at compile time), andLocalProjectService.Reg()must still be called once at startup before any project XML is deserialized - Messages:
MixedProgress0,MultiTagMessageandMultiTagMessageUtilare removed; every message parameter is retyped fromIProgress<object>toIProgress<IMessage>;Category.Generalis deleted andNcDiagnostic.Textrenames toNotification - Session lifetime:
LocalProjectService.SessionShellis null outside a session andShellProgressis recreated per session — hold no long-lived reference;MachiningSessiontakes an injectedIMachiningService, andIMachiningServicereplacesPlayerCancellationToken/PausePlayerwith onePacePlayer - Play verbs:
PlayNcFile/RunNcFilegain anNcKind kind = NcKind.Autoparameter and dispatch by extension; the old narrow verbs becomePlayBrandNcFile/RunBrandNcFile. The “Control” vocabulary retires with them (IControlRunner→INcRunner,RunControlLines→RunNcLines,ControlKind→NcKind) - Hard renames, no shim: runtime geom → meshed geom across
WorkpieceService;IContourTray/UniformContourTray/FreeContourTray→IFluting/UniformFluting/FreeFlutingandMillingCutter.FluteContourTray→Fluting; HiNc'sHi.Common.ResourceUtil→ResourceLayout(it was shadowing HiGeom's same-named type); the native topo-STL wrappers move toHi.Geom.Topo;ITimeGetter→ITimecoded;ClStrip.DrawingRefreshing→DrawingRefreshed;SoftNcRunner.NcDependencyList→PipelineNcDependencyList - Removals:
CsvRunner0andEnableSoftCsvRunner,RawCsvRunner,IndexedSentence,SimpleSessionCommand,LsStl; the GUI-layer typesMachiningProjectDisplayee,IsoCoordinateEntryDisplayee,HeidenhainCoordinateEntryDisplayee,UserConfig,UserServiceandPlayerDivConfig; the managed physics kernel typesFluteZData,MillingForceUtil.RuntimePack/LayerPack/AnglePackandMillingPhysicsBrief.YieldStressMinHeight_mm;CultureUtil.SupportedCultureNamesandSetCurrentCulture(string); eightgl*P/Invoke declarations that had no backing export; andPostExecutionCommand's meshed-geometry output pair (useRecordMeshedGeomCommand/ExportMeshedGeomToStlCommandinstead) - Shapes:
MachiningToolHousederives fromDictionary<int, IMachiningTool>;MachiningStep.ActualTimecode/ActualDateTimebecome get-only views onto the newActualTime;PreSettingCommandbecomes a legacy bundle that expands on load into five single-setting commands and is never written back;ToPresentDtowire keys change - Defaults:
EnableSoftNcRunneristrue— SoftNc is the NC engine andHardNcRunneris the opt-out fallback;EnableNativeMillingPhysicsistrueand a shipping build throws if you set itfalse;YieldingStressRatioreportsNaNinstead of0when it cannot be evaluated, so a caller reading0as “no constraint” must add aNaNbranch - New licence feature
NcComposition(id 22) gates registering a non-built-in unit into aSoftNcRunnerpipeline and executing an NC-embedded C# script. Degradation is silent and functional — the unit is skipped with oneComposition--NotLicensed— so an unlicensed installation produces a different simulation, not an error - Packaging: x64 only; the shipped machine-tool packages are renamed and now carry the
.defaultmarker (MachineTool/Table-B1.default,MachineTool/CT-350.default), so a project that refers to one by its earlier path must be repointed; HiNcServer pins request localization to English and HiNcRcl drops the inertHiNC:DisplayEngine:FontFilekey
Some results change without any code change — the pivot-transform anchor, a G68 rotation that was a 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 Results that change on upgrade.
New in this release
- Siemens SINUMERIK programs replay end to end — real
.mpf/.spffiles rather than an ISO subset: modal vocabulary andT="name"tool calls, an expression evaluator over R-parameters and$-system variables, programmable frames and$P_UIFR,TRAORIRTCP andCYCLE800swivel, subprogram andMCALLcycle calls, full control flow with iteration watchdogs, theAC()/IC()/DC()per-word coordinate functions and the coded-position family - Heidenhain plays both dialects on one preset — klartext motion, datums, tool calls, arcs and
cycles; Q-parameter evaluation with FN 9–12 conditional jumps; the
PLANE/FUNCTION TCPM/M128tilt and RTCP stack; subprogram andCALL PGMcalls; post-processed spellings written without separators; and the DIN/ISO dialect with its absoluteI/J/Karc centres - Fanuc Custom Macro B and polar interpolation —
#varexpressions,IF/GOTO/WHILE,M98/M99subprograms andG65/G66macro calls;G12.1/G13.1polar coordinate interpolation withG41/G42compensation on the hypothetical plane - SoftNcRunner is the default NC pipeline. See NC Parsing Engine for its architecture and the per-brand support matrix
- NC optimization runs on that pipeline — not finished on this line, see Adoption status above — regenerating text as anchored token edits over the verbatim source block, so lines the optimizer does not touch round-trip byte-identically. Output follows the source's decimal digits and is written back in the source file's encoding, so a GBK or Big5 program keeps its comments
- Cutter-location files drive a real machine chain, not only a
ClMillingDevice, and a played CL program converts to Fanuc NC through ConvertClToNcFiles - Milling physics moved into the native kernel — engagement, force and the sequential thermal chain — with the tool's scalar physics frozen once per session into MillingToolPhysicsPack, which also makes force waveforms reproducible between two plays of the same program
- Session commands declare themselves through CommandCatalogAttribute and CommandFieldAttribute, so a generic editor renders them without a hand-written form; the HTTP surface answers a no-session or no-project call with 409 and an ApiActionResult envelope carrying the call's notifications
- Diagnostics carry a template and its arguments, so a front end can re-render a notification in its own language, and repeats fold into one per-run summary instead of one message per block
- Shipped resources carry a
.defaultmarker distinguishing system territory from user files, and HiNc-Resource ships the five brand controller presets and three coolant presets so those load browsers start populated - A parser configuration is a file, and it is shareable. NcRunnerSuit bundles a runner with its per-case data as one loadable unit, and per-case data now travels as proxy placeholders that resolve against the owning project — so one controller configuration is no longer welded to the job it was first built for
- A long program no longer degrades as it plays. A dead equality guard made the session append an NC-optimization option entry for every played act instead of only at change points, and reading the last one walked the whole map — together, quadratic. On a 2.35-million-line Siemens program the per-100,000-line rate now stays flat instead of climbing from 73 s to about 11 minutes. It applied to every runner, including sessions doing no optimization at all
- Performance and footprint, measured — physics in the native kernel takes a paired play from 59.3 s / 16.1 GB allocated to 40.6 s / 3.4 GB; building the topology of a large STL is linear instead of quadratic in triangle count (18.7× at 300k triangles, and it was 99.6% of the load); 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 Performance and footprint
- Stability and data integrity — the native crashes from disposing a display or geometry object still in use, the intermittent “No cut / No data for step” on freshly-simulated steps, the project-file race between a Load and a Save, and non-reproducible milling-force waveforms are all fixed; large geometry now builds its display topology off-thread instead of freezing the UI
HiNc Packages Version 3.1.175
- WorkpieceService file IO now takes relative paths and resolves them against a base-directory
Func<string>injected by LocalProjectService — the runtime-geometry write/read no longer requires the caller to pre-combine an absolute path.WorkpieceService.ReadRuntimeGeom(nowReadMeshedGeom) now returns whether the source file existed (the not-found notice moves to the calling shell) - Rename runtime-geometry mesh-export methods to the
Export*convention (STL/OBJ/PLY are foreign interchange formats, not native writes):WriteRuntimeGeomToStl/Obj/Ply→ ExportRuntimeGeomToStl / ExportRuntimeGeomToObj / ExportRuntimeGeomToPly; the session commandWriteRuntimeGeomToStlCommand→ExportRuntimeGeomToStlCommand(now ExportMeshedGeomToStlCommand) keeps the old<WriteRuntimeGeomToStlCommand>element name as a back-compat alias so existing projects still load
HiNc Packages Version 3.1.173
- Improve Mrr_mm3ds 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
- Add AlignWorkpieceProgramZeroToIso 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 AlignWorkpieceProgramZeroToIso extension)
- Drop gRPC plumbing from the HiNc package: remove
Hi.Grpcs.*ClStrip/Player service runners and protos,MachiningProjectGrpcServer,MonitoringPlayer, andUniversalNcMonitorClient; foldCsvRunnerConfigback intoCsvRunner0(gRPC services now ship in HiNcRcl / UJoinRcl)
HiNc Packages Version 3.1.172
- Replace implicit XFactory registration (private
static <ClassName>()constructors +_ = X.XNamewake-up touches) with explicitpublic static void Reg(XFactory factory = null)methods across ~270 classes. XFactory becomes an instance class with a process-wideDefaultsingleton;Generatorsis renamed fromRegsand now an instance property; the delegate type is renamedXGeneratorDelegatefromGenByXElementDelegate. Composite types chainX.Reg(factory)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//legacy aliasescomment. Entry points (web service, win-desktop, test fixtures) must call Reg once at startup before any project XML is deserialized — registration no longer happens by accident when the type is first touched. See XML IO.
HiNc Packages Version 3.1.171
- Rename
RuntimeApi→ SessionShell (the runtime entry point exposed to scripting);IShellCommand→ISessionCommandandRuntimeController→SessionShellController; theHi.ShellCommandsnamespace moves toHi.SessionCommands, and every command implementer'sRun()parameter renamesscriptApi→sessionShell - Tri-state milling-physics contract: MachiningStep physics getters converge on a tri-state result, non-null MillingPhysicsBrief on no-cut steps under
EnablePhysics; silently skip thermal physics on null FluteMaterial / WorkpieceMaterial; lazy first-equip warning; align relief-face null-sentinel across NoCut + producer (in NcOpt and forces) - Rename
IMachiningStepHost→ IMachiningService (drops theICsScriptApiseam) - Fixes: rotary IK round-trip anchored to pre-FK interpolated angle;
ForceAccelShot.ReadRowsskips blank lines
HiNc Packages Version 3.1.167
- Introduce SoftNcRunner as a pluggable NC parser/runner replacing the legacy
HardNcRunner, opt-in at the time via EnableSoftNcRunner. It became the default pipeline in 3.2 — see NC Parsing Engine - Extend coolant model to CoolantMode Flood/Mist/Off and refactor CoolantHeatCondition /
MillingTemperatureUtilfor multi-mode coolant - Bind session events to MachiningSession lifetime: SessionStepBuilt, SessionStepSelected, SessionSyntaxPieceRan, SessionSourcedActEntry (legacy aliases kept as
[Obsolete]); add RegisterWriteSyntaxPieces / RegisterWriteSyntaxPiecesWithActs for syntax-piece debug tracing - Add ProjectApiVersion carrier through XFactory deserialization for project-XML version negotiation; resolve Workpiece through a lazy
Funcgetter in WorkpieceService
HiNc Packages Version 3.1.162
- Refactor message management into three independent categories: Diagnostic (
IProgress<object>), UI Notification (MessageBoardUtil), App Log (ILogger); removeMessageUtilclass entirely and removeExceptionUtil.ShowException/ExceptionUtil.OnShown(see Message Management) - Thread
IProgress<object>through XFactory deserialization chain and MachiningProject loading; removeGenModeenum entirely (see XML IO) - Add ActionProgress<T>.FromLogger to bridge
IProgress<object>APIs toILogger - Rename
ShowIfCatched→ CatchExceptions with explicitAction<Exception>handler; removeRoutineBlocker0 - Extract WorkpieceService from Workpiece for runtime geometry operations
- Update ISO coordinate rendering for 3+2 axis machines: coordinate position now uses
IsoCoordinateEntryDisplayeewith full machining chain anchor instead of table-buckle-only anchor - Rename
SessionMessageHost→SessionProgresson both ShellProgress and ShellProgress (SessionShell.SessionMessageHostis kept as[Obsolete]) - Remove obsolete
HiLoglogging utility andDynamicMachiningProjectDisplayee0
HiNc Packages Version 3.1.160
- Fix NC optimization R-format arc interpolation with negative R values (follow-up to v158 R-format arc fix)
- Fix cubetree construction defect when a triangle edge passes through a wire corner
- Mech Builder: geometry (STL) file picker for anchored transformation now offers Project directory in addition to Resource directory.
- Rename XML IO utilities:
XmlSourceAndFile<T>→ FileRefSource<T>,CombineAsSubDirectory→ GetResourceDirectory,MakeXmlSourceWithRebaseFile→ MakeXmlSourceToFileRef
HiNc Packages Version 3.1.158
- Fix G53.1 tool height compensation behavior: replace
NcEnv.SetToolHeightCompensationOnFeatureNormalconfiguration with automatic detection via NC flag state - Make EnableIntegerShrinkOnPositionCommand configurable via project settings (previously hard-coded by CNC brand, now defaults to
falsewith XML IO support) - Fix NC optimization splitting R-format arcs (G02/G03 with R parameter) by converting to IJK format, since R sign meaning does not apply correctly to individual fragments
- Fix step.csv reading crash on null or malformed values
- Fix XML IO sub-base directory not applied in some project file operations
- Improve CSV actual time parsing to support
DateTimeformat in addition toTimeSpan(see Workflow: Basic Machining Simulation) - Fix CSV title parsing to trim surrounding quotes
HiNc Packages Version 3.1.156
- Fix G68 coordinate rotation transformation for non-origin rotation centers
- Fix NC optimization arc/circle offset when splitting arc fragments across multiple lines
- Fix optimization rotation code jumping at ±180° cycle boundary by applying cyclic angle comparison
- Fix RTCP on unmatched tool offset
- Fix blocking issue when time-mapping file not found
- Fix FlagsText always null after NC parser refactoring
HiNc Packages Version 3.1.150
- Add cubetree geometry defect scanning (ScanRuntimeGeomInfDefect) and clearing (ClearDefectDisplayee) for detecting and visualizing geometry anomalies in workpieces (see Workflow: Geometry Validation)
- Upgrade internal fraction representation to float128 precision for improved cubetree geometry accuracy and numerical stability
- Refactor messaging system from
IMessageHostto standard IProgress<T> pattern; ShellProgress (formerlySessionMessageHost) now implements IProgress<T>, and all messaging methods renamed fromAdd*toReport*(e.g.,AddProgress→MultiTagMessageUtil.ReportProgress) - Fix cubetree initialization crash
- Improve postprocess precision by applying sin–cos parameterization instead of direct angle-based formulation for rotary axis numerical solving in XyzabcSolver
- Add asynchronous anchor solid preparation on project load for improved startup performance
HiNc Packages Version 3.1.144
- Enhance Siemens Sinumerik support:
- Siemens CYCLE800 coordinate transform and reset
- Siemens MCALL CYCLE81() drilling cycle parsing
- Siemens TRAORI/TRAFOOF/SUPA flag parsing
- Fix Siemens TRAFOOF plain rotation coordinate transform issue
- Fix Siemens coordinate transform for successive file running
- Fix relief face collision floating-point precision issue
- Replace MongoDB with SQLite for local step data storage (significant package size reduction)
- Add machining and motion resolution dynamic adjustment functions
HiNc Packages Version 3.1.106
- Rename mapping API for clearer naming:
ReadCsvByTimeInterpolation→ MapSingleByCsvFile (one-to-one mapping)MapByActualTime→ MapSeriesByCsvFile (one-to-many mapping)
- Rename CSV column prefix
SpindletoHolderfor sensor data mapping - Unify CSV column tags to MappingUtil for consistent data mapping
- Fix ChartRange manipulation to be time-based instead of step-based for more accurate time chart display
- Tune thread priority for machining parallel processing to improve UI responsiveness during simulation
- Various code cleanup and improvements
HiNc Packages Version 3.1.102
- Separate resource files (Resource, wwwroot, Doc) to HiNc-Resource nuget package for smaller package size
- Add ScaledFeedPerCycle function for scaled feed-per-cycle machining motion resolution
- Upgrade target framework to .NET 10.0
- Various code cleanup and improvements
HiNc Packages Version 3.1.100
- Refactor project architecture: split runtime functions from MachiningProject to LocalProjectService for better separation of concerns
- Improve MillingTraining module with separate lead and result parameter templates for more accurate cutting parameter training
- Separate C++ library for code protection
- Add UTF-8 file path support for runtime geometry IO operations
- Improve
CsvRunner0with enhanced time mapping pattern - Various architecture improvements and bug fixes
HiNc Packages Version 3.1.91
- Add NcOptimizationEmbeddedLogMode to control embedded log detail level (None/SimpleLog/FullLog) (see Embedded Log Comments).
- Fix bug of
NcOptProcduplicated feedrate assignment
HiNc Packages Version 3.1.90
- Rename optimization log API EnableIndividualStepAdjustmentLog
- Fix crash from workpiece displaying with specific mechanical topology setting
- Improve
.flatproc.logoutput to maintain step order during parallel computation - Various stability improvements and bug fixes
HiNc Packages Version 3.1.86
- Re-build
NcOptProcwith stricter optimization logics - Add optimization logging features (see Optimization Logs):
.flatproc.logfile output for optimization process analysis- Embedded log comments in optimized NC file marking source lines with
(src)suffix
- Fix cutting depth and width accuracy by bounding-box method with workpiece surface
- Fix collision check error during concurrent changing collidable object
- Various stability improvements and bug fixes
HiNc Packages Version 3.1.84
- Optimize memory usage by shrinking map-size of clStripPos
- Fix design pattern of cutting parameter training module (MillingTraining)
- Add LoadCuttingParaByFile function to load cutting parameters from file
- Improve
CsvRunner0actual time parsing: automatically calculate step duration from actual time when duration is not provided - Enhance message handling in SessionShell by unifying ShellProgress usage
- Improve optimization performance with better task scheduling
- Various performance improvements and bug fixes
HiNc Packages Version 3.1.75
- Add actual time tracking functionality (ActualTimecode)
- Various stability improvements and bug fixes
HiNc Packages Version 3.1.74
- Rename class
MillingCutterOptLimitto MillingCutterOptOption - Add physics simulation function for relief face collision detection (ReliefFaceCollidingSpeed_mmds, IsReliefFaceCollided) and optimization (EnableLimitByReliefAngle)
- Add
UpdateNcOptOptionfunction to step processing - Fix step ordering bug from concurrent processing
- Fix ClStrip shrinking to zero issue