Table of Contents

Upgrading from 3.1.175 to 3.2

Rebuild every assembly compiled against 3.1.175.

Packages

  • The 3.2 line is eight packages: HiGeom, HiLicense, HiDisp, HiCbtr, HiMech, HiUniNc, HiNc and HiNc-Resource. They target .NET 10 (net10.0), x64 only.
  • A set is named by its HiNc version; each package keeps its own build number. The packages reference each other as 3.2.*; pin every package when a build must be reproducible.
  • Settings: the package source is https://gitea.superhightech.com.tw/api/packages/HiAPI/nuget/index.json; customers of the mainland mirror keep the address issued with their account. Where a machine registered the source at an earlier address, point it here with dotnet nuget update source HiAPI --source https://gitea.superhightech.com.tw/api/packages/HiAPI/nuget/index.json (use the name it was given; its credentials stay), and where a nuget.config names an earlier address, write this one in its place (Getting Started).
  • Removed: Hi.WinForm and Hi.WpfPlus, last published beside HiNc 3.2.31: host DispEngine in your own control, or keep the whole set at 3.2.31.
  • Settings: an executable built on the packages must not be marked CET-compatible; HiDisp sets CetCompat to false unless the project sets it.
  • Settings: ResourceSeeder.Seed may refresh or delete resources marked .default (AlTiBN.default.CoatingMaterial); keep your own files unmarked and strip the marker on save-as.

Before anything else

  • Call LocalProjectService.Reg once at startup, before any project XML is deserialized. XFactory.Generators is now a ConcurrentDictionary.
  • Call LocalApp.AppEnd() last, after disposing the LocalProjectService and every DispEngine (Ending the Program).
  • Message parameters take IProgress<IMessage> instead of IProgress<object>, the XFactory chain included. MultiTagMessage and MultiTagMessageUtil are removed.
  • Messages arrive on ShellProgress, StepDiagnosticProgress and NcDiagnosticProgress; NC optimization and writeback report on IMachiningService.NcManipulationDiagnosticProgress.
  • BeginSession() creates LocalProjectService.SessionShell (null outside a session) and a new ShellProgress: subscribe through OnShellMessageAdded / OnShellMessageCleared or MessageCollector.
  • MachiningSession takes its IMachiningService host in the constructor; IMachiningService has a PacePlayer property.
  • PlayNcFile / RunNcFile take (file, NcKind kind = NcKind.Auto) and play any program: .cl, .cls, .clsf and .csv files as CL or CSV, the rest as brand G-code.
  • PlayBrandNcFile / RunBrandNcFile play brand G-code only. The same rename applies on LocalProjectService, SessionShellController and MachiningSession.
  • Do not obtain a DispEngine while DispEngine.IsGlAvailable is false (no usable OpenGL).

Renamed

3.1.175 3.2
Vec3d, Vec2d, Box3d (the math class), Tri3d, DVec3d, Box2d, Mat4d, Hi.Native.vec3f vec3d_t, vec2d_t, box3d_t, tri3d_t, dvec3d_t, box2d_t, mat4d_t, vec3f_t; compound, XML and wire kind names keep their spelling
in-place members of these types (Normalize, Set, Expand, Translate, Transform, …), v.At(i) = x, tri.ps[i] the value-returning form, assigned back (v = v.GetNormalized(), Expanded, Translated, GetTransform, WithAt); v[i] = x; tri[i]
Mat4d.Set, SetIdt, Scale, Inverse, Transpose, SetNoTrans, Transform, FixFloatingZero, AdjustSingularValueByTolerance the constructors, mat4d_t.Idt, GetScaleMat, GetInverse, TransposeMat, NoTransMat, GetTransform, GetFloatingZeroFixed, GetSingularValueAdjusted; m[i, j] to write
members that answered null (Asmb.GetMat4d, Workpiece.FixtureToProgramZeroMat4d, GetRgb, GetCoordinateOffset, IsoCoordinateAddressMap.Read, GetMachinePositionAtTableBuckleZero, PairZrUtil.Get…, …) their Try… form (TryGetMat4d, TryGetFixtureToProgramZeroMat4d, TryRead, TryGetMachinePositionAtTableMountZero, …)
WorkpieceService.…RuntimeGeom… …MeshedGeom… (GetRuntimeGeom → GetOrBuildMeshedGeom); ResetMeshedGeom takes no ClStrip; script names keep hidden aliases
IContourTray, UniformContourTray, FreeContourTray, MillingCutter.FluteContourTray IFluting, UniformFluting, FreeFluting, MillingCutter.Fluting
FluteContour.SetupAngle_deg / ShiftAngle_rad, BaselineContourShiftAngle_deg FluteOffsetAngle_deg / FluteOffsetAngle_rad, BaselineFluteOffsetAngle_deg; do not copy an old flute angle into the new MillingTool.SetupAngle_deg
web fluting field setupAngle_deg fluteOffsetAngle_deg; a request still sending it writes an offset of 0
…Buckle (TableBuckle, GetTableBuckle(), ShowTableBuckle, show-…-buckle, SpindleBuckleAnc, …) …Mount; code and requests take no old spelling, files with it still load
CodeXyzabcMachineTool / CodeXyzabcMachineToolUri GeneralXyzabcMachineTool; the old XML names still load
IXyzabcChain, MachiningActRunner.XyzabcChain IXyzabcMachineTool, MachiningActRunner.XyzabcMachineTool
GetMillingEquipment GetMachiningEquipment, which answers the runtime face; MachiningProject.GetMillingEquipment() is GetSetupEquipment(), which answers the authored one
api/Player/… and api/player/… (strip-chart, cl-strip/…, messages, …), api/Preference/player-div-config; the /playerStatusHub hub, its PlayerStatusUpdated message and the playerStatus field api/Execution/… and api/execution/… (strip-chart, cl-strip/…, messages, …), api/Preference/execution-div-config; /executionStatusHub, ExecutionStatusUpdated, executionStatus
IControlRunner, RunControlLines INcRunner, RunNcLines
NcDiagnostic.Text NcDiagnostic.Notification
Feedrate_mmds / Feedrate_mmdmin of StateActRunner, ActFeedrate, ActRapid; MachineMotionStep.Feedrate_mmds CommandedClFeedrate_mmds / CommandedClFeedrate_mmdmin; the tip feedrate is ActualTipFeedrate_mmds; MachiningStep.Feedrate_mmdmin keeps its name
SoftNcRunner.NcDependencyList PipelineNcDependencyList; the resolved list is GetEffectiveNcDependencyList()
WorkpieceService.HasDiff HasDiffOverlay
Hi.Common.ResourceUtil (HiNc) ResourceLayout
NativeTopoStld, NativeTopoStlfr, Solid.NativeSmoothTopoStl, Sweptable.NativeTopoStl Hi.Geom.Topo.NativeTopoStl3d, NativeTopoStl3wfr, Solid.SmoothTopoStl3d, Sweptable.NativeTopoStl3d
ITimeGetter.Time ITimecoded.Timecode
ClStrip.DrawingRefreshing DrawingRefreshed
CbtrPickable.CleanLinked* CleanAttached*
AccumulatedTime, BackgroundTemperature_C / _K, SessionShell.GetMillingStep EndTimecode, AmbientTemperature_C / _K, GetMachiningStep; the old names stay [Obsolete]
MillingPhysicsBrief; MillingStepLuggage (Hi.MillingSteps), ResetMillingStepLuggageDb, SqliteStepStorage.…MillingStepLuggages MillingForceBrief; Hi.MachiningSteps.StepLuggage, ResetStepLuggageDb, …StepLuggages; a mission script may keep the plain names MillingPhysicsBrief and MillingInstance
SeqPhysicsBrief SeqPhysicsState; a mission script may keep the plain name SeqPhysicsBrief

Changed shapes

  • The renamed …_t types are structs: assignment copies, and a write through a property (st.Trans.Z += 10, mission scripts included) is CS1612; assign a whole value.
  • No vector is null: an unset one is NaN, an optional one is vec3d_t?, dvec3d_t? or mat4d_t? (read it with is { } v or ??). new mat4d_t() is the identity, default(mat4d_t) the zero matrix.
  • A geometry slot holds the class Box3d: it wraps a box3d_t in Box, has no math API and compares by reference (a.Box == b.Box compares values).
  • SetupEquipment is the authored, saved equipment, and an equipment file (root element <MachiningEquipment>) loads as one: XFactory.GenByFile<SetupEquipment> reads it, and so does a read as IMachiningEquipment or object; asked for as MachiningEquipment or IGetMachiningEquipment it answers the runtime face built from it, whose AuthoredFace is the saved one. MachiningEquipment is rebuilt from the authored face for the run (SetupEquipment.MaterialiseMachiningEquipment(baseDirectory, progress)), the authored face's parts shown on it as copies; its MachiningChainFile and SpindleCapabilityFile are the authored face's (on one made with new MachiningEquipment(), which has no AuthoredFace, they read null and a write throws).
  • LocalProjectService.MachiningEquipment takes a MachiningEquipment read from a file, with what was written on it since but for the tool (its AuthoredFace becomes the project's SetupEquipment; read the property again after the assignment); one made with new MachiningEquipment() is refused: set MachiningProject.SetupEquipment and call NotifySetupEquipmentEdited().
  • A workpiece, fixture, machine chain, table transformer, environment value, MachiningChainFile or SpindleCapabilityFile written on LocalProjectService.MachiningEquipment, or on a face read from a file and assigned to it, is written back to the project's SetupEquipment, and the runtime face follows (rebuilt, but for an environment value): take it from the property again after each write. A tool written there is not: the next rebuild mounts the setup's tool selection again. Nor is a material or cutting parameter assigned on a runtime face's workpiece: the run takes the setup's from the next play on, so assign it on LocalProjectService.Workpiece. With a session alive, a part or the table transformer reaches the SetupEquipment at the next session boundary (the next play, a reset, EndSession) unless the setup's member was written since; a save before then saves the setup as it was and says so. A face kept from a closed project, or from a SetupEquipment since replaced, writes nothing back and says so.
  • A workpiece, fixture or machine chain belongs to one equipment at a time: a part assigned from one equipment to another leaves the first (after LocalProjectService.Workpiece = equipment.Workpiece, equipment.Workpiece is null, so read it once), where 3.1.175 let both hold it; a part of the project's SetupEquipment that another equipment takes leaves the project.
  • The runtime face follows SetupEquipment by rebuild: after editing a part of it in place (its geometry, a transformer), call NotifySetupEquipmentEdited(); a material or cutting parameter replaced on its workpiece reaches the next play, or RecomputeStepPhysics, without it. The runtime face's workpiece is given the setup's own material and cutting parameter objects, not copies, so a field written in place on them needs no call, and a refused recompute does not take it back.
  • StlFile.ExpandToBox3d answers the bounds taken when the mesh was loaded or assigned to StlFile.CacheStl: after changing such a mesh in place, assign it to CacheStl again.
  • new GeneralXyzabcMachineTool(), new Fixture() and new Workpiece() build empty mechanisms; CreateFromChainCode() and CreateDefault() build the default layout.
  • Brief values that need the material, the spindle or the tool are Get… methods that take it (MillingForceBrief.GetChipMass_g(material), SeqPhysicsState.GetThermalYieldRatio(cutter, ambientTemperature_K), …); MachiningStep keeps them as properties.

Removed

Removed Use instead
GeneralXyzabcChain, CodeXyzabcChain, IGetXyzabcChain, IMachiningChainSource, MachiningEquipmentCollisionIndexPairsSource, the machine's chain members and constructors (XyzabcChain, TableAnchor, …) the machine: GeneralXyzabcMachineTool.CreateFromChainCode(), its TableMount, ToolMount, AxisX …; new XyzabcSolver(machine)
Fixture.GeomToTableTransformer, GeomToWorkpieceTransformer, SetWorkpieceTransformationToGeomTopCenter, Workpiece.WorkpieceGeomToProgramZeroTransformer, WorkpieceGeomToFixtureBuckleTransformer, the …Branch properties Branch.Get(fixture.GeomAnchor, fixture.TableMount).Transformer; a pose through Asmb.TryGetMat4d
Hi.Native.vec3d, tri3d, box3d, mat4d, vec2d, box2d the Hi.Geom values
NativeTopoStlfr.Display, ExpandToBox3d the bounds of the Stl it was built from
MachiningEquipment.GetToolTipXyzOnProgramZero() GetProgramCl()?.Point
MachiningEquipment's XElement constructor and MakeXmlSource; IMakeXmlSource on IMachiningEquipment MachiningEquipment.ReadFromAuthoredXml(xml, baseDirectory, relFile, progress) for the constructor; the same members of SetupEquipment (a face's AuthoredFace); SetupEquipment.MaterialiseMachiningEquipment(baseDirectory, progress) builds a MachiningEquipment from it
XyzabcUtil.GetNp, GetTransformationMat4d machine.GetAsmb().TryGetMat4d(machine.GetTableMount(), machine.GetToolMount(), out var m); new dvec3d_t(m) for GetNp
MachiningEquipmentCollisionIndex.WorkpieceRuntimeGeomGetter IMachiningEquipment.WorkpieceCollidable
AnchoredCollidablePair, IGetAnchoredCollidablePairs, IGetDefaultCollidablePairs CollisionIndexPair, IGetCollisionIndexPairs
MacroMotionValve a larger FixedMachiningMotionResolution.LinearResolution_mm
CsvRowSemantic and the earlier CSV runner classes GeneralCsvRunner
IndexedSentence your own ISentenceCarrier
MixedIndex FileLineIndex comparison
MachiningProjectDisplayee, IsoCoordinateEntryDisplayee, HeidenhainCoordinateEntryDisplayee, UserConfig, UserService, PlayerDivConfig the ILogger-only LocalProjectService constructor; copy the displayees from Hi.Sample
the HiNC-2025-webservice sample's DemoColorGuide a color tree (StepColorTree; Step Colors)
CultureUtil.SupportedCultureNames, SetCurrentCulture(string) CultureUtil.English, SetCurrentCultureEn()
NcFileListCommand a ListCommand of NcFileCommands; projects convert on load
PostExecutionCommand's …RuntimeGeom… switch and file template, and their routes RecordMeshedGeomCommand, ExportMeshedGeomToStlCommand
MillingCutter's resolution members, IPolarResolution2dSourceProperty, PolarResolution2dSource Solid(IGetStl, PolarResolution2d); MillingCutter.SetShaperStlResolution / SetStrutStlResolution
GetStl() on the shaper profiles GenStl(resolution), or GenStl(null) for the default
MillingTool.ObservationRingRadius_mm; ringRadius_mm in api/ToolHouse/{id}/observation, which a PUT ignores nothing: the ring is sized from the tool, and a MillingTool drawn whole shows it; to leave it out, draw its Cutter and Holder rather than setting ObservationAnchorReference to None, which makes the bending moments about the sensor NaN
api/Vec3d, api/Mat4d, the routes that index a vector by key (IndexTrans, IndexAxis, api/Box3d/IndexMin, …) the owner's route (UpdateTrans, UpdateAxis, api/Box3d/Update, api/StaticFreeform/Update); StaticTranslation/NewWithValue
the api/Fixture / api/Workpiece transformer and geometry routes (UpdateGeomToProgramZeroTransformer, …) api/mech/equipment-topology (graph, …/branch/{id}/update-transformer, roles/{owner}/{role})
api/general-mechanism api/mech/machine-tool/load, …/xml, api/mech/equipment-topology/machine-tool/…
the SignalR hubs /sessionMessageHub and /selectedStepInfoHub /shellMessageHub, /ncDiagnosticHub, /stepDiagnosticHub and /ncManipulationDiagnosticHub; GET api/Execution/selected-step-info
MillingInstance, ISuccessivePhysicsBriefAccessor the same values on MachiningStep (IsTouched, Mrr_mm3ds, TryGetMillingForceBrief, TryGetSeqPhysicsState, …), where step.MillingInstance.… still compiles with a warning; new MachiningStep(…) takes a SubstractionBrief
MillingInstance.BoundingBoxOnToolRunningCoordinate MachiningStep.CuttingDepth_mm
MillingPhysicsBrief.GetIndexAtMaxCuttingForce the rotation sample with the largest force, read from the step's force luggage (TryGetMillingForceLuggage, the largest of its CuttingForcesToToolOnToolRunningCoordinate_N); MillingForceBrief.MaxForceOnToolRunningCoordinate_N gives the force itself
SeqPhysicsBrief.InstantFlankWearDepth_um the increase of SeqPhysicsState.AccumulatedFlankWearDepth_um over the state the step started from (the step's value minus the previous step's; from 0 on the first step after a tool change)
SeqPhysicsBrief.WorkpieceDermisTemperatureList SeqPhysicsState.WorkpieceSurfaceTemperature_K (its first node; the deeper nodes have no replacement)
MachiningStep.MillingStepLuggage, IMachiningService.MillingStepLuggageReader, LocalProjectService.MillingStepLuggageReader, SqliteStepStorage.MillingStepLuggageRow one step: TryGetSubstraction, TryGetLayerMillingEngagement, TryGetMillingForceLuggage on the step or on IMachiningService (a LocalProjectService answers them through that interface); a range: SqliteStepStorage.FindSubstractions, FindLayerMillingEngagements, FindMillingForceLuggages, FindStepLuggages
MachiningStep.FlexDictionary, FlexDictionaryUtil, IFlexDictionaryHost<T> step[key], which keeps a number (read back as double), a bool (read back as 1 or 0) or a string; many steps at once: SessionShell.WriteStepVariables, ReadStepVariables
DistributedQueueTaskScheduler, DistributedQueueTaskStarter QueueTaskScheduler, which starts its own workers
QueueTaskScheduler.WaitAll Task.WaitAll on the tasks started on the scheduler
UnmanagedSubstraction.PreserveBegin, PreserveEnd, preserveCount Dispose() (or using) where the last PreserveEnd would have reached zero
ParallelBulkReader<TData> ReadBulkDelegate<TData> with SegmentedReadUtil; SequentialBulkReader<TData> stays
SoftNcUtil.ParseDouble SoftNcUtil.GetParsedDouble

Removed with no replacement: ReflectedXyzabcChain, SimpleSessionCommand, LsStl, FluteZData, MillingForceUtil.AnglePack, the z-to-dz LayerMillingEngagement constructor, MillingPhysicsBrief.YieldStressMinHeight_mm, MillingPhysicsBrief.MaxCompetingCuttingForceOnToolRunningCoordinate_N, MillingPhysicsBrief.GetMaxAbsForceSlope_NdDeg, MillingGeomBrief, IMillingGeomBriefAccessor, IGetMillingGeomBrief, MachiningStepUtil, StepMotionSnapshot.AnchorTransformDictionary, IMotionValve.Finish, ClMachiningValve.MotionValve, NcArgSiemensFrame.Reset, Box3d.NoInit, Box2d.NoInit, the useRef / shareFields parameters, the parameterless RgbTreat constructor, the generic NcFlagUtil.GetNcFromSyntax<TVec>, GL.glFenceSync, glGetDoublev, glGetDoublei_v, glGetDoubleIndexedvEXT, glIglooInterfaceSGIX, glPNTrianglesfATI, glPNTrianglesiATI, POST /api/project/log-message, POST /api/Player/messages/export.

Settings and defaults that changed

  • LocalProjectService.EnableSoftNcRunner defaults to true; HardNcRunner is the opt-out.
  • NC-embedded commands are marked @@, or @@^ to run after the block, inside the controller's own comment; rewrite programs that use ;@ or ;#.
  • A controller saved in a project keeps the syntax list it was saved with; re-create it from its brand preset, or an NcRunnerSuit built from it, for the current syntaxes. The Fanuc preset's SnapshotSyntax entries default to IsEnabled = false.
  • On SoftNc a SINUMERIK rotary axis rolls over, as a modulo axis, only when its MD30310 row under Parameters (Native) › Axis Parameters (Integer) is 1 (SiemensMachineDataTable.MdRotIsModulo); without the row it takes the control's factory value 0, and its plain and AC() words are positions as written. Add the row for each rotary axis that rolls over on your machine, and an MD30455 row (MdMiscFunctionMask) where your machine sets its bits: bit 2 (4) where a plain G90 word takes the shortest way, bit 0 (1) where a word outside 0–359.999° is converted instead of alarming. Coded positions and an equidistant indexing definition wrap round only on a modulo axis.
  • YieldingStressRatio on the brief and the step is NaN, not 0, when it cannot be evaluated.
  • A cutter whose APT values contradict each other removes no material and runs no cutting physics, and loading the project reports it; correct the values MillingCutter.GetShaperProfileIssues() names.
  • A cutter made by new MillingCutter() or saved with an empty MillingCutterOptLimit carries the default limit, so NC optimization optimizes the lines it cuts; set the limit's EnableOpt to false to keep their source feeds.
  • A material file without HeatConductivity_WdmK, Density_gdcm3 or HeatCapacity_JdgK leaves that constant not given, and the thermal model skips the material; add the element to keep its temperatures and wear.
  • A project keeps its own copy of the cutter, workpiece material, cutting parameter and spindle capability it loaded: load the shipped ones again to take their current values, and load a spindle capability saved before 3.2.47 from a legacy InsistentRatio contour file again from that file. A spindle capability saved as one power and one torque curve needs your spindle's short-time contours for its spindle temperature; one saved again by 3.2.51 or earlier may carry the 15- and 60-minute contours of TMV-720A-STD-8000RPM: replace them with your spindle's own.
  • Your own processing unit in a SoftNcRunner pipeline needs the licence feature NcComposition, or it is skipped; the API and scripts need none.
  • A SoftNc pipeline you compose yourself puts SpindleDirectionFallbackSyntax after LinearMotionSyntax; without it, a speed given with no direction leaves the spindle standing.
  • Localized step labels need the HiNc-Resource present catalogs (catalog.<lang>.json) in the host.
  • The shipped machine tools are MachineTool/Table-B1.default and MachineTool/CT-350.default, with the mechanism file Table-B1.GeneralMechanism, and the shipped holder is Holder/BT40-ER16-090.default.Holder; repoint earlier paths.
  • A mission script that no longer compiles runs none of its lines; rewrite it to the current API.
  • A step-built handler (SessionStepBuilt, LocalProjectService.MachiningStepBuilt or MachiningActRunner.MachiningStepBuilt) cannot play an act (PlayAct, PlayToolingTeleport, PlayClTeleport), wait for or dispose the runner, or call ResetRuntime, EndSession or the player's Reset: the call throws and is reported on that step, which is left without a result. A program play from it (PlayNcFile, …) is refused as a second play, and closing the project from it waits for the play to end, which may be waiting for that handler. Make such calls after the play.
  • A run (RunNcFile, RunNc) or an act (PlayAct, PlayToolingTeleport, PlayClTeleport, LocalProjectService.Act) from another thread plays nothing while a mission (playing, paused or between its commands) or a job such as the step-physics recompute holds the player, or while another thread plays the session; POST api/SessionShell/OptimizeToFiles writes nothing while the player runs or is paused. A request still answers 200 and Shell says why: make the call in the mission script, or after the run. Dispose an enumerator of RunNcFile or RunNc you walk by hand (foreach does).
  • ResetRuntime() or PowerReset() called inside the program being played — an NC-embedded @@ResetRuntime();, or a script's call in its own loop over RunNcFile — is refused and the program plays on: reset between two programs.
  • NC optimization over steps played across a PowerReset(), a switch of the controller brand or preset, or an EndSession() and BeginSession() that kept the steps writes nothing and says why: optimize before it, or clear the steps (ResetRuntime(), the player's Reset) and play again. From 3.2.55 on, RecomputeStepPhysics after such an EndSession() and BeginSession() answers that the earlier steps need a replay.
  • From 3.2.54 on, CloudLeaseClient.LoginAsync takes termsVersion and analyticsOptIn before its CancellationToken: name the token (cancellationToken:) where a call passes it by position.
  • A program played with no tool in the spindle builds no machining step, and the play says so at its first feed move; a step cut with no tool-house tool of its number (the project's own tool is tool 0 until the first tool change) has no feed per tooth, cutting force, cutter temperature or wear, and a change to tool 0 (T0 M06, TOOL CALL 0) with no tool 0 in the house keeps the tool and its number. Put a Manual Tooling command (ManualToolingCommand) naming the tool above the program in the mission, or a tool-change block such as T1 M06 at its start, adding the tool to the tool house first if it is not there.
  • Projects and machine-tool files saved by 3.2 do not load in 3.1; 3.2 cutter files need HiNc 3.1.175.5 there.
  • After rebinding a role of an installed part, call IMachiningEquipment.Rewire(); for a machine also regenerate the collision pairs and call NotifySetupEquipmentEdited().
  • Give each branch its own transformer (Clone()); one object assigned to a second branch moves there.
  • A host that builds MachiningEquipment itself sets WorkpieceCollidable, or pairs against the workpiece are not evaluated.
  • A class implementing IXyzabcMachineTool adds GetSpindleTransformer(); returning null keeps the machine as it played before. A class implementing IStructureMaterial answers YieldingStressLimit_MPa, or the yielding stress ratio of a cutter made of it reads NaN.
  • LocalProjectService.XyzabcSolver is null while mount w or t is unbound or the two are not connected.
  • LocalProjectService.InspectingQuantityFunc answers null for a step not filled yet; after InspectingKey changes, read again on InspectingSlotsScanned.
  • A step variable registered, or a CSV column named, like a built-in step property or with a key starting with MC. is refused and not written onto the steps, and registering a key again replaces it; rename the key or the header to keep it.
  • A selection's BeginSelection and EndSelection belong in one program and the subprograms it calls: a begin that no end has closed is dropped when the session starts its next program (a mission's next Program File, the next PlayNcFile), and an end in a later program maps nothing. Move both anchors into one program (Sensor Data Mapping).
  • LoadProject / ReloadProject do not fail on a missing STL or an unreadable referenced file; pass a message sink to receive these. XFactory.GenByFile, Gen and GenByChild return null for an unreadable <XmlSource> file, and for an element read as another type than the one asked for, which they report as an error on the message sink; GenListSkippingUnloadable skips such an element with a warning.
  • Web actions answer 409 with an ApiActionResult body when the session or project they need is missing, or while another project New, Load, Save, Reload or Close runs (ProjectFileBusyException in the API); cutter, tool-house and holder edits answer 409 with the code ToolEditRefusedWhileRunning while a run is in progress or paused. From 3.2.55 on, the brand and NC-runner switches (POST api/mech/soft-nc-runner/brand and update, LocalProjectService.ReadNcRunnerSuit) are refused, with 409 over HTTP, while a mission's program plays or is paused.
  • POST api/SessionShell/ResetRuntime and EndSession answer 409 with an ApiActionResult body while the player is running or paused (ResetRuntime--Busy, EndSession--Busy) or another thread plays the session (ResetRuntime--BusyAnotherThread, EndSession--BusyAnotherThread), BeginSession (BeginSession--Busy) while the player is running or paused with no session open, and POST api/SessionShell/Reset (Reset--Busy) while another thread plays the session, as POST api/Execution/reset does with { success: false, code, message }: stop the play or wait for it to finish, then call again. LocalProjectService.ResetRuntime, EndSession and BeginSession and SessionShell's three return bool (true: done, or nothing to do; false: refused and nothing done), SessionShellController's three and its Reset an ActionResult: a statement call compiles unchanged, a method group passed as an Action becomes a lambda; rebuild a host against the new package.
  • Under /api, a GET that no route serves, such as one to a retired route, answers 404 with an application/problem+json body, every HEAD answers 404, and any other method that no route serves answers 405. …/align-workpiece-program-zero answers 400 with the reason.
  • Web clients send POST to api/NcProgram/file-lines, api/StlFile/GetFileInfo, api/ObjectManagement/GetXml, api/mech/machine-tool/xml, api/Cutter/{id}/inner-beam and /upper-beam, api/FreeformHolder/Get and api/CylindroidHolder/Get.
  • PUT api/Controller/stroke-limit-xyz and stroke-limit-abc take exactly six values and max-rotary-speed-abc three; any other count answers 400 and writes nothing. The PUTs to api/mech/soft-nc-runner/machine-limits/{axis}, rapid-feedrates/{axis}, home-positions/{axis} and tool-change/{axis} take an axis their GET lists, in any letter case, and answer success: false with the listed axes for any other.
  • From 3.2.55 on, a step message such as Collision--Detected can name a step not built yet: GET api/NcProgram/sentence-of-step marks it notBuiltYet, and the step-variable and color-tree previews answer 400 with the code StepVariableStepNotBuiltYet / StepColorTreeStepNotBuiltYet for it.
  • POST api/SessionShell/TrainMillingPara and ReTrainMillingPara default outlierRatio to 0.1, as the script does.
  • With sign-in off, as shipped, the web application answers only localhost, 127.0.0.1 and [::1]: list other names in AllowedHosts, or turn sign-in on ("Enabled": true beside Auth:Users). It sends no CORS headers and does not redirect http to https.
  • The installed HiNC's program is HiNC-2025.exe from 3.2.45 on: point a .bat file or shortcut that still names the installation's HiNC-2025-webservice.exe at HiNC-2025.exe, or at HiNC.exe in a portable copy. An installation that other computers reach may bring up the Windows Security Alert once more after that update: let HiNC through Windows Defender Firewall again (Keeping HiNC up to date). From 3.2.55 on, its first update server is named hinc-1.superhightech.com.tw: an appsettings.local.json that blanks or reorders it under Update:Servers uses that name.
  • ToPresentDto payloads use the keys Type, Min, Max, Trans, Axis, …; update front ends that read them.

Values that change

  • G68 rotation; incremental programs with blank, comment-only, % or O-number lines; zero-length feed blocks that carry a new F; G41 / G42 under G18 / G19, or with a non-motion line between a corner and an arc; arcs with an end on their centre, such as an XZ or YZ arc under G17.
  • Siemens programs with frames, TRAORI, CYCLE800, R-parameters, subprograms, loops, G74 / G75, a D with no $TC_DP row, or a D given while the next tool is selected ahead of its M6.
  • Heidenhain klartext and DIN/ISO programs, notably incremental words, Q-parameters, datum shifts, PLANE, M128, M127, arc centres, a bare CYCL DEF 7.0, * blocks and TOOL DEF.
  • Fanuc-family programs with Custom Macro B, G12.1 / G13.1, G05 P, G70 / G71, a G04 X dwell, a dwell P with a decimal point, a P on G81, G82 or G89, G54.1 Pn / G54 Pn or G59.1–G59.9.
  • On SoftNc: G04 / G4 dwells in projects whose Fanuc, Mazak, Syntec or SINUMERIK controller was set up by 3.1.
  • On SoftNc, in projects whose controller was last saved by 3.1.171 or earlier: the #1–#33, #100–#499, #2001–#2200 and #5001 … variables Fanuc, Mazak and Syntec programs read, and, last saved by 3.1.169 or earlier, % and program-number lines.
  • On SoftNc: G43 / G43.4 with no H take the modal H (H0 until one is written); the block after M02 / M30 cancels tool length, tilt, G41 / G42, G81–G89 and G12.1, and the one after END PGM a CYCL DEF or M89; a rotary-only G53 under RTCP holds the linear axes; M98, M198 and G65 calls nested deeper than MaxCallDepth, and the call level of G66 bodies.
  • On SoftNc: rotary words under modal G91 are increments; G81–G89 repeats with A / B / C words or under G91, and cycles whose G98 / G99 follows the cycle code; Heidenhain G28 and CYCL DEF 8 mirror; stroke limits set only in the legacy machine-limits boxes are checked.
  • On SoftNc: rotary moves of exactly half a turn; position variables (#5001 …) and radius compensation after G53.1, PLANE, CYCLE800 or M140 MB under a work offset, a tool length or a pivot; a program whose NC-embedded script plays another (PlayNc).
  • On SoftNc: SINUMERIK programs with absolute rotary words, ACP() / ACN() or coded positions; on other controls, a rotary axis whose two stroke limits are set less than a turn apart, its words and the angles a tilted plane solves for it.
  • On SoftNc, a tool change moves the axes to the tooling position; a speed given with no direction runs as clockwise from the first feed move, and an S0 stands the spindle.
  • Machines with a workpiece-side linear axis; plain XYZ moves of table-side rotary programs; G68.2 with A / B / C on fewer than three rotary axes; five-axis CL on ClMillingDevice; CL playback, whose steps follow the CL path and take the feed of a FEDRAT written before the first GOTO; the steps a play opens with along the tool axis, such as a CL file's first plunges, after an earlier play in the same process.
  • Inverse kinematics (XyzabcSolver): G53.1, G68.2, CYCLE800, PLANE SPATIAL and LN answers, tilts from the rotary pole, and the branch chosen inside the travel.
  • A new session starts the machine at its home position, rotary axes included. On SoftNc, rotary axes with Rapid Feedrates or Home / G28 Reference rows of their own, a 3.1 project's included: their rapid and RTCP feed times, G12.1, G28 and the session's start pose.
  • On SoftNc, a run started after a Stop with no Reset (A Start after a Stop); on either runner, the selections and NC optimization of a program played again after such a Stop.
  • Step counts on non-RTCP rotary blocks and diagonal moves (LinearResolution_mm caps tip travel).
  • Feed per tooth, MRR and cutting forces, which read MachineMotionStep.ActualTipFeedrate_mmds; cutter engagement and the forces and temperatures of most engaged steps (retrain coefficient sets if that fit matters). From 3.2.55 on, under Feed Per Cycle or Feed Per Tooth, the bottom engagement of flat-bottom cutters and, on their steps down the tool axis, the forces, temperatures, wear, NC optimization feeds and, with EnableDeflectionTransformation, the tool positions after them.
  • Against 3.2 builds up to 3.2.54: the cutting forces and engagement of a cutter with a Const Helix side contour, played after its APT values were edited in the open project.
  • Steps that move the cutter up its own axis, such as retracts at feed or rapid: IsTouched, MRR, cutting forces and the values read from them, and the rapid-cut warnings of such retracts.
  • Cutting speed, peak axial torque with the spindle torque ratios and NcOpt feeds that read it, and spindle temperature while the spindle stands; with EnablePhysics off, no cutting temperature or wear.
  • Cutter deflection (MaxTipDeflectionOnToolRunningCoordinate_um, MaxBottomEdgeDeflectionOnToolRunningCoordinate_um, ReCutDepth_um) and the deflection compensation of NC optimization; a pointed cutter's tip deflection reads NaN. The yielding stress ratio of insert-end, ball-nose and tapered cutters, with the NC optimization feeds it limits, and the mass and shank heat of solid-end cutters saved with a shank of another material and of cutters saved with a <CutterMass_g> element.
  • Cutter and workpiece temperatures and wear, notably after a tool change, on a play carried on after the cutter's coating layers or shank were edited, and on insert-end cutters with no coating layer; spindle temperature and energies with a legacy InsistentRatio contour file, after a spindle capability or environment edit and on a play resumed after a stop; a played step's spindle torque and power ratios, chip mass, plastic depth and thermal yield ratio; from 3.2.55 on, no cutter temperature or wear on steps cut with no tool-house tool of their number.
  • Spindle temperature, MaxSpindleTorqueRatio, MaxSpindlePowerRatio and the NC optimization feeds they limit, with a spindle capability saved as one SpindleSpeedToPower--RPM-to-kW and one SpindleSpeedToTorque--RPM-to-Nm curve.
  • Spindle angles (MachiningStep.BeginSpindleAngle_deg, MachineMotionStep.PassedSpindleAngle_rad) and the force samples of shot files; removed stock and forces on rotary passes and along tilted tool axes.
  • Results with a RakeFaceCuttingPara2d cutting parameter and the trainings that produce one; results with the shipped cutting parameters, workpiece materials, FANUC-aT12-12000i spindle capability and cutters D12-Rc0.5-CH20 and PDST040900T ZrN-A; from 3.2.54 on, results with the shipped FANUC-ROBODRILL-aDiBPlus-HighSpeed-24000rpm, GMN-HSP-230-18000-18-18000rpm, HSD-ES789-24000rpm, Jaeger-Z100-H540.108-S3AW2-40000rpm and Johnford-DMC-SH-BT50-6000rpm spindle capabilities loaded again.
  • Optimized NC files: unchanged lines, unparsable ones included, stay as written, and output follows the source's decimal digits and encoding.
  • NC optimization feeds of steps with almost no load or a thin chip, of steps with no load limit whose relief face meets the work and, under a target cutting force (NcOptOption.PreferedForce_N), of ramps, plunges and five-axis steps; of programs after ResetRuntime() in a mission that changes the option or after a BeginPreserve range an earlier program left open, and of a play optimized after a cutter's setup angle or a cutting parameter changed; the per-step optimization log's status words and its FrtByUnTouched / FrtByNoForceBrief / FrtByReliefAngle_mm rows. An NC Optimization Config (NcOptOptionCommand) keeps its values when scripts below it set Opt*: check one an earlier build saved after such a run.
  • Sensor files mapped on a host whose decimal separator is not a period, ForceAccelShot acceleration built from g, mappings over recordings with gaps, and CSV play step times and the step each extra column lands on; selections anchored before a session's first step or just after ResetRuntime(), a FirstTouch anchor on a lone touched end step, and a bound moved by a negative ShiftTime_s; refit trainings fitted on such data.
  • On a host whose decimal separator is not a period: numbers and dates read from project, cutter, NC, CSV and ASCII STL files through the API, a script or the web API, and the force CSVs and the text of vec3d_t, vec2d_t, mat4d_t and Polar3d written there; export again an ASCII STL written with decimal commas, which does not load. On a host set to Turkish: lower-case NC keywords.
  • Geometry-difference deviations and coloured cells; collision reports, which add the holder and the shank against the stock and a plunge before the spindle has a speed.
  • Messages: a stroke-limit report, once for each step past a limit and on that step; Script-Run--Exception, which carries the script's own exception, and none at a Stop while an NC-embedded script plays another program; ScriptCommand-Run--Fault, said once with the exception's own message, when a Script command's script throws during a run — before or after an await, a cancellation of its own (OperationCanceledException, TaskCanceledException) included — the mission going on to its next command, while an exception from an action the script returns, such as return RunNcFile(…), stops the mission with Player-Run--Fault; from 3.2.55 on, the tool changes ToolChange--UnsafePose warns of.
  • HardNc changes tools on M06 / TOOL CALL, not on a changed T; unset HardNcEnv tooling defaults are XYZ = NaN, NaN, 0 and ABC all NaN.
  • API: an executed SyntaxPiece.JsonObject is a read-only snapshot per call; SyntaxPiece.SentenceIndex is numbered across the session; MathUtil.Convert_inchdmin_To_mmds returns mm/s.
  • API: PairZrUtil.GetRByZ on a List<PairZr> interpolates; MotionUtil.Interpolation and MatInterpolationKit.GetInterpolation follow the shortest rotation from the first pose.
  • API: GeneralTransform.GetInverseTransformer of a scaled transform; ColorUtil.GetDiscreteRgb, GetDiscreteRGB_Env and ToDualHexString; EnumerableUtil.GetIntensiveItems, which throws on a resolution that is not positive; MillingTraining.Convert; RakeFaceCuttingPara3d.FrictionAngle_rad / _deg.
  • Web API: from 3.2.54 on, the Individual aspect of GET api/execution/strip-chart serves the MC.<axis> series of a wrap-around rotary axis between 0° and 360°; the steps keep the continuous angle.
  • Web API: from 3.2.55 on, the Individual aspect of GET api/execution/strip-chart serves an item's unit as display text, mm/min rather than mmdmin, and for a color tree's key an item's min / max and the keys of its idColors.colors are the leaves' lanes, not their ids; the rows of GET api/execution/step-properties carry unitLabel and source.
  • Loading: a machine under <SolidMachiningChainSource> loads, and so does an equipment's spindle tool saved as <StickMachiningTool> or as a bare <XmlSource>; machines with W / T end anchors or no w load, but a run on one with no w stops at its start.
  • The run skips a mission entry saved as <CommandEntry IsEnabled="false">, and runs the commands of a mission saved as <ListCommand><CommandList>.
  • From 3.2.55 on, the step file and the step CSV export carry six more columns, IsRapid, MaxBreakageRatio, SpindleOverloadRevolutions, SpindleOverloadPeakRatio, YieldingStressOverloadRevolutions and IsRapidCut; a comparison by column position made on an earlier build shifts.

Re-baseline comparisons made on 3.1.