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
the messageTable field of api/Preference/player-div-config sessionInfo of api/Preference/execution-div-config, which shows the Session Info panel under the Execution canvas
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
the step properties YieldingStressRatio, ThermalYieldRatio and, from 3.2.55 on, YieldingStressOverloadRevolutions (Yielding Stress Ratio, Thermal Yield Ratio, Yielding Stress Overload Revolutions); MillingPhysicsBrief.YieldingStressRatio, MillingForceLuggage.GetYieldingStressRatio; from 3.2.43 on, IStructureMaterial.YieldingStressLimit_MPa StressRatio, ThermalStressRatio, StressOverloadRevolutions (Stress Ratio, Thermal Stress Ratio, Stress Overload Revolutions); MillingForceBrief.StressRatio, MillingForceLuggage.GetStressRatio; StressLimit_MPa; code takes no old name, files saved with one still load (Settings and defaults that changed)

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.GetThermalStressRatio(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)
RakeFaceCuttingParaMap (with its Test()), MultiFormRakeFaceCuttingPara RakeFaceCuttingPara3d (six coefficients) or RakeFaceCuttingPara2d (four), one coefficient set for the whole cutter; as TrainMillingPara's template, paraTemplate: new Hi.MillingForces.RakeFaceCuttingParas.RakeFaceCuttingPara3d() or DefaultParaTemplateDimension = 3. Their files of one flute form and no angle table still load, as a RakeFaceCuttingPara3d
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, the enableStripAvailabilityChart, enableStripRoughnessChart and colorIndexTimeChart fields of api/Preference/player-div-config.

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.
  • StressRatio 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 cutter or structure material with no yield point by nature — a carbide, a ceramic, a CBN, a coating — is saved with <YieldStrength_MPa>NotDuctile</YieldStrength_MPa>, as the shipped cutter materials are; one whose yield strength is merely not known is saved without the element, as before, and an empty YieldStrength_MPa or TensileStrength_MPa element loads as not known. NotDuctile reads in any letter case, and a program of your own that reads these files takes it as no value. HiNC 3.2.43 to 3.2.55 read the element as a number, so such a material, and a cutter or project file that holds one, does not load there; 3.1.175.5 and the 3.2 builds before 3.2.43 skip the element.
  • 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.
  • A cutting parameter file holding a rake-face angle table or more than one flute form (<RakeFaceCuttingParaMap>, <UniCuttingParaMap>, <MultiFormRakeFaceCuttingPara>) loads as no cutting parameter (XFactory.GenByFile returns null for it) and reports CuttingPara-Legacy--NotOneSetFile, or CuttingPara-Legacy--NotOneSet for one written inside the project, which the next save leaves out; a play then skips the cutting-force and thermal physics. Replace it with a file of one coefficient set; one of one flute form and no angle table loads as a RakeFaceCuttingPara3d. POST api/Workpiece/cutting-parameter/load answers such a file with success: false, the reason in message and messages, and keeps the workpiece's cutting parameter.
  • 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.
  • From 3.2.56 on, a Heidenhain SoftNc pipeline you compose yourself builds its lists as SoftNcRunner.HeidenhainNcRunner does, HeidenhainApprDepSyntax and HeidenhainApproachDepartureSyntax included, or its APPR and DEP blocks do not play as approach and departure functions; a Heidenhain controller that an earlier HiNC saved in a project takes them as it loads.
  • 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: 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. A play result that Record Play Result saves from 3.2.56 on is not reviewed by 3.2.55.
  • A project saved with its motion resolution as <FixedNcResolution>, then saved again by 3.1 or by a 3.2 build before 3.2.56, holds Feed Per Cycle in its place: set its Machining Motion Resolution back to Fixed, with the linear and rotary resolutions it had.
  • 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.
  • From 3.2.56 on, a host that constructs MachiningActRunner passes its exception reporter as an Action<Exception, int?>: the exception and the index of the step at fault, or null. A failed write to the step cache reaches it as a StepConsignmentWriteException, the store's exception its InnerException.
  • A class implementing IXyzabcMachineTool adds GetSpindleTransformer(); returning null keeps the machine as it played before. A class implementing IStructureMaterial answers StressLimit_MPa, or the 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.
  • From 3.2.56 on, MachiningStateGeometry and MachiningState are the keys of HiNC's built-in color trees, refused as a built-in step property's are: a step variable or a color tree a project holds under either is not registered (keyTaken), and a script's registration or a CSV or mapped column under either is refused. Rename the key or the header. PUT and DELETE on api/execution/step-color-trees/{key} under either answer 409 with the code StepColorTreeBuiltIn where the project holds no tree under the key: copy the built-in tree with POST api/execution/step-color-trees/{key}/copy and change the copy. A tree the project holds under the key is renamed by a PUT whose body names another key, and removed by DELETE.
  • The step properties MaxBreakageRatio, SpindleOverloadRevolutions and SpindleOverloadPeakRatio of 3.2.55 are removed: a project's color index, color tree or saved colour range that names one is kept as it is and reads no value, and the play warns that the key matches no step property; a step file 3.2.55 wrote, mapped back, skips their columns. Read the spindle by cause instead — SpindleTorqueOverloadRevolutions and SpindleTorqueOverloadPeakRatio for a run of the spindle torque ratio above 1, SpindlePowerOverloadRevolutions and SpindlePowerOverloadPeakRatio for one of the power ratio — and StressRatio, MaxSpindleTorqueRatio and MaxSpindlePowerRatio each on its own where a tree took their largest. The Internal Use Only members of OverloadRunFold and StepPhysicsChannelReader that read them (SpindleRuns, Sample.SpindleRatio, MaxSpindleRatio, MaxBreakageRatio) go too.
  • The stress ratio's keys are renamed (the table above). A project's color index, color guides (the selected key included), strip chart entries and color tree terms and shown values saved under YieldingStressRatio, ThermalYieldRatio or YieldingStressOverloadRevolutions, and the displayed step properties of the web service's UserConfig.xml, load under StressRatio, ThermalStressRatio or StressOverloadRevolutions, and the next save writes the new name. A step file or step CSV mapped back skips a column under an old key, as it skips a built-in property's column (CsvEmbed--BuiltInColumnsSkipped): the play supplies the value, and the column does not become a step variable. A step variable's formula, a mission script or NC-embedded C# that reads step.YieldingStressRatio, step.ThermalYieldRatio or step.YieldingStressOverloadRevolutions does not compile until it reads the new name. The old keys stay reserved: no step variable, script registration or CSV column takes one. Web API requests take the new keys alone: an old key sent to POST api/execution/inspecting-key or as a color guide's key matches no step property, so nothing is coloured, the strip chart reads no value and the play ends with Play-InspectingKey--Unresolved; the Availability aspect of GET api/execution/strip-chart keys its series StressRatio and ThermalStressRatio.
  • 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.
  • From 3.2.56 on, the machine tool's and the fixture's solids are read-only while a run is in progress or paused, and while a program plays through an api/SessionShell request such as PlayNcFile: enable-geom, disable-geom, create-geom, set-geom-transform, refresh-geom-cache and POST …/rgb of api/mech/equipment-topology, its index-geom on an anchor that has no solid, and a write to the geometry and transformer routes (api/Box3d, api/StlFile, api/TransformationGeom, api/StaticTranslation, …) whose key names an object under those solids answer 409 with the code SolidEditRefusedWhileRunning and change nothing: stop or reset first, then call again.
  • 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.
  • From 3.2.56 on, the seven play and act routes of api/SessionShell — PlayNcFile, PlayBrandNcFile, PlayCsvFile, PlayClFile, PlayNc, PlayToolingTeleport and PlayClTeleport — answer 409 with an ApiActionResult body naming the one refusal, and play nothing, while the player is running or paused, while another thread plays the session, while the player is being reset (the plays) or while a play result is under review (the teleports; a program play under review answers 500: close the review first, with the player's Reset). ConvertClToNcFiles and OptimizeToFiles answer 409 while the player is running or paused, and POST api/Execution/start answers 409 with { success: false, code, message } while another thread plays the session (a start during the mission's own run answers alreadyRunning). Treat a 409 as refused: stop the play or wait for it to finish, then call again; a 200 means admitted and run, and what the run itself refused, such as a missing file or no NC runner, is on Shell. The five plays of MachiningSession, LocalProjectService and SessionShell, SessionShell.PlayAct and its two teleports, LocalProjectService.Act and the new LocalProjectService.PlayAct return bool (true: admitted and run, to its end or cut short inside the run; false: refused and nothing played), and those of MachiningSession and LocalProjectService take an optional message sink for the refusal, Shell without one; ProcAct keeps its sequence, and TryProcAct answers whether the act was admitted; LocalProjectService.IsPlayerStartAdmitted is the start's gate for a host that starts the player itself; SessionShellController's seven, ConvertClToNcFiles and OptimizeToFiles answer an ActionResult: a statement call compiles unchanged, a method group passed as an Action becomes a lambda; rebuild a host against the new package.
  • From 3.2.56 on, while a project is being changed (New, Load, Reload, Close), or another request's ResetRuntime or EndSession is resetting the runtime or ending the session, POST api/Execution/start, run-line, run-step and reset answer 409 with { success: false, code, message }, and the session-shell routes (BeginSession, ResetRuntime, EndSession, Reset, the five plays and the two teleports) with an ApiActionResult body; run-line and run-step also answer 409 as start does while another thread plays the session. New, Load, Reload and Close answer 409 with a message that names the reason while another thread plays the session or an act on it, or another request resets the runtime or ends the session; ResetRuntime, EndSession and Reset also answer 409 while another thread plays an act. Treat these 409s as the others: wait for the change or the reset to finish, then call again. In a host's code, LocalProjectService.RunToLineEnd takes an optional message sink and returns bool (false: refused, nothing launched), TryStartPlayer(sink, out launched) and RunToNextPace(sink) launch the player under the same gate as its admission, and ProjectFileBusyException gains a constructor taking the message. BeginSession() answers true while another caller's begin is in flight: read SessionShell once that begin has finished. A setup edit made with no session open while another caller's session begin is in flight, or while another thread's run or job holds the player, reaches the runtime face at that begin or the next play: read LocalProjectService.MachiningEquipment after it.
  • 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.
  • On SoftNc: Heidenhain klartext programs with APPR or DEP blocks, their NC optimization included; the blocks after a Heidenhain cycle call, which keep the feed in effect at the call; on every control, the motion mode a block leaves when it calls a cycle with a G00 or G01 (or FMAX) of its own.
  • 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.
  • With EnableDeflectionTransformation on: step counts, the steps' cutter locations, ActualTipFeedrate_mmds and FeedPerTooth_mm, the stock and the geometry difference, IsTouched, cutter engagement, cutting forces, deflections, temperatures and wear, and the NC optimization feeds and deflection compensation that read them, the first step after a change to another tool and a block whose M06 calls the tool already in the spindle included; under Feed Per Cycle or Feed Per Tooth with an APT cutter, also the rapid-cut warnings and IsRapidCut of a rapid step right after a cut whose contact goes no deeper than the layer the deflected cut left.
  • 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 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. From 3.2.56 on, every end mill's stress ratio, with the NC optimization feeds it limits, and, under the default inner beam (Flute Dependent Ratio Profile), its cutter deflection, with the deflection compensation of NC optimization, and its shank mass estimate and shank heat, with the cutter temperatures and wear that follow.
  • The cutting forces, torque and power, and the temperatures, wear, energies, stress ratios and NC optimization feeds that follow, of cutters whose flute contour gives one height twice: a stepped CustomSpinningProfile, a flat tip given as two points, a Column APT whose Length of Cut equals its Round Radius (Rc), a Cone APT whose cone reaches its full diameter at its Length of Cut. The temperatures and wear of a Column APT whose Length of Cut is shorter than its Round Radius. The shank mass estimate, deflection, stress ratio and shank temperatures of a cutter whose upper beam is an StlFile, a Box3d, a GeomCombination or a stepped Cylindroid inside a TransformationGeom, and the play results of a cutter whose flute or inner beam is a CustomSpinningProfile over a mesh.
  • 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 stress 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.
  • Trainings that used a MultiFormRakeFaceCuttingPara of one flute form, or a RakeFaceCuttingParaMap of one flute form and no angle table, as their template and use a RakeFaceCuttingPara3d now: the coefficients they fit for a cutter with a hone radius above 0 (with a hone radius of 0 the six coefficients stay bit for bit the same); and, at any hone radius, the trained file now carries the radial rake angle of the cutter's constant-helix side contour as its anchor rake angle (AnchorRakeAngle_deg, which the results of the old templates did not carry), so the stagnant angle a play reads from it and the physics input fingerprint change too.
  • Against 3.1.175 and every 3.2 build up to 3.2.55: the thermal stress ratio, and the NC optimization feeds it limits, of a cutter whose flute material gives a yield strength, which the ratio now divides by, as the stress ratio does, in place of the tensile strength; and of a cutter whose flute material gives neither strength, which reads NaN.
  • 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, and from 3.2.56 on its stress-ratio rows, named FrtByStressRatio_mm and FrtByThermalStressRatio_mm. An NC Optimization Config (NcOptOptionCommand) keeps its values when scripts below it set Opt*: check one an earlier build saved after such a run.
  • NC optimization of programs that call a subprogram or a macro after a jump — a GOTO, or a loop that goes back to its head or out past its end — and of programs whose NC-embedded script plays another with PlayNc: the optimized files and their feeds.
  • 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; from 3.2.56 on, the collision check of a part whose mesh has a triangle with a coordinate that is not a number or is infinite, which leaves that triangle out and says so once for that part.
  • Plays whose raw geometry is a GeomCombination of several bodies: the stock, and the removed stock, forces, collision reports and geometry differences that follow from it.
  • 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; from 3.2.56 on, PairZrUtil.GetZrList of a mesh or of a geometry that states no Z-R list of its own, and MillingEngagementUtil.GetZToDzList over a height list that repeats a height or turns back down.
  • 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.
  • API: in CollisionUtil.Detect and a step's collision check (CollisionIndexPair.CollisionFlag, MechCollisionResult.PrimaryCollisionFlag and CollidableToFlagDictionary), two parts, or a part and the stock, whose bounding boxes lie farther apart than the pair's SafeDistance can read OUTSIDE_SAFE_DISTANCE where earlier builds read MAY_INSIDE_SAFE_DISTANCE; Collision answers and the collision reports stay the same.
  • 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.
  • Web API: from 3.2.56 on, with a project open, GET api/execution/step-properties lists HiNC's built-in color trees MachiningState and MachiningStateGeometry and its rows carry group and builtInTree; the notes of a tree in GET api/execution/strip-chart and GET api/execution/color-guide are { code, message, args } objects, not strings.
  • Web API: from 3.2.56 on, MachiningState is a physics key: with Show Physics Options off GET api/execution/step-properties leaves it out, and while it is the project's color index, currentKey of GET api/execution/step-properties answers MachiningStateGeometry; GET api/execution/strip-chart asked for MachiningState answers pending: true with items empty, and asked for MachiningStateGeometry its colorTree carries standsInFor: "MachiningState".
  • Web API: from 3.2.56 on, the categories of GET api/preference/step-present-keys carry one more stable code, engineeringView, which takes every color tree's key out of custom.
  • Web API: from 3.2.56 on, GET api/execution/step-color-trees/{key} answers a built-in tree where the project holds none under its key, and under review, while the luggageState of the review in GET api/Execution/status reads Loaded, GET api/execution/cycle-line/force and GET api/execution/cycle-line/sim-spindle-moment answer with the recorded step's samples.
  • 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; from 3.2.56 on, a project whose file holds its motion resolution as <FixedNcResolution> plays at the Fixed linear and rotary resolutions it holds, so its step counts and step results change.
  • 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 three more columns, IsRapid, StressOverloadRevolutions and IsRapidCut; a comparison by column position made on an earlier build shifts.
  • The step file and the step CSV export carry the spindle's overload runs by cause — SpindleTorqueOverloadRevolutions, SpindleTorqueOverloadPeakRatio, SpindlePowerOverloadRevolutions and SpindlePowerOverloadPeakRatio, which replace 3.2.55's MaxBreakageRatio, SpindleOverloadRevolutions and SpindleOverloadPeakRatio; a comparison by column position made on an earlier build shifts, and one by those three names finds no column.
  • The step file and the step CSV export name the columns of the stress ratio, the thermal stress ratio and the stress overload revolutions StressRatio, ThermalStressRatio and StressOverloadRevolutions, the new keys; the columns stand in the alphabetical order of their keys, so these move: a comparison by column position made on an earlier build shifts, and one by the old names finds no column.
  • From 3.2.56 on, the step file and the step CSV export carry four more columns, StressCriticalHeight_mm, StressCriticalZone, StressOnsetHeight_mm and StressOnsetZone; a comparison by column position made on an earlier build shifts.
  • A play result that 3.2.55's Record Play Result saved is still reviewed, its steps reading those four as not recorded (a height NaN, a zone 0); record the play again to have them.
  • From 3.2.56 on, with a project open, the step file and the step CSV export carry two more columns, MachiningState and MachiningStateGeometry, the leaves of HiNC's built-in color trees; a comparison by column position shifts.
  • From 3.2.56 on, the colours of a run coloured by StressOverloadRevolutions with no colour range saved for the key: the first range runs 0 to 10 revolutions, not 0 to 1.

Re-baseline comparisons made on 3.1.