From bfa3106a693e484a1cbd635204f7b0b9a3235350 Mon Sep 17 00:00:00 2001 From: iamboss Date: Wed, 16 Sep 2026 00:00:49 +0800 Subject: [PATCH] deploy. --- App/EngineMessages/engine-messages.json | 2 +- App/Hi.WpfPlus.dll | Bin 71168 -> 71168 bytes App/HiCbtr.dll | Bin 133632 -> 133632 bytes App/HiDisp.dll | Bin 16841728 -> 16841728 bytes App/HiGeom.dll | Bin 423936 -> 423936 bytes App/HiLicense.dll | Bin 86528 -> 86528 bytes App/HiMech.dll | Bin 1810944 -> 1811456 bytes App/HiNC-2025-win-desktop.deps.json | 150 +++++++++--------- App/HiNC-2025-win-desktop.dll | Bin 967680 -> 967680 bytes App/HiNC-2025-win-desktop.pdb | Bin 348220 -> 348220 bytes App/HiNc-Resource.dll | Bin 56320 -> 56320 bytes App/HiNc.dll | Bin 451072 -> 451072 bytes App/HiUniNc.dll | Bin 186880 -> 186880 bytes App/StepPresentCatalog/catalog.en.json | 2 +- App/core.dll | Bin 3038208 -> 3038208 bytes App/en/HiGeom.resources.dll | Bin 4608 -> 4608 bytes App/en/HiMech.resources.dll | Bin 4608 -> 4608 bytes .../anatomy/by-source/webservice-backend.html | 2 +- .../general-setup/background-coolant.html | 43 ++--- .../controller/machine/per-axis-tables.html | 8 +- .../anatomy/general-setup/index.html | 2 +- .../general-setup/spindle-capability.html | 2 +- .../anatomy/general-setup/toc.html | 2 +- .../anatomy/general-setup/toc.json | 2 +- .../anatomy/legacy-controller-settings.html | 12 +- .../anatomy/platform/control-tree.html | 2 +- .../anatomy/platform/tree-ids-and-routes.html | 2 +- .../anatomy/shell/main-panel.html | 6 +- ...ningEquipmentUtils.MachiningEquipment.html | 80 +++++++++- ...achiningEquipmentUtils.SetupEquipment.html | 82 +++++++++- ...gVolumeRemovalProc.StepMotionSnapshot.html | 70 ++++---- ...Hi.MachiningProcs.LocalProjectService.html | 42 ++++- ....MachiningParallelProc.StepTaskBundle.html | 6 +- .../Hi.MachiningProcs.RapidCutMonitor.html | 4 +- .../HiAPI-docsite/api/Hi.MachiningProcs.html | 2 +- .../api/Hi.Physics.SeqPhysicsBrief.html | 16 +- App/wwwroot/HiAPI-docsite/index.json | 74 ++++----- .../manual/basics/finding-your-way.html | 10 +- .../HiAPI-docsite/manual/basics/projects.html | 2 +- .../HiAPI-docsite/manual/setup/coolant.html | 27 ++-- .../HiAPI-docsite/manual/setup/index.html | 2 +- .../manual/utilities/mech-builder.html | 3 +- .../product/system-requirements.html | 4 +- .../HiAPI-docsite/release-note/index.html | 107 +++++++++++++ .../brand-nc-language-coverage.html | 20 ++- .../upgrading-to-3.2/breaking-changes.html | 7 + .../geometry-rendering-and-stability.html | 16 ++ .../release-note/upgrading-to-3.2/index.html | 8 +- .../milling-physics-and-training.html | 4 + .../results-that-change-on-upgrade.html | 25 +++ .../session-project-and-commands.html | 7 + .../api-foundations/getting-started.html | 2 +- .../milling-physics/coolant-model.html | 2 +- .../technique/nc-dialects/controller-iso.html | 15 +- .../technique/rendering/rendering-canvas.html | 2 +- .../workflows/project-data-checklist.html | 2 +- App/wwwroot/HiAPI-docsite/xrefmap.yml | 86 ++++++++-- App/zh-Hans/HiNc.resources.dll | Bin 6144 -> 6144 bytes App/zh-Hant/HiGeom.resources.dll | Bin 4608 -> 4608 bytes App/zh-Hant/HiNc.resources.dll | Bin 7680 -> 7680 bytes 60 files changed, 696 insertions(+), 268 deletions(-) diff --git a/App/EngineMessages/engine-messages.json b/App/EngineMessages/engine-messages.json index f3e063cb..007f7490 100644 --- a/App/EngineMessages/engine-messages.json +++ b/App/EngineMessages/engine-messages.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "engineVersion": "3.2.29.0", + "engineVersion": "3.2.30.0", "filesParsed": 1282, "siteCount": 366, "sites": [ diff --git a/App/Hi.WpfPlus.dll b/App/Hi.WpfPlus.dll index 58a45028121cd0301051c52da8a3ce85684e9c57..871957a232576c72ce5aa9c102333060e523773d 100644 GIT binary patch delta 193 zcmZoz!_u&ZWkLrFcar6XjXetTj8c==%3CrjPJS-m%_z0GSfN%-z*?$IUT&JR>+G6u z@`963{M%%HfR*1&&wzo!gpontSkFk$$ZYa?n@pDb4@~b&wy_NmSib&MvZaB$>pJZ# zZgMk@{hd6=)f0w7ot-wJh90S#1?~PaP7Yw?-OT53obnS~hJf!uB(#!_YgyTn9! delta 193 zcmZoz!_u&ZWkLtbwl8+aH})vVGfGZgD{slDF!{NBH>2d{Vue~U0r3}B4W(PY`mNZ% zDpq!Kozf=r1FZa}dIk&(CX5XF#(GA2My8X`+hnq2oVj~zvW;zkfM8`*v-7Wb$A&|v z)Xl~2y`MbC)NK5y5>$!rn)BP&d$0P7A7vb#>U2GE^ekSP8QB444d;` zTj;7-I=Q(ynOZpO8WY5lCndv&2ni=XE7#f(n8917|S(sZ)KP|ziNSsOmNk#{O zH3vFYEn(Q=*)EzabSdu9>Fo(XQ7L{)Jp%>?6GjGoV?851Bg^gUjTwJm;FM)xVqgaP nL3aCQ7N-47jF#Jr*_px_87-%u=3r`PwPes^FqnSOgmEPRuoq4j delta 278 zcmZpe!qG5=V?qZD`^?|_Huk*fVPx4{**le$k!dskyBO)38yLHoxf(e+8(6qZKP|ziNSsOmNk#_& zEt5s7FI;N%ns7n?(7BGD_1hDGqEh@8dIk&(CX5XF#(GA2Mi$%G8#DgCz$wGP#J~*n ngUt5LEKK{E7%jFJvonP=GFnVO&B4^pYQdn#U@-ll3FArtbZAb& diff --git a/App/HiDisp.dll b/App/HiDisp.dll index b8607efa56305bd7cba3b8d4bcdeccc2ced328d2..20235d45244eddebf67d9d5f2135fcc112447deb 100644 GIT binary patch delta 1791 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
hk^aT7 z>LSKoS=9{4?NL@UR;~_R4eS4Rc2v`vjp#@l4i$^&pz+h{QIHRA%|X0}X6@^Qn<`QL zlB}13r!NBWuM=_9g9CRfXYFF-^brnF$9|fKx`GnaTUmqELCUSHxANR7?pAtGT(FgI zBK*dH1@RB}JO}wVNoC_UjIdkRiJ#OsbRbv4dl-AvD+7+%j`@pT#L?RjgJ+@Z;n+Vt zQIbd2ZN}bX&-x+|gOuQ)+)8I#QGRff3(DD9jdFI)LQj`wEWzFH)`~8<4u1W)IunVdq6^$OkNXl3gKl4^;Fh!c%Nlpu(1|{jG&b zX8ySVDaU>bJK!&AJ!_E$hg(eO&&)=`^7BhR{Hv1UrAYi&nxpWSv{3e6xxb`EvH$pAjQ$SR zfM3cx2tOeGCk>VY_~Y0!shHlXIF!}G%JHu>j(u1BYnrg?*R)5@yjI8S^=dacXEglo z4|&FDX^fUm)Y3^>dKW8%ivetITKX`oGFYx>>oYKYTuU3Z^l2?Utfha`+I4XK5W|eU zp>jdRUvrNO5Qgk)ZjcP==YonvT`)E3f_!0G8mXmGS~?O^Y(G+m|5OKNtyUgQWuA>E zIq-rG;^&!5Yp14YggLtN&=a1eYiXWF&(|35(&&X+>elL4YUNd0x?1Be*7>T?pkiIH zryI47c(nRm!Bk~`)CgT#`e!ZuP;1bml|Rq{-~u)9~=UmmhzBd4|#pi<)T&=wX#v;Gi!9SMwhg*gk_9i zStH0AgH9Y@7L-N3=IycdSqzORY$dSW>~O1OH22M z1sM-$X}y*{rlpTVii#c&yFx?tq*i`XD>rK8#<1fw1P8TtPX|+#9SSQY0f)jqCIN@T zfYvr>k89=QTKV~~;52258p)>3s?(ADa&psQ=Na*bBLPb=T2mG=(wsnqkmnt%s1MGt7@ zeOh^+R(@D3KdhDaYvuh~`G8hFpq1-2h4q@k$F%ZeTKVx|u>Vu^YJ?{>0Z(cI8ntqx zRz9ee4{GJ7wer(i`H)sVq?HeA<-=O}h*mzLm5~$VIl6!)Wbs6+onkPHzIJ@W|3!pw^a<)afxRxl#9zaF7e4xUhx4TkxgZ{pRw%_ N^SLwJ4)G`Me*opzq%;5k delta 98267 zcmaH!34D!5_xR5|bMMW)*%u%hY+h>KhPb`n{b6;-*cjSv7Ss~=v2qX5{e&T&u{|{qj`6g@V zv(1cPH;r}X z`3{1#V1r4cOEYY6zfYqfUEq`Yr5UbJV6l4JU^`I!f(axS_9A(q1<6HC8V#|*OPLhD z+?3>xF(fasoY9QJe~cx$Gqp6s6Aq7vNU_0}93P)W@hzm)L<2us2=2x;8sZA$B$eQHzsBN9t6VMwz^L;T?dG+={!Sg1cN<8X>W?cOP<&=%~2CTwycdcp=?QKY@s zkK|HJ=?YEIj6cktP34@68&Vhs=FBLGS*19j-77yQ3jQ#w}?(7``_PXy|2H`(l5Dv9z&FV0qI* z@r#;X=x&4PdQ?!#SgP*1{OD;mm^G5Zf3mT~BS`xmR=PKgD=N*1hD!OWXEb~@b6R9H z+%;bHjDtlpskB<$?)Q37dbb?2xEl^PtXDovO`<}VvFwa7Hdv1)lOftNGA|jL2^xAq z85BRhKFL?ZNVevf?l>=6!J@c1SlSERO$*q}$0I4t=TRhwvkxY*yqrho*Z0_KqTOyxfXnwwlzw1IZNg7Z-Pt$NU&H77e>#SGQ<54~}pf1akZr+?7dKAy*hW zn@0OrDKyTfTB(HI_0p2Uz|vz*QGaNVZpV^459IOxdqHW&NO8M6z-z|$*c~GUNgI5@ zRT(vkGH2(IpX&6Z@E{!9Hu!fKg%9Ub72o3)UyCTsh=egs`sAfS$%x~<(qMM{vLR^@ zQe+C{Gi9jh3%oB zh{B;oG#Z-cko>(9wFA16yv0k?xH5`g%EPvApNSYhoL7`jxau=`B{55N*r50_pss0>PT{#Y z0@9%CfHR&p@I*hk!aVlGc*CTnu^~rwE~4<{K+15xE@iIE!(<6AP&P0OnmnU;vfbr@ z_8!Oo(q#UidX~9EXvD0ItDTHHLNoGTH=eZ3I6Riat}Gj|ti$ncaTiQXy0b~&3LCtG zh0;c}%t}(={{Z)^ht`KyE0YvN07MoLs9urTq9_VE7-PKQud)_JR&XUkUF=-ac|rr2 zi}|wJlg<~(K-~b`2IHX?M8Qjtc3Uwd_lX}Bl z{~3b-0--Gz`d53>1>zu;5m>dASN0egqI6}`ca12sg$q@*6HMSzlH)05Z{FG39WIyU?qyZ+aBWgG=oDw_<(M0Tya% zR!7mVtlO(~SD4z>@ijT=Rj%8#cE0IW%y^9ptVE-|sTY^O6;zStWm{)8*!*dkF&Z|K4!E--9H84G_*0GDcAZ(`yNeBALe2Q&f*>M}eaHIPSe+JEpXn zSWH79ur^X$ovq>7~L87!V`iHpPk3jxcC^};X>6w{1|p|%2Ay1Q+T&V z%Fp0_jg+6kKb&%8AelG_4{KEIbMQB4j;J!fG9k>sv~Y1i_fAnbxWch}y&-^2e2XMe zM{7wGd=K4fWITgJDQ$ho#ChmrJo4JlFq(B4T*@ynj_Jjzl=4?7XNv4fbQ#P_E|g4I z;VM*dF{*CYVI%9*#JdTvGcDvvc?-5NZQ@CJ8+I_2`cWx&;4OpPy`VjrxC?I^G-f1L z29Vxk%GdP1$=Ffj2Ta>Ks-*jvHdQG4m}!^ReacikQ0ewFMPm!e#Ai&)b-n{kgF}_> z5K~ia?~q|q-8O?#9%k1(hf1pVQ3DaCB$D&*L2WtD*=zqGk-L>=9uT2UdFCMmFe%Uc z2SJj2;mJb}L*D&uZ zX4Ek6CuT9Jj;STenEv8U^B3hvrZ*G@Q?Jz#6|7YIL4cUgmFdZq2@;h!4!vPT9(g86 zEU3|nVDSp)Q&kHSn>gR6oUeh{UL$1#d@Y@#buqWG5! zRjp4JeikzS9`?NzT8cmmbX=l~+(KQU%(o>%6Us9gB8BsL)Tex%L@Q3I%FGm9 zS!cdHm6TmX55{I}K3n8+F)C>{F^fr==qbu9)QY+7C|_UkM2(bv#S$)MrXT5siRYMZ zv?dxZ?pUzB5Xcrrh)^q4^r6WUZ?vegQlVeAUpLYU`&W47-i!b4~6xs`g2)wu|9yv!V%Aio>XHd(<)RMvU!I$AlW`OjvCbhhANy z9iysugwcUX)w_YwiAjywMn)!+8nRJF7bZ1i(~TUaOU-FG4>krc&EVtB1YIeu}nW(&`=H zi1A4cmmWhR=UX`6SH@>G41R5V&AN^KsgzU3H#X_)nD319toyDV>CDr{6>O6?WH&p| zD+_)!ZnDzOH9cqC;mVW_prq%G`_6iYid#mk3-u@s%TRI0h-0E*87l4@&0MHz%ea(> zMst@(o6|!h(S^L$waEeW8kn*L4VF2}L%O@oT@ zkyBW=7#m~-KUv1QOFa+t3dP-E9#`}oc6We$f-AGM0aYzPE-)F7*HgGi)ihVpQ%vnA zDq76sf?YuwmoWX2rD!Re*u=gFkWbgBXrO$aE3=WuQ;2-Q#lZ0t+M6bG1No+lS>16fmJhVpP<<35ra_sve8$Av+ zMumF+F0Y%hOfr4U3N<)3U~e;=YwQrKxgt!0CqrPa=h zC$EoL(%U{y4@A6(l)m;yTXR<=GXD;jk}HE*rzT~AjJFGcCl~+8h?0lA+I!dN;v|kd{W0Y*ew1^upQRdYsZ;CA7I!1E7X>zdAt$g!<5iCpEA6R+p zfYHdjFKLLB$ywY2PYcl;S;jec@IW)AX@4|Z=gNg_@dFq*+zRvMGCNJ47NG<2L9kM; zV%j-g(P~b)G@DXZ%IBG$Gl>?+b$06ajjedyUL@aOT(0R&tPJp`83l{vJLndGxiJHW z$HNjNa=h7o;L7a>jU-bIhbs9cm)^^Gh>t;Q<#DE|lITVGEz_o!0ciPU`4boLUVEYq z@`khLLd6F8CzD!2w#dIYU&|y)xlP_>I?ttSllQokwyn6B9n$8YNA3-{*I40AS=&Lw zLCwBhGSWfye^$g|{oj@K9W(&y8L=zZ9WsLRVzKN`WeP{S8$?HBryAK$$Q;&XS>~bc zYnkVu<`3vV^o<G-}53p;mCS9Aj!RfymQxiD`c+k+)5tLsaR{YambpF}Lg|(@tee8Rc9s{|PdObX4iCf?(DGW1q#Z5WmHCzH zju^pNxxFXi0?^m;5jW=i97P{<{?ZP&@CvD~}rnmwH#tyWQSWT#Ze``N=_d{OkzOt<4$Vkh|o?jS2Wetqa9vtH&+8LHo_}KGVZ6qMJxm(T-fv+el>ZjyG58w&f(ZDP7)L z`S%w%+o)-t*1K-BsBGem%ggHFUOh~$;AQn@Qp428>g!HrUu$2LjN836*!@wL*0Q#6 zry*SARh10jZ*9et)Id>dcXDM*BrEDttMkzzIMABuPL1iDS(O|G!Paa}+PDrSt&8-? zM7TBAo%Y*OKU)1Ft$o~UBhjXY`?R$mlUh=%NuA27X`$NDbxJyP<0TL&0q-5ZlFjE? zfyfUFJz{a47b;?`hdgZXZQ5$QIQ_>?@@PkrtsE$A37!WbzkE#8=O|kSl58@Tq!&to z)go#4`VnQ3jpRZMQ!Y1=Up^$#6J>uhi~i{t;3<62{Q)RT{Q}S#f7$X;76y}S;X?9K zb1Gtn%a4!@TQWbf`okNJ11Q_~Ci$o1E0mpcPg|3rovX0Ni*I*65CieUk7dJVxN^%)LN@o#A0XGty% zO`JrX!>FJk*fIf46B1DIqDunCKbe@0;h$X6G5lRhF=h_8Q<}h3l7sCZp&XG)@&!8? zc(P4nJVyP<;nKFvT(FgnW*E~ogUWx}LAiQnrDDt}4xjG*BbWk0T}iPnmlE08$-`Xz z@l=qW_%$Zow^#hEzwK_q^JIhF{SqFD9zLgdj#yZFTmZq zb>1BeA543Q;X7QRgB>d{oa7*{yzklaMf!kjE=TOOhj2g=Qno#-x!=4_berdK1my1bx*RfhB zU9V$Brwz<@s~-8bfJ<)q<@*vyK0lS@xu8oKH>J$x zi9OxxU$6Y~!42|FkqmCGbMQmq!MO)8Q9oBoBuc14FXL1c@QTghgY&}M;gbx_^B(&6 z!zxa5(?)5g2j+Vw!_vIYe*SQi;}cxE`uV`9h&;di@~?5^C&P0C&D#Eu=tkuqEuN3z znQlu_hLtR>ZTiDrx91TCmTatTga6#}1%BvVf&)#jZU^0eshwXw)q`Zb=P$V4F7qP8 z+tGaWS~kt4VV(T)FA^Ho5%9JP4a0;as`{T8w!v>HQ1%ytCI{J-A~u? zH^E*?EuNK1h3@3}y{T4sfB>(w!652!nZRUN?lC6FA5K+JYksv( z#PCATnJBy4<_Fnerq>53H`)%PZ0=2sxs49T_&}OF$u4<*G?H-9)6FxJvp)>YFW)-- z!%%;CKjM?nWGHp{9K**GJ_)tKZd{Zw8@47H{!^b+3`8Ez}!Rwi1cn60waOJYW9bComT?SmZ1ax$z@v)%8^?Lpg?;ziNk#V!0 zfDO3d2xypHr@nxzy!f2Y3Bho4Tvu%HU9L&$=?KXXn)hV`f0*Y=17t=X$uk@-ANV!K z*LC|D8wuD|@_wWIa@UX_p;viRT7q=n;$b8yVz zt0lYa1ioohyT8;%(qTJRE0JAyJY#(f?urhQQQ5D?;QH^_it=I(dF~iiSHQ=!D1NpF zh4)o-Z-Q^XSi3h7Fxrz!Zpjlh(W?)}Ea&jsID_;8W#W27j@mej`eRQ8$^Tus;=$zg zAPKukz-jL9ncRQ5?AWusr9SDurMZ9zcJHyeXK*|fx}1r`o=%|hU*_F)Ng{>MbNF-$ zh0S_AatgQWbDG2XE>abMTWoQ@K3$T zaJVZOUY~mw^A@?DMQvIhmH!d%v}ySi7Tj6in1jhcXE!pibu<}R%==h$2^l!T;o=f9 z;KQ!ISK{!&*9F{ZO-wE&13n&PV8d)O?C>PR=h>q#<75+%h08g{^AhgoMYbl|$kwxX zFu_-nY&`zA)*@rTt{Wdr#@ciEE}jN#FrVGkgC2p{9_tbPB^G?CwNM?h(%?-E4HD zfU`Uf<_)BZMzV+AD<%V@+{l1CALHI&_hxhWHx9qc;pXmC!ky{VuoD=@^Ur?XG))gu ze98mxl$A_Q@g%RL^5AOWMaEWe_%xkj;R3s~kJ^seD|hQs{0I(z$b;@x4*$oVyU5|6 zQmCR0?Nrgapf|?y*ZF%nb+_H8&q-3+pPYw z(>RRzA&VB^(~eI<@jQqg5)h9ke>~gc>J|Zqd7usDb3-%qPz1zyy_66E3vC+{;^8%~ zGm-J|jg1Fp?{Qe^dfb&ebHA0zFv@hDm4avZymFKu(4%c$0__5O|ek6yhW>UD8$Cvm%Uu+pQ&z&1~vEm`dylS;3*}vuvOfh+O4yY+=CNDxfX|y*x72U(TvW;7B^>_D{v(b5bKKt+>|-08>PQ(n zaQM?q3h&}@c5ezlaAc$5o_I1A(8ZN1QIBWGBJ>>gWgb=Hf-6X^ay%*1d9Xuntm&|C1>;E5aGf?pXAB~fEk@-X)ia5v%a|N&M2Y7aT$FrjZ zM*yA!ct*71r<|1>KIcWbe&N~CKaj$WcrAHYm%_z73qDSu25fdY(h@I$jU<9!*^TFM zdI*TZk&o}Y;q(wNio+8)yotk-y>*GhpYrTzz#cL)sGL=f8F^G8b3eo80R%2Moow*TFv{G`tsFD>k10pjJ%jGDK{K9aUvZiV=q)_S zyOXgA_)Lg8lu2b~Q%p&M}wXHv|&yvTItLH8fW=iq#`L5JcL zTn}Ing?}GPQY|Cbc}bbT(r+5YtF@$?E3F(2^YG}V4>h;aQWEmZ>j#qjEic8yf1d72 z@NWw&S||Ey`Z$cK98I!E7%du$dC{oA^*sbsJHJ~%kqJf^R z1vGY}XUKiUckmf}M8197+^LQ3=i^TBWk^+ZWZL-QevUPs>#hD~K zcto~NhSp_2wDyN!&jViZFwXyM>v#xoIg9Zr?)h!};lcC)ZQ`Lacr?oXE_duc5XGbV zJ9nzY=QwNd=?9;OdX=xn@!zX_KAw*w;5)p^h=4UIRNWwZzKA!$FZD{AfPQw@bbO{y zCArE@58f}PlKj^0i!qbilJs{3qwJJHa*-n(WtXfdl*b(O1bwPEJtNoQJ#%F)wYY%8 zNqO`j`wl-lALa>s+WK=_ytweZ+!n`wdmBCZj_2dR^EOia>_v*p96vCSMn<#?#V1Bk z{8*R$uF0@JVL&^7c+F)9N^-sp3c66r`DW1dcZy(M8yc{c3R{!* z0$#;%1X#_ato9Lb)um^9EY#MmgFndHbb9x7>5bv?-~yDnE+abNGf)bpjI~orzl0SS zU*$q63lb^iDHlq)D#g|@9+L9QIwnJd)Rmp^amBtC<>b`YItjRkK8OIHLFBnK91RgL zXten&M$L008G*w=z$Z9-1Pm$hL$%%g4qh^BwNLA816x`p$}9F|C=c*Su(5-@QjxK} zvw$^@{jT}tJEx&1^bo#L5|Wu;KER!1lTwm)kC4oGD489S83F4(T4v(Bt8g{3E~~B7 z>uo(rf{m_QT)n1Yp(AZn-zUAOU$h+c`bkp&B^Pw0s%Z1Xk zOQaj2_guC%rTc@Auv217Kf;Hv6S#@TLs?3vta$j_WnfkWT*$hTW=6ny$LHDp@Kny- z>|}^?_2}vk@86)`2aci2J;zfn zfv4O_H)_D-5}JxZ?*6#n*RgNv<`3SfICYhu%<}UAuXoEY4+|pMq=014cCX`myse|D z?!5=1#H4g(m~X#^+Je+;-S9!BHBF(`cHi#U;?z1QXX11cFgKOtyY_I5Ih;n}do<19 zaL1S)5zxZXybIoXWG3`ThRM_4?BNgQ68BvQYiCCF@`qL)aVVRYrJ(fnY~L#xu2x*c zM6X#-_rR)nmi5BtBpb;PuahWe*iQEHfvt`=d;35-ua#@P$P@4LXx~|jmKq0NUQQ4G z2qNGQM{G_!bj;1miGVcM{yEq%ldn*-T~6fYmqP-{B^>^^VLrCFH%_f&$Vsf9k2e=M zBk&dvmkxX-+)mH;E~)fP-woS`Z?kiFF&{dfO+B5Dml*boC@--OTpd^P@yV&TIPMJuqfL0LgE%N!IGtV@R*^KD$Qat}|(E1Bux=|1pX@9Qo;5ailxXatzg=RP^K+Q7nIyN2RjPyxxxWRe-9 zNM0RD^0RP~b8~h%(|;CznzbY|Mv<&cCb_lXG!}i@o#Yp@dJMs50T0^uj#iNT$x3&_ zrYD8*t1TY{;XuPzP_qa|ThT43R&#}YT^3&2J-cHupIu6Hi z?nNbBvvnPgi+5lzlucYF-~b#JLFG(vS%fhMd4t~OvJ}(Xla^x4Z!Y}&`)kT`2>+-` z45AFb7E*BqIBo^Z8A~xQaaHEvXT451ByEsZMrp#ZP1w`eN&&mAlxC18 zl^n+FL1Qn9d4j{6y|UWd;Giwb#I4X)n=;pS`5o2sg72VA=i}u$Hd(>phJ5|n&W(x~ zI{H{q1XQ}U86lv4NmhFw_zWwW3{CAjNBBeI)IAtqSh5eLn|l_Pf2)M{%<=Xiqx@l7 zY7xpe?9)c!(v)_Po`0|N!g(0?GyyRVs@D@4l8R= z;YyH8yWb=}-(}~m8Hr~eS91Qg0XHzEhudwGUWK&acSlPY-2v*NiI6T@kPB!Yvp;-FPF4Au2kLFJTmYM z$1lvAIS$7^ho2rebDRz0+$iQiG0Cay_J9%!zsuo17{)JZxS16787oHHdW{#b1Sge% z*SXdkYEjI64v*r8kW}{2&E{%TrkmZwDOacEm*2`Jxn%6sX~~f0eq)+H7^SyS{^U;b z_^i#7@Py$(;bRpf&s!;`!t=I?kZGf+sa_=4b2!$U)W56vK#FhXLNP@V6rSvI8_j&4 z@FvE*$??sS=oa}8my40OWv5st<0fvukJ@Ib;TWD|Z#x;UwNqDNc!xc~@CWy_bR!vV z*uR>L_y6-dP*j|QqCU@Pm%n&zmq6 zubN#uVf>W=RF1dX%&Ez+qHsUP=etpS=~#+igYo{*vg8=bAKY$Wn%O0B)A0U3+?@(7 zolb>5>)v)U-cQa<#_#mC#gUI!#AOr?z>$v+>J^EA~3 zWiN{VnB$=~#dx`RO{iYruhuhm@Y^M4Qw^zZp7&WHdwizG zxYS^2ydjF)2R%_ohPau3uu(0z7C4C{HtaSt%*Zt<(J<`AbBE>GE8@)kCpr!6`1s5#{*so;$G_ovl2v_eKE?8 zsU*wn%TdlxtwQ;Mea$RCG1+=~mLHT^e?w_n&$jLvj&B9Ra{MHmzG9PEznY#x+Rs#J z2HY!1d4!sdvT`0~+={x}n(SUgAq}XQdH9h!QAbS+SvOYGCf2RcRO&}5KhX3S>n>_C z3xi4N-cS|V!i6YN)1~G_1)65CZoa1UMAE&kX%Fj8YMPZox(Ax>vaWt3W#PBhr0c4w zrD-ReuQ5H9=mSlqth=qrWLW5RWX_MdXE;rG;TYr2$s1L@G{v2L*laZ1CgAt+ z_0q!b&W5h6qqXFwH5*20vU?HDPr@(3(PHw@dRu10Q_iG+qw?ARPoeXjDJkEJ|DTkv zIaAKTG9R~q6(##>%4Ea0&ZJc6mdH^Hg9Xvv1nn(SVb@^2)x zPv!~zT9AqJ;-NJKotUc0b=p>>rL9=!uzMY{WkZ!BQDmc(>$Gm6*9p|Uu63JiXOa9` zt1|H$4K7_Fm`T~|21!JwHrNd^by70e4X(7QHaOU&+hYd1!A-3rgWUkql!;BYahS4) zCNkI^`Y@5fN|zomj_HzvW<@WU#$;Y{(6s0U<&0`A>kY4~jJUEbap?`;F;&@1dpzTk z1OIATQMSe<4+8L8i~#%LyTY9=eelb;iiV}_M~c#v9(BZ}FC;Rl&h8JXicEX^lsfkQ zFjb+w2hsp|UDJT1I`#s%sA&Y!KnQG0Cg$27TEpyvAVQPfD+(!!snWin^F}cU;j}+r4zQ8 zB>Qmqoaqu$3KYTjDy6+%#WH&loY$0GQH6As2^(QrH;NH(mvNrm?zPT70{+uUr(-K{ z*=+R@hp%6BjH(153Lc#NO+B@3d-8tz?3^xK5YHp_EB(% zi7INQz$mz=lw8wMa9tDCbQJuh>EBKpMKS!VDWG$NQ4F>Y)m5vqkA`q2<-;-1SQGhh z43sj>#dRhH#@6(x=`!}QnLZv;J5r&vB&EQ3*vCY@eZ)Q<4r#J`g&`f+RAh@n`i`m6 zUXe8z=@(7p{PFOcPPx!)qZki=Y1)M2!W<8fQQeA>j`1*`X)eBon1bIpzO8ij?bsEQ zKy;#%s)dulQxmmtQq4BGOojy3sZlZ&+NzX1N~S^;lNu${OxVm=1x=?+z;7ehT-m0< zAFNZpmD<9}0@J9UR0|Ev4Jsr%bL4azd9lq%@l=4VW4KA|xJu>_WADnyzN z&oRxzL37hl3R{^}y-V?PBCd?qoqkMrmx+cf<#W%Xl-2nfGgZMm!S_(t*3`Jox4G*K zn9oERN4n004{Btb3Ac61ht_$hOX>2c(3y{UZ6-`)-Fe|UEd^%6sBB7kUPMOyh51S~ zk!}{W?P@+!&Vue;i7M^m+7!6WhI~y?6Ne!UQiN5Tf;7WPW8LP!0w*nUGhvm^w{Ox$ zF&EA#f<^u>y3K`fT(8jr9L-CC3K-H&?SF84_=|28ut6)YmA~dT4=!seYyP6!e2B$g zzMzcvN2b6NFjmu!_#JLfzz$98TJLpR0Q4Iflrjmcy%17*5bfuow-EX;sjgT=3bKE| znl$(tC?q;Es3z6w@rT8iINs%s+fy(_)6ZT0bz2N`HBIeg zbzcfgH7)Gq?*25aB{Fd&t{-T1Uk=-}a%oVI`!n#qCYO{*_h;cCQ>FdcuoU+da7@$M zur#DAn!YR<0nforP3KDTk-U3S8)@~(cCUf}C-p+A&t%TUH&<; zQ?toWxUYm8im>lfU^N){Ei7~}(n|N$__GvDV5zmz{ds8V)V<=q1_m-+5`AjD;=UFp zGN~PQ9UN6D>G`jj$2xf6%$V%)0yM)fX<=8u)xr)QFG63YOX6x_rpJ0%t928?Hj0ldYP?sl$>Vh> zXHw?hfLEEw{M#Pe;4`fw^V{(Sx@z<9du)dbn!@J3@9`%5&P3+F^w857wv8+m>Le`+Ne{1n{rmlBjq6Fol#e@$U?6Fom81^ylI zi0O0<4k|!uU6ZV@C#2!Er20GH@f<$7JfgXe>8cVs(&s;sY@*VBG_BC{5JYSGI;|Kf zK~rSxM9;&}T2prHDUZX@QPa>mC7z!{S4|V@m`Hh={%my(j=(@ovh@w55t`!#bv8mn& z{7Hm%ns(I7N9w{Zyn!0QM64JXcLZ`UXcX@Dk)y3@%@kboD^%C0%u^X zQX)0*Is=QG)XeKFyuwsv&uq}b>l|!V1XYRMkS;q@4);2bzhOgVK8qXmG_MQL-$@IR zhBI9fDWU6;zB3usqVNlJ!QV8(3nPAx`{gm0{sQ@|quu|A*Do-LN%`Uz7@>)L@e52~ zsy>M6!s0XHuT|3ks1;9A0*E&0jD{E6Fu?V2&p8 z%pF*)=~j3X@4K)<6GXH?TBnFd&^_4Ur1swT;43HPd*6riPHN`$FTfCN5$=CHpdNyq z5H}(kP!C}~6Rl;#z5aviOmvYr#v4TGP)e!%gjZX`h?JkC7{#RgBt^}^EyYyUDL++{ zIS=>0BVPDHHUAy(pvm=!$Zb;0=8RPko4v-{BHq@tWcnI!o4Bs2Pw|J|cG0zvim9}h z7f$qah+IvJ3Qu`B#6V3ma7A<#MT$)O0=&&}72_3Rd%y5@6Z4&v4<6zolWL)-NE}Wk zE{WAG?s`@sON=%gs0I-=GHHjgP2d;&#E zHJJq+d_u*1Ngpp9tYLk_xS|FKupGB1J8x zO4vQR+$T~bI_XKDhGKw|p7m)YDiqllW|*~o8jI&Nj_pshOH)hS9vX}NI-_^MTGS5#F~oZOlr(D6R~5c z6g6g=iG57!EMPVlUuxym!nHmLLXM@R2Y}83i6Vum%3eO}qEDhI(lnK+MAKlV1)6Tm zq?D^P4RjFIoQ8>F3+vPrO*H>U`3@`998DA-s$zIeNEH9*LTLj^5|(jPQ8l`gL|-Pg zCM1iuHD$)Q`?eIHsg(BnSra{5i7zx6T~2wl66QA=-AX6ot1CZg@+&>%(Yi*}e0@{J zuS&;by^XMruQng(+eS2XQn+uL$Z%4$Z(A|eNvXb_#0Dn~@$D=g(DS!y#blpM;WmLt zjrA!j(vy~MLlD);Rz-qRE{Ymsk`II1ZFDObQm zlg;BqnCO`&{3a?I+n*>=(<-JFnieqqsfp%D9=;aL`M^71wQrtSuW4)Xdf$BEn5=ZG zk@|=bO#!i+eEW)ylhytQ)BEr8?I#XtW&6onQUlYxk0&!gv&6om_GPSzQ>AnSGEfTiB(mr(h72kp4JEgSeGG$KVr1nNk zdo=koH7-%QOr}+uS~A(EE1iYuEhhB@G*En?bdXc{(07n%Oujd| zDDEmUd9NBS9x~Ew#%o34Q$h768sj%yG*D#E7&*nSNHo#ZYh)Qx3KN|S_V|qu`o<|nug89&zS!a;PUF_T(^#)y+zM`zoyB6tzyBVAbS38F94B|%HlL}!^X=F};Elf)3M zq`sddK4q$cI(@QhPZHM^+3WSmsXawlpQJ*SyQhf8k5SEznIaNdr<^}Uq&jIAmeSEl z=7%-V?nTs9EA3tfka9H@*^VJSZeoG6m@}wb%Y>)NNfSM%hz**mCY|z_BHqxHls?gO zs(43J+w@bW$JECPohCj~N_1Pe?=*4JNzFW_3(HgNQe5?-eM?0nMVK<$caG@pq{064 z#cU@{@P9%acT%!PrD(Rex|A9I<^oZ!5Q~}Nzet>PQa(H-vX^jD)J^tTEM_xZ60{&M z5#K2tY%6}!f2ruQR26zOcA5XvqQ9p4g9<&L7Sov2gne4fW1@%eZT`zl@sU>2j9o5n zYoaIm<)Y`)s!;kEV!2q)q*j4vM9?zQU2@b;+bC9uP)&U^-tk`{8fhAu@t*&4B9W=e zem;Aj|4Ok;Q)!RG{;Px;yPS%tvd`&$*#CKPNYje4pZwQ~Up1v?|K$IIxbM_m_Fpdo zpHcaI=ic^zS#;MFhO|NSR|I!s9{O(-PcT*T(!E8zq=^>mEh5O&wfV2JY1tw^)Wr;R zxYcnIOlJC0>we84ohIVvE;qV!p+DBXsV!4)fr)TI{@FSF_c zge_tRE6+O?dR@b$)t_>0!Ved=h&@_Y>UYAnMI2Hj{<8H%^KQ>66ZqR)E?Y${CUqo# zO%yU!+PmUT`MMaRX#n0eye_6br}jVlYoWvHydh?5<;S68k!nu0ZQ==~!xm1jvrVkk zDGLLa*V!R1GpVIzhxkVmEnaU5M-^2~Eo^UzI+|$l+9|@3u>F?=t!z6*oL0u*lJvG{ z&7>aA-WKhd)H?UJn50wEI`@v4q3P}Mo9gTl8<^;mjyI4#V^Yi2p2wQBM|?#(lkfA7 zc4S##`mZs@lZXnh4(|h6{r9(e`;r*WQSxK#@ zYG0}Ifrw|Sf_~|L)cH`fV=^y^-Z2wB_ljJ`OJXsa*eeP&Ex^j`6~mb-VO#G9b@qzc zn$}N}0sF)&I_1?u_kfSZ1tvAqKM~%m$h{@0MB1zJp@UQKm)%b|X(j3|D+1c_J{LWo zuWp14JR&wT;c?x>A#_aqrIe5zkpd_1+XR$U9hy#v0!`G4uf-@$v{8R8>aV4gwEMpr zcv9psQE#6|8pA|)-+lon#dM{^PZ9OS*P~L{=K4e^%?P zw5~oPT32sZ>pZT6J{^pt>>u#BAG(^5{|;D}&s^{OS2cOi4u8ikd@f{HK}Z{YUp z`x|2gE2%QBA(6&QuT~qpfxlsPToLMgLh2jWH&*LTc{DI$H!-0uJfxxVg(Mo^IdxM* zl8n!{Ru`HNEse{H>=$FVLMy}dbyc-(#q&d286lc>kA5m7)o4sa_n+spp9x7fPO_3- zGI=?qt>OI!Wu#--%OUNJu9{YqZ42pWlsjopNGGGsHkEQk+5V7BW4M!E4(VdNx>M=W zv$utGHTGxoQTrKPHPO{WKckdM?Fapg{YnR&aNF)@ z)HIl6ObKO^&)qF-}}u4@`-ItZ5?XC<62?uPUhlR8B7H})~nW-%*t zfN`0r5_*Na6k1?Jent7zCNs!r#iVwJK}OAU(IBG}>u7g46gF?5!5=yIkxpt#svQ|N#F%|THNt0fPFSIl{OJ*Gt6GN&%W7-jT3sR}KbTqH*sqcvHZSUigj^&uPXBXx@8Xv5UHWr;;{j8Ub@ zQM*WvHQvyaH?~Nc3>ybw7p8FqUb0uS=0EGuCOEGq_03F}7;5Wutl1*sXB|D$9-inu?I-8mBe6 zB2^d(X`!?Sa+$hLepm*Th)Eq_(0PqNXw1iG|eh$Rrgr~zEg#kB0XpL zY3dQ!r0z;1R+DGU@Vcvva!p%Cm)BiwylrZ%8ojpe^G46_RWY%cbgg0efrw6b7wfJw z4lz~1gJ_TNb;i9jD&^`HEyC9u_%(R^tHRgyvcg|B@O$b^%X5mtHyBSl>G|+2#x5tl z8veR*1b=^klb$Zy9=_eUt(A9UwuirEwEIcv?#5gUf5#Z>q~F8$7_U3Y7V*Au+)2$N z_8FG5)%nIo95ND}v^?TVV~D03F|S0NFwUJ-`ybqhIS}!KG5eg#cq8Vgh;znCO_hF^ zBQ6;Q=asHOt;-RYjjcZ`x)XIj;%W^llGlvwS~tOZKjL}~Dw4k$yR>d5>V7vqMZ)%1 z!Au{NN~%@e~j2) z6}8FCi~QG^tx1IEMLsmnXsXj?cI1D?Eh2jVrE%%(NFnW)RmR_QDiQtlXm|U z@RrS4NsG`Aq298ElYWczmZ_TTUPLt)R&UwSnerX~|J99k>i+yc`AU_})CM0fbiOmA zQO{fMbJ8iS+T$sY{eN^nId#;e$MfCPI=ufRWyqh(Q4^;%M}y&iDWZ>JedQn~n4vt>CU9K-yj*tq;AB5WGa)ovIvnKR6gw9;a(wfq)tg!7NK&U zraraISKPzp$2z0$+$ZWq$lo=EA=Q)jHI?>wx?Tere3w0g$FisEHIk{C@J--)Q8GtU zdiI)nF>*AM+Qgg4Ql?6Lq3P9nadLy!;gz2$n#yxp`Dx_q^_t4Nn%<2(U$2?0e~%2R zF&qC_AI8f^x41{V;$<^VNdx%bdhs%ai8?L9h?l*Y)QwoYEYL(ZVrIO&p%CBgj;bFo zt8cyNmD)!-deu5!-qRU3*^)42=fA0H=LNlL-CXu$s)88Lp7j&tbte_nPm*2lQ_3nh z?@?U8g#w{Mt)=!hU|EQ!_{0`J_CtrV{Xqn%c`W>X@p`w_n6B=a5 zKb*9vK_}VfKc!0=S=FGk9Hr@tMjtf5AIZj-1jzgsjSe>GBI_|Jk7moq-hau)?zW>ity8)r7`{@A$aE<3P}`uf_FFI*= z!`|{;{Eu*8F_rc$I1O{;$4Y6ZX_zBF*F^6tKJlX{9QkZD@Cd-UOk1v1}BCmIfxQ=Rlf!y$4l67GMM{FeVv z2{tNJEhfX{C?>Vg43~#A(f!SE`3)1z=ARoDNf-R~U-cn;gzU&f4|P`?j*vq%mG=0v z;Yhhu)12;qHY}DO5YhABin9M2j*(}yGCljhhU56h+o@{3W;+^9kV$sc-qwlDJSNCo zCwVrSD4)|5G1yB83oe%(J;;Q*xST7CHQ|F>qYAl}N$m&o-<;@K`PiEONJ(pcrTkVEYWFQXjONd33NHK_>9VGAp4aeq z_CvhcJk&4rZoEMDWWxO*HM;Rax!6frjTgxj{P8|rQPX%*c6DNL-?^Cc2uv+4xy`+>dnhIS0Q$%j>Pvy*1{td@)YtBZNX{du`V5oD*Qz#4g(N%j32nOaAca-q|> zsI{{C{ZG0bTql>Yj+X8Tu+EgvDCBn@*F826*U1-HN88c%sC9CqCftsYwm;GZt&_W* zv^VO7$4YrYzUR~(LERTj>T`e>r0EtwHC2bE7o{)LCC3?j3+_c3r0E*I1^1$?$5d%w zfvs3CV>G?gvAFSinWzY&>gU5ta+ap<^}mUFSuS?ck5R8YR<&2<&!$rHhVZJq<)nUM zqjV3XswtOlmUT6e6Sv65Of=U2h}t4IXdRvIUYEBu(FYIPWiu8R=CC@0rQj+X%$!5W7|3mBPAHGmh~0k<>Zv;_hc8R z?uqD+fCrsx9_f6-hwcSrO=xgLr4zulvEM<0@LVb#h{ zqd%9~PMYj(Qs=eoYrT-HHBI zHjGfEoJIOhrf8bqBP-^6nNp8*YPCEg?e&TD=YMCUFXJUap97qcO*PSOct#G=MAz~^ z%27;}aBli~-=E|>Cbh1gmCJR?tA$6R&dF_BM<4B%=yO# z+XZ=>l{65ah`AsKH{dqmNQf{l$Qev(UB4g~Yoc}if{cx(l;?3>_l>>q*s}geN6Y#J znW$00H+djknsPpVSov3aF;&`oxSQADp{%1Z&;15c zxTXj0*Wf?dSd)S0*Z&^tCa}aS9d^vYCSb{NQlSu*Vkd3#kd`thec8lfS>dEpW)rLB zj1wpL+b#GXF-Dh?FY>`*8SkXYKCYIfiul~?X4%Z7CZ4&Z_7tcy57Xc^1YM(YT|3T?WBiI{46oe zsZce!{4JxHD*0sXZ@H*-bb791xy3{m+AeVcrX@H*)#hrUXI!AAHH!jR_QqzjEn7DAubxrBnF>#TWphU7jA9N(e)wguk6o%B$ zV&*X7XZ!dTPh(4wrijVuaZ#2EP5nou$3xQwwFN!$oNT*g@H zYKqC-in_l4Ata`pC-gu%1n)$=Mt{g)SKxYO>}yXv3#WncC=29i?RHsb@Xr+ zYk_2Co*u_yEgqUqM|X;gwS+6eQ-5urSjzxS^#>7^C+p|G3GtNiS)K8Brj43@9I#Qu zTHe)kjOiOq^)e~n4NdeU5o>X4L6uQ2BF9<+m?|L{-yUyb$<^eF@0rJ0o^HYWpL&O> zspT1!(LwJpHMOkOMDH*)vut9b2a@c#=9Yb$E;SJc!&|CNYNVxx1+1oH`6ZlFIDYXf>Sj4%1YRfa=l5iWs|0tkXl#{X)>|zQ!IaIYLt~8*V59lCHFl}wJC9} zEJro%9z7#2)pEs2OXAvCd|RoMwXpBgEKQlrO6VF$n5vcOfoDV0Ed3PO_hWCTTgGbL zg-*}MrCXlWbQYfs@{g>txxWh`#@q4_Ov` zzgn+)lYP2ank$0urq1xmw){WZ&O0!Qs{Qw~$&@ooAVf;&5CJJ7gdTbe5_+VB7D$1F z-dm^xq5-70016rv0hO+ZigW}76hx&60xB;eAfSSxAl|3#?kvUE-@U(^KPK~;?>Xl= z*|cHf@*-$K}Zd+J3RP;IM{aSmd2LhM{+Akq3l zXUiZp6IvFA6fe{~Cz8a29^;A!J;oIedW<7(-sz(k zY3Osk&vN$BYx!wzrT%)dpOW$q)Zg*b;QWL1@BFl>(qR3rpT5dDM9<&Im*)0LL-lAs zeOzgn9`C2am4-X|K|gMJVzhqOPYGIv4j0Ik35A)hjjU zkl2~$>jRoQh}fG;M9{u^+`f_ znQg89wh*p_*6QC0;Yw(&o}(?K3Fm(bmqKgxYKTC%5?ZTw7s8d$T0K(;S3+y`^-Qo5 zx*NGxKP*(H`Q6BMdWm?>sL}myhIAoAu9x@)F$^D%1hBuI)J6xPscOX9(d6YO|gtgtO>o{SzS^kT>gh znH+^9@@Bnrdrk%yRGak)Lb#yXtgj^E>mZx;4XnX}3SK1FuL^nL+UOR&Ob0IgcTZ1> zeqT=(ItTQDK9eX*>)NMW^oRO&CgtFR*B|M>2>#H1X7opT-j0||mbzF5sW1~PQ|1Ge z7HwJB%;;@;Goj`=k@^Zn%eXL9U)u? zZr9<*d@yTp5qW9!P945CO7zC4rO~_eB0>e8%#PlzUl6)hK0A7^KE4x&gj@U3`}Ac( z*PnDgivC0o>x?3=VUFlKiTD!H=lTysd}{i+?&*Rd`PB4tJxmBsO+VLPWrCCMD?sl1 zXrJqEiiW4ApX={Syj5m=p~%nmJA!!feM}GS$~o<}_(niQzb```GAP#a~NkhD4EY;^zO+f(0rINn262iG^UG&=5rbgh0uIX zqiH(D1J^lFC8ysW-hy=kBKl5FBc6l8WsNT(=&wTPI=PHHL~JnJD9}4l-f$yX2n~iC z4f_Pj8*U^LQF*I``^{rxhdX`|%NuU=;-FOCa05Sei`@aso7?!Eh|NbB5q$&ZBa9+K zXgDy>#}iWtj<8n%iGDPpV?S`Q1(qQ*L*4`4A`)Y#$(Cc=udn6X1B9afyh zi~~ZScfSI^Q+ZVAo9@?vP6-W!L`xXo3XO$COBk1h3PGAt#xFu;Ak8S_j?fNB^Km0| zpo8VjR0kl@$BnRoNWADNXv@J z(Ek1_Jynf;LSOff3aM%w5n2@ScGYUe388l)HUgbzf*RcdRCg%U6JDR55%F2oI>sbK z7$EN%*Q?euJ|fE0MpTKYR?o;goHZ3*x>_Rxg89E->7#w{1VU~EGS-_kb@EJGA;Z;H$}Cs7NF@-9jmo6N|O036&sOQt+i2Js5?<*CdgTqdnC+v3hT#E+f$M)dv`>g)XG5u0G7TDRiXo z(dr|OGb1UYwq#U?8e@zvM=_mBdbP$lqf`b{iSegvOfbe1;f=7eH8YJfe!2-XU@V7p zCgsf=Gu8NP9OI95Y@?N*`T=zm z!ufi((cQ0I2TB)$`Ohvh+Zf~*qjSzSMl*q%425JC68Q|eyV`6cn>6fdUqi^Zgj6`v z@qkuzwsF?4odde+*PQbZ)F-By=ZelTZi+Z9{A(c3BrH9exEeFZC?=FW+vxk&P+xgBzIlR zF$#%x&)A&*e(fp0R-#t0=FBlV`9(}L%}T%b^9+3&M_gt0g^=$E;Y>N- z*h<6(7Z@i+LxT&964L_)7Z`~zAaQXQ7#R*BmiJbz1%C6mGyqXFEbjti5)+iyQ+t8& zw-AHl6e-^}nqOoLVIuR3 zj5|VTKFbK56)?ZpC_%*L7aM(q(EMT}d3M13Vq^SlIzMOgi-XLQNS=V^7aPw}M0^;| zQ+u%yI)}1G>!Kw_4k9l7QlqqJSouqhSRpjO)L1j0i=@JD)mlpSVE+4-zOxz-v9*^P z?{ZLB7kO$gH5x2ngV@?H8gWEuuxag=j3rETFXr{29<#zIzX;>u=6`GwH@8lx0Z7Jr{$txx8vH z4TV%VQZJ!26X|&(o;fxK6>y_5kF+WHeS$;b8;xazSz27egxVX88$t;Q*|py>;+CMn zEG@k2!P=XR6+%r@Pt<-dDA6s(Zql%|$3$!~j!MY({V&wsV%!jl?|-%ShepIwPP4hw z|JT~vjADWf`s;Oe7*&Mu@!(y?5F)Ob-9|PMe}`p{ah3?*!Hll6&$#HP8bH^D@XNLP zjNkoQJ>yMQXumOCD5Fqc z&jDke(3C=hfR+(Wh96yrH&>1Km!U!UZd3h3>Jwup(PTBZ{$9uW#5l|%eRK8`2wt5=A?OEA%Xej4QY#28P+U!pu{946u~Q64f*6R{^8GJbH8b10|{ z4;jCbh;4W%{E%^ngF*#=U+0h!l8xr)!Aq`4VMJM4(tuk)orNyfC|UPY<2gSi)IDNs z;CPVcvvof=n!SptWNClZm{IqbWAqU$QnO5*FO7vlO;h*O{mQr`R44UP-Qz~9*EnL+ z)LV5=7$b!4jeD%#Nu$K;tX&(|vfgQ9ArY7NjA5;yY||4^XM&1*#&GhGh~@27?~GA^ zgF<=70TmZg;j@6sGQr8pDWHW!S=!}(gS9h8worjWV-$pZgER9{?=k8dBT?w^=)v&Y zJUdrXX4JHBM?Y)qhx;Q`rT2_}ARZyg(*78Mbc;30_c8uMGmKzsjLR$)U~}ok`^LzjHK{PSUbUVJXCsBw|nR z;`!E?!KBJRk*2;xZ$0q=-A<9xkYZWVb!FY#BTOT(Velq1&Ts3Zs7!UN55&bqNQxNEy(MPB} z&~+nQXhen84Q?1Gg=PT#Y~)_U@uo(uZt#l{CzJ*Bt1&^SW}Ed5ZW_-M!SlH-+k5~x zTg2sQdmG#`vV`7D`wZw6Ci0TsjDtk{$>`sVV}9Ce{brmNQsI@HIHT+i`NltJnt zRP9Nm{z9uOAY}+SmmWI=2Db`ch8LWFGY&AR(DEq_e>08>6)NA``{BNd0b< z*uVyJ6ZI52TQElZ-FQJLyFSt~CS}!l3+Nr8eNH6ecEQy|`-mp1Es@p1#8Dz1*MB!+ zHljfu*KZrmh;T8z*Sc-=A>!{c-!@8Z!jSx3=G#U!A^a}$AI7D3e42C1`-gE`5XC=@ z^Y8k^Ti!p7YeZSv@D9<9?il7~)Q~y?)hFWqb2n&Uy=$}}4ae0!jqduFWnG_2*ZgF_ zNns18lfyCHr4xKe65 z7X@!X-Xcuz`)C5bpIu>9qsPo5L|Iz=U{B-6%yS>2#;qM`UI`+1AtKG+N#iv{r1>`y z)?rjgq*-t)rov}Ok!C4J5YJB{%_U55-FBrX()6AE;>l>FnJpTgo=C0?&R{mJ+W?V8FMrdmhf7WvgQmTE@8Q#5|%R; zlg0%s7gWG2n|MGw}9*v@fF3WJrwWr<}FwrU%Htr<0@2 z!(x8@<8Q=PHmB{vddku^)jkqi#k?xCw|42K)y!VISvys`W78UDkv&B4`y|ioY#L+E zX4EFvJleF5xs6FxOaHoQJ##M+u393Vu4h);ixH8g044A9QF2&4^8+SYG1fD`2qJeE zt!JJmjn4l*f@IWwOa|NOFi;sHoZ;6usApCZQsG~KR@1KyuT#%#D1<)&QqPPNng+9f zJu_Ztm3auLvrtB!azM#K@cSI~Aep{`x6C9Ehx$Y~0jp<@73x{|m|4$!jtKqY2gpp` z1DI_jtyu#zmT0n8(~8j=nQ@i}Okx++nFL*jVxe-_J$)2(OvHZa*y=UTp8zteKziVtb3Ae$dkVp3=nnz3y%4)*P*+sSf!n z|8={iIfRI3@s?)vVbpjQZ)r9p%F-UI{7JJ`=5s>P^}lS^);uFL@QJ^hwKJnX#dulT zz$f&$_GT}k14+qY9n4>tpn0E&b2^%L3FpBg;)%G9W}DA2BKPKwW>=z2mD;U7XsJZ_ zdlj)jBUsZG6^_w5n%NQ(SI-^IlR~(9PB3#H!89|~TA)s5oX|d?&W<@ra0Fl%^L?Q? zKwZrnLIq(l-OVg}l#?kBlxTJrn$)RRTz4~#39{A?XeQAVC?WhZjk!<=f8VW#xy-Ls z2hDkda57v9fFHOq*9zSOx9nlQN5nsQ(!=~zs9>9+aXrkhgvz!V4|G=IO$$GylFW-j z_l&((l6hTdm6@0$$^2d7T^L%SPLlbzBjV3PYnM$j)#p?~Sog+gN#<%HT+Jq#d5^J% ztJx%Tk`S(DlgzL$Sew)zse}+NW|Pb%LNlS6lFWTfvC%KR6jrJFCZ2qxO(PB%9&X+pm=7@Hg>WG@z|1CsubUK9%?Fsfk?{S@ z*`@L{A7q{uaYE_xWe1tpgl0TZzU*LAKZ%KEX}_0F4jW?D7JB)K}HlV(VWjA9SRz}3U69H*Jvn4l0b+H~`@p9XoRn^&2%sr6#C7tHbJIn8J5Id1{(B;?-wg84NO z_vRVqk3>8l%rI{Sk$Xuo!}NUXtNcUZGu(3={A9RI8rE-{+%wGLemd&3o@K@p^3$Yq z%xy&6x#pUOM7!MceCv6p_8pqw&NbhR5yH+j-&{zPrRm{!Th9+Nzrb8e8k&!9v%uWR z1P_{aYU3<4Ykg0Zp}sAZt}QYf30;9V4Hua$gl5%BZj)uU6MDT?I#4&EABGQXv)Jq@ zbGA_R5zn@H(aaKRJz{Q~ zm&{j$Zb3$unX81tAl@=_gV38})3xR1`$F5sCIIas;u?L~JW7Pa)wVXTn9hg`fhx^5 zqyK}1ud;-;%{J=`6$5(BY$3E^c-^)u%x8$OSG?bHh1o?&g*OE)#jmvm>PLi?-xX*) zlfqHp4YMx19|s26y;hoWLF9I?m1YOhuy5~byV6V~%F@QAB!{gu2MfJZ!xO*C%of_2 z|Hb&#=G9AN0ph(E|F&7+M<0C()Z|A85x>op9QL-ELE-{f2_a<@Woc2Vmmug-q18?D zKC{Lge;MOtX>0pT&^DMMS13^$$~FbL-X=2_X_)Qy&ulUa`Kc?=<5%STPlcxdR{Doz z>iQ%8)OM3Og(yqgP=6l8Tji%M&%A3M_LJ6bi+RIO72ADa7P!jUesbW`?LIQ=0>S(T z?@$jM+-_S?zPFp*DJbUq54HV1ZOA`pQ~cW5XM*GHFtc3R4)aYUd_M&*q3<-`ClP){ z3NE4VG-H3_oZ=<)U1o+5UPRt)-Xxj_uIK2x%{zYT2U_Sgj)zy!cbgT6aA`YO+hcyn zM9s9v+(!i0Kk??#9`iFoq#8gcgz!Sd9`l@EiwfCeUJ}9!>U+!^er*uYA51g^?=kaU z$IS3DWskXzh~ItQW4_1a*m(N6$J{{(zaX0{L)&Za7y2SsOSLzs@;^3@vIZs!wg1?> z$OL0qRQvt#6V_-jQ)^l^SHuDTNi4p#{E46NF5+Rc5QkLGvn?yPKWskE2#MANsw~N9 z&EwjCYPKcHQj-Uywg1dakcex0_XkQQ!c{{i&|W{i1jL`TL~S?Fr$2MUBs4$O{)llGT2=5=`wM1~Us+pK@J9Q~W{l9Bf?YaX zHxq>tOAYUE(_AQ2vs7k>Kg@TDa1e^o?wR|EaMW=I145noAE@#Xp5q+~=U)iM9|7JJ zwV{JyaY+72;4mRfw1t+_uWgB{R4&|4o1*r2i0~7h8|HJzbF}<^aZ6N!R=`i2qE2)u z=qHR=#QH+Yv}2Iov8Z)}2nVk!9gA7LZgR~WuTU50uF&=YZ96`0Mc-nrbDqH+OIzcG z605H4=#;Sz3s$eXspFGYsoywgOwm6&R|p|W*OC~ZXFgz8q2-#KK%r$!~z zurh>}4x5w^W1SIdTJ^PrI##dS95P?2bqNiu=|nu_H+C%dDBsvxL?RA5!<#e?(wbOn z{Mu6qP43eU__d=Qn^#Ju!+@5X3lF->nQ6WvO=@Rdr zF{{(l);veVxd{^hmkKRUI03YRiGIwmnN{sB8e|V{X0>BdAJi(@xtY~f=uoY4Ks|+e z)JoUlto}lSYb5}=YrDBM;x5g9m}qq8=GF@w6sTP1mex`~rMGEi?PStEcp|2AYpd*E zlo@SCu5_)9l|jS{j5by#5iT&|I=8jn6Adp+$6JSmaLE>LmAxnDf8A;$cDaX%;^HH% zbG+4Cs2ET?YXp<_W1sS6J6PF5)$;7>+|jxqG&r_Emjo;K-;|10I8T)>ovaQ->*(#nas~LeM-?xz0&eX(F!DWUDF>R%w~8DOL~Buu4;{ zp+Z=tsn%>Ftiy_3Q>|q}#ejNQtC_T4W0J$tt#^sw{4YnX4d|$e^_HKSh7Gpf7qZGt(1uzk{q#%j;g+s*Dp#Deun|_G&be(L4 z7-$e_DNqigOz6xjfbs~z%}Aia5)yu&czuJ(R$0MS<~9(cIVd#637~A&AT#kAXeOG# zhnA2si17RVNQZ@{k#@ntkbB`%I@Q%=%T`EyRy8@`7Y@uvldS?I;;8q!J=r}yfCjPX zSLnAyU8*p}PjJbx+w*>!9yOxdbgMF_0;T_}>kC#bA{ee7E7t7=s}a#;sEd`J7p&$& z@cawnGZGQ&;svXVh^tK0QiL+{tbkNGL?v#JN@}8_S!i zz1bn#GvB)4Wx`v03#Jz47sm(sGVk8*OEu0*#~Syt{`On3=yu~m(T&!`t$FA#A7msm@Q@Z#iO zU6(l4s~nNqX^HhF5w=se?n|tVLTS(xORNus@b`(ASi6O$L5nW24*KJv_Jt5O;S%dR zp^QA~kmhBfTku@r63e+sh$YMbaY#6q0$XjFwI+fITWxtz!z{OMlZFkG-DtUGK1Lx` zEqFC}xs^+(Nk&x2aw}43&G-!MWvjT*yW?A`m#wmn;8!KCb$`W*7CKkrHjsO+%C>5; z1{n?Qk!>aTsbG)St?@+gTihc)=&{NgkQXz9G%o2)Yjb`iUT&-jN^_01E5CyxmSSJh z8tW_tMLGd=hX`xtPatn3hP>#RKdhx%YZV}Z8*rUUC9exgbiLJ?G)(0WwVt}@Bn_XG z>8H8L(brqa1wvr_lf13Bwicj#tCu>WxLaslM~rw-=veVt^)^_a3!N=KMs2W82_4Ke zFL|SNUg+o6F9H1^WVBfUbX{oYP)FZn{RV{Rf9l}Se%dDM9*gkAnxnsCMHHmWXm!1R zM!jP_A(Y4aZt}ZUBcYo>?^!*CB6IAj_`Wq&=&Q23Dt=(i5jy4FRq;dXb)mcvZ!6at z&wnx6HtT&7vDy-VN)%%A7t${$Z?jtYDJ*42P<8LJGDyRCd#zpfX$yihsA~AzXLz11 zpR$V@2Ik*=#xN(^kNb?P@I!(=ai8%)OE*<$bj;jk?WRQcdE)z_=A$jCH6#_^-6Bo} z&mFcz)k)doAFMY;#is1@k>kOY{UPgPE}=RX`DXpY)?uNaA`?;$TVD!YEHp6XQ%eOE0$e^n|G))@L{P62aq; zXdSgys1zjHKX`=pQg!VlTiIypb<;79&W=foDPju0PU8c3_CWJkvwdyH^J*KtlFN8g& zwHhvjJ*Kr9CxktwwVEP?J*KszW)kv6lGf^p;$&Xo&!o0i6@~C;Qd_H3Y$8i*)}mf&XLXYk_3X-M zn%Y&V5?B`(Js-4d36v^yxo5l7ZfXG$pC2TuSB3D5pu74=2+s(*t7=hHquOgk>xuCE zASt!G+8O1bh`%tCl$xXti&(gMQfi7iFLbFvQfg0iQz#6yG-W)_@s5GkTfwhspwGaQ zP@_}(s!~GrT1)_XN@z#H(W(7Zb)o$QCjdb`;rxfr7Nhl7^;raZF15ev;HTNC1JztV zElM4veqhq@8K%LiKuI=#t}Idp5uPi(mO5CyPQ>*zL~RtpdK#+s0)c&Yy`idjDJ~QK zV$o1lmI$-f3uqh>-w_(7o)f}LX(QEnCi0+>>JrCO=s_dZ&!V9RjZ%Mzh8{FZg_H(+ z`26Rfb}K!jRTv`Bn08SiqgABPY|t`Pl+aSpGJ@P|jH z(|Fa3H1wwvK%0o*`uhj%&ZbUKA8|x-lZmRp6POvUnTcwI5Pn~4qIy#ZD-nKPgNQ$W z=qPU)uEWPBUrBXTVWDC`lT{g^!p*OwPEmE39CfL|mDJ}|TM@%RoT`$Aj)68^jb_rG zYj-PkhMFw20%)e1DYUTc-PBoXzfi=a3fdfXQs{7j@@40$yk#kCny0DRbDpY4v;g0K zDAaSl>L7T}c&g_D^}dh_uhDa%I`7v8Yl~Eoa-7TxI8j}s%9dwpTstjnv8wwd)BM`W zVK1s7Lc2?*^n6K85}I87K+k3BqY51Ip!3*wJ(nx(DaMmE3ior|UVh5?Q|IF@ zvbr4a<-F}TI0eKtetHRLty(}O%v6}Qb?POd+i=}yomwG;nOU#a2w}fpAJj!RsLiZF z!`$q(K^^kbpS?CY>Ixx`Q17Teh;a1sq`j-6s$e_u{m#v*nh=ibn}bYjR&zVb!n{nOZv3#V#4=-~%~j8>Q`1<4NNh-K91P;c&HE?Ip_6J}B8bZMQmIjpskD zM#^((d;P;DI?c!G3Y(zr^s!Ra(I7v!`myRPgx%?560{NW2A%)mTYcZBeXO={M0%@lpV~phy?MVnBO3PR{VKjDX9mshS3_a~=J%@?gz%}^ z{c05v{^aD*Uiu~9tf|nduj!?U@`O=ODEj3T5X{uDYDHvBSGGKCSW# zO&i`N{j@5<1euA^&ZyG$FyuT1^Iy&IGpd5%J);7M)rhjR?Kti!Vm`|{r+y^DOLqs- k%|7LE?* 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%0AcNG9J>fTF%bJTkz9k& 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�vM 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%0D24=gD0ltNo)&c4FovnbrQcO72F8qY3X# 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 delta 750304 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

-u(glp5@Yi0;jPy$O$K6 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

h)S@7&ZJu5i*&`m~LA08j)f>G|2~2)6a^K{X}4Z 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

GC> zSI7-{;lW*z1NTI>ABt?xj%+W$wu~t!jTUCAvEZc$?-=1)<9^Z-{VPlD#W`yg?V78a zN&l-P^nlh_L$DrL*&I?qMq}k<9kI99mzR5G9K0^v`dhbc9E_9gZ>6=u!7KLXiI-~s z4)W1~xh}H(dtCZo3+^jkmKR5KTl-bF*PbQKCKoKWJzln}Nv8WPmH9zZ=Wutr4!<#1J=I)EC_$a6A z$NsWiNw{q z+t$?D9p~I5AHS(8gH5*8p_Ni&-L?Rx+ZNbb%C?=mRGjD`gZIp;(*Mn+sXHGWb5s8x zac=|X<&^%9-ydo;(}*%Nm7+;Q(nMuEl!=K!Wuk}i5K~PxRu7}Zc!jMo0X`}+QSz3%3HU*|g4xz2U2 zbDf9#-1i59^1-BWnwT+wwIR_q9DLo7r7llW4=EjFPY9$_$HArktX9|V7cmSxC%Qv-gf20Z0nVWi&=`oBQ00Nw)J zza1u@z^dhR6gCF6Tnu@nb9@;Io@!u@FB5@l@KiRaea?*cHNfm1Gm)UojEut9dGs4S ze5;2!#&gC)s}Qp=&9D~$%UZ;(4ng}rh0MHJ(H;Yg#a#QX2ClOi*liX<*qS^{G(cYj z+zVqpS|M2C@zA*rc^Lr;^ZR{GQ5Wb z)_xA~MvGYk3T44BgTC3L(<1lZ@<@q! zz*K_%Ml7Btk52sZJ!m!#p1fI(;fBq^4DGNp!nTg+bIi_O3pkvF5=$tt_=)L1v}n5J zXA@<3xU+|I@FHexE}Cfm3~Y>bHeKvv%p;%1T(=AgX=@=D{GXo-pE&@%4Osp_EXQ37 z#ieMzl}}3$YqPD;(xYx$WN)bH9N?PQ(9KYQ+U!Z-VvnZ;SOfJvmd@rX^LWZVOgV*U z`<@3HnMVK@0aviwN>d8(vAP&*CasYn?s}D80o5L^@$ftkQwbKl83iwh>1clnl^Ka; zMk*vslWN;>IOyFmKjIQ}Bj{W{oY4g{gjgtgiihd2s@Pm$?w?!^{>^Nr5MIg!P`#I7 zrNwNs;m~?L{D3<;q-$r7p0CYSV)hhHs8)lAJ%tmhwZLj7V$G+>PwO(Uh0LIC!>~(D zS@ZQ?<_#XE898a*znf8xvF0S;1<0e(kxD;h7iYwrEldVaKIF)eSq7{gMq!$R6t@ex zqeDz3UH}6}yM{;1XxA0E3kIxh5VXlEN(&LID>Co(*ypMQU2<4Z4ep0wL-f)d3|Qb- zb1!4qKIvSn_>r&;Od}SeK;W%lq7v*8>wt@}J#fmw7}70$7%Jrh=Vuqr$ioC!FiyJYYq`d|*YxLSPj}x|*^GSaMQP ziLIzTrvt>KzXdB6gC~0C!CKN>6!a}-Myr4;a-ua!oT2}rF7r5G)`kJ{_eHtYcwY}F2l}=u6as$n+=8CP zEr(+;L4VTnXgNckPo4-(Z0F54IB~%B331=0j$QyP`iJcu{WDDVaTuUho%XGy_?K_^*}In1D=Y^#C<(n^17v?EzjC%);aYMM5U<^gHqcYFzrWP zV(t=g--Ax4!tMc``{C)mU}fZGC3AYA|E~vA96pf{hfm-*eA>d;zlQ@e;1od6YG64m z>D)Cg16_EEhc5=EH8fWsj^h7ND6j!HMVBUma}Gx>fT_?@(3^nO*Si9bf_XV9+3L|Z zdHj=r=^wq1FiO1l6ao`4YfPC*;0*Kz$qYN=Mzy3yaxT*46FI<&?F_dvX}Twfo9I%S zwWm+?!Sa;2H6}I30_TE9dmzNv8wsQKs|V9EJm;tb6Y*Cs2f-7-d7jXGU};UE`=XYu zu(mA(T@K5^<}YKh0|a^z=qij@zOoQJbj-^l9<)C*zYS9}fg2@_NT35=buQk*1unJ) zu$hPztV%q3nTN}F!Qv;6aD{kKe!v?gjDv@tJ_of=GhvvMg~R%q_G4Hb4qiq*(%WN| zUugxg0>r8@v9_M%j5mOvU9o-w&hA(oX5a7DiQF3c3<>wZyqDjMg=L-@f>X~h%kXNi zFk%(Jwv-jw{WvcC19_K0soz|R<^*OX=^tF|)BxM2#Ea0l@w?Cx42vb$idY0COdmB^ zPABJ@0v@(ECl}QgKYxvR+DAH{=zebL>*|BxYhX@r=pWqLBG0;d*#CPZurM~k9>i3I5IV6EM5A$wImBmpw^4wM4Y1K!eQ05m{;+G1<(>)3DH;Nn8e~ox!Ci9*}2qW zX3gWMkZMM{FbiG=&*ydwaV?bKtcG~zw?Xi`_Rep9IL;~ka;9k}PCnU#<{*!GB8c`M zh0J^;c+LQ`>BODf1;B-1-0vhD%tAWxcNk!Z*@ZgeKTW6f2yr0j+^*&TwgLRwm`w%! zyH|tATI)eq5L*j8pY#8vs6BH3GorebX0==Q4Ril%QF<^ zM>p!zg-B3sih$)T#lQ+CB{nnLn}S3y+XYJ@(kYXnw;Wh9Ne@*p6I5er-RBw;a2BG* z?;xzMJPjixaP{RT#1cP(mG2{6|k2 zM!|;}WEIj?FzG&)Nmqg{ld|h}xgrtlK*^-bq8&jWfKhQitp!}X3cIkxA#Toxw=%Xf zVI7|63V&-&P5QZGt*L?Mt$}q=v(+d-wOMX0w4;gGcdZZ7Z}tGjlLlZ!>c&*Z?f^GJ_my z6R?I!kd-$G2aN>A)IOvKitfU-pJLr+3A((li%<}xdLi@GQTH9sZmc8&s zw=GM0(*(14<+`zbndvEoh#zZ#n;?@FU<4$75mA+^E1rE(#nOS}_&*nloc=oc==o;U z+Uo|?6q!k9VfTTafebP=muc_aX@us0F0*&`c(#Lwg|SN$>lkC6;}3&eF9Z9i+9n@# zY03jND!9mH4#t81JPc0HUx1M6@t1hG%){ltYD!vV`5f4vbMlH^5F$+rvj|$7M{OoeXnnMhRTs1K<`M`x}vtOIV8Ascu)oQ`zXhIl%5 zMh05?#-%tDWARmI<0uj$<}%c#j!4KyW*r|QE}UeJ4-s>%e=M}8P=?jtO?OLop7>?xEyR|Mo+I3ko*}$< zp23??7AwXL&O)AfQ!NWofZD7MOj@y0Xlaf)dP*KO2M^DwIf!L;ZO;tC&POrml>auY zNGzGe(Gop`aNcN1TmsCt6oOj0QyZTF7lLP zq~uCSGB=~}JWSOQivo^{Y!2>*mqSh{CdOw)IwmN#(_`=pfa4~r5fF*}m6(d&OCBToQqB6)!{0CGTOZs-vjRY~FSMrS0GulTFM_xxv zq6{@7%ajb_UMPP6c!;gMpvLk?YZr^@0_33_%4D4+lP$#g$$7I)$0$NncwshzBQ3iK z&BaH;^~gZqL+1-t0?YT-!B7mMTsH9eBAb_w3)h2>1u%?I4o@R3M`R~m@o2SGg6^}{ z!{nd76wSs*wi!rJ28D=9Ob<9a`|w_K?Cm`$!NMXxMB&_J`vN>1ued?devXloda)T; z=^AZcG;X!t7R*pXtWG$*2bd1T#Dz6uf|MXuFWdl(vkd9OaF#(ma1sR3@3!7(Vw$#u zSt!q~w1tKGq3O9XM!(iklA}TA))2Q52LMk35BEWz_3*2}l*2jEr8Nc*J~GlVjQ1DI zk%>czrVGRx!I_yOFSi}%0`ssjPqc0a4=t#%D#oB|)aDrWa4F9J-D3Fp2Fu~Vlz%tR zZ?`+dn4CT^773gRY{nGf=36nlM@^~F9Tv-)45lC68w5|^W@^J`;nQ06d>*mg1S>0| zlTM3HoNFrZ?Ll}61$a2hkKQJjjT^<8$p{y$aVy)_#N3}c=?+7``!$?l0^W`S6!nP} z^@$brH=_cy3jHJjImDZhS2*NzN#1Z_`{g{dTl2~+Gnb)4azr{VkHfCM)0j?9*#ga= z0*K{^>A(ug#N?r)w}mB$3p!vohy&cJfw9AI^4VmUJTHM`HX z{BI`_%{~5llx0>4$C?CX&IgmG1%<$B?;z&)om!%O$HlChqcUU9%Q+4Yb6s-;;dq%#4HDh_=DdJ_arE zNV4@=-r3NtNYZ$@37GnDLBTA zWmVcM;0^SwKP%&)Lzt1mNt5sl#~cv9UzKbEZ`3EqOPY8YVU9%D;*L3E=SCd2;S&UDXOMzyTZ_EMV>b-?}5xRV>z(Q zSOKgW5Tm(PpObOWcq+r@B26`66D7vMzgJ=sYU!*?x=K*7)F=$lA zK|`d+0?=3vE6RQ}|0Z)vx6YG6ta$*j3`V^3jAT9J#b>9NfTsRIOkVnUJ+SIatQK1d ztT`v?n)8w_ImDVT6Kn2DY~_bh0lazJw(1}};h7H~XB6WMEC)thZ8Na4YdyRkSjrJg zxedTlj&vzU`i1DIoU{{14`Dc)=Z&-@Rt+=}>G77~;p@tMEvC{FfmwiG0nQof{$yH( zM-RJUdx4(7iP87KJ5UL3MV|0ybUu6^H0pgrc!LDKa>*I=CM%RRZUK$ejHGL1C0*`9 z+zS)jy!R2JcFC(vS?(x31B-qOo{doGW~`q>7S;nHR|V7Te2h@N0rAbNSvtZnYf1lY zvA65d>A+GV16c8}GqCzk4zRW^iP;=H&I0*i+$_G}sA=Us!IbT~j+O!!O48wfS%UtB)Vh@*CJQM{JtH%kz71Lrk&3)^mbkj;ThPM{H@kqDYrVoV?h+{o~b&!BwqF%lpbWPle zHE}1_#GUi)(woiW-3_42RW||KJ{3l*$?e}6CT6$>s{}n8eq@rvZ=z*H=Oq5(FU?By ziDwNRqi|GkE&leiQ`w=w>1~{%#8Q;F<+#vnEOqvnh{Z&#+T?mX#Nr_q56^4?QL}ho+0f;-?^;2`>hwyS$3LCBSqS_HsrJt~xnv zlP=exeC7>#puEh>T<&FNVaiOpGFJf0KZwOs39Lv^?co{^lV25>*T$}$7&;apLGh~& zSPs7gSn-Qk@v9zKg{=fu-qpa$yVm1h@9~pvWQK@uUcx3|3EB!QLEC{zq&NQK%A#6>v6yNoL#xtOB+I ztAKg%8!b49rD(oKCl);e3fZwBjLv_>PJ!A-OlkNoE|~lbJI^q$?1;|CHpEnj51Y1o z3K1(9%&Qd+%<{zSS8 zCYC~Zq0PX8^MO@ZA+QQ70#*UUD!3R}N|$(;J42+?Lc|KsWtN8(F1I*(52(V+OeUGM z5?D%91FK+SDMTKbnt3%>CJ&Y1GK+N9{_iN5Sn~j2a}MxrB-Gdpv;>*Hd<&lp7-Mkk zTprIr@bRe!kKHW*T_z=#sh6PktPCIX*MZK;@G<`qU{e|Nf8MAzqcCy!>uorQ+BOl? zgD&&VMPb|@xd?O$QjJ-dddf;*S#CA3EJq$S0qK6;_#F6JB&e|U!199)z!J0xSWQ4I zrMqI9ckiL*2;O$kC8x<^w)Z4d?AYJn%uxomtU*^3guIc7T43TU6Qu*IF!IQ}q^n@^ zt2Wb70MCLoq5$C_)8YMrr4YxL4CI9p<~^X!xS`fuTI867=<$56M{mNmq@0W4nd_v? zEHf^=ZN~*ZIn%2e#Cko0V@Dk}_jz7m1{Br4dR|+!zY1moKXrI03YrCc$txI4P(VJE z;8f{!;6h+2kq0bCV_tq9k$Fj%MT>xC(PCg(j`YZKC_mDO=d&t+X%@c#VjiVs0aTRd zLuf4(ObaP8mH?~m>99OOLx*MU51eX7PWA{jCFxuwF`@2|v{pAdZ30n>_ndcG>e&BCQPIuE85HsMp?)m9-! z#*Lu=X*RYcpa2z8m!qO;jx?-FXM`=CV?~q2mxJB{CZ$C<@+B~dDMY2}EL|a(GGzr~J)cWQUfVsxNa)Mh zD4}(j5Jy5}$i&K>)?vYS-((J?vWbM**21Y!;;{Si(F0U4A9VRu24u<+iPfZ(^Y{t` z1s1@g(kt@uqGC6g4NNj8u}sJna}m4v-@A3`|&g8lL!97!ir{fn}jWVC5xU5s%^c&8N(U z3iImyGGe`7HXO1T*24!5#-k+Mw6k;hLMX%Ao+VZetvCt%cPz*AdGJsPRiGaDivf0;v=TR}0TbkSRkv@j#?#s|Ldzf#iu+XK*w}FMCOfJvZbP8CTKvz=}(`ua##W(oC z$Fb^i;H@4H$1Q%N?}kG$uOJgMKL{oUEOou@$e_ZARjDRm`Am!bTyqtJuI5SyT?%D* zm`ZC6LuhhakC6J{OAR1#)PJI7#ZOY#3y0OM*1QMJMntd z8vH9jr=SU_{VES*QWj11`D~vu2fTw54u>K*65C3$GPHC6#|I9B51&p1t;|i#r1yqT z0lmnp%|-}fX3nm5Slj@f1Y!i~RJ7QdmzV`Vh~D!7c!(z<0DWfhpKI{V{3Ak_(C!Gd zGcqfDZ$^fz-mv2au*MTAaqW$m9if1>@DCQuu1Y$2*tMB=-T6T<1u}_q(B&(D=KvoK zt6T}pFVY>dH*TtML+xIil&r6?qw4dZy$70VRqiRq?z#UpW|mCze|N8$lhP@_x&*yr zF4m3US5K+{mLm>Cp-;o&n;@Tf%NwR5#7idOq{|WLl9gUz%&e}r5QY6uCHw=KiMw2B z#tGI?afTHc3p(c?#82&KzA8vX#k0-BkiNt!YPlpKJXYYzn?_ zvA40p>{TJV)kbs^buo6C7tm&7kbz7uj>dE!m~;-$eBR6`8h(McwDi|OX9dW^VVgX} zZv&G~IqH(kE1c2Nj;gFBZsK_&Yp?brW^LHUGf=ayJ~Cz`o^ZOs(}Bm}qXv{S4zr~< zE-_Y_Wi3H^4VptCdl~4tk21(%R9z9@An*XIV46{Q74Te4>t^?bGXl%J+!A z%9whc&ASiieITn4^dnGM575uU%IzT1fn|0!%}_*5_JWWFC}Ey85o7sWD6y>y-VD3| zbk>Z4hje{4fi>1EBHV9K?a4#@5(*Z6&Ehqa5%}7|^TCfVlbO#P&V^v^q;Q%>2RZ6U zV-;qWa8d% z6dXOo#tf@a?+^*BG2fijSGfk*wqXV;aUs^0IhZF9bGlCYw_|^N^kW6&h=+c|f}h6< z`!}EybEUNzxCin+eIaPaU^$5jgc^W&qZ$)yEz#K)OiK`JDMxF~F2TnutRT^uS7X6i zV2uUD3hnEGSr!xxqp!r;n+Qt~nTVq!8T*(FbifTZGw~)5ufuYHANb^%@U0$wyN8=R zOrLvob!fh@#G4|tUoA4X$Z!+fbYLpS!up|rUiTtygNMp#LQ1R!afZiFnfX_ngV4lB zd-65y?;P3;tYr?c7No?iJ?C&dO>3TRLL+mOD)%(Wp!2uiRnGrHI4ZUfr ziHseA2jgMrPUNK@uriD{Z9%8QM)5xvg~_Y)fK}r{k6z^AVqiVcB-R7X5|2(SdYMNj z7QH+J?Jq&Ni4!Wk48+P%>CuTrrxNsVv`oN)g;|&|=9h*`Eat})g!x&ChzCs&ZS`_IX2BAqoze?!0qRckz@zTO z0u&iZSJ$E(b!lSdUEt;A_Q0<(WY?VppXv%Nv`XJloHhB60zwiuVh{f+(%t46!GeKWs@`lkUw+#YLT!_eognBEKU2dg^$ukK& zpMqz#N2egwaxJhdL@Y(gBdcrxrV^AtP_KM&@Yv)fZ1pgkgH6MCN{IVSGP77(NKK$7 zd#M2NBh&Q`V)<6OM<p(c9r44xnR=g zY4d>Do%pHRLR%ZQ-wg0m2^N;Xee@|8C|P8A7DKsWV0B$$hU&jtdi=^CGsrXpaLp@RX`=M3LsVi)t0|+ zAr>nh|2&VMSp4LX5|l5z0GJ9zkNSAv^yChSU>ZiUIWXzAIXLu-0_FmuhGW{Su4W9Hh&N^}EoyuatreD?R!`e&%*<4=k}y#)woEh^ zvCOsB(pm6&Pmt(*hD0nSh-ux$khuX^v0)Riu`c32Z)C2mz%&bML$4k`9nRAhdxRdn z$-|4FH2JB}GK-Ht6)^xiucEI4onPP@GRV+1S6Bmjw=fSAMI`X%j3d!?fLUYJfLPvJ z1guF%wN-)zlP;$tT?G(pK9LTEWJSgdD)$T~p5ZDCK4vL|*Syem&bk?Im0(((z;z-{ zuIG0CRfY?OHQ2$$%1FD$HI{XJer- zGBt-$tzJ3jm(Y$7B%vHU?iq{I)u$P2@ri5?VA8i9WoA2hh;Ax?kxrIlWDGD3XC%!r z1xMxfVEjK4aWTIL0mn;di-JG=6&}r?2Gm+Uu@*j|cFptXJ-|A5|5vc20kh_+x}%9oz~Usp2UiP z%V3po!b)R0?(@vF`#i*35VN@@+t1dFjz&Bg1#CGTJK|me6&90+SdLcd@eH(bO3uLE zvZIG)qu^|}B$F!RKoKUEi3s4(PVu>{=t@G%_ zqLW8+g1XSVSpqCaW837x0oNh!0!Eq9bAo!0XQhW%dw8vfIZr$t3;mRlShRTb4Hkzq z7jIM>Voj$u0mmT|Sc3<7w0FD}SW0toxoU)2`ECb&23AX49XEMAE%5AuUu)X}KLU^Y zmUD-K<2nmC2EipAnN=7UqZ(Am^CV`pt3k`yg@^o{?R56& zIWb22GtM{N46V*K&c&GD9XK~;a$^BEDAq$M3SEr9c^*%`hqe;RGf^U$q-V>X!=TA`fZ6?uZ_ zXkXfxpMiLwv7;Qyv9RpXc+Oz+jsad_F$-pI>U+Q0U0afY_SYa$fy^ss;Nv7?FcF1S z_P7N78o1I5W#(#&SsT)Ike^uAB35rAmVC@>V;<)sGp)EQ&hvPP z#Y2bs?KC_k>kmKhYPkSBGW$j-PKBy5UesASotHTNI?g7mITfl`)}8a@65`1im_`0WIAOOL(|mN;Mxwrk4pL1oN>s5GbK8!Qi- zl6dDCX#clyv&l;!rn#757S?;+Uc~PaKoA3tBI8!@sL6=c9Ly^}kW8AIn0Yx7-R|XW z3UQ-(eiN`JqU>5yf|xa+AYut>(ZMN^4on_8W`>8?ArD`3Ir&%SL&$VShU9sm$49+8 zdl@DnfH16sxxSe4A} zfcBT^HlxkHT7}Q^USKj)DChGOq|c`t`H)BsB<~ACiqOkVlC%qC_Q}sgRjVGm`tE?OZv|%BhT3nig z8rs4*QW4A1ih<>5#IhEiC&p%{AQsFfAidDaj4Xt%OPS;my~N7rTXkWXR{*gJU@i0- z39&4}%sZ`6V$#{2sI>T18Pe-)UScZ5ibb#Ufgcq!pL`{g+Oix8Qi2&|t~_|HX)`zx zuuoT$kuF6mta9uTYFo5t?k(DTb3h_OY)xcDU@0k#*V0Q0zkgx7-ze$b#A3N0EG}ZKb zu2}gMKK6SRw$>J~6bh`j1z>6)Z1CutJbD6YY%)47asLW4JK72!H7jwv|HB*gZ(=zV zF$J*;5y!J$OJ`e>F3;a?>GY>250giJ)1ssEn-(E%WTJFnIU~cWnq~zG*N5ygJf7{K zlb^oQWHA-$Yee7m4f!%+l++7C$_<;cQHmP;P2DzdL4okR#|`? zFc(-3mzr|jmdQRGQ&in(sUr04#KMU9`G=;6e3nYBGwDT#EL1ziomRl zh6GkXm4x4fk>h*@?O02-Jqr}365M#W08i1$BSCCGZ2_`rgxP$;9f2u_=acy(OOlxp zW3+$g_y!A1Sc0LP4wz%>J1p)A zOeOTY2CKmTMTpGwYMM*h<#`2AQ`=R7eBc9SnX`oyq=Br^<7bWav&$Q-W3mFQqzWbv z*CniE$OLsWCg=zk3sASD62jycCcnac5$N(8VmW3pFe^qSbhM*uh%G=vH#@0)An5Oy zL7$9-O`g^~J#h+5%V&-HQVq4{(SKQsSUyqa6;|$H@@P+)STpmA{q0POQIBDop|
KUKwEvp@s=KNsDuSxLY8Z>KaW}62ZA8<^X)_Q*jg= zyREaVx6>+l$UC+xdIxa6Cuc6q&5hCfZp2K=qZh>(?awZ>*Y~Ci<+pVO7lTRto^%b< z++BGF&l!f}Inx}g1e`x*V4X z3cy5sSr0r}vv|$jSejX$%7NH~wDjYFZ?q4W-`>Hu-~DuO3>BDaPHt->@A-(9~+dY!Sgp@q(qIYEzgxmud(XZSJxv+IC~pYyCh0yE2T7FeNv0gs~qD#02&1pYdYe~IO1 zI47MyC)D*m!=uWqKwjcP(Ca(d_|F1X+RVhOE#{jz6r>Sv1KLeax)yYHMXm|Pfqv>T zwD}(99knB_F=vn0doniwZ$l4Sbw9#9lsMvg%rj7abfb9Af`zvtjfHXGVP=i}IdDKZ z<|fdEOVFoGPcXl`oa@)~xy5NE)|BUUGZGatlb zT}v+kCVlXiX1A62AROo5;q^So83l)13Z8u6hh~}3Tj z@6m}xXI{w!e;D78NeQdH%*4vP)}s@PzTTq~i_W}~Nq%AS7>xe62{$q$u`+M<=)|Iv zM}kNfrVovQqc!~6^%TD7Py`-1<91*2aoB@7fP{m~+HSC6N}!x`Y$OsNcX z1*@_H(Egh3@cROtUo;!f#44a185BM%yv!Y8q2yT8T`NInEje~nTYgTl=J7;yOah> zoSebLMe$cr(X5Ipw#t6x~Rda>Oi*jqdSW9jJ9teM9MLxhI zXT2-?2{1#%dh9K5lOqEKkmnoFI|IvT{K-Noonz^&fWe_zXYfX~BvuV_fz@M(Rf9ZW z3gsGw1t@Pld{{k|N@!n-So>1rP?@iwFmyGq6P?%391qV2lX_brunML^GB2_AnOLys z>7c7%^2n{YjqtDg%)2b4YZHw0R`;V5u>C0Llw;A$mSg?^CT(h|mgFIpRf>S69I>pD zK=TbmwfGJLk0#8(e3d`;#oBAHl9;a_ab}mxukLE*#hp~X1N{J$h?p?J<&2D&?M&Ix{nv2RMN>K%)Bp# z3ozNS8SZ`q%B(O#r=qa^EWRBD5VOr%V9`wP<&i)>$2<=7Nf1O_h$=1v4}YzED0qkm zzJnS1q2}GCacCOGuZRxJN``U}W>^G4O>mY$5K2uMkJzpOW^Tc`|s`@~*Kf4Xrj12KQIK2i;W3VYcs}HvIQLv&e zu_Em}k4`N50$|Fd^Dgmth!wHxMGwKm8zrn%0_en|GqVaHzc6`(=c38Fz%d*9Vs#FD z8!GTyU~c`WX;#2u^JXN1@h=*B{N<=sNVt3%eP(pKHPq0ZV7V`40F! zti;a50GaiY!Bd|`R|Q@NeilY2eb3^dz#ATApN9upOoawVc=^XmGum}a9JTzrcQQ^$B>E+fTb~gQ{0w7Js~~+uQ}lP= z5m$}nea49C(ccauE{pzl9+87y*DA;!aU>#Ns~~5@8PR?35!WyOZhgkddxQ(eV|xKV zP_Qog+a~yOJPO8r<^)5ZYyb8sGxz=M-+}h;#`6vRpZ4z#`*+;0NN*LKInn$b7yWG$ zOqw`h2|gnqTo~QA3xn$n2#qsRS?r5G$D6d}`)}$*F@fuV_69>+WyIW4d~MBKhH< z%mK>}ADo%pBC#fU($LH!x}{>G+wEkNpSUOR$){pn0?b?$HzktOhh`p}d~j%H?{0OV z9tYFR!cNvA;LpK9a}sYk3nsiVkxZPP*`uuzdi1sl$>UDX>=X{ht&)gso?wzkCl-B< zM<*72A+W6}K0u3?TA;&A)WhQ^7XK>4A4bZq#!XK!PsOzcnALm)8;%`XXQ|Hx+c^C~x_VSVDVDt315fX1ER+h*elB0z3sh3_7vsU4f-U56km9 zc!(pO={zb;~=jQ8P((%CG|GjtZTtTERn&HjwcnEa<+hnSUlMtPY=t}`W95v@$?T0Jf^{x zsTY`tC8*TnnIwAh^5L0X+Opgtu+NFfj||W38IdP|yeKCBUF0f|*Tm#5BP{oQAa9Pz zXNdd+$f5Vx56mEs_$SAPx9~_53d1c-jk7+Sa~;F`ZUmqMNd6C;tzwRNZ^eU zdYFV@8Mt$HQo$5vFJT4ebDWwfJYx}>5qX<9Px+n?^52N2^ufPl-V+U1}0(&onz@; z??7!l`XWm|2Xtcbud(zyK_?b{vxifU#e)qc^uUeqU|_c8I%FmmeUgXgSf0-FppZxB zOV;Nxh%tnF^ahW<2AJ~CpNBO)Z&bi$oA4}z5{n-6b3#*rMbGx=J%A}R|EX?UK&;_L)(rSlSf07yAr{YIOMeM;V$mmA`p2LXlOD46b8Nyv zNrRPPk)@Y_PAqx@u-bTy<*5M=v3MFip3Ro00X)RwNj(nj&o=uC3Al+9dH|E&>2B1_ zqZa_H;K7z>0C0@@hTY;NeCOH=O188&Uw8K@Slf%Br%nA#}wv5++r5>*GaIJ?MJX~7p z$@6fdhl6pBC)>jX1|MdEk(W^A;aU$jBwzmq9@BS6W``lA6P(c6$qqMoIGEz-*&Z(N zaOsrf4LdRq?^9ducpE(2=;7c($CI60z9X~S-lbC=sVdp}+stll8a+}lEt&IeX8*9@ zBF9$h;etyXy~@M29&Ye(qlbeEmp9wP1s*On*eqPDyo6fdk=P<*2O^eRHF$Jl(HlJ+ zT1~oMh^$q8=G** zB$k|Pk4`Llfu+;_1=oizq0~ztR)#7M*Lpm};%V^c#G*G^I+Y_9J-ET*WS8$V_Zls7 z!;Oxm(ZdBdIeMvwt2|um;p`g6Uy%In`^@9^ZuCe&@}!-aBa=_;%*4GLE#nzlfrlGB-00!pKF6PJ@SUTw z4j5nM(Srv(9uF6IxYWZ{9yT;<_fU`APXJYvad@aV*#n-JY-6BrhVl_9{d?I~Oni=OS_0*{ASJf$9; zSoA7Or*c(`lEr&w?SFvMg2hg8;)tGnVb82CZN*X*llN(n)n%xv*(frk29J4CfR#1d z(pgJl(F;URo(7ReslrtrORZRtl~`FDEPZP7DrAl8QLw~mKpe3r{{fb`9t|=1xRzc$ zvLAQC3xHKWVij6y>8uB_=vAU8FNesu9t|E#qgarYSXqN7Y*EQasEx=~B7>b+^jZ%$ zc(~ES!BWegydWj3OQ?#JicFEfq7%pBEu9st_2>;Aoml*h9uA%~GMSgy@{9?xy#!)q zF0gd^BeCeE9qZ3qvOG6%3}T?+rtII$wyjcb>F)|w=hs+@;9xrP8}aS z=jHTpfrm>yT;<_f4>x$Y(Zj)tWO-`VEy){3u*ETx-1`qS#oEoBlS8|DO2R60PaE1{wbvilDY)uzeTM6FtoqKyRfelq zExrej>lR#(;d&X@N4TaegkreXkC{HpG*XI;o6Anlw~;mfNRoIuoA9+;p&9_>|VHvu{Yfq;=fa$ z!4?dz`M3^x7C(N4Ya*^Bu4i#=#nomxPO#&;64zt68gbq591d#XdI#6va2>D$HOF-| zu2s0U;mUp$tvj39w*&eCxY8S--a{3zi#8``<;zneFA;OcQ|SXdgCi_5&ZoG_mo4q zpWt3{dHb902rGDP> zQW6IuXty0>grKaqYmX@+_TI-bk($Z5h()LctOzV)+ zKCN3y&$NS6^3o1T8IaaJ<@mH7DW|06rVLK&l`@(zO05)u(~48>NE?+hFKu+nU1?)e?#1-5#VpK*5fg&o&p6t;JVI~df!T`@YGD!neDoa7 z@kYcqkA+u9=!QP{o?(Q(`HlJbB%V0nvD4oo+96YLLNr3}-H4N0Xg0j5c9T%aZxX>x z5$(A%ae6dD1!oDp5u+xi@+ZCVHbG2GKU<7Vqw!P`Zz$mO>KLJOVl*{Ie|uQ<{5(cY zF&Y~4O^DHq7!8<;!;@{ILhetl>z8#vc+^8UUmg+Gy)RS|SID7}=tHKGnW*?Bus4o* z$9ymM7Oi7np&O1A`k)KG!5rmi{SHpGMyUK+^wrkbyYL(CosR=sNbem&hhK|d4!~(l z98kMc=t(rSp?!n5YK&Spv=u7BQ%XZyAER)8soyT99ex}R6pW2TH(iqm3~G!~;v&S@ zDAjqEL(Qr6MxF|OJTC5%qeLslSyiLfO*q+VP(v8QlVWr)+Q=kd9-~PxnxT!3Ydq`` z(Jp~8P3m}@aXu7b2|rj5WPGs%QJ`-`YyU4HsQ~*o#05JQnk)F5n9tR-<%2=+N+jB; zaO)Q)FyWZ+t%=}`eW?u3`WVzIruD)E=qA%0UX0tWrjzQFhK#08r^U22sEMI1iLLN` z%=gAOO6?w_C0~m+v4c=noVRjc)ZYkP-ccr87`IqqOxqa?JU>SN6<-JgwM6p`v3pkeuzhII(pPaF6gEZ~n?!p*vJCs57ddxdC)e$q2RKjf zAKR@d?gxK-S;aZu`cZ{Z|47%}*VB2r^ZqB|cK-yk!ZlItHZa^ZMqpwmmUq?p`4~ddpjhh?v{ zM(&*m4vdgfaQ8O)H|mGG)xSAqoT|>ij+Tb`J|(uA4I8+)^4lX-O=uC!cZJW z?f&6t>~6t@%sWP=N6h|*vYZ^FFHRS2>=L0DV_MJCs>MW9P0!#`X7gtfUb_MzK?~f1KJqo}RcIzmx{aq1E4IcE$Z)(8App@=I&t z_$K2N^JN$bu<*dSYlC)E2JPQmjo0lVUp_EK(`wX9el_f;4bhwwrs5q{@9mlX*tf5UuU05prKD$^px?qg@!KfJ3AvBr(@(IfQ z6(qy{`%Kl6V91GB*G9!{X@ymF6q=6zPPAT!;N`*NsZ5(nHO}vk#_PKg&E>fCP^^e| zp}D+gLCTa9Vku_+*PIw9(5=XtqtQmciv)iCt?GWwv3Pr{fQ7gme;6vIQ}+})x&-wv zi5RCRWtx`*>?B0Aqf797D?;;Qt)0LdU`*3EoiQGm0emLL1B2#YCp7Ujp&Pd=vc^)v zz=?52ij#xvAu{j_$7x;aQXP$XjagmlIk8$#$7=1|MJ?1H->vwmUcp%~Y5$X$TKI-) z=R|jEgO>-R)St{~ki(57&mb6^@ny=XKdE~FT4+7kiFS+^pQ?6h4*ePJZd{ZO{L)~m zO0QlMA?E?jwYyU=bQ-!kIThZ-9L@~PPn65eGSMRpt#^@X*LtzgMd#pE{vlN6Eo^_8 z?pd%JTZ7;Yg0oj8g1sYj&!DJ#(*EmHpy$p(R zqNl(=#tkLSMYy4r>iNU^VuK6w1AOe|4s3}<=!3f?xe2?N;hXSre9_=}Ww~=UR_GDU z3A_dh9$rSi@>tBJ==pgOZPjhqqm0n=x8qIS2%Q~|0&inu<@AWw6UrF0GNx@0W0(>r zx521x!m?B0bBLZig(|q{crA8HN0*cKS&Sy%C)yP;Ixj|TV$|6p*#C|=a}XzQL2(lz z(bMB8#-x!Nblybj15xUtn6|P+segyOMN#SrkY~_CG3}ig)f0sgMS$6nTmXIYa%#f8l}7wqlF8x#cM=6F&9t3HzO`0 zy}+R<2hB|`SPvSag2={HVl3|9-DUmrL>tZ$d{YT(Ojyd z9efEseRWwB|6FE=Vh#US3jSMpq4o5C%lIGi)%*(ISIlK2IP?3? zH~(uc%VFo@vB3>2q~mCb`6L#Y71La}a;i3`mT0j5RoERi=DK3IMl9DP%~|0a1Q3&> zx#D(jkMrvk4Wep>*{qWjc+TfC%@6ko?Ovc$)gjfcdEXj?A=;?lVixMZ>k8l&FZrjb zzqF8F$oKEozq_x=FDzs?J?!80Pc+W|z7RI?&s5}>t$+VJDmX85%KV%4uVei0sPGec zwEs_tKSOIyf2Y>&Q-7`u8~>b`pJOy}^1sd(#t-f8LNwkr7~gp(zV>$q-DlwFz@i>w zgeou|m@)2QOju3c89fxjp1xcG`u!N4f}m}dBllyHGvv-_{p&J2w0(sH&WvZqI}sgE zy^G4+)CJ!jh>%O=gKjh1AA@=SF-h_*!!Wz;ZlXD$eH|fJ#*A|?^$!u{@KE>}JgSe- z;)^8au<1e{#57l@j`8}y)$X!JEkb%>0b=U8xHG2i3s^?;Q#1IVVRQ=)r=g4PyD#{& z!|=TPeim}{dD>0yJ5lI$)IB#!J$wXCCq(FEp)hzCOQQQ9U}jhFf9__SY+SdHQkrw% zx_B(vHT6G=f9vA;&d_+ky)s6NW3+1_Kc^P>ep&qc4+PqN;4F9`W<%rgumNA2gpJIa z!O8poE&g>gD<|6D>FV_QzoPwz`+qdy-B0hPJ+1kB!s#WUx>@tf28;*+0Oqi?XKO~9bJSr#D{FS1!?wyoHESO zH7b}n3~DaNqnMBx^~;YGa#F^G*akJ`YEJ7*j>6{wi&(o;@6}w-ZC1Nceax?987KO1 z?5vrB_nq)l^_2?yH<#?hxQ7aS&|m~MM|<=XrPlP;oa!Syx;L|{zDEjm!UnvdMaVq= zaK){PTj#?`GVAVBcf27!hidOtAuez0Dw*F;Mg2{kT=MVY{eV_?V9W6$n%{|W=<3)p z-7dLHy#|hHCg;253j@dKIuV`5c*U3X@X^T4oMl`g&Cy)y(Alb7bF}iPa;QI!NxlA4 z2XU?KGB-zasm-Am@a)7`@SF>Ns!Zje`1wca7PZ*VFj{*!zTLaoqiytn#vyy;1QmA3 zd;Z}V-7^tKYp!-5#!9E?kb?2d*FUnIQEr zqNqWPyEgt^xmuoHd9~07>x70D3!NIH(sB66=R5Qs=M@deVS3Z*mg;OL&lIgPM*EBr ztt31_jNy0@|4X8qk?ckq4RNr)Ga=)=Iq>Qt`FE(X>Bsz%zNy_O=SfwU*9|{&TdDJ^ z5P$CYDvr||DN*Bum|j8!#4tl_ZWM5$U3)gi_e)dvJX9+5osasPXv{hp^h?F$U`xU% z?Vg?;+(C7Bg*eH45@O02ztmba^t}JcE2Wn+-1;sO*j$r1KBx4>2TICJG^bJU<`_9k zo0&rt|D1uF(0ff57lNH=H&XujGI_-<=sCte9G}bk#Wu;Ch_TT0m*@Hl<>sOP8={+h zeG)ISUF}?IbF{0jQ6X+TXpXNQ1KZN~=x;8y+4ZkWZm!_{TPvn>Ig>G#ds+^5{&#&E>T=vM84q4IQmxUueKf&p{-XWA-50le zYdN(X@^ZNSKaYrs=Py~5O~V$G*~cIDq6VF23)zi4*njs~{x@}RPC+LxD);BtzfLWe zs@kZH5z?$T}A^GXePv&%YS>>zMe$cpN|ao`s}i-EwV& zQi0}1=#S^%=s|?OJ|AySMd)8ZPeo|c#R|snVlU*Sh~^Z$9OeNV*Pm-=NX** z!%>8I9rwgMneZbVs4;`i74Qm!oca!R!p8J{ds4~)<8aP8LN4_bq=ujDLOil3-ju^} zQ5-44irt)Tdl-x(BU&A3qa)k(e>~RpgZy5 zw+K1LKIM2ja2MJoQ0w7{wxR~lM0QF2Wlq>N2;hZ3aYE+-ZzdnPFzdK*z>S)RJoTBJ zW6BNq(Qq6M3IgX6|3nu#E225w!{K-lXcro{L|)sAc?aO>#<~bODK4)?bdyuxP_LQ_ zl;4V(9b@+#DOdz_(=MsM%oxqv0^uu2Hcrhd3SHHmN4w6)s^6XVW35>A#kfVRM$fX{90p=x9!?|$BYKFhrmjyqyRUPQd ze+XUjiO}kpwm#;2HBNPf3`DnS-R{SBbE&srDPiop2*~z^VY4)^`hRIc1qo;1#mOlb z|A(QWb{CCl@E3QXxmq}M`XKfFpY(3Fs&fvP#i2LO&{N+|!-TpcTAHQUgc!LT?iGl! z8`UtiF>-tzKg0~$h`9*Rpj$({*|;BD=H{DzIygDn!vm$l>;j>1s&WjTp`o0G>{^CX z;pQ+dhL2B&4SKtiRA{ca?9-L{NsKBGL#P()KQca| ze*#8RqwAg+2MwCrN-Atj6FR-CP;*x36?js()t&P{za16{{r72KNWq(?f7N+4m9vUOw&zV8idmi#`Ug`cbEoZ z!oED>J1O>_mt)lQPt8D+j|y#>fR7{?F%QjF>pU1c;b3gEnbhMyQkI+IS!BmDtsn1* z`Nm(I2zEv)xGokJ;H}E&Ku2aHeod+)EAk~ynHvx<;y|BU_Cb*!c6L}qRD z2dHY$c^^o@wc8QUumO&r{CE~y717}h=TVop#bm!HQ?E4sM*HuqR^8oV#l0t*pYkrcr954#RPTdOs)yoh^sM9;PAA#G3>rxOZEEnizQC z8A1;%5eiR}t_N)sO@_mFlVgDwpnDoAkD`|wbnF?*`$ZfBT;5AmxiHuZD-zT0|BPMF zY3))=&s3fIy@Ow##p6i)R9+!|5HmuZKpPXGJEr1ClOuF}KXuA`PYQy`5p4{cDMFi~ zNP_yKwV+Kaoc8j!7F`D{0FUVv6xjcV%;Z3 zYArrO9dH!d*L20^VnuT*EJ1X5Ba-4=IX`ybumkF3JhMFRI>#Q5&uK(iex$2a)z!rD z#qH@erwcUtdI!Fva`i42r2TW^8mGnR;<(1g#>myK)3NyA1D-D9`12h6j75YP4W>oN z)$YOqdh_NOS9aGc>edJS@5hUCE9s)b4`-w$Qj)=-IE6?xc8`343JmAEYoA+ z4=CV&`m>Nt>;H0}8)yxO4l7r_gn)bFRESt3-It&dpTfxOii5Ajpd z$7=X-Wn6s_;Rz&rsZ0&v;PII;8e`@QVU%2&!xU{z9v;JuPe@}fB9po$YoH_sPA$t9~)o?8B;82 z!{U0MrYwVEvwngpqiK@cV*@`OPttCQZFGM;5S_L~Ib3mj#P0amq1cZ*k>!T(#bWAX zF;#d}ZFWm$#}BO^Ols4>)wAGBEm1y2LoAF0PK;}OF4p*uqSirhS&Ux0TmIHioCt=U zjQKBqf$&=F6r)Z333gUIm74RqYVy`}yn=Ts`RZcS=NWuXETVl`FLY%`6%t}Q0-x!@ zzxy%f8|2gveAD6C5&C8VetP!IAFI$dHh(hi zLyyLhq;LpTh~l4nq1c_B`NKULVE%c!6wE|NGpcTi(fsa-;G45q@ah;{{3pB=716Tc zgysoM+c|i(wFUVy;DiQY?Ws4YPl!!(>0UBYVVcmUT%qCrUu9Vw?`&>TMcYgEls_yEl>ZK@jKuSTh@Uopp5Go;dB*XK%cVBPN5dqY-( z^KZOOo2jUBMhAQL+D9vOcH?vO;XI?-%}1T}A77+0tfFZTs1ol;T7w^m;^BC}CYd}EcQ(6WM>*%qk(40`O7 z6q?%2779`wZgLQB@e#eX{ZXxCVEZ_zgm*vGX-Cka%iX7)Pio^+Yjongy82?d7>q}a zg3O!=wr*gUP_^2lyM7yXX?wjFC!+UKBe1Ov#>R2+E;{0bV6rgrW>&u#uW(?{~Xvp4QwW>71jHAF5~Khy)4{mX*E!4 z)#xg%I#%%%!zUhyTH2V`LMv}oGqszC1NA-qxw6S%*As%RmD2Rq+R8FZ4E%oMc71XCW_ljn=6;(;uf9P@i4Jtxa&fkM7iGPh#Pc;=& zI~FrE)vaa(%CriT1ylSct%+xP@f)^iw{y+G+~E!J%KR;6N2Q+o_{uqli8wwOpO-v@gLu97^4g}KVn1_vm6>-J>3F8J%$NWLQhg|m^ z>79w&0N07H?qr6e)a9xA(W3i4tAzMljWh1h1fGTYwyE3^?DEwfZo2oPDE|-J3USsq zn!HwY;K|JM=8pEV(1L;W313xoP8Fq%?9gtb221q0`^)mF{%>~R6#MX%a^@HV9xcBj zu5=%m&Hw&+?&TU#P1)?F``nN?dXJZVvu2{Hu#;RN?Z)~2UpJamSDw7^N;m^Ye_wgc zY?QCspvL>kEX!vWtukx=nAMQ3UZ|HFy{nrLBgT7semqrQ#`%F_@!NQLu9s))&1M~3 zb0)?QZ{FhnaLIoe|>wmw8dkw|#?J=PR=p(=d&%D{gKS&HbivkUsmO zeuR=8G|_LF{wsg?OMyDL_m|ydZpqO%C3)BTE?TeuyGBWr$xKB%G#S*+KOv0A&o~Lq z*%?Qf@#OhlyCko)Jf~gx{Ld6p`=u;^J7h)PBZh3w?0nC;CG`VX6wV1l4KnPuO1Dn zA!+U;{(!#9IrXr^=>jSJ3YuskdsgLg~TLoQR$g4 zQ$oI~=osaD_Nvev&Rk&TaP#qmraa{Ba7HQ5zIFF zJrqv_>g?aOt<9gcI=+CviS)0fiZ1b;TXeivgS54Sw2SoCxQNczyZP>0N)q zTY9)wTTe|PhpYX~X00r5jal`gueZjmQs%Elwgx_8)6&hNhv8&hIlYp!GL`dAF;iG| z_iKuO)(l-wrb!*0$(71IfLieJf3BAo>!t6UO~W)zuVYYdrY!FbJPC2rXpC2@S};R? z{Ci#etC@1ERltpJuL6(W6%IYm)uB#q6ls<6oLWkGt^$--{*^XsW2dn~{F8|XPV*e? zlKCi5dyi_{E!b3BNHo%EUklW^KpE$V=UGt){<)i^deiCK-xt~PY zdgH)SsvmxzDI|G#;|GnN^HBiU5YTK4T4ZNVw{ipBrxj%DKE0?XRJU;(i zt2cvq(}PO%d`>Den^9h`LHQ@jB_mduu5HhKqau3l8>Kw=jZ&WbMyb2HYGvFv4^-C& z@z!Nm@lKOL)k*ECp|^JTR2*j%>m~+9Z$)^O#9PW;DQ_uvrM#uwmHOA~#hU^5x}bM4 zGm_m^^$7SwHO^nX7SV8;z6)A5U8@%K_WyX&YmNijQvAL$^T2P2r_y?VfBUPaym&Wk z)3)V-I`D)j-^3e1=V7H+>zU)LjE}4Rcst3$Gb`fWuFc5&c5t)Z5$D4uKcbmf zOy8@sRgL+M%AgrN52fikUe7I_+Uj{xm3n2OR+Sh%m91b7=da|kJNTKG)m~<5*4Mk4 zNLx^i#*F!SbjGUhpMR|$1x(GFrvyo(LSolCZ-3LXbc%sZbqX_D#LXaK29tXjLezXQ zXQ2=sH+s97%XFfPuW|;nf{?F<1*%h^Hc_4Z{jDy0nc9}5;)97o4EAm24X{@qV}`NO zcVR4MoKmIGZ-_47f0y)EmVgwOAN7lwD>oyaSFNhac*3`aG#d0Wk`xOwJjt_|XsO zM*rfz{6yf3UfPDQGRg7PGN!8CeRY5o6XQHYVUF8RH@N$`w^wbUhQ7-e@&#RR)4ADG zTSt!Lw@3Zmn7bT}iW5YcH&6$Qr~{5V!HWbs2d};D2m+$NgJB`adPx4${U4 z*sKcuFxgV-^QC%N`QasP8$${;=oC)XDS8J7c_wiFU3oZtG|!Rar;T5culYs#=Bzn6 zR)txIJAiIGz5I_v_3~BnG~GeJw@b$}wgo{7bN67j8kN?L*S>c7{omoK`X##aL1Odz zm`P#|XHuB0=2ooHcz)W6tWoD=Rh@_#H&!wHEb_O0R*n8o$yp`3SdX$% zh+dM9bdqxQuTz)g{fkbQycqcXo*Ke9qhAUs@USx#l96ohpMaKlOk`o7 z3sc4C&NbLiI{XxnCFY3+Y?u#IMFY1X8yZ4OED+h)e+N@Vw%Z7MBWQ_*A_x29FjeHZ zjj=a|mRKa3U|$SVMHBa0?AJm|Bt%o}Pry{s)V&V-bk3bT26t#mT}ldPJ`FW8Sn=A5Nsz)VS70Xc965-jq)+rQO<)m$px^J zTnKNLi(qG&fVapeVHdfirWF_6HatB{VK}*~v zccDi^t`WHh-Ys8-_sG3)tlS63$=Bh%az8QegO<2ozJ(qSEipm9gPsU2@qj#lo&qiL zpgf39qROZ7!$^!T&SqT3uTfyV9HT+DrfhXh*@N?NNgZ6(?cHqljWJh>P zc7k8X&hU)v0?*1@;ooIf_?7Gqzm`4VIoT8bL-vN}WgqyB><7P<1K@Y^4tPP9!0+V{ zcu@|6|CA%(4{{W|B=5|i{r@OO^W`UbH@qyzLSf$vL-zg9vM0bKdlF2xC&Nni6d1O> zl1s6t!Bl$&OtT+?mF-ek#hwMPvS-7p_G7S`JrAba3t)A7A*^99g7KPmf{zUQNqDur z1ZLXHU@dzEjM%GSZF>!@W3PjC?e(ypy#dy@pMzQUMtF_A88)!D!bbKsm}75;jqNhn z#NGj~wRgd$_8u6uUxsen-pfb6y$`mqU#A5WKuff=_oEA;C3@L!!QS>eu&;dpdp}4Y zU>`&efL!tRA@pEqi6Qo3^iXJtVfGR9aA=7U_A&HGXo*qw$M7yYQS?)-M)3*u3ARjx zmY8IpME@2tYT2jI4?s)Ix4%R$fR=dNK8;=k>80&6aHV|~uCl+vz8YF$jeQQTwa;T& z2QBfm{VjSuw8XRa1^AqO5k4Qcf8b-I{Uh9DUxwjm=xQo6n#7%A6-Z@9E1|1GDl?jb zPKQ)xG!0z?TB2sO3OWN)m(i-|Oh{cu)6o$~T}Er5>p14tAtfGdf*uYnabL74d^p++CZZDi z6VMV*Mx*GbAeULxjq`Cfnv3c0kn1d(55JBUz;n?;_>X8Scs|-1eiv;+%nOifD|!R^ zBIMeNwnP5_xsakA(8B3}4mlms7UV*5I-!#x?cC{%t_A4?B2E{+)P|P0&bbvfce+By z=?-0|2aGvA;RL5QF(*RWiqi-ETS!}R`k^0ymYCuUKtBk%!kjzMQz4zcQ-YojEiuCx z0%tnIuI8@uAwKBnoe^xF1(}UFqtK5-W+2X;=*5s?bVj3}fE1&1H~J~a6vG*dUJ98? zIQOELLrbi1?nkeLG*4#&dNrhZI+M_AAz9q$Oy*;|GX>KN&=O@%9Q`6>7;vVccS42% zX9jvVw8S3gA@oa-A;IyS8m~YG24@!fRmi~L%tpTknXNdF!9&hG_<^$k9(NYPFXPT4 zKK|+?;A!Vcc-~n;vTq1yADR&^{}?P0eclX!R`(?)ZGP#yL;F= z0$O6E`!aeIq}JWN@IiMUjJvPHsqTI_&3y|_ci(|C+yii?dk{Y49)b_MhrL2Bb&tSD z++%RI`!PG60~zGqPtkKBgS`7EINv=E7q}!}#zjH%4z%D>8Q8x*F5i;btm0;yq3YIF6ZY`FUN&BzL2mM;C3LDZP z^%tv(t^?_(V(GA6tOmR$mVvziq??LmqO&30R4jtdftHZ5I?#^QgRxi^_FPE!6>EUb zhYU8cY;*x+FlZCY;mh@qiEXS2x-Dd48*2)0iZz3sViFd|qVU$3OPt?8OLUFpqPsz6 zv9WygZIGF0tN>jCX+5z*^pIF#*@@&x*;Vn^`ivD;_>DfJ;k$iKBwOM4`rM6vzt0Hx zL7$UYKJ1gm@0))_%%t!q#7qi*-KTr4r0_q8nH2tpm`UO9`gFzeJu#ERmx!4h{)w2$ zVbQmHt>m!P_il7@-w`m}w=0&^zGacR84Z6jU|2XB{^NiV@XrHA z!OsTV2|ph&He3{bd*I4meGUrlp_tu>vc)wc1FOdW#?#pE2?KeEdWvwC(BR>akc2Tj zlblNEI}2Y1;TT~OE|}?rErc_Kn|U(yt0%cTz;nBs@HU}f33WlZgD{#fli>YSO@wee zVHjZ?A$vKk?%CyZafI$G$pm2xVLah=!aIcJtN5bnQL zM0G+FLh)MC6P6ObA%xb2L>^%VVK!kQVK3n_A?0a&9qCVpL~Fu0!fy#%)`!GBlNn+X@Ve)nc147CR%p(ZB34;jh2%8AQ%0l8>!sB>{ zjuJj2c+SUb@e2Jwn7NA%g-{i5M>E1^!b^m=30COG^!S<46p;|2%jrY*@WKD*ZaKkQ zk)GOkOKwB8wN3F_>eaK|P<$Fkny1-&bXc z-{eGUg&HPm*(>m*7VlX7-q3LjS4 z@WfLbI%(i`m6uRK;*e)Q-NKJ;-F};&HEYyf_5Jct|1&AQb9vs^y_xuJlSp0b{?7i6 zLM;|3ze6gMq3XsG)%xDH6?9uJ~+UfHZI4}JjdXeLmy*S4!d-mg% zJ$q8}PgR6i6Uy$voxV6R%i{ui%oWyuy~WE-X&$$UJy>R?9p(l3gPCn;1QTl9LT_0Z z9(&hP?_&#GBPOlzl8s#H@oJksFXVBX_yhf6)6gEcO&ox0LZA3N1Djc1ss@$P=^yW{ zbpfuh)@ATxXtfSJ?d^FzT~}eaI-OQwxJ%+-he#xTk)CUfRgb=k-N7!Q^Idt7E#l>_ zFg%7XYK=&uQz{HEfNO-L)laBV@`sRkEOH5M6Bb?79uckS#qWVG4A1oWGCUr!c^Y=g z=a)XuL>l3)KkKu^vfAwQc2NkMS;KvHqvu*xeGY79?eg_OcyDd*0Qc8Ew1>mj{t`}t zWvg$Dq@xW2+WSQXfalR(I0OvSADBc52-!uay(yolu?|%Phq-6Mzf*AkvbMp&hLxvT`iiQp@$Qx32>b<%dp(Oi2-9&Ciy~N_1Gm6WqyrVS`7L#Lu diff --git a/App/HiNC-2025-win-desktop.deps.json b/App/HiNC-2025-win-desktop.deps.json index 1e6deeee..f7010a06 100644 --- a/App/HiNC-2025-win-desktop.deps.json +++ b/App/HiNC-2025-win-desktop.deps.json @@ -11,9 +11,9 @@ "dependencies": { "AvalonEdit": "6.3.0.90", "FontAwesome.Sharp": "6.3.0", - "Hi.WpfPlus": "3.2.25", - "HiNc": "3.2.26", - "HiNc-Resource": "3.2.23", + "Hi.WpfPlus": "3.2.26", + "HiNc": "3.2.27", + "HiNc-Resource": "3.2.24", "Serilog.Extensions.Hosting": "10.0.0", "Serilog.Sinks.Console": "6.1.1", "Serilog.Sinks.File": "7.0.0", @@ -1598,36 +1598,36 @@ } } }, - "Hi.WpfPlus/3.2.25": { + "Hi.WpfPlus/3.2.26": { "dependencies": { - "HiDisp": "3.2.32" + "HiDisp": "3.2.33" }, "runtime": { "lib/net10.0-windows7.0/Hi.WpfPlus.dll": { - "assemblyVersion": "3.2.25.0", - "fileVersion": "3.2.25.0" + "assemblyVersion": "3.2.26.0", + "fileVersion": "3.2.26.0" } } }, - "HiCbtr/3.2.28": { + "HiCbtr/3.2.29": { "dependencies": { - "HiDisp": "3.2.32" + "HiDisp": "3.2.33" }, "runtime": { "lib/net10.0/HiCbtr.dll": { - "assemblyVersion": "3.2.28.0", - "fileVersion": "3.2.28.0" + "assemblyVersion": "3.2.29.0", + "fileVersion": "3.2.29.0" } } }, - "HiDisp/3.2.32": { + "HiDisp/3.2.33": { "dependencies": { - "HiGeom": "3.2.25" + "HiGeom": "3.2.26" }, "runtime": { "lib/net10.0/HiDisp.dll": { - "assemblyVersion": "3.2.32.0", - "fileVersion": "3.2.32.0" + "assemblyVersion": "3.2.33.0", + "fileVersion": "3.2.33.0" } }, "native": { @@ -1645,15 +1645,15 @@ } } }, - "HiGeom/3.2.25": { + "HiGeom/3.2.26": { "dependencies": { "MathNet.Numerics": "5.0.0", "Microsoft.CodeAnalysis.Scripting.Common": "5.9.0" }, "runtime": { "lib/net10.0/HiGeom.dll": { - "assemblyVersion": "3.2.25.0", - "fileVersion": "3.2.25.0" + "assemblyVersion": "3.2.26.0", + "fileVersion": "3.2.26.0" } }, "resources": { @@ -1665,27 +1665,27 @@ } } }, - "HiLicense/3.2.25": { + "HiLicense/3.2.26": { "dependencies": { - "HiGeom": "3.2.25" + "HiGeom": "3.2.26" }, "runtime": { "lib/net10.0/HiLicense.dll": { - "assemblyVersion": "3.2.25.0", - "fileVersion": "3.2.25.0" + "assemblyVersion": "3.2.26.0", + "fileVersion": "3.2.26.0" } } }, - "HiMech/3.2.29": { + "HiMech/3.2.30": { "dependencies": { "CommandLineParser": "2.9.1", - "HiCbtr": "3.2.28", + "HiCbtr": "3.2.29", "Microsoft.CodeAnalysis.CSharp.Scripting": "5.9.0" }, "runtime": { "lib/net10.0/HiMech.dll": { - "assemblyVersion": "3.2.29.0", - "fileVersion": "3.2.29.0" + "assemblyVersion": "3.2.30.0", + "fileVersion": "3.2.30.0" } }, "resources": { @@ -1694,19 +1694,19 @@ } } }, - "HiNc/3.2.26": { + "HiNc/3.2.27": { "dependencies": { "Dapper": "2.1.79", - "HiLicense": "3.2.25", - "HiMech": "3.2.29", - "HiUniNc": "3.2.27", + "HiLicense": "3.2.26", + "HiMech": "3.2.30", + "HiUniNc": "3.2.28", "Microsoft.Data.Sqlite": "10.0.9", "SQLitePCLRaw.bundle_e_sqlite3": "3.0.3" }, "runtime": { "lib/net10.0/HiNc.dll": { - "assemblyVersion": "3.2.26.0", - "fileVersion": "3.2.26.0" + "assemblyVersion": "3.2.27.0", + "fileVersion": "3.2.27.0" } }, "resources": { @@ -1718,22 +1718,22 @@ } } }, - "HiNc-Resource/3.2.23": { + "HiNc-Resource/3.2.24": { "runtime": { "lib/net10.0/HiNc-Resource.dll": { - "assemblyVersion": "3.2.23.0", - "fileVersion": "3.2.23.0" + "assemblyVersion": "3.2.24.0", + "fileVersion": "3.2.24.0" } } }, - "HiUniNc/3.2.27": { + "HiUniNc/3.2.28": { "dependencies": { - "HiMech": "3.2.29" + "HiMech": "3.2.30" }, "runtime": { "lib/net10.0/HiUniNc.dll": { - "assemblyVersion": "3.2.27.0", - "fileVersion": "3.2.27.0" + "assemblyVersion": "3.2.28.0", + "fileVersion": "3.2.28.0" } } }, @@ -2117,68 +2117,68 @@ "path": "fontawesome.sharp/6.3.0", "hashPath": "fontawesome.sharp.6.3.0.nupkg.sha512" }, - "Hi.WpfPlus/3.2.25": { + "Hi.WpfPlus/3.2.26": { "type": "package", "serviceable": true, - "sha512": "sha512-8QBd9q0MGNFjTFuJS7TtWB+Zftpn0RJxIEzVQC+vQ/0FdqQIgLy0GEErsdpEqxO1cMFEbRLNtg7RPQG4gK9iHw==", - "path": "hi.wpfplus/3.2.25", - "hashPath": "hi.wpfplus.3.2.25.nupkg.sha512" + "sha512": "sha512-UwzqRPG1Yza6rbhJ+G0OTYI/TUlJ0iIEkJGtT9Wl9OMs5nyYfwrOcGklAiXDru+J1pbitsTwnAhy1RR70Y5OUQ==", + "path": "hi.wpfplus/3.2.26", + "hashPath": "hi.wpfplus.3.2.26.nupkg.sha512" }, - "HiCbtr/3.2.28": { + "HiCbtr/3.2.29": { "type": "package", "serviceable": true, - "sha512": "sha512-el7ZHL9Gq29dui9SK9M5SRLlt8RMNvYVW0AijNunyQODq+F2lqXbE9/i2P8MtvIzDLyTKqdaz4vkpcMpsAdx1g==", - "path": "hicbtr/3.2.28", - "hashPath": "hicbtr.3.2.28.nupkg.sha512" + "sha512": "sha512-YsC5P885nSlcZ3ThgLcJR3G21xMcqyEFRhofGyHrRMxUN/SwVX1xfYAtsJlIAr3bPKKpn3f+BlW6VjVPmVadqQ==", + "path": "hicbtr/3.2.29", + "hashPath": "hicbtr.3.2.29.nupkg.sha512" }, - "HiDisp/3.2.32": { + "HiDisp/3.2.33": { "type": "package", "serviceable": true, - "sha512": "sha512-LF2tEwpc+1vXSG+HxYDmOZ1FI5cD8mT2OILlKHeutjzucep3KjhigD09ftdptd98K2TnpBZk/TDKplrCbDxwXQ==", - "path": "hidisp/3.2.32", - "hashPath": "hidisp.3.2.32.nupkg.sha512" + "sha512": "sha512-Si0hT2CuJ2tA4NoFdtDqT0mnpXZR+zFzL0hFz4zsTnqJ+4olYCNQUfYKxfrK5xZfaRzBgdmoYvera/62oABwvA==", + "path": "hidisp/3.2.33", + "hashPath": "hidisp.3.2.33.nupkg.sha512" }, - "HiGeom/3.2.25": { + "HiGeom/3.2.26": { "type": "package", "serviceable": true, - "sha512": "sha512-kDz6FPnxdDf7fIKUy7Ry6WUES17SbbrUZqxjrUko+wp+YMhQZePOT6/x7IqARfoHwMWQa4uyptz/uCqOKWfsvQ==", - "path": "higeom/3.2.25", - "hashPath": "higeom.3.2.25.nupkg.sha512" + "sha512": "sha512-+7MT5Z+0e/Du678GIk1xPc4jjSole+k1Yctbg513QuiNRxtPBq8p9t6LDS37nVo/qf5Ca0ksKaJCkKEZzCjWsw==", + "path": "higeom/3.2.26", + "hashPath": "higeom.3.2.26.nupkg.sha512" }, - "HiLicense/3.2.25": { + "HiLicense/3.2.26": { "type": "package", "serviceable": true, - "sha512": "sha512-a53li1WcSo6X3raacFoqVTrqM3TvQ/nQYLXBjlD3aFPneIsR8M32TO50f9wDYbeOIMlT90NjEnjrZHxIr+LHhw==", - "path": "hilicense/3.2.25", - "hashPath": "hilicense.3.2.25.nupkg.sha512" + "sha512": "sha512-zb49GEXjRVThRul2QzViSb4f82DstbA9AdQKskR/AUVftg1lLvyG8/kxVUt2+iPLWdT/xhqdKt9kRNFkYUKWTg==", + "path": "hilicense/3.2.26", + "hashPath": "hilicense.3.2.26.nupkg.sha512" }, - "HiMech/3.2.29": { + "HiMech/3.2.30": { "type": "package", "serviceable": true, - "sha512": "sha512-gyrUo/YozRYciG43oHZLtRaXpmE3zhISgwk7Q8PiW4Bi5QAf/w7KNL3DKj+T18/3brv2owzTtQ7tT5K7myfUDQ==", - "path": "himech/3.2.29", - "hashPath": "himech.3.2.29.nupkg.sha512" + "sha512": "sha512-n4cByu9ZEQ2XTgfD7ZgEh6veJYPZusByguxkPWAmsq9PhwxeWPfWwFQxqa6r5DBOdBVBBPQy4k48ojD4LFKdzA==", + "path": "himech/3.2.30", + "hashPath": "himech.3.2.30.nupkg.sha512" }, - "HiNc/3.2.26": { + "HiNc/3.2.27": { "type": "package", "serviceable": true, - "sha512": "sha512-ClpKih2ipUdtoqcyWUzyk0MLkwMJhJ36uwcBUghHNBvm1ULaHSxEPWOK80/lXVadbchwVfPxL7+LRNs3QbJHuw==", - "path": "hinc/3.2.26", - "hashPath": "hinc.3.2.26.nupkg.sha512" + "sha512": "sha512-+40aJqFhcJa7tvyWdvayzR60hX8WlwglnRpPsCBsOTpZ3CKAfNS6ZdtzHOEOg8HigiZjlAXbkcr9yhDg9VcLKA==", + "path": "hinc/3.2.27", + "hashPath": "hinc.3.2.27.nupkg.sha512" }, - "HiNc-Resource/3.2.23": { + "HiNc-Resource/3.2.24": { "type": "package", "serviceable": true, - "sha512": "sha512-sP3Gacc91Gxst3mvC9S5+dcefFkFa/mRZMfashTHA7wmfPRy+xuYJAgUQw0NJs0Oz+qoc0GRE5BZm7IjSp1jvg==", - "path": "hinc-resource/3.2.23", - "hashPath": "hinc-resource.3.2.23.nupkg.sha512" + "sha512": "sha512-XQ0d+FperlaIYGEa1ZmORgQMKlbgSNsghfBnK2WUejRECQNxEF0VX5gRQ4b3cbjYdHmv2+7qAJg2nhjnBYWcGw==", + "path": "hinc-resource/3.2.24", + "hashPath": "hinc-resource.3.2.24.nupkg.sha512" }, - "HiUniNc/3.2.27": { + "HiUniNc/3.2.28": { "type": "package", "serviceable": true, - "sha512": "sha512-JrzVCUM2uu3Reul3VniFDEjPcoFpUvBph0p4yfmKWo2n0ae2emYKF8mixxntT2fzAawC5btqnzCEzDT1/uELeA==", - "path": "hiuninc/3.2.27", - "hashPath": "hiuninc.3.2.27.nupkg.sha512" + "sha512": "sha512-X4QqJS/qOkuR+DLzTY9BuPrC6+YIGhvPba0aWJAsjY1ZwfAe7oDIAdCECc4DxjCDPxnVSDDluivWmz6iy+0THg==", + "path": "hiuninc/3.2.28", + "hashPath": "hiuninc.3.2.28.nupkg.sha512" }, "MathNet.Numerics/5.0.0": { "type": "package", diff --git a/App/HiNC-2025-win-desktop.dll b/App/HiNC-2025-win-desktop.dll index c35ad223a24b49d402c7844ec55efec0affff721..b7545c6998c4106b23f29fb2afbb0b62084fe568 100644 GIT binary patch delta 317 zcmZqZux{wEp3uP}?=Y*Uv8T0%v9*V(wTF3W56g$?9UobErqB4m(!eM;UGgJ~G@l{^ z0{q-Fz3u~x)byB-ECSPeJ^)o#fLK33dZv72NtrGIWVN$=V%g5}iM60dVB=52jV~uU zddD|fk@I&P zLU21!rGgTp`SgjI9Gct9g}Ihgz$IO`clU6W`GNWEKx2WJ8;E(f>)hrI5nz#v`*(GE z%WK{MftGmzm)4!pc3o?{sdDa#UFFlCyyh)afQpK~g^B{zhrZ`vx=@!FAk==oiFbR| I8{W3-07le-3jhEB delta 335 zcmZqZux{wEp3uQ!)4BFlV^3=jV`~pnYY+3%9+nT&b3U^0OrPG z0|NZqgJ3f=Ffm9@5B$g?%_uoN7f4O-`2f^20WtgbmO2jQ1V+>86Eit9r)%Hla-FXGk<)W~{C$o!8!?3s zPvra^hb+7us9Hg3`o0gG+S@CHxfWL-NxE(C?%^u)gNn2R4F_UwAm-VweVaE_fTej- z`sL{@uXzImr1$l#WmLcH)hC$gzToX={pn9$^Oh+B(wAHb=C#n Lw^zO4ZMzNtmS2Ud diff --git a/App/HiNC-2025-win-desktop.pdb b/App/HiNC-2025-win-desktop.pdb index c75f36ad3d56df1ab80a4d92a0fef7ceb877d921..080fddaf0c331729045f3ac85a62e91652eb3927 100644 GIT binary patch delta 390 zcmdn9Ky=Rn(FrvoE%O2{tvjRby4HA8<=hjy%H`tzU2UAuI)QQP1g56H_1sC88yFlI z8LXws(Gr1e(O?a!G;f`=c3-J66m0SDri*;gRW{nx6|*^xBteI>P}r zhG}c;oT4t|de%3DJp0#{sPV)j(6@zqBYBW?-x4 zgNY0Zj0_P+XGQFHW^rC()O=X^ly|~qkYcELb42F0F(|Mz@E@NTyXEB!*Uq_bB~Q;( z`s$Gxnuky|xz(+SL4lbeDtyJ#O`MXBD|Q{6SaWw*+Vnbp7V-9?|4cy4yuIi@%c%eW Dgy)>e delta 390 zcmdn9Ky=Rn(Frvo())VWGOAzp>J!X#U-0&`e)FXC%Z(FSCopcEz|{1&e%lwj;|var z4B{`W8cMf(^;@xjRjlmfIwg-x=cJM%y_B3B1_nm|!{; z#!y%B|IGP&Zf^CvU9uC6@4T$=$n?ofPR%P$g(|GPZQ9Auz{v3ZTe7^^WHtAdD~}zG z74x3vk?EV7oB>r-B(v-e!vkrC>j@X{>@F|$Y74!;!1&3FV;-4)$+|(Q#rdU0$uI+t z6$Z~{P+(+;6R1}S`Z(Ql{Vw^ViXPq$X&}W=^A>#%TFs!q&TuViL9hGwMa~@+>l6}} zzi#lz49!ER$}!+S%b>u_(6i|LHPXQ_z zc?&A|W9L451IH(tD;b0Htt)2mO?G5d*v!W<=NzXv0}}%?0|SHj=FQhWGcp=)UVft* YNKID0)y`_npvPdadE+gAMkWRZ0FCoQ)Bpeg diff --git a/App/HiNc.dll b/App/HiNc.dll index 171a67c39c5cd9f30957fa09063c7d109b54f9c3..e922e5ca932a25bac2af4d805cae906700719469 100644 GIT binary patch delta 146055 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 delta 145456 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⋙EWSWY{fL!xl(Jk` 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

Mech

Mech/ is the largest domain folder: the REST surfaces for the machine tool, the tool house and -cutter editing, fixtures and workpieces, spindle capability, background and coolant, and the three +cutter editing, fixtures and workpieces, spindle capability, ambient and coolant, and the three runner suits. It also holds the display controllers that bind a mechanism scene onto a rendering connection. Mech/CutterDtoBuilder.cs is the shared read-side DTO shape two controllers reuse, and Mech/NcSuitUsage.cs is what lets the Control Tree show the CSV and CL runner branches only when the diff --git a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/background-coolant.html b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/background-coolant.html index 5cfc997d..54bb4e96 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/background-coolant.html +++ b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/background-coolant.html @@ -2,9 +2,9 @@ - Background / Coolant | HiAPI-C# 2025 + Environment: Ambient Temperature / Coolant | HiAPI-C# 2025 - + @@ -85,19 +85,21 @@

-

Background / Coolant

+

Environment: Ambient Temperature / Coolant

-

Background and Coolant are two leaves of the General Setup page's Control Tree -(/general-setup?tree=equipment/background, /general-setup?tree=equipment/coolant), sitting -directly under the General Setup group between Spindle Capability and Fixture. They are two tree -items rather than a page, so the older /equipment/background-coolant path redirects onto the -Background leaf. Both are served by one panel component, which branches on the selected node's role -path.

+

Ambient Temperature and Coolant are the two leaves of the General Setup page's Environment root +(/general-setup?tree=equipment/background/environment-temperature, +/general-setup?tree=equipment/background/coolant — the root's id equipment/background and the +routes keep the legacy background spelling; since 2026-09-15 Environment is one of the page's four +roots beside Mechanism, Spindle Capability and Controller, and the pre-regroup equipment/coolant id +migrates). They are tree items rather than a page, so the older /equipment/background-coolant path +redirects onto the Environment root. Both leaves are served by one panel component, which branches +on the selected node's role path.

They edit the thermal condition on the project's authored equipment face, SetupEquipment, reached as SetupEquipment:

@@ -105,10 +107,10 @@ leaf) CoolantHeatCondition).

Layout

    -
  • Background leaf — equipment/background, item type ThermalCondition +
  • Ambient Temperature leaf — equipment/background/environment-temperature, item type ThermalCondition
  • Coolant leaf — equipment/coolant, the same item type and the same panel (file pick on top, @@ -177,11 +179,11 @@ are the water-soluble preset's values.
  • but exposes _C accessors that handle the conversion, and the DTO carries Celsius.
  • Finite values only. Every field handler drops a null or non-finite entry before any request is made, so Infinity never reaches these endpoints even though the numeric widget can parse it. -Background and coolant temperatures accept negatives (e.g. -40 °C for cryogenic coolant); the +Ambient and coolant temperatures accept negatives (e.g. -40 °C for cryogenic coolant); the three convection fields are clamped to min: 0.
  • -
  • The run sees it at once. The background-temperature write, all four condition scalars and the +
  • The run sees it at once. The ambient-temperature write, all four condition scalars and the file load each end in the project service's ForwardSetupEnvironmentToExecution, which stamps the -background temperature and the condition reference onto the runtime equipment face — including +ambient temperature and the condition reference onto the runtime equipment face — including the lazily created condition, which otherwise would exist only on the authored side.

Source Code Path

@@ -190,7 +192,7 @@ the lazily created condition, which otherwise would exist only on the authored s

HiNC-2025-webservice (Quasar CLI SPA):

  • wwwroot-src/src/components/controlTree/ThermalConditionPanel.vue — the one panel both leaves -share, branching on the node's last role-path segment: Background renders the single temperature +share, branching on the node's last role-path segment: Ambient Temperature renders the single temperature field, Coolant the not-attached badge, the file row, the read-only Name / Note and the four property fields.
  • wwwroot-src/src/components/controlTree/useControlTreeHost.ts — declares the two @@ -207,7 +209,8 @@ the flat snapshot, the load / save-as pair, and the five scalar PUTs.
  • wwwroot-src/src/router/routes.ts — carries the equipment/background-coolant redirect, which lands on general-setup?tree=equipment/background.
  • Mech/BackgroundCoolantController.cs — REST surface at /api/mech/background-coolant over the -authored equipment face: +authored equipment face (the route, the PUT path and the snapshot field keep their legacy +background wire names; only the C# member behind them is renamed):
    • GET / — flat snapshot { hasEquipment, backgroundTemperature_C, hasCoolant, coolantTemperature_C, coolantConvectionCoefficient_Wdm2K, mistFloodConvectionRatio, offConvectionCoefficient_Wdm2K, coolantName, coolantNote, coolantHeatConditionFile }.
    • POST /load, POST /save-as{ rootName, relFile }: install a .CoolantHeatCondition file @@ -218,7 +221,7 @@ project-relative path when it lands under the project. Save-as appends the exten missing and renames the condition after the file (IPreferredFileName) with the .default marker stripped.
    • PUT /background-temperature-c — set -BackgroundTemperature_C.
    • +AmbientTemperature_C.
    • PUT /coolant-temperature-c, PUT /coolant-convection-coefficient-wdm2k, PUT /mist-flood-convection-ratio, PUT /off-convection-coefficient-wdm2k — the four condition scalars, all through one helper that lazy-creates the condition when absent, writes it, and @@ -233,7 +236,7 @@ flood / mist-ratio / off convection coefficients, Name and Note with Prefe StandardPresets / ApplyPreset / MatchStandardPreset statics behind the shipped resource files.
    • HiMech/Machining/MachiningEquipmentUtils/SetupEquipment.cs — the authored equipment face that -owns the background temperature, the condition and its file reference, and externalizes the +owns the ambient temperature, the condition and its file reference, and externalizes the condition to the side-file when that reference is set.

    See Also

    diff --git a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/controller/machine/per-axis-tables.html b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/controller/machine/per-axis-tables.html index 89877c1b..05463eec 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/controller/machine/per-axis-tables.html +++ b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/controller/machine/per-axis-tables.html @@ -372,7 +372,13 @@ bounded field on the four leaves, at zero or above.
  • The stroke limits are checked at each played step against the chain's current machine pose while the session's stroke-limit check is on; a position past a configured limit is reported as a stroke-limit validation error anchored to that step, and pauses the player when pause-on-failure is -set. The check walks a fixed axis vocabulary — X, Y and Z from the machine point, A, B and C +set. The comparison carries a small tolerance +(Tolerance), so an axis parked exactly on its limit +is not reported. The rotary limits also steer the tilt solves: when a G53.1, G68.2, CYCLE800, +PLANE SPATIAL or LN posture has its nearest rotary solution outside the travel, the solve takes +the admissible branch nearest the entry instead of commanding a posture the machine cannot take. A +project that declared its travel only in the legacy machine-limits boxes gets those ends copied into +this table on load, for the axes carrying no end here. The check walks a fixed axis vocabulary — X, Y and Z from the machine point, A, B and C from its orientation — so a limit stored against any other axis name is kept and shown here but never tested. Rapid-traverse timing has the same shape and the same six names: a G00 move is timed axis-by-axis at each axis' rate and takes the slowest, falling back to the same 20000 mm/min and diff --git a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/index.html b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/index.html index 2b76e344..0009dee1 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/index.html +++ b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/index.html @@ -104,7 +104,7 @@ application.

    • Machine Tool — The kinematic chain the whole scene hangs from, and the standalone route that loads and previews it
    • Spindle Capability — The spindle envelope: thermal condition, gear shift, dry run, power and torque
    • -
    • Background / Coolant — The two scene branches that are not machine parts: the backdrop and the coolant model
    • +
    • Environment: Ambient Temperature / Coolant — The Environment root's two thermal leaves, the ones that are not machine parts: the ambient (shop) temperature the thermal model starts from, and the coolant model
    • Fixture — What holds the workpiece, its geometry and the two anchors that place it
    • Workpiece — Raw and target geometry, the anchors that locate them, the mesh, and the material
    • Controller — The SoftNcRunner-native controller branch: its two planes, the brand matrix behind which nodes appear at all, and the contract every leaf edits by
    • diff --git a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/spindle-capability.html b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/spindle-capability.html index 361fc02e..c7ee8788 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/spindle-capability.html +++ b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/spindle-capability.html @@ -290,7 +290,7 @@ reference.

      See Also

      diff --git a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/toc.html b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/toc.html index 170a4efd..0ba5ed18 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/toc.html +++ b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/toc.html @@ -22,7 +22,7 @@ Spindle Capability
    • - Background / Coolant + Environment (Ambient Temperature / Coolant)
    • Fixture diff --git a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/toc.json b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/toc.json index 636d2b17..a242f168 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/general-setup/toc.json +++ b/App/wwwroot/HiAPI-docsite/anatomy/general-setup/toc.json @@ -1,2 +1,2 @@ -{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Machine Tool","href":"machine-tool.html","topicHref":"machine-tool.html"},{"name":"Spindle Capability","href":"spindle-capability.html","topicHref":"spindle-capability.html"},{"name":"Background / Coolant","href":"background-coolant.html","topicHref":"background-coolant.html"},{"name":"Fixture","href":"fixture.html","topicHref":"fixture.html"},{"name":"Workpiece","href":"workpiece.html","topicHref":"workpiece.html"},{"name":"Controller","href":"controller/index.html","tocHref":"controller/toc.html","topicHref":"controller/index.html","homepage":"controller/index.html"},{"name":"Hidden Controller Branches","href":"hidden-controllers.html","topicHref":"hidden-controllers.html"}]} +{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Machine Tool","href":"machine-tool.html","topicHref":"machine-tool.html"},{"name":"Spindle Capability","href":"spindle-capability.html","topicHref":"spindle-capability.html"},{"name":"Environment (Ambient Temperature / Coolant)","href":"background-coolant.html","topicHref":"background-coolant.html"},{"name":"Fixture","href":"fixture.html","topicHref":"fixture.html"},{"name":"Workpiece","href":"workpiece.html","topicHref":"workpiece.html"},{"name":"Controller","href":"controller/index.html","tocHref":"controller/toc.html","topicHref":"controller/index.html","homepage":"controller/index.html"},{"name":"Hidden Controller Branches","href":"hidden-controllers.html","topicHref":"hidden-controllers.html"}]} diff --git a/App/wwwroot/HiAPI-docsite/anatomy/legacy-controller-settings.html b/App/wwwroot/HiAPI-docsite/anatomy/legacy-controller-settings.html index 94f4bdcb..1c329bb8 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/legacy-controller-settings.html +++ b/App/wwwroot/HiAPI-docsite/anatomy/legacy-controller-settings.html @@ -121,12 +121,16 @@ session holds no played SoftNc layers, and it is handed MachiningProject.N the switch on, so a value that only the legacy endpoints or the project XML can change still shows up on a runner play.

        -
      • Stroke limits, as a fallback. The per-step stroke check reads the runner's +
      • Stroke limits, as a fallback and as a seed. The per-step stroke check reads the runner's IStrokeLimitConfig when the switch is on and one is present, and falls back to the legacy stroke boxes otherwise — a CSV or NX-CL suit carries no stroke config, so -a play on those falls through to the boxes. The pre-play audit that warns of an unlimited linear -axis reads both sources end by end, the runner's first and the legacy box behind it, and stays -silent for an axis either source guards.
      • +a play on those falls through to the boxes. When a project loads, the boxes' finite ends are also +copied into the runner's controller parameter table for every axis that carries no end there +(PopulateLegacyStrokeLimitsWhereUnset; an explicit row wins), so +a project that declared its travel only in the boxes is checked against it on SoftNc — and its +tilt solves prefer the rotary branch inside that travel. The pre-play audit that warns of an +unlimited linear axis reads both sources end by end, the runner's first and the legacy box behind +it, and stays silent for an axis either source guards.
      • The home position, as a fallback. The chain is re-homed from the runner's home config; the legacy HomeMc fills in only when no linear axis was ever configured there.
      • The Execution canvas's coordinate markers. The IsoCoordinate and HeidenhainCoordinate diff --git a/App/wwwroot/HiAPI-docsite/anatomy/platform/control-tree.html b/App/wwwroot/HiAPI-docsite/anatomy/platform/control-tree.html index b9940c29..49b04b03 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/platform/control-tree.html +++ b/App/wwwroot/HiAPI-docsite/anatomy/platform/control-tree.html @@ -116,7 +116,7 @@ segment is a scope key only.
      • re-minted on every re-index; in the Mission branch it is the Mission API command path (0, 1, the dotted 0.2 of a nested list entry); in the Tool House branch it is the tool id as a string. Waves whose panels read a module-level state singleton rather than an indexed object leave it -empty — the SoftNc controller leaves, the spindle sections, the Background and Coolant leaves and +empty — the SoftNc controller leaves, the spindle sections, the Environment root's Ambient Temperature and Coolant leaves and the Program branch all do.
      • ctx — the parent-provided SlotCtx: the afterChange commit chain, a slot's onCreate create-and-rebind hook, and a slot picker's allowedKinds / allowNone constraints.
      • diff --git a/App/wwwroot/HiAPI-docsite/anatomy/platform/tree-ids-and-routes.html b/App/wwwroot/HiAPI-docsite/anatomy/platform/tree-ids-and-routes.html index 33e38ee7..2a2822fe 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/platform/tree-ids-and-routes.html +++ b/App/wwwroot/HiAPI-docsite/anatomy/platform/tree-ids-and-routes.html @@ -209,7 +209,7 @@ moved into a Control Tree still lands on the editor.

        /equipment/background-coolant -/general-setup?tree=equipment/background. Background and Coolant are two separate tree nodes; the redirect picks Background. +/general-setup?tree=equipment/background. That id is the Environment root over the Ambient Temperature and Coolant leaves (equipment/background/environment-temperature, equipment/background/coolant); the redirect lands on the root (the ids and the route keep the legacy background spelling). /mission diff --git a/App/wwwroot/HiAPI-docsite/anatomy/shell/main-panel.html b/App/wwwroot/HiAPI-docsite/anatomy/shell/main-panel.html index e03cc9de..d13f1a38 100644 --- a/App/wwwroot/HiAPI-docsite/anatomy/shell/main-panel.html +++ b/App/wwwroot/HiAPI-docsite/anatomy/shell/main-panel.html @@ -119,14 +119,14 @@ signed-in session; it is omitted only while that probe has reported no version.<
      • Tool House MenuItem Open Tool House Page
      • General Setup MenuItem -The equipment Control Tree — Machine Tool, Spindle Capability, Background, Coolant, Fixture, Workpiece, Controller, in that order — plus the shared equipment canvas. Two further controller branches, CSV Controller and CL Controller, are hidden by default and are switched on from the Preference dropdown.
      • +The equipment Control Tree — four roots: Mechanism (Machine Tool / Fixture / Workpiece), Spindle Capability, Environment (Ambient Temperature / Coolant) and Controller, in that order — plus the shared equipment canvas. Two further controller branches, CSV Controller and CL Controller, are hidden by default and are switched on from the Preference dropdown.
      • Execution MenuItem Open Execution Page
      • File Explorer MenuItem (below a separator). See Util Pages.
      • Mechanism Builder MenuItem Open Mechanism Builder Page
      -

      The dropdown is not every route the application has. The Machine Tool page stays reachable by URL for its chain-only canvas preview, the Log Viewer is reached by the Show Log button, and the Fixture, Workpiece, Spindle Capability, Mission, Background / Coolant and legacy Controller paths resolve as redirects into the two tree pages.

      +

      The dropdown is not every route the application has. The Machine Tool page stays reachable by URL for its chain-only canvas preview, the Log Viewer is reached by the Show Log button, and the Fixture, Workpiece, Spindle Capability, Mission, Environment (Ambient Temperature / Coolant) and legacy Controller paths resolve as redirects into the two tree pages.

    • Preference Menu Dropdown

    • @@ -203,7 +203,7 @@ watching for project changes itself.
      • The Execution Page is the landing route — / redirects to /execution
      • The page URL and panel state are synchronized (bi-directional navigation)
      • -
      • There is no Environment dropdown. Machine Tool, Fixture, Workpiece, Controller, Background / Coolant and Spindle Capability are branches of the General Setup page's Control Tree, and Tool House and Execution are pages of their own; the remaining paths resolve as redirects into those pages. The menu bar is therefore Project ▾ | Page ▾ | Preference ▾.
      • +
      • There is no Environment dropdown (Environment is now a root of the General Setup page's Control Tree, over Ambient Temperature / Coolant). Mechanism (Machine Tool / Fixture / Workpiece), Spindle Capability, Environment and Controller are the roots of that tree, and Tool House and Execution are pages of their own; the remaining paths resolve as redirects into those pages. The menu bar is therefore Project ▾ | Page ▾ | Preference ▾.

      Source Code Path

      See HiNC App Anatomy for git repository links.

      diff --git a/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html b/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html index 3ea9f977..5b81137d 100644 --- a/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html +++ b/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html @@ -252,6 +252,73 @@ serialized: runtime data cannot reach the project file by construction.

Nqng%15;_; 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 diff --git a/App/HiUniNc.dll b/App/HiUniNc.dll index 1d19dd67ec8043ea5e6ef7cf40a6c7946bd8f7b8..43eaca77b847c39a34cefb6033c5e72eaa6da0d7 100644 GIT binary patch delta 4199 zcma)xN#*u8028ueRSm|v!3g{yZ&U7%4hcDqjr?ux@^7O3Z9j@w%LgVwGKBEMlb|{? zO#TOEE=v>-C=}mKpxB#25rk65Cr^g-a;F>_<8N!iXqL@WT&TQ^(NvbnWvC2cG?h&` zb*Su>DfaP4CPPlVB(Dsnvz0DPJRng#$p41@#NRIONB9_{S)*Ql4V6wF<%H`C#-x8C z3@a4h0*dd5*e=uOA4RMc*$zg^ha%eeQ%*?6;gWP&lsF(v?Iox;>4;&Z|p5HUn3%S0R!F;6spS;Uk=DmNqw zeIcSvc&3TCHkGo6#65l@hWWM7i$&W*!hb=;&D=T#%A#)<>5oOM7qL^jX$mw${0XHZ zHH3X&sYu18r1arZ`p(jiak+MKDx^UC=R!L#v>KH%ij@{zpB9-7zk+K<6w*$LMfknK zJEp@OdGF&Y1on|=11f#~-a>JO_#9!S&&Sp4aq&9BDK6zHIglQ4UV1Atnq4E0V4T7i z%BVp*oBOON?DK~SW)_UfwGAR$KBS;NMV?kPJ zUC8dOHmhtyx)`KCAUSG`T(xo(u~r~;e*tOQ9J32+*g`gD(71)@=v+PLSBXYz%`W(p zGjSFM`Qe$6IMuIS7uLW&U7%Z4>#azCsxyn;jdZ~vKZjZRL$uF=g!O}JsI`IZz1g(h z6W+kensnM4mcbfWt3d(fZOpk>na(efHm^1*Y(fJY3z8G*$Qm=}LppZ1Nh_oV_UC&H z@+x;=vUaVR96&m4(AKa}Ya<(3XXZ{!Xk^P;OyU=2K|ZZTXAwB*y3n|`7Kz2di{L>Z z-BFA?%df7G?qY2ZQ|pa5>3j~V_)T17yNlI1NZmAXcv=R#i+%c&XG5`Gc?i9@&Ausy zX#PPl#Qo298@s5AsC`X|*vnM=J)v%)9t%tK`(0fEPCqT_maCR@iQK|^eoGa)E#sE` zwidQcCv0hrYGL0A+QPo{Sfg55&11rexu~cI*zO?ludw#ifRY>4$u4%2rx!gXNQ-)O z8n;wOZDL0Z^7FD%NVE;ABwp$@8}K_zaRAq;H$`n`i~EA=mQsB>j+DX~Jd?Jo&#<9> z%8EhnDT9CGbZgK0AcN*z8!3l4sKMJ$yvV+M*7PMJT|MC!+2vsF)};T=xt}xJY11pg zC7$Q4Rp49}P-2o9`1VkmcC81gBS^E5COmKEW>YRmE0ZN?+iT{YN|xcq7fd>ltUyPQ z_*YesfCHFsSDFKhoAn!M+AITY{r70?`e$mXGic;Z7ka%4+9c*h=aJU5%e3RL>m9BDHCb@IIugJLl*X&Y+s?S2LI$M$b~;pIBAvH=%a8pc8hM zK36X=f39J5fc@N0RtGqBLTj&KeMPsnrlmpEu&{z^&0uNp#HikIP?KxnX~2izO3#7Z z&q(dYi6Xkqpn&pAr2B(ZjXdkMUFHH3yQeTiX_k2i_ zBiE>vP!DyN$h67Q!f&aE=IXyI?NTH38RA)`6KTMpeEc5s!%l;W)J~*525rFHVtCP@ z%{+7=?3(r!ekm>i_jh^^b5){JgSentL9}=H2Mgg0J*-0w(1aWN*@)X==nAzIKQ^W; zf-fjLu@Rh+ih85877AqiDUWx4CtuJAmD2*sGnx0nDk1jbd>+YM2W^77*>d?j(r!WG z7(CJ_4$}`CX`N`78ezNS9aT!?b&zSLs$1}9KT)YcK9%T3gD#8QT7w?dj$eoEVT7+* zf~y;Um~}0|>PxjDDWDaz&>1Xk)~u|eJ1`kSfj37*o7WiKnd zs2R&H*A_QZ+0RAU9cg-@^P=qQ2GxkN=M7Rs+0b;|*{9_!gWJ^detc(?*yG8J$?Pu$ z^sZTgL{>GjtG(o*D6tBeJjvS074UR;3>~gTFg)!ISOohMY>A6-(`t|2 z4X;Yz(dzF7@5In{B~fK8Q|o>V1_0LcoF4c^1iqi4=vOHY@`fJpM0_iJ3siFV^T&H& zUZ_R=0qCedW1%+3wuD{A_Q2VMVsf!vA*B9)PWNdj zwcW6I_s)IR__E!HhPzuoI<#EtI1MqABMYbJGUf)BGh@1Ix~ovzB}?)<)+8JzPCZM~ k{`j7B37}AW?tR>KP{`#|(t~Oto6d5z?o-k#z?a_t02Gihg8%>k delta 4193 zcma)@3ZoU`FxkbxUu0&=)Ky@UwDy2MihR_?N;nBABKcPYs7EaDSsQ`~&=F zERN}1=iDTSV}lNz3r&Zhf}gcIcv5xF7-x5|7*Ny6Cu$|a?2y=~LkbLt7j&4Qg|L$N zn+{&xZ1WJS2f!Y#`4iooJ_s?bL>vQB-SixhecZ@?XqZ?Mwzcz zG+P`@gWN!pOnKK5De(H)XLv}k!eH9v0AUqq%G=0iwyyP?$@TnoGbNt@G>Mt@!KPS{mJnwjI;S~FkW?};Y_?H2D4y&OblNQ5$uek zIxd3E73;HMDeM)H1LKq!RgBMp>Lj0be|$v55p2}bwq4y2-_n+$QCui`b08J+#DN^B z$u3a8L@iUslNw!rm`t%djbe^e7K;%hAhWVwjZJ82TZ7Rq+oBbr@+C%FS+7>0atx!b ztSy*=$|owtePZJXC`cNi&I{X(S_c{rC=^eNPq3e)jcOkP*ZRUqOVqbf*(qEexWyl% zUP3shQG5?59+Ppq)H9^MP{wvf?q@Rk#M2%~#o>~aDdS0*^kFh7-Dwnaq_S9?@j!jv z2$}SWjQeB^%1R$(Qfi}2eL$h>(_%(06s)Y5No!<$QKtSw#yqL4m+_d4Ewb^KGNz58 z61!v}mvntHHpsX%o!tHM9>0*oOpvYalySdol_)dU3Fi$^5x-Fam-Z5Qz0E+HtuE z-CVSfg1MuA&{m`NN7*I^S0u0>926gs*D+4IKEiLo#p{lyxK5-MKxRy|`d)TCD^`zU zoGd06KoV`Axdo6Mr}GJT)^xk+1lojWjnPv8ixiaSDe-JbHp#2#2pU!djnwF#BHWuH zQBVv`gzd$!0yphM@UY!JnT)%O=y8ieBGrqhgU+Ai9(GiUt1*S>ltnt|7*LEv4?2WPHu5~=4?Lm6SqS1Vn zQp*loR4rZ&K<-MNyB!Uzqkr-la|_MFVZQCHb+G|o7vIjw)fGHW_DM|CUIdLl+arAl!Avo8?Db3rE+nIQg{eR zcaO)N72|+3)vJmscVNF9GS%yvaf#1d2qa0c^Bs5HX9fZ zx&O1t>JBO(%l@KFZeuF@u~auvXJg9DTU}5Fo)%iop`WehGBw1yeoGZP9fOX(xDeZF z61H@@LhOp9P3&8r)3t)tJ}NWObGaU1&xc8Thqd!`Ug%oGE_PB*H|CTfP3)C4G!U*)W7 z@Z6>Igj5E>-DJ~-^&z!~X&lm!mu+t%d10EDszBQ-w)b?Z3b(#$(?_Wqw1-K2R}INH zfSYs;diK~k9XbcK&!#O%o-o~+#$mx;+dJXn&>to-r3Omydrxx5!V`v>Gw9f&$HLnd zg*ef9i*&vXGY{^wtDQ|73g^Rg%{>$*?YBK~szyGBmZcAcLsF#^o#?bhA(38dZus%F zkW4#bI)2K9JQUgvP$63Tdz7KDRnixLIbF5j!8LyXo8lRBycYb_G7f)DPz_9!YV$x$D6;?xzb3U4 zCyMB9i*)`=r2E5EiL@!4N%Vf$Yen+@*{p(N{jpxoXb-B6Z)|lRQcsu+?@cgVjor*A zKm$yF7OYc^Tu1asIMXwo0ZpQX-Nz9*ts~exm zI%Z(?b;gbvR5nI79ZWFGo{>!x5>1*by%LMSNnK8}Xs@yIb}D;Cq_tw%OfE`WvFrw8 zS}T=}lTEi}n1#;CvhP@Quk_AYq{*_8nP%obqu?&Mn^*SZ%ca5|OJz)DfAG_5W*LrK zVKbviAy<BY~b9*n8B-6VsW6SVemj=F!(@P_D zhd1|eFBEE-6#?Iv;-X+>esS@HqI_?aKbSwp?=Q&@j1KsG-e6&{s?t!Nfe#ep(l+?C zB&)D;w68Ky?adDcgT8#PzoaC;qT27zA5&3O9Sn@|RaF)F#rK~<`u~^dJq6`)9nT#3 zySDd<`i@x_UtKo+#0y6IDM%O*>mOCfm={<<@u;FvMSf$4s;I}DDL6`;d6r_l_OWsq ez;C?xDQ-IO3-yHZ5cjiDtkCE@q09$--TgO2QoAYu diff --git a/App/StepPresentCatalog/catalog.en.json b/App/StepPresentCatalog/catalog.en.json index 297eb287..87bac30f 100644 --- a/App/StepPresentCatalog/catalog.en.json +++ b/App/StepPresentCatalog/catalog.en.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "engineVersion": "3.2.29.0", + "engineVersion": "3.2.30.0", "recordCount": 98, "records": [ { diff --git a/App/core.dll b/App/core.dll index 9046caaab16d67bce82684a1e4ed7f953a42f471..c10b4e048651b48a7c86b5a7bbd355e820ca89ce 100644 GIT binary patch delta 274 zcmYMuISztQ6op|PIEypR^90Vd$=d>*9gU&U=qgAoT!yrEcIc8UEQ}lQr!d~+OK#3- zj(2|u54W|@UWe;RinA0U6&fOlB8E5;NFs$abYzf44tW$%LS&;e7TV~b ziyrzIV2BaMffVNREg5)JI29Y%J4>-0D~yz1r}G=|>HL2eY(J*hv&MBSOfba^b1bk7 ITxWF=UwIKj#Q*>R delta 274 zcmYMuISztQ6op|PIEyomI1k`lo4hU1+0hspOk;p4s$+Qqz`q&Q0vQK2D*I1)%Ag)}nALPrjH6i`G7WmI6GiW=%@potbtw9!Eq zJ@hfa5F?B+38k=JZ^^);!l~H8+1rZa+EJwZI-TD@Ko|VGaQCsqfmNPsV~QE(SYU}& J=(+2w_yRsuK_dVF diff --git a/App/en/HiGeom.resources.dll b/App/en/HiGeom.resources.dll index d32ec38b6a43ebf704b47e9426014e0aa3c17863..c38e9a7a334bf732589af6f5b52ff75459bcaad4 100644 GIT binary patch delta 108 zcmV-y0F(cKB!DE4hy=4Cq@J;iLIVLBv(Ez!0ubZFmS6At7fhRmVsuabe&Unt1^o{; zE-(N9GywoFGcGbNGB&gL29^T}8UO+S0{{R38nc%Q69NG?v#Sh$0Rc9XD-MSRHUKUF OFtZU5N&&M05dQ%fGa(fK delta 108 zcmV-y0F(cKB!DE4hy=Y8i?FebLIVLAv(Ez!0uZFxd!J{8h)um+B!urB9Ep?c1^o{- zE-(N9GywoFGcGbNGBvaK29^T}82|zR0{{R38MBuP69NG>v#Sh$0Rc6WD-MSRH2^LE OFtZU5N&&M05dQ&>Bp*Ql diff --git a/App/en/HiMech.resources.dll b/App/en/HiMech.resources.dll index 4700b7b5e0961bc391b1027ce54ad4a3f42b5567..66bad122a6bc0e31dcfef2642091d51f9cfb7c2c 100644 GIT binary patch delta 238 zcmZorX;7Ka!P5Kv@}rGCPRxvQo6j?gG6}40^?Uu~Tf0Mh?cZ5WyrPMlzp!R7S{fVZ z889%IFf!;H>lx`88)%!Sm>4En8kkt5Sem6;7@1fm8XK7z85<;<8kifUr6d~}CL0(V zC0T5q%KnpyQ;va&fti7UL2mPOuBS}Q#ta6V>v?M#LxBtiZ3c6O6b2IpLxw~KOCaBb z!2-y)WH4h$1+t8Qd`qB=F_2{j#2_8X45mQR9LP%ps!RsbhCtE)tR{)UVsaqAF*`_| Q9)rPTL4mT(i~|1|0o`>s8~^|S delta 238 zcmZorX;7Ka!Sd+1^^=V~PRxw5o6j?gG6`^)@l5ulx`8S!x?wn3$!e86>8eB_*1er=%t(rX`yi0FkkwvAIEVs=0whN|LEj z^5&`RKbbgX8JHND85kI3H&5q!%EWBMV7a-Tx0W#!$Y9WBFlMk|FkvubNM%T4Fknao zl4cA^K-z@CoFN4$ng|w4W-tZHLP%o Strip Charts and Cycle-Line Charts.

+ + +

+ AmbientTemperature_C + +

+ +

Gets or sets the ambient temperature in Celsius. +This is a convenience property that converts between Celsius and Kelvin.

+
+
+ +
+
public double AmbientTemperature_C { get; set; }
+
+ + + + + +

Property Value

+
+
double
+
+
+ + + + + + + + + + +

+ AmbientTemperature_K + +

+ +

Gets or sets the ambient temperature in Kelvin. Runtime-stamped +from the authored face at materialise; the authored value's home is +AmbientTemperature_K.

+
+
+ +
+
public double AmbientTemperature_K { get; set; }
+
+ + + + + +

Property Value

+
+
double
+
+
+ + + + + + + +

@@ -291,13 +358,13 @@ serialized: runtime data cannot reach the project file by construction.

-

Gets or sets the background temperature in Celsius. -This is a convenience property that converts between Celsius and Kelvin.

+

Source-compatible delegate of AmbientTemperature_C.

-
public double BackgroundTemperature_C { get; set; }
+
[Obsolete("Renamed to AmbientTemperature_C.")]
+public double BackgroundTemperature_C { get; set; }
@@ -324,14 +391,13 @@ This is a convenience property that converts between Celsius and Kelvin.

-

Gets or sets the background temperature in Kelvin. Runtime-stamped -from the authored face at materialise; the authored value's home is -BackgroundTemperature_K.

+

Source-compatible delegate of AmbientTemperature_K.

-
public double BackgroundTemperature_K { get; set; }
+
[Obsolete("Renamed to AmbientTemperature_K.")]
+public double BackgroundTemperature_K { get; set; }
diff --git a/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html b/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html index e2dc1465..9eb90ce6 100644 --- a/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html +++ b/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html @@ -299,6 +299,76 @@ shipped project files keep their layout, only the deserialized object changed. + + +

+ AmbientTemperature_C + +

+ +

Gets or sets the ambient temperature in Celsius. +This is a convenience property that converts between Celsius and Kelvin.

+
+
+ +
+
public double AmbientTemperature_C { get; set; }
+
+ + + + + +

Property Value

+
+
double
+
+
+ + + + + + + + + + +

+ AmbientTemperature_K + +

+ +

Gets or sets the ambient temperature in Kelvin: the shop-floor +temperature the workpiece, cutter, chips and spindle start at and the +spindle cools toward. The cutting zone itself convects to +CoolantTemperature_K. +Serialized as AmbientTemperature_C; the pre-rename element +BackgroundTemperature_C is still read.

+
+
+ +
+
public double AmbientTemperature_K { get; set; }
+
+ + + + + +

Property Value

+
+
double
+
+
+ + + + + + + +

@@ -338,13 +408,13 @@ shipped project files keep their layout, only the deserialized object changed.

-

Gets or sets the background temperature in Celsius. -This is a convenience property that converts between Celsius and Kelvin.

+

Source-compatible delegate of AmbientTemperature_C.

-
public double BackgroundTemperature_C { get; set; }
+
[Obsolete("Renamed to AmbientTemperature_C.")]
+public double BackgroundTemperature_C { get; set; }
@@ -371,13 +441,13 @@ This is a convenience property that converts between Celsius and Kelvin.

-

Gets or sets the background temperature in Kelvin. -This represents the ambient temperature of the machining environment.

+

Source-compatible delegate of AmbientTemperature_K.

-
public double BackgroundTemperature_K { get; set; }
+
[Obsolete("Renamed to AmbientTemperature_K.")]
+public double BackgroundTemperature_K { get; set; }
diff --git a/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html b/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html index c87a59d6..b4c8c11a 100644 --- a/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html +++ b/App/wwwroot/HiAPI-docsite/api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html @@ -196,7 +196,7 @@ Class MachiningVolumeRemovalProc.StepMotionSnapshot
-
public StepMotionSnapshot(DVec3d GeomCl, DVec3d ProgramCl, SeqPair<Mat4d> Seq, Dictionary<Anchor, Mat4d> AnchorTransformDictionary, double[] McValues, bool EnableSweeping, IMachiningTool MachiningTool, WorkpieceService WorkpieceService, double BackgroundTemperature_K, CoolantHeatCondition CoolantHeatCondition, SortedList<double, double> FluteZToDzList, DVec3d PreTipPose = null)
+
public StepMotionSnapshot(DVec3d GeomCl, DVec3d ProgramCl, SeqPair<Mat4d> Seq, Dictionary<Anchor, Mat4d> AnchorTransformDictionary, double[] McValues, bool EnableSweeping, IMachiningTool MachiningTool, WorkpieceService WorkpieceService, double AmbientTemperature_K, CoolantHeatCondition CoolantHeatCondition, SortedList<double, double> FluteZToDzList, DVec3d PreTipPose = null)

Parameters

@@ -225,8 +225,8 @@ Class MachiningVolumeRemovalProc.StepMotionSnapshot
WorkpieceService WorkpieceService

Service that owns the workpiece being machined.

-
BackgroundTemperature_K double
-

Background temperature in Kelvin.

+
AmbientTemperature_K double
+

Ambient temperature in Kelvin.

CoolantHeatCondition CoolantHeatCondition

The coolant heat condition.

@@ -258,6 +258,38 @@ it may span two steps back.

+ + +

+ AmbientTemperature_K + +

+ +

Ambient temperature in Kelvin.

+
+
+ +
+
public double AmbientTemperature_K { get; init; }
+
+ + + + + +

Property Value

+
+
double
+
+
+ + + + + + + +

@@ -290,38 +322,6 @@ it may span two steps back.

- - -

- BackgroundTemperature_K - -

- -

Background temperature in Kelvin.

-
-
- -
-
public double BackgroundTemperature_K { get; init; }
-
- - - - - -

Property Value

-
-
double
-
-
- - - - - - - -

diff --git a/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.LocalProjectService.html b/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.LocalProjectService.html index ba776596..865126ab 100644 --- a/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.LocalProjectService.html +++ b/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.LocalProjectService.html @@ -2222,7 +2222,7 @@ no-op, for hosts without a setup face (e.g. test stubs).

-

Forwards the authored environment values (background temperature, +

Forwards the authored environment values (ambient temperature, coolant condition, spindle capability) onto the runtime face. These are pure data with no topology involvement, so eager forwarding is safe and keeps environment edits immediate — a full materialise is not needed @@ -3735,6 +3735,46 @@ The previous step is null if no previous step exists.

+

+ OnNcPipelineReset + +

+ +

App-lifetime event raised after the per-session NC pipeline state has been +rewound (Hi.MachiningProcs.LocalProjectService.ResetNcPipelineState()): the next +RunNcLines(string, IEnumerable<string>, MachiningSession, StepDiagnosticProgress, NcDiagnosticProgress, CancellationToken) re-initialises from scratch, so its +FileIndex / SentenceIndex counters restart at 0. Raised on EVERY rewind path — +a runner-suit rewire (brand switch), PowerReset() and +ResetRuntime(IProgress<IMessage>) (including a mission script's ResetRuntime() +between two NC files) — not only on a PacePlayer reset or a project swap, +which are the two boundaries a session-lifetime consumer already sees. Anything +keyed by those counters must drop its index here, or the next file's pieces +land under the previous file's numbers.

+
+
+ +
+
public event Action OnNcPipelineReset
+
+ + + + + + +

Event Type

+
+
Action
+
+
+ + + + + + + +

OnShellMessageAdded diff --git a/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.MachiningParallelProc.StepTaskBundle.html b/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.MachiningParallelProc.StepTaskBundle.html index 72d26470..d0128609 100644 --- a/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.MachiningParallelProc.StepTaskBundle.html +++ b/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.MachiningParallelProc.StepTaskBundle.html @@ -190,13 +190,13 @@ Class MachiningParallelProc.StepTaskBundle
-
public StepTaskBundle(double backgroundTemperature_K, double spindleTemperature_K)
+
public StepTaskBundle(double ambientTemperature_K, double spindleTemperature_K)

Parameters

-
backgroundTemperature_K double
-

The background temperature in Kelvin.

+
ambientTemperature_K double
+

The ambient temperature in Kelvin.

spindleTemperature_K double

The spindle temperature in Kelvin.

diff --git a/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.RapidCutMonitor.html b/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.RapidCutMonitor.html index 5725406e..544878ae 100644 --- a/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.RapidCutMonitor.html +++ b/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.RapidCutMonitor.html @@ -6,7 +6,7 @@ - + @@ -105,7 +105,7 @@ the line's first touching step and carrying the line's total removed volume and its largest cutting depth. A rapid move through material breaks the tool or crashes the machine on a real run, yet with the spindle turning the engine treats it as ordinary cutting: the collision -rule (Hi.Machining.MachiningEquipment.Detect) pairs flute +rule (Detect(bool)) pairs flute and workpiece only while the spindle is stopped, so such a line used to pass with no message at all.

diff --git a/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.html b/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.html index 1e7f7ebe..fd2cdb80 100644 --- a/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.html +++ b/App/wwwroot/HiAPI-docsite/api/Hi.MachiningProcs.html @@ -222,7 +222,7 @@ the line's first touching step and carrying the line's total removed volume and its largest cutting depth. A rapid move through material breaks the tool or crashes the machine on a real run, yet with the spindle turning the engine treats it as ordinary cutting: the collision -rule (Hi.Machining.MachiningEquipment.Detect) pairs flute +rule (Detect(bool)) pairs flute and workpiece only while the spindle is stopped, so such a line used to pass with no message at all.

diff --git a/App/wwwroot/HiAPI-docsite/api/Hi.Physics.SeqPhysicsBrief.html b/App/wwwroot/HiAPI-docsite/api/Hi.Physics.SeqPhysicsBrief.html index 7e9a5453..85d5b599 100644 --- a/App/wwwroot/HiAPI-docsite/api/Hi.Physics.SeqPhysicsBrief.html +++ b/App/wwwroot/HiAPI-docsite/api/Hi.Physics.SeqPhysicsBrief.html @@ -229,13 +229,13 @@ Class SeqPhysicsBrief

-
public SeqPhysicsBrief(double backgroundTemperature_K, double spindleTemperature_K)
+
public SeqPhysicsBrief(double ambientTemperature_K, double spindleTemperature_K)

Parameters

-
backgroundTemperature_K double
-

The background temperature in Kelvin.

+
ambientTemperature_K double
+

The ambient temperature in Kelvin.

spindleTemperature_K double

The spindle temperature in Kelvin.

@@ -1050,7 +1050,7 @@ public double WorkpieceSurfaceTemperature_C { get; set; }
-
public void BuildCuttingTemperatureAndWear(SeqPhysicsBrief preSeqPhysicsBrief, MachineMotionStep preMachineMotionStep, MachineMotionStep curMachineMotionStep, double backgroundTemperature_K, SpindleCapability spindleCapability, IMachiningTool machiningTool, Workpiece workpiece, int stepIndex, Substraction substraction, LayerMillingEngagement layerMillingEngagement, MillingPhysicsBrief millingPhysicsBrief, CoolantHeatCondition coolantHeatCondition, CoolantMode coolantMode, bool enableWearEffect, MillingToolPhysicsPack physicsPack = null, Action<string> onWarning = null)
+
public void BuildCuttingTemperatureAndWear(SeqPhysicsBrief preSeqPhysicsBrief, MachineMotionStep preMachineMotionStep, MachineMotionStep curMachineMotionStep, double ambientTemperature_K, SpindleCapability spindleCapability, IMachiningTool machiningTool, Workpiece workpiece, int stepIndex, Substraction substraction, LayerMillingEngagement layerMillingEngagement, MillingPhysicsBrief millingPhysicsBrief, CoolantHeatCondition coolantHeatCondition, CoolantMode coolantMode, bool enableWearEffect, MillingToolPhysicsPack physicsPack = null, Action<string> onWarning = null)

Parameters

@@ -1064,8 +1064,8 @@ public double WorkpieceSurfaceTemperature_C { get; set; }
curMachineMotionStep MachineMotionStep

The current machine motion step.

-
backgroundTemperature_K double
-

The background temperature in Kelvin.

+
ambientTemperature_K double
+

The ambient temperature in Kelvin.

spindleCapability SpindleCapability

The spindle capability information.

@@ -1135,7 +1135,7 @@ derivations on use.

-
public void BuildSpindleTemperatureAndRatio(MachineMotionStep machiningStep, MillingPhysicsBrief rakeFacePhysicsBrief, double backgroundTemperature_K, SpindleCapability spindleCapability, SpindleSpeedCache spindleSpeedCache, double preSpindleTemperature_K)
+
public void BuildSpindleTemperatureAndRatio(MachineMotionStep machiningStep, MillingPhysicsBrief rakeFacePhysicsBrief, double ambientTemperature_K, SpindleCapability spindleCapability, SpindleSpeedCache spindleSpeedCache, double preSpindleTemperature_K)

Parameters

@@ -1144,7 +1144,7 @@ derivations on use.

rakeFacePhysicsBrief MillingPhysicsBrief
-
backgroundTemperature_K double
+
ambientTemperature_K double
spindleCapability SpindleCapability
diff --git a/App/wwwroot/HiAPI-docsite/index.json b/App/wwwroot/HiAPI-docsite/index.json index b55d6b4d..dbf72d21 100644 --- a/App/wwwroot/HiAPI-docsite/index.json +++ b/App/wwwroot/HiAPI-docsite/index.json @@ -7,7 +7,7 @@ "anatomy/by-source/webservice-backend.html": { "href": "anatomy/by-source/webservice-backend.html", "title": "Web Service Backend Source Tree | HiAPI-C# 2025", - "summary": "Web Service Backend Source Tree The C# half of HiNC-2025-webservice is an ASP.NET Core process that serves the SPA, answers its REST calls, and pushes to it over SignalR. It is organised by the engine's domain vocabulary, not by web-framework artifact type: a controller, its hub, its DI service and its non-web scene objects sit together in one domain folder rather than in a Controllers / Hubs / Services split. Folders below are ordered by how much of the shipped surface they answer for. Reading a Filename The role of a file is told by its suffix and base type, and the convention holds throughout: Suffix What it is *Controller.cs a REST controller with a route attribute *Hub.cs a SignalR hub — but see the two traps below *Service.cs a singleton registered in Program.cs *Displayee.cs a scene-composition object handed to the engine; no HTTP surface at all *Dtos.cs, *Config.cs plain wire or settings types Two names deliberately break the reader's expectation. Controller/ControllerController.cs means CNC controller, not an MVC controller. And Mech/'s *DisplayController.cs files are ordinary REST controllers that attach a displayee to a rendering connection somebody else already owns — they are not hubs. Important Folder nesting does not predict the route. Mech/Topo/ and Mech/MechBuilder/ expose routes that carry no api/mech/ prefix at all, and even inside Mech/ two conventions coexist: the newer ports use kebab-case paths under api/mech/, while the older keyed-object editors use the controller-name default. Read the route attribute, never the path. Composition Root Program.cs is the only C# file at the repository root, and it is where the questions a reader usually has are actually answered: which services are singletons, which hubs are mapped, and what the middleware order is. Two facts about it are worth carrying: A declared hub is not a mapped hub. Program.cs maps eight hub endpoints. Anything not in that list is unreachable however complete its class looks — see the trap under Execution/ below. The tree is not self-contained. The project service types Program.cs leans on hardest live in the sibling HiNc engine repository, not here. Documented in Program and Hosting. Execution Execution/ is the run cockpit's whole backend: playback control, the strip and cycle-line charts, the NC-program branch index, run-output queries, and the real-time push layer. Execution/ExecutionController.cs — the playback surface. Execution/ExecutionChartsController.cs and Execution/ClStripController.cs — the chart data. Three separate classes share the case-insensitive api/execution prefix on purpose, one of them routed there rather than under Mission with a comment saying why. Execution/SessionSinkHub.cs — four mapped hubs declared in one file, one per message sink, so hub-per-file does not hold here. Each pairs with a broadcast service that Program.cs resolves eagerly, so it subscribes to its sink before the first client connects. Execution/ClStripHub.cs, Execution/ExecutionStatusHub.cs — the strip and status pushes. Warning Execution/ExecutionCanvasHub.cs declares a hub that Program.cs never maps and that nothing in the repository references. The Execution canvas rides Disp/RenderingHub.cs like every other canvas. A reader looking for “the hub behind the Execution page” by name will find this file first and be wrong. Documented in Execution Page, Program Branch, Selected-Step Info Panel, Strip Charts and Cycle-Line Charts. Mech Mech/ is the largest domain folder: the REST surfaces for the machine tool, the tool house and cutter editing, fixtures and workpieces, spindle capability, background and coolant, and the three runner suits. It also holds the display controllers that bind a mechanism scene onto a rendering connection. Mech/CutterDtoBuilder.cs is the shared read-side DTO shape two controllers reuse, and Mech/NcSuitUsage.cs is what lets the Control Tree show the CSV and CL runner branches only when the loaded project actually plays them. No SignalR hub lives here. Mech/MechBuilder/ — the standalone mechanism-building session, held by a process-wide singleton rather than per user. Documented in Mechanism Builder Page. Mech/Topo/ — one thin controller per transformer kind, each editing an instance held in the keyed object store. Documented in Transformer Select Panel. Mech/SoftNcRunnerController.cs — the one endpoint family behind the Controller branch, and the file whose snapshot decides which of that branch's nodes exist. Documented in Controller Branch, with Brand Matrix for the snapshot flags themselves. Mech/CsvRunnerController.cs and Mech/ClRunnerController.cs — the two resident non-brand runner suits, reached from tree branches the Preference menu hides by default. Documented in Preference Menu Dropdown until those branches have a page. Documented in General Setup Page and Tool House Page and the panels beneath them. Missions Missions/ is the mission command tree's backend. Two things here surprise readers: The folder is plural and the route is singular — and the SPA folder is singular too. Missions/NcOptOptionEndpoints.cs is not a minimal-API endpoint file despite the name. It is a second file of the same partial controller class, which is why its routes resolve under the mission prefix. Missions/MissionCommandCatalog.cs reflects over every session command carrying the catalog attribute once per process, replacing hand-maintained kind switches, and Missions/MissionCommandFields.cs does the same for annotated scalars — which is how a simple command gets an editor without a bespoke panel. Missions/ScriptCompletionService.cs and Missions/ScriptCompileCheckService.cs are the Roslyn pair behind the script editor; the compile check reuses the same options and globals type the script command uses at run time. Documented in Mission Root Panel and the command panels under it. Disp Disp/ is the rendering layer. Disp/RenderingHub.cs is the single transport surface for every 3D canvas in the application — canvas initialization, pointer, key and touch input, resize, view presets, cache clearing and snapshots — and the SPA's canvas component defaults to it, so all pages share one hub rather than one hub per page. Disp/RenderingService.cs owns the per-connection engines the hub resolves against. Disp/StlPreviewController.cs is the only other REST surface here. The *Displayee.cs files are scene-graph composition objects rather than web types, and each has a live instantiation site: the execution scene, the equipment-setup scene, the step-subtraction scene and the two coordinate-frame displayees the first two compose in. Documented in Rendering Canvas on Web Service, RenderingCanvas Tool Bar and — for Disp/StlPreviewController.cs and the per-connection slot behind it — STL Preview Pane. Environments Environments/ is session and environment scope: the project lifecycle, per-user preference persistence, the Execution page's division flags, and the shipped localized step-present catalog. It is also where the Log Viewer's data comes from — the log endpoints sit on the project controller beside status, new, load, save, reload, save-as and close. Documented in Main Panel, Session State, Preference Menu Dropdown, Internationalization, Log Viewer Page and Step Present Dialog. Common, Geom and Widget Common/ — cross-cutting infrastructure with no single domain owner: the optional login gate, the named-root file explorer, path guards, the daily file logger, and two pieces the whole application rests on. Common/IndexService.cs is the keyed object store behind the index a backend object, then edit it by key pattern every geometry, transformer and widget controller uses. Common/CleanupHub.cs is not a messaging hub, and it is not what bounds that store either. Its key registry is an ordinary instance property and SignalR builds a fresh hub instance for every invocation, so the entry Add records is discarded with the instance that received it and the disconnect handler always walks an empty registry. The bound comes from the browser instead: wwwroot-src/src/composables/useCleanupHub.ts posts the index-remove endpoint on Common/IndexController.cs for every key it holds when its host unmounts, and again whenever a key it registered is replaced. Documented in Dictionary Service Pattern, WebAPI Hub Cleanup Pattern, Login and Authentication and Log Viewer Page. Geom/ — one CRUD controller per geometry kind, on the same keyed-object pattern, and nothing else: no hubs, no services. Documented in Geometry Panels. Widget/ — the generic value and lifecycle controllers the reusable inputs post to: the 3D vector, the 4×4 matrix, and the object-management surface that handles file operations, XML editing and copy-paste for indexed objects. Documented in Object Management Menu Button, Vec3dControl Component and Mat4dControl Component. Controller and Demo Controller/ is the single-file surface over the legacy HardNcEnv model, MachiningProject.NcEnv. The Legacy Controller page that drove it was removed on 2026-09-11, but the controller is still mounted: its routes edit the legacy tables, a different store from the runner tables that Mech/SoftNcRunnerController.cs — its successor, as that file's own doc comment says — edits. The successor covers the brand, the axis limits and rapid feedrates, the tooling time, the work coordinates, the datum tables and the tool offsets, but not every route — among them the work-coordinate Align P0 pair, the shortest-rotary toggle, the per-axis max rotary speed and the Heidenhain master-axis character have no soft-runner endpoint. Only GET cnc-brand still has a client — the Execution tool bar's Heidenhain Coordinate gate. Documented in Legacy Controller Model (HardNcEnv). Demo/ is customer-facing sample code — a custom colour guide and a per-step optimization sweep — compiled into the assembly with no call site in the running application. Read it as an example of how to extend the engine, not as part of the shipped behaviour. See Also Anatomy by Source Directory — the other two source trees, and how this layer is meant to be entered Web Service SPA Source Tree — the front end this process serves and answers" + "summary": "Web Service Backend Source Tree The C# half of HiNC-2025-webservice is an ASP.NET Core process that serves the SPA, answers its REST calls, and pushes to it over SignalR. It is organised by the engine's domain vocabulary, not by web-framework artifact type: a controller, its hub, its DI service and its non-web scene objects sit together in one domain folder rather than in a Controllers / Hubs / Services split. Folders below are ordered by how much of the shipped surface they answer for. Reading a Filename The role of a file is told by its suffix and base type, and the convention holds throughout: Suffix What it is *Controller.cs a REST controller with a route attribute *Hub.cs a SignalR hub — but see the two traps below *Service.cs a singleton registered in Program.cs *Displayee.cs a scene-composition object handed to the engine; no HTTP surface at all *Dtos.cs, *Config.cs plain wire or settings types Two names deliberately break the reader's expectation. Controller/ControllerController.cs means CNC controller, not an MVC controller. And Mech/'s *DisplayController.cs files are ordinary REST controllers that attach a displayee to a rendering connection somebody else already owns — they are not hubs. Important Folder nesting does not predict the route. Mech/Topo/ and Mech/MechBuilder/ expose routes that carry no api/mech/ prefix at all, and even inside Mech/ two conventions coexist: the newer ports use kebab-case paths under api/mech/, while the older keyed-object editors use the controller-name default. Read the route attribute, never the path. Composition Root Program.cs is the only C# file at the repository root, and it is where the questions a reader usually has are actually answered: which services are singletons, which hubs are mapped, and what the middleware order is. Two facts about it are worth carrying: A declared hub is not a mapped hub. Program.cs maps eight hub endpoints. Anything not in that list is unreachable however complete its class looks — see the trap under Execution/ below. The tree is not self-contained. The project service types Program.cs leans on hardest live in the sibling HiNc engine repository, not here. Documented in Program and Hosting. Execution Execution/ is the run cockpit's whole backend: playback control, the strip and cycle-line charts, the NC-program branch index, run-output queries, and the real-time push layer. Execution/ExecutionController.cs — the playback surface. Execution/ExecutionChartsController.cs and Execution/ClStripController.cs — the chart data. Three separate classes share the case-insensitive api/execution prefix on purpose, one of them routed there rather than under Mission with a comment saying why. Execution/SessionSinkHub.cs — four mapped hubs declared in one file, one per message sink, so hub-per-file does not hold here. Each pairs with a broadcast service that Program.cs resolves eagerly, so it subscribes to its sink before the first client connects. Execution/ClStripHub.cs, Execution/ExecutionStatusHub.cs — the strip and status pushes. Warning Execution/ExecutionCanvasHub.cs declares a hub that Program.cs never maps and that nothing in the repository references. The Execution canvas rides Disp/RenderingHub.cs like every other canvas. A reader looking for “the hub behind the Execution page” by name will find this file first and be wrong. Documented in Execution Page, Program Branch, Selected-Step Info Panel, Strip Charts and Cycle-Line Charts. Mech Mech/ is the largest domain folder: the REST surfaces for the machine tool, the tool house and cutter editing, fixtures and workpieces, spindle capability, ambient and coolant, and the three runner suits. It also holds the display controllers that bind a mechanism scene onto a rendering connection. Mech/CutterDtoBuilder.cs is the shared read-side DTO shape two controllers reuse, and Mech/NcSuitUsage.cs is what lets the Control Tree show the CSV and CL runner branches only when the loaded project actually plays them. No SignalR hub lives here. Mech/MechBuilder/ — the standalone mechanism-building session, held by a process-wide singleton rather than per user. Documented in Mechanism Builder Page. Mech/Topo/ — one thin controller per transformer kind, each editing an instance held in the keyed object store. Documented in Transformer Select Panel. Mech/SoftNcRunnerController.cs — the one endpoint family behind the Controller branch, and the file whose snapshot decides which of that branch's nodes exist. Documented in Controller Branch, with Brand Matrix for the snapshot flags themselves. Mech/CsvRunnerController.cs and Mech/ClRunnerController.cs — the two resident non-brand runner suits, reached from tree branches the Preference menu hides by default. Documented in Preference Menu Dropdown until those branches have a page. Documented in General Setup Page and Tool House Page and the panels beneath them. Missions Missions/ is the mission command tree's backend. Two things here surprise readers: The folder is plural and the route is singular — and the SPA folder is singular too. Missions/NcOptOptionEndpoints.cs is not a minimal-API endpoint file despite the name. It is a second file of the same partial controller class, which is why its routes resolve under the mission prefix. Missions/MissionCommandCatalog.cs reflects over every session command carrying the catalog attribute once per process, replacing hand-maintained kind switches, and Missions/MissionCommandFields.cs does the same for annotated scalars — which is how a simple command gets an editor without a bespoke panel. Missions/ScriptCompletionService.cs and Missions/ScriptCompileCheckService.cs are the Roslyn pair behind the script editor; the compile check reuses the same options and globals type the script command uses at run time. Documented in Mission Root Panel and the command panels under it. Disp Disp/ is the rendering layer. Disp/RenderingHub.cs is the single transport surface for every 3D canvas in the application — canvas initialization, pointer, key and touch input, resize, view presets, cache clearing and snapshots — and the SPA's canvas component defaults to it, so all pages share one hub rather than one hub per page. Disp/RenderingService.cs owns the per-connection engines the hub resolves against. Disp/StlPreviewController.cs is the only other REST surface here. The *Displayee.cs files are scene-graph composition objects rather than web types, and each has a live instantiation site: the execution scene, the equipment-setup scene, the step-subtraction scene and the two coordinate-frame displayees the first two compose in. Documented in Rendering Canvas on Web Service, RenderingCanvas Tool Bar and — for Disp/StlPreviewController.cs and the per-connection slot behind it — STL Preview Pane. Environments Environments/ is session and environment scope: the project lifecycle, per-user preference persistence, the Execution page's division flags, and the shipped localized step-present catalog. It is also where the Log Viewer's data comes from — the log endpoints sit on the project controller beside status, new, load, save, reload, save-as and close. Documented in Main Panel, Session State, Preference Menu Dropdown, Internationalization, Log Viewer Page and Step Present Dialog. Common, Geom and Widget Common/ — cross-cutting infrastructure with no single domain owner: the optional login gate, the named-root file explorer, path guards, the daily file logger, and two pieces the whole application rests on. Common/IndexService.cs is the keyed object store behind the index a backend object, then edit it by key pattern every geometry, transformer and widget controller uses. Common/CleanupHub.cs is not a messaging hub, and it is not what bounds that store either. Its key registry is an ordinary instance property and SignalR builds a fresh hub instance for every invocation, so the entry Add records is discarded with the instance that received it and the disconnect handler always walks an empty registry. The bound comes from the browser instead: wwwroot-src/src/composables/useCleanupHub.ts posts the index-remove endpoint on Common/IndexController.cs for every key it holds when its host unmounts, and again whenever a key it registered is replaced. Documented in Dictionary Service Pattern, WebAPI Hub Cleanup Pattern, Login and Authentication and Log Viewer Page. Geom/ — one CRUD controller per geometry kind, on the same keyed-object pattern, and nothing else: no hubs, no services. Documented in Geometry Panels. Widget/ — the generic value and lifecycle controllers the reusable inputs post to: the 3D vector, the 4×4 matrix, and the object-management surface that handles file operations, XML editing and copy-paste for indexed objects. Documented in Object Management Menu Button, Vec3dControl Component and Mat4dControl Component. Controller and Demo Controller/ is the single-file surface over the legacy HardNcEnv model, MachiningProject.NcEnv. The Legacy Controller page that drove it was removed on 2026-09-11, but the controller is still mounted: its routes edit the legacy tables, a different store from the runner tables that Mech/SoftNcRunnerController.cs — its successor, as that file's own doc comment says — edits. The successor covers the brand, the axis limits and rapid feedrates, the tooling time, the work coordinates, the datum tables and the tool offsets, but not every route — among them the work-coordinate Align P0 pair, the shortest-rotary toggle, the per-axis max rotary speed and the Heidenhain master-axis character have no soft-runner endpoint. Only GET cnc-brand still has a client — the Execution tool bar's Heidenhain Coordinate gate. Documented in Legacy Controller Model (HardNcEnv). Demo/ is customer-facing sample code — a custom colour guide and a per-step optimization sweep — compiled into the assembly with no call site in the running application. Read it as an example of how to extend the engine, not as part of the shipped behaviour. See Also Anatomy by Source Directory — the other two source trees, and how this layer is meant to be entered Web Service SPA Source Tree — the front end this process serves and answers" }, "anatomy/by-source/webservice-spa.html": { "href": "anatomy/by-source/webservice-spa.html", @@ -141,8 +141,8 @@ }, "anatomy/general-setup/background-coolant.html": { "href": "anatomy/general-setup/background-coolant.html", - "title": "Background / Coolant | HiAPI-C# 2025", - "summary": "Background / Coolant Background and Coolant are two leaves of the General Setup page's Control Tree (/general-setup?tree=equipment/background, /general-setup?tree=equipment/coolant), sitting directly under the General Setup group between Spindle Capability and Fixture. They are two tree items rather than a page, so the older /equipment/background-coolant path redirects onto the Background leaf. Both are served by one panel component, which branches on the selected node's role path. They edit the thermal condition on the project's authored equipment face, SetupEquipment, reached as SetupEquipment: BackgroundTemperature_C (Background leaf) the whole CoolantHeatCondition (Coolant leaf) — file-first, see below Key Model: SetupEquipment (+ its CoolantHeatCondition). Layout Background leaf — equipment/background, item type ThermalCondition Background Temperature NumberField (°C) — BackgroundTemperature_C. Coolant leaf — equipment/coolant, the same item type and the same panel (file pick on top, properties below, as on the workpiece material leaf) “Not attached” badge — visible until the first coolant-related save (see Lazy CoolantHeatCondition creation below). File row — FilePathInput (.CoolantHeatCondition, resource subfolder CoolantHeatCondition): a Select dropdown button whose menu holds Browse…, Browse Resource… and — only while a file is set — Clear, beside a read-only path input; it loads a saved condition by named root. A Save As… button follows it, prompting for a project-relative file to export the current condition to. Tracked in CoolantHeatConditionFile. The three standard cooling types ship as ready-made files in HiNc-Resource (Resource/CoolantHeatCondition/StandardForcedAir.default.CoolantHeatCondition, StandardOilBasedCoolant.default.CoolantHeatCondition and StandardWaterSolubleCoolant.default.CoolantHeatCondition), so Browse Resource… starts populated like the workpiece-material picker — picking a shipped file is the cooling-type selection. Name / Note — read-only mirror of the loaded condition. Property fields (always visible, under Name / Note): Coolant Temperature (°C) — CoolantTemperature_C. Flood Convection Coefficient (W/(m²·K)) — CoolantConvectionCoefficient_Wdm2K, min: 0. Mist / Flood Ratio — MistFloodConvectionRatio, min: 0. Off (Air) Convection Coefficient (W/(m²·K)) — OffConvectionCoefficient_Wdm2K, min: 0. Both leaves, with no project open: every control is disabled and a “no project — open one first” caption is shown. The panel fetches the snapshot itself on mount and gates on its hasEquipment flag, so the tree host holds no state for either leaf. Behavior File-based conditions (WorkpieceMaterial pattern). Picking a .CoolantHeatCondition file installs it as the whole condition (XFactory.GenByFile); Save As… exports the current values and renames the condition after the file (IPreferredFileName). While CoolantHeatConditionFile is set, the project save externalizes the condition as relPath and regenerates the side-file (a resource pick is copied into the project on save); with no file the bare inline shape is kept byte-compatible. Coefficient edits tune this project's copy. The static presets on CoolantHeatCondition (StandardPresets / ApplyPreset / MatchStandardPreset) are the API-side source the shipped files are authored from. The file row's Clear entry does nothing here. FilePathInput reports a clear by emitting update:modelValue(null), and this panel binds the widget's value one-way and listens only for picked — so the entry is rendered, is clickable while a file is set, and drops nothing. Clearing the tracked file is therefore not reachable from this leaf at all; the reference changes only by loading another file or by a Save As. The .default marker never survives a user save. The shipped resource files carry a .default ownership marker in their names. The Save As… prompt strips it from its prefill, and the controller strips it again from the name it stamps on the condition, so a user save cannot mint a file that masquerades as a shipped default. The “not attached” badge is unreachable, and the lazy creation behind it never fires. SetupEquipment initializes CoolantHeatCondition at its declaration and nothing assigns null to it — the project-XML read replaces the instance only when the element is present — so the controller's hasCoolant, which is a null test on that property, is true whenever a project is open. The badge is therefore rendered only in the no-equipment case the panel already covers with its own caption, and the null branch each scalar PUT carries is defensive rather than reached. What a fresh project actually carries is the class defaults, which are the water-soluble preset's values. Celsius is the wire format. CoolantHeatCondition stores Kelvin internally but exposes _C accessors that handle the conversion, and the DTO carries Celsius. Finite values only. Every field handler drops a null or non-finite entry before any request is made, so Infinity never reaches these endpoints even though the numeric widget can parse it. Background and coolant temperatures accept negatives (e.g. -40 °C for cryogenic coolant); the three convection fields are clamped to min: 0. The run sees it at once. The background-temperature write, all four condition scalars and the file load each end in the project service's ForwardSetupEnvironmentToExecution, which stamps the background temperature and the condition reference onto the runtime equipment face — including the lazily created condition, which otherwise would exist only on the authored side. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/components/controlTree/ThermalConditionPanel.vue — the one panel both leaves share, branching on the node's last role-path segment: Background renders the single temperature field, Coolant the not-attached badge, the file row, the read-only Name / Note and the four property fields. wwwroot-src/src/components/controlTree/useControlTreeHost.ts — declares the two ThermalCondition leaves (equipment/background, equipment/coolant) under the General Setup group, with no host-level init state. wwwroot-src/src/components/controlTree/itemTypes.ts — registers the ThermalCondition item type against that panel: no child tree, no geometry-cache chain. wwwroot-src/src/components/widgets/FilePathInput.vue — the file row widget: Browse… / Browse Resource… (opening at the CoolantHeatCondition resource subfolder) / Clear. wwwroot-src/src/components/widgets/NumericInput.vue — the numeric field used by every value on both leaves, and the source of the min: 0 clamp on the three convection fields. wwwroot-src/src/api/backgroundCoolant.ts — typed client for /api/mech/background-coolant/*: the flat snapshot, the load / save-as pair, and the five scalar PUTs. wwwroot-src/src/router/routes.ts — carries the equipment/background-coolant redirect, which lands on general-setup?tree=equipment/background. Mech/BackgroundCoolantController.cs — REST surface at /api/mech/background-coolant over the authored equipment face: GET / — flat snapshot { hasEquipment, backgroundTemperature_C, hasCoolant, coolantTemperature_C, coolantConvectionCoefficient_Wdm2K, mistFloodConvectionRatio, offConvectionCoefficient_Wdm2K, coolantName, coolantNote, coolantHeatConditionFile }. POST /load, POST /save-as — { rootName, relFile }: install a .CoolantHeatCondition file / export the current condition. Both resolve the path under the named root and refuse anything that escapes it, and both record the result in CoolantHeatConditionFile as a project-relative path when it lands under the project. Save-as appends the extension when it is missing and renames the condition after the file (IPreferredFileName) with the .default marker stripped. PUT /background-temperature-c — set BackgroundTemperature_C. PUT /coolant-temperature-c, PUT /coolant-convection-coefficient-wdm2k, PUT /mist-flood-convection-ratio, PUT /off-convection-coefficient-wdm2k — the four condition scalars, all through one helper that lazy-creates the condition when absent, writes it, and forwards to the runtime face. HiAPI Engine HiMech/Physics/CoolantHeatCondition.cs — the model: Kelvin storage with _C accessors, the flood / mist-ratio / off convection coefficients, Name and Note with PreferredFileName, and the StandardPresets / ApplyPreset / MatchStandardPreset statics behind the shipped resource files. HiMech/Machining/MachiningEquipmentUtils/SetupEquipment.cs — the authored equipment face that owns the background temperature, the condition and its file reference, and externalizes the condition to the side-file when that reference is set. See Also Spindle Capability — sibling equipment editor, editing the same authored equipment face. Coolant (manual) — the end-user task: picking a cooling type in the application. Coolant Model — what the values on this panel mean, which one a running program applies, and how the condition is stored." + "title": "Environment: Ambient Temperature / Coolant | HiAPI-C# 2025", + "summary": "Environment: Ambient Temperature / Coolant Ambient Temperature and Coolant are the two leaves of the General Setup page's Environment root (/general-setup?tree=equipment/background/environment-temperature, /general-setup?tree=equipment/background/coolant — the root's id equipment/background and the routes keep the legacy background spelling; since 2026-09-15 Environment is one of the page's four roots beside Mechanism, Spindle Capability and Controller, and the pre-regroup equipment/coolant id migrates). They are tree items rather than a page, so the older /equipment/background-coolant path redirects onto the Environment root. Both leaves are served by one panel component, which branches on the selected node's role path. They edit the thermal condition on the project's authored equipment face, SetupEquipment, reached as SetupEquipment: AmbientTemperature_C (Ambient leaf) the whole CoolantHeatCondition (Coolant leaf) — file-first, see below Key Model: SetupEquipment (+ its CoolantHeatCondition). Layout Ambient Temperature leaf — equipment/background/environment-temperature, item type ThermalCondition Ambient Temperature NumberField (°C) — AmbientTemperature_C. Coolant leaf — equipment/coolant, the same item type and the same panel (file pick on top, properties below, as on the workpiece material leaf) “Not attached” badge — visible until the first coolant-related save (see Lazy CoolantHeatCondition creation below). File row — FilePathInput (.CoolantHeatCondition, resource subfolder CoolantHeatCondition): a Select dropdown button whose menu holds Browse…, Browse Resource… and — only while a file is set — Clear, beside a read-only path input; it loads a saved condition by named root. A Save As… button follows it, prompting for a project-relative file to export the current condition to. Tracked in CoolantHeatConditionFile. The three standard cooling types ship as ready-made files in HiNc-Resource (Resource/CoolantHeatCondition/StandardForcedAir.default.CoolantHeatCondition, StandardOilBasedCoolant.default.CoolantHeatCondition and StandardWaterSolubleCoolant.default.CoolantHeatCondition), so Browse Resource… starts populated like the workpiece-material picker — picking a shipped file is the cooling-type selection. Name / Note — read-only mirror of the loaded condition. Property fields (always visible, under Name / Note): Coolant Temperature (°C) — CoolantTemperature_C. Flood Convection Coefficient (W/(m²·K)) — CoolantConvectionCoefficient_Wdm2K, min: 0. Mist / Flood Ratio — MistFloodConvectionRatio, min: 0. Off (Air) Convection Coefficient (W/(m²·K)) — OffConvectionCoefficient_Wdm2K, min: 0. Both leaves, with no project open: every control is disabled and a “no project — open one first” caption is shown. The panel fetches the snapshot itself on mount and gates on its hasEquipment flag, so the tree host holds no state for either leaf. Behavior File-based conditions (WorkpieceMaterial pattern). Picking a .CoolantHeatCondition file installs it as the whole condition (XFactory.GenByFile); Save As… exports the current values and renames the condition after the file (IPreferredFileName). While CoolantHeatConditionFile is set, the project save externalizes the condition as relPath and regenerates the side-file (a resource pick is copied into the project on save); with no file the bare inline shape is kept byte-compatible. Coefficient edits tune this project's copy. The static presets on CoolantHeatCondition (StandardPresets / ApplyPreset / MatchStandardPreset) are the API-side source the shipped files are authored from. The file row's Clear entry does nothing here. FilePathInput reports a clear by emitting update:modelValue(null), and this panel binds the widget's value one-way and listens only for picked — so the entry is rendered, is clickable while a file is set, and drops nothing. Clearing the tracked file is therefore not reachable from this leaf at all; the reference changes only by loading another file or by a Save As. The .default marker never survives a user save. The shipped resource files carry a .default ownership marker in their names. The Save As… prompt strips it from its prefill, and the controller strips it again from the name it stamps on the condition, so a user save cannot mint a file that masquerades as a shipped default. The “not attached” badge is unreachable, and the lazy creation behind it never fires. SetupEquipment initializes CoolantHeatCondition at its declaration and nothing assigns null to it — the project-XML read replaces the instance only when the element is present — so the controller's hasCoolant, which is a null test on that property, is true whenever a project is open. The badge is therefore rendered only in the no-equipment case the panel already covers with its own caption, and the null branch each scalar PUT carries is defensive rather than reached. What a fresh project actually carries is the class defaults, which are the water-soluble preset's values. Celsius is the wire format. CoolantHeatCondition stores Kelvin internally but exposes _C accessors that handle the conversion, and the DTO carries Celsius. Finite values only. Every field handler drops a null or non-finite entry before any request is made, so Infinity never reaches these endpoints even though the numeric widget can parse it. Ambient and coolant temperatures accept negatives (e.g. -40 °C for cryogenic coolant); the three convection fields are clamped to min: 0. The run sees it at once. The ambient-temperature write, all four condition scalars and the file load each end in the project service's ForwardSetupEnvironmentToExecution, which stamps the ambient temperature and the condition reference onto the runtime equipment face — including the lazily created condition, which otherwise would exist only on the authored side. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/components/controlTree/ThermalConditionPanel.vue — the one panel both leaves share, branching on the node's last role-path segment: Ambient Temperature renders the single temperature field, Coolant the not-attached badge, the file row, the read-only Name / Note and the four property fields. wwwroot-src/src/components/controlTree/useControlTreeHost.ts — declares the two ThermalCondition leaves (equipment/background, equipment/coolant) under the General Setup group, with no host-level init state. wwwroot-src/src/components/controlTree/itemTypes.ts — registers the ThermalCondition item type against that panel: no child tree, no geometry-cache chain. wwwroot-src/src/components/widgets/FilePathInput.vue — the file row widget: Browse… / Browse Resource… (opening at the CoolantHeatCondition resource subfolder) / Clear. wwwroot-src/src/components/widgets/NumericInput.vue — the numeric field used by every value on both leaves, and the source of the min: 0 clamp on the three convection fields. wwwroot-src/src/api/backgroundCoolant.ts — typed client for /api/mech/background-coolant/*: the flat snapshot, the load / save-as pair, and the five scalar PUTs. wwwroot-src/src/router/routes.ts — carries the equipment/background-coolant redirect, which lands on general-setup?tree=equipment/background. Mech/BackgroundCoolantController.cs — REST surface at /api/mech/background-coolant over the authored equipment face (the route, the PUT path and the snapshot field keep their legacy background wire names; only the C# member behind them is renamed): GET / — flat snapshot { hasEquipment, backgroundTemperature_C, hasCoolant, coolantTemperature_C, coolantConvectionCoefficient_Wdm2K, mistFloodConvectionRatio, offConvectionCoefficient_Wdm2K, coolantName, coolantNote, coolantHeatConditionFile }. POST /load, POST /save-as — { rootName, relFile }: install a .CoolantHeatCondition file / export the current condition. Both resolve the path under the named root and refuse anything that escapes it, and both record the result in CoolantHeatConditionFile as a project-relative path when it lands under the project. Save-as appends the extension when it is missing and renames the condition after the file (IPreferredFileName) with the .default marker stripped. PUT /background-temperature-c — set AmbientTemperature_C. PUT /coolant-temperature-c, PUT /coolant-convection-coefficient-wdm2k, PUT /mist-flood-convection-ratio, PUT /off-convection-coefficient-wdm2k — the four condition scalars, all through one helper that lazy-creates the condition when absent, writes it, and forwards to the runtime face. HiAPI Engine HiMech/Physics/CoolantHeatCondition.cs — the model: Kelvin storage with _C accessors, the flood / mist-ratio / off convection coefficients, Name and Note with PreferredFileName, and the StandardPresets / ApplyPreset / MatchStandardPreset statics behind the shipped resource files. HiMech/Machining/MachiningEquipmentUtils/SetupEquipment.cs — the authored equipment face that owns the ambient temperature, the condition and its file reference, and externalizes the condition to the side-file when that reference is set. See Also Spindle Capability — sibling equipment editor, editing the same authored equipment face. Coolant (manual) — the end-user task: picking a cooling type in the application. Coolant Model — what the values on this panel mean, which one a running program applies, and how the condition is stored." }, "anatomy/general-setup/controller/brand-matrix.html": { "href": "anatomy/general-setup/controller/brand-matrix.html", @@ -192,7 +192,7 @@ "anatomy/general-setup/controller/machine/per-axis-tables.html": { "href": "anatomy/general-setup/controller/machine/per-axis-tables.html", "title": "Per-Axis Tables | HiAPI-C# 2025", - "summary": "Per-Axis Tables Four leaves of the Controller branch's machine plane are one table each, keyed on the machine's axes: Machine Limits (Stroke), Rapid Feedrates, Home / G28 Reference and Tool-Change Position. They live on the General Setup page at /general-setup under the Control-Tree ids equipment/controller/machine/limits, equipment/controller/machine/rapid, equipment/controller/machine/home and equipment/controller/machine/tool-change; none of them is gated by a snapshot flag, so every brand grows all four. Two components serve them — one panel behind the first three, discriminating on the id's last segment, and a second behind Tool-Change Position — and the differences between those two components are what this page is mostly about. Important Anatomy makes no claim that any id named here is stable across versions. The migration hop that keeps an older ?tree= value resolving is described in Tree Ids and Routes. Where the Rows Come From Every row on all four leaves is one axis of the runner's machine-axis configuration, read as AxisNames through the proxy-resolved dependency list. On all five brand presets that configuration is the brand parameter table itself: ControllerParameterTableBase declares IMachineAxisConfig alongside IStrokeLimitConfig, IRapidFeedrateConfig and IHomeMcConfig, so one object supplies both the row set and three of the four value sets. Which brand carries which table is Brand Matrix. The table's axis set is a single parameter row: the per-axis integer bucket under the brand's axis-type number, whose keys are the axis names and whose values are the AxisType — linear, rotary or spindle. Adding an axis therefore means adding a key to that one row, and exactly one surface on this branch reaches it. Neither panel here has an add-row or delete-row control. Both render a fixed header over one per axis and nothing else. The four per-axis routes behind them write one axis' value and nothing more: the caller names an axis, and the endpoint writes into the stroke-limit, rapid-rate, home or tool-change store under that name. None of them touches the axis-type row, so none of them changes which rows the next read returns. Parameters (Native) edits the axis-type row itself, and is the one place on the branch that widens the axis set: its Add / Set footer takes a free-text axis name, so the section Axis (integer), the brand's axis-type number, a name and a value of 0 linear, 1 rotary or 2 spindle adds an axis, which then appears on all four leaves. Its grid cannot — the per-axis columns are the union of the axis names already present, so a cell can be written only for an axis that exists — and its delete button removes a whole parameter row, every axis cell of one number at once, rather than one axis. Axes arrive from the machining chain. Whenever the active runner suit or the chain changes, the project service re-binds the suit and calls ConfigureByMachiningChain(API), which walks the chain's axis codes and their transformers: a rotating transformer writes the axis as rotary — and, on a brand parameter table, writes its reference position as 0 deg and its rapid rate as 36000 deg/min — any other transformer writes the axis as linear, and every chain axis whose reference position is still unset is seeded to 0. That is the mechanism behind the description above the Home / G28 Reference table, \"Axes without a value are seeded to 0 when a machine tool attaches.\" The stamp adds rows and never removes one. The generic axis configuration carried by the CSV and CL runner suits is cleared before the walk; a brand parameter table is not, and keeps every axis it already held. An axis dropped from the chain therefore keeps its rows on all four leaves, and no surface removes it individually. The three-axis default table every brand preset seeds is why a project with no machine tool attached still shows X, Y and Z. Two values are the exception, and only on a rotary chain axis of a brand table: that branch of the walk is unconditional, so it rewrites the axis' reference position to 0 deg and its rapid rate to 36000 deg/min whether or not one was stored. The walk re-runs on every suit re-bind, so an edited Home Position or Rapid Rate on a rotary axis is back at those two numbers once the chain or the active suit changes. A linear axis' values, and every value on an axis the chain does not carry, are left untouched. The caption below the first three tables records the row half of that: \"Axis rows follow the Machine Tool chain; they cannot be added here.\" Where the chain itself is edited is Machine Tool. The Value Columns Each leaf renders the axis column, its own value column or columns, and a unit column. Leaf Value columns Empty cell means Machine Limits (Stroke) + Limit, − Limit no limit set for that axis and side Rapid Feedrates Rapid Rate never empty — see below Home / G28 Reference Home Position no reference position stored Tool-Change Position Stays put, Position see Stays Put The stroke-limit and home readers return an optional value and hand null straight through, so an unset cell is blank. The rapid reader does not: it returns the stored rate, or — when the axis has no rate of its own — the base class's fixed default, 20000 mm/min for a linear axis and 36000 deg/min for a rotary one. So a Rapid Rate cell is always a number, and a number in it is not proof that the axis has a row. A table cloned fresh from a brand's preset seed decides what the three leaves then open on, and all four brand defaults agree in shape: a linear X, Y and Z, a reference position of 0 on each, and a rapid rate per axis — and no stroke limit at all. Machine Limits therefore opens entirely blank on every brand, while Rapid Feedrates and Home / G28 Reference open populated. Whether a brand switch clones a fresh table or keeps the project's own is Machine and Controller Plane. The Unit Column The unit column's header is the translated label Unit; its cell text is not translated and does not come from the server. Each panel computes it in the browser from the row's rotary flag, using literal strings: Leaf Linear axis Rotary axis Machine Limits (Stroke) mm deg Rapid Feedrates mm/min deg/min Home / G28 Reference mm deg Tool-Change Position mm deg The flag itself is server-side, and it is the axis type rather than a separate setting: an axis stored as rotary or as spindle reports rotary, so a spindle-mode axis is labelled in degrees. The unit is a label, not a conversion. The base class writes a linear and a rotary rapid rate into the same per-axis cell and reads them back through the same lookup, differing only in the default returned when the cell is absent; the stroke-limit and home accessors are equally unit-blind. Nothing on these three leaves converts, so their numbers are the raw stored numbers, and the same values appear in Parameters (Native) under the brand's own parameter number: Role Fanuc, Mazak Syntec Siemens Heidenhain Axis type — the row set 1006 1006 30300 400 Reference position (home) 1240 1240 34010 410 Positive stroke limit 1300 1300 36100 420 Negative stroke limit 1320 1320 36110 430 Rapid rate 1420 1420 32000 1010 Mazak shares the Fanuc column because the Mazak preset carries the Fanuc parameter-table proxy; Siemens spends its rapid-rate role on the max-axis-velocity machine datum. Tool-Change Position is the exception on both counts: its values live on ToolingMcConfig, a plain runner-owned dependency rather than a parameter table, so they appear in no native form at all and a brand apply returns them to the preset defaults — see Machine and Controller Plane. Stays Put, and the Sentinel Behind It IToolingMcConfig stores one number per axis, and the contract gives one number a second meaning: NaN means the axis stays where it is during a tool change. The read splits that back into two fields — a stored NaN becomes the Stays put flag with no position, anything else becomes the position — and the panel renders the flag as a checkbox and the position as a numeric field disabled while the box is ticked. Writing goes the same way round. Ticking the box sends the stay flag and the reader writes NaN. Unticking it sends a position, and because the panel clears its own cell when the box is ticked, the position it sends on the way back is 0 — so unticking parks the axis at machine zero rather than restoring what was there before. A third state exists and is not the sentinel: an axis with no entry in the map at all. Its box is unticked and its Position cell blank, because the reader reports no position and no stay. At run time the two are indistinguishable — the tool-change motion overlays only those axes that carry a number and are not NaN onto the current pose, and leaves every other axis alone. So the machine stays put either way; the tick mark distinguishes only how that was recorded. The overlay has a vocabulary of its own, narrower than the table. X, Y and Z always take part; every other axis takes part only while the machine declares it rotary. A linear axis outside those three is stored, shown and editable on this leaf, and never moved. The preset default is exactly this mixture: X and Y carry the sentinel, Z carries 0, and no rotary axis carries an entry, which is why a rotary axis usually opens unticked and blank. Above the table sits Tool-change mechanism time, a single field in seconds bound to ToolingTime. It becomes the duration of the tool change step the runner emits, and it is the changer mechanism alone — the axis travel to and from the position is timed separately from the positions in the table. It is 0 on every brand preset, and it is written into the runner file only when non-zero. One Reader, Two Readings of Its Presence Flag All four reads answer the same shape: a present flag plus one row per axis. present reports whether the backing configuration resolved — stroke limit, rapid feedrate, home or tool change — and it is computed independently of the rows. Each reader builds the row list from the axis set whether or not that configuration resolved, and fills the value cells from an optional reference, so a missing configuration yields blank limit and home cells, a 0 rapid rate, and rows all the same. The two components read the answer differently, and this is the sharpest divergence between them. The axis-table panel discards present entirely. Its typed reader parses the flag; the panel assigns only the rows. Its second empty layer keys on the row count instead: with no axes it shows \"No machine axes yet — these rows are driven by the Machine Tool chain (MechBuilder). Attach a machine tool to edit per-axis values.\", and with axes it renders the table whatever the flag said. The tool-change panel reads present and, when it is false, shows \"No tool-change config on the active runner.\" What that costs: a runner that has axes but no stroke-limit, rapid-feedrate or home configuration renders a full, editable table of blank or zero cells, and every commit fails with a toast naming the missing dependency instead of the panel saying the table is absent. On the five shipped brand presets the state cannot arise, because the one object that supplies the axis set supplies all three configurations too. The reachable case is the mirror one, and it reaches the two panels differently: deleting the axis-type parameter row from Parameters (Native) empties the axis set, and the three axis-table leaves fall to the no-axes line while Tool-Change Position keeps its rows, because its reader falls back to the tool-change configuration's own axis keys when the axis set is empty. Rows recovered that way are reported as linear whatever they are. The tool-change flag itself is never false on a shipped preset: all five carry the tool-change configuration as a plain entry, so its empty line is reachable only on a hand-built or file-loaded runner. Above both layers sits the shared no-runner guard every leaf of the branch carries; it, and the commit, rollback and toast rules the four leaves share with the rest of the branch, are Editing Contract. Editing a Cell Numeric cells are the shared numeric field, so a value commits on blur or on Enter and never per keystroke — its full contract is Numeric Input. The Stays put checkbox commits on the click. Three details govern how these four leaves commit: The writes are per cell, not per row. Editing + Limit sends that side alone, and the endpoint leaves a side it was not sent unchanged. The branch's row-shaped editors do not agree on this: a tool-offset or work-coordinate edit resends the whole row, while Parameters (Native) writes one axis cell at a time as these four do. Clearing a cell writes nothing. An emptied field parses to null and the handler returns before the request, so the box is left blank on screen while the stored number stands, and the number returns when the panel is remounted by selecting another node and coming back. There is consequently no way to unset a stroke limit or a reference position from these panels; the only surface that removes one is the native leaf's whole-row delete. No cell is bounded. None of the four tables passes a minimum or a maximum to its fields, so a negative limit or a negative rapid rate is accepted and stored. The mechanism time is the one bounded field on the four leaves, at zero or above. What the Values Do When a Program Plays The stroke limits are checked at each played step against the chain's current machine pose while the session's stroke-limit check is on; a position past a configured limit is reported as a stroke-limit validation error anchored to that step, and pauses the player when pause-on-failure is set. The check walks a fixed axis vocabulary — X, Y and Z from the machine point, A, B and C from its orientation — so a limit stored against any other axis name is kept and shown here but never tested. Rapid-traverse timing has the same shape and the same six names: a G00 move is timed axis-by-axis at each axis' rate and takes the slowest, falling back to the same 20000 mm/min and 36000 deg/min defaults when no configuration answers. The reference positions reach further, but only at the start. The initializer that sets the machine pose at the first block writes every declared axis, reading each axis' stored reference and falling back to 0 for one that has none. The G28 reference return reads the same store through a narrower window: X, Y and Z for its linear stage, and A, B or C for its rotary stage — and a rotary letter only while the machine declares that axis rotary and a reference position is stored for it, an unconfigured one being reported as a validation error instead. So an axis outside the six canonical names still carries its stored reference into the pose at the first block, while its stroke limit, its rapid rate and its G28 return are all inert. Layout General Setup Control Tree — the left dock of /general-setup Controller Node Row Machine / Controller Group Row Machine Limits (Stroke) Node Row — equipment/controller/machine/limits Rapid Feedrates Node Row — equipment/controller/machine/rapid Home / G28 Reference Node Row — equipment/controller/machine/home Tool-Change Position Node Row — equipment/controller/machine/tool-change Editor Row — the panel of whichever node is selected Machine Limits (Stroke) / Rapid Feedrates / Home / G28 Reference Panel — one component, its role taken from the selected id's last segment Description Caption — \"Machine travel limits per axis (empty = no limit set). Motions beyond a limit raise a stroke-limit validation error.\", \"G00 rapid traverse rate per axis.\" or \"G28 first reference (home) machine coordinate per axis. Axes without a value are seeded to 0 when a machine tool attaches.\" Axis Table — dense, flat, bordered Header Row — Axis, then + Limit and − Limit, or Rapid Rate, or Home Position, then Unit Axis Row, one per axis Axis Name Label — bold, not editable Value Numeric Field, one per value column Unit Label — mm / deg, or mm/min / deg/min on Rapid Feedrates Footer Caption — \"Axis rows follow the Machine Tool chain; they cannot be added here.\" No-Axes Block — replaces the description, the table and the footer caption when the axis set is empty: a precision-manufacturing icon beside \"No machine axes yet — these rows are driven by the Machine Tool chain (MechBuilder). Attach a machine tool to edit per-axis values.\" Tool-Change Position Panel Tool-change mechanism time Numeric Field — suffixed s, minimum 0 Axis Table — dense, flat, bordered Header Row — Axis, Stays put, Position, Unit Axis Row, one per axis Axis Name Label — bold, not editable Stays put CheckBox Position Numeric Field — disabled while Stays put is ticked Unit Label — mm / deg Footer Caption — “Stays put” leaves the axis where it is during a tool change. No-Config Block — replaces the field, the table and the caption: \"No tool-change config on the active runner.\" Shared Empty State — replaces either panel's whole body while the snapshot reports no runner: \"No NC runner — load a project first.\" Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/components/controlTree/SoftNcAxisTablePanel.vue — the panel behind the first three leaves: the role taken from the node id's last segment, the value columns and description per role, the unit strings computed from the row's rotary flag, the row-count empty layer that discards the read's presence flag, and the per-cell commit that returns on a cleared field. wwwroot-src/src/components/controlTree/SoftNcToolChangePanel.vue — the tool-change panel: the mechanism-time field, the Stays put checkbox that clears the position and sends 0 on the way back, the disabled position cell, and the presence-flag empty layer. wwwroot-src/src/components/controlTree/SoftNcEmptyState.vue — the shared no-runner line both panels open with. wwwroot-src/src/components/widgets/NumericInput.vue — the numeric cell: commit on blur or Enter, and the empty-text-to-null parse the panels reject. wwwroot-src/src/components/controlTree/softNcItemTypes.ts — the four node ids, their labels and label keys, and the two item types that bind them to the two panels. wwwroot-src/src/api/softNcRunner.ts — the four readers and their setters: the row shapes, the presence flag both panels receive, the per-side stroke-limit payload, and the stay-or-position tool-change payload. wwwroot-src/src/composables/useSoftNcRunner.ts — the shared runner snapshot the first empty layer reads. wwwroot-src/src/i18n/en/softNc.ts — the four node labels, the three descriptions, the column headers, the two footer captions and the two empty-state lines quoted above. wwwroot-src/src/i18n/en/common.ts — the shared Axis and Unit column headers. wwwroot-src/src/components/controlTree/SoftNcNativeParamsPanel.vue — the neighbouring leaf that edits the same parameter rows by number: the per-cell axis writes, the grid columns unioned from the existing axis names, the delete that drops a whole row, and the Add / Set footer whose free-text axis field is what widens the axis-type row. Mech/SoftNcRunnerController.cs — the REST surface: the chain-driven axis helper every reader builds its rows from, the four readers with their independently computed presence flags, the four per-axis writers that name an axis but never declare one, the native per-axis-integer route that does, the tool-change fallback to the tool-change configuration's own axis keys, the NaN sentinel write, and the rotary lookup the rapid write re-derives server-side. HiAPI Engine HiMech/NcParsers/Dependencys/ControllerParameterTableBase.cs — the one object behind three of the four leaves: the axis set as the keys of the axis-type row, the reference-position, rapid-rate and stroke-limit accessors over the per-axis buckets, the fixed rapid defaults, and the rotary configuration helper the chain walk calls, which writes the axis type, the reference position and the rapid rate together with no guard on the two values. HiMech/NcParsers/Dependencys/IMachineAxisConfig.cs — the axis contract and the axis-type enum whose rotary and spindle members both make a row rotary. HiMech/NcParsers/Dependencys/IStrokeLimitConfig.cs — the limit accessors, and the check itself with its fixed X/Y/Z and A/B/C vocabulary and its validation report. HiMech/NcParsers/Dependencys/IRapidFeedrateConfig.cs — the linear and rotary rate accessors. HiMech/NcParsers/Dependencys/IHomeMcConfig.cs — the reference-position accessors. HiMech/NcParsers/Dependencys/IToolingMcConfig.cs — the tool-change contract: the NaN sentinel and the mechanism time. HiMech/NcParsers/Dependencys/Generic/ToolingMcConfig.cs — the sole implementation: the per-axis map, the preset default of X and Y staying and Z at 0, and the serialization that omits a zero mechanism time. HiMech/NcParsers/Dependencys/Fanuc/FanucParameterTable.cs, HiMech/NcParsers/Dependencys/Syntec/SyntecParameterTable.cs, HiMech/NcParsers/Dependencys/Siemens/SiemensMachineDataTable.cs, HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainParameterTable.cs — the parameter numbers in the table above and the three-axis default each brand opens on. HiMech/NcParsers/Dependencys/Fanuc/FanucParameterTableProxy.cs, HiMech/NcParsers/Dependencys/Syntec/SyntecParameterTableProxy.cs, HiMech/NcParsers/Dependencys/Siemens/SiemensMachineDataTableProxy.cs, HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainParameterTableProxy.cs — the placeholders the brand presets actually carry: each clones its three-axis seed into the project's own dependency list when that list holds none, and resolves to the project's table when it does. HiMech/NcParsers/SoftNcRunner.cs — the chain walk that stamps axis codes, hands a rotary axis to the unconditional rotary helper on a brand table, and fills a missing reference position; and the five brand presets that decide which parameter table and which tool-change configuration a brand carries. HiNc/MachiningProcs/LocalProjectService.cs — where the chain walk is triggered from, why the generic axis configuration is cleared first and a brand table is not, and the per-step stroke-limit check that reads the limits through the proxy-resolved list. HiMech/MachiningProcs/MachiningSession.cs — the play loop that runs that check once per step and pauses on failure. HiMech/NcParsers/Semantics/LinearMotionUtil.cs — rapid-traverse timing: per-axis rates, the slowest axis, and the same six axis names the stroke check uses. HiMech/NcParsers/Initializers/HomeMcInitializer.cs — the reference positions written for every declared axis at the first block. HiMech/NcParsers/LogicSyntaxs/ReferenceReturnSyntax.cs — the G28 return: the three linear names it resolves a final position for, the three rotary letters it tests against the declared axes, and the validation error a rotary letter the machine has not declared raises. HiMech/NcParsers/LogicSyntaxs/ToolChangeMotionSyntax.cs — the overlay: X, Y and Z plus the declared rotary axes, of which only the ones carrying a non-NaN position move. HiMech/NcParsers/Semantics/ToolChangeSemantic.cs — the tool-change step that carries the mechanism time as its duration. See Also Machine and Controller Plane — the plane these four leaves sit on, and which half of the project each of their values is stored in Brand Matrix — why all four are ungated, and which table each brand resolves them through Editing Contract — the fetch, commit, rollback and empty-layer rules these panels share with the rest of the branch, and where they are recorded as departing from them" + "summary": "Per-Axis Tables Four leaves of the Controller branch's machine plane are one table each, keyed on the machine's axes: Machine Limits (Stroke), Rapid Feedrates, Home / G28 Reference and Tool-Change Position. They live on the General Setup page at /general-setup under the Control-Tree ids equipment/controller/machine/limits, equipment/controller/machine/rapid, equipment/controller/machine/home and equipment/controller/machine/tool-change; none of them is gated by a snapshot flag, so every brand grows all four. Two components serve them — one panel behind the first three, discriminating on the id's last segment, and a second behind Tool-Change Position — and the differences between those two components are what this page is mostly about. Important Anatomy makes no claim that any id named here is stable across versions. The migration hop that keeps an older ?tree= value resolving is described in Tree Ids and Routes. Where the Rows Come From Every row on all four leaves is one axis of the runner's machine-axis configuration, read as AxisNames through the proxy-resolved dependency list. On all five brand presets that configuration is the brand parameter table itself: ControllerParameterTableBase declares IMachineAxisConfig alongside IStrokeLimitConfig, IRapidFeedrateConfig and IHomeMcConfig, so one object supplies both the row set and three of the four value sets. Which brand carries which table is Brand Matrix. The table's axis set is a single parameter row: the per-axis integer bucket under the brand's axis-type number, whose keys are the axis names and whose values are the AxisType — linear, rotary or spindle. Adding an axis therefore means adding a key to that one row, and exactly one surface on this branch reaches it. Neither panel here has an add-row or delete-row control. Both render a fixed header over one per axis and nothing else. The four per-axis routes behind them write one axis' value and nothing more: the caller names an axis, and the endpoint writes into the stroke-limit, rapid-rate, home or tool-change store under that name. None of them touches the axis-type row, so none of them changes which rows the next read returns. Parameters (Native) edits the axis-type row itself, and is the one place on the branch that widens the axis set: its Add / Set footer takes a free-text axis name, so the section Axis (integer), the brand's axis-type number, a name and a value of 0 linear, 1 rotary or 2 spindle adds an axis, which then appears on all four leaves. Its grid cannot — the per-axis columns are the union of the axis names already present, so a cell can be written only for an axis that exists — and its delete button removes a whole parameter row, every axis cell of one number at once, rather than one axis. Axes arrive from the machining chain. Whenever the active runner suit or the chain changes, the project service re-binds the suit and calls ConfigureByMachiningChain(API), which walks the chain's axis codes and their transformers: a rotating transformer writes the axis as rotary — and, on a brand parameter table, writes its reference position as 0 deg and its rapid rate as 36000 deg/min — any other transformer writes the axis as linear, and every chain axis whose reference position is still unset is seeded to 0. That is the mechanism behind the description above the Home / G28 Reference table, \"Axes without a value are seeded to 0 when a machine tool attaches.\" The stamp adds rows and never removes one. The generic axis configuration carried by the CSV and CL runner suits is cleared before the walk; a brand parameter table is not, and keeps every axis it already held. An axis dropped from the chain therefore keeps its rows on all four leaves, and no surface removes it individually. The three-axis default table every brand preset seeds is why a project with no machine tool attached still shows X, Y and Z. Two values are the exception, and only on a rotary chain axis of a brand table: that branch of the walk is unconditional, so it rewrites the axis' reference position to 0 deg and its rapid rate to 36000 deg/min whether or not one was stored. The walk re-runs on every suit re-bind, so an edited Home Position or Rapid Rate on a rotary axis is back at those two numbers once the chain or the active suit changes. A linear axis' values, and every value on an axis the chain does not carry, are left untouched. The caption below the first three tables records the row half of that: \"Axis rows follow the Machine Tool chain; they cannot be added here.\" Where the chain itself is edited is Machine Tool. The Value Columns Each leaf renders the axis column, its own value column or columns, and a unit column. Leaf Value columns Empty cell means Machine Limits (Stroke) + Limit, − Limit no limit set for that axis and side Rapid Feedrates Rapid Rate never empty — see below Home / G28 Reference Home Position no reference position stored Tool-Change Position Stays put, Position see Stays Put The stroke-limit and home readers return an optional value and hand null straight through, so an unset cell is blank. The rapid reader does not: it returns the stored rate, or — when the axis has no rate of its own — the base class's fixed default, 20000 mm/min for a linear axis and 36000 deg/min for a rotary one. So a Rapid Rate cell is always a number, and a number in it is not proof that the axis has a row. A table cloned fresh from a brand's preset seed decides what the three leaves then open on, and all four brand defaults agree in shape: a linear X, Y and Z, a reference position of 0 on each, and a rapid rate per axis — and no stroke limit at all. Machine Limits therefore opens entirely blank on every brand, while Rapid Feedrates and Home / G28 Reference open populated. Whether a brand switch clones a fresh table or keeps the project's own is Machine and Controller Plane. The Unit Column The unit column's header is the translated label Unit; its cell text is not translated and does not come from the server. Each panel computes it in the browser from the row's rotary flag, using literal strings: Leaf Linear axis Rotary axis Machine Limits (Stroke) mm deg Rapid Feedrates mm/min deg/min Home / G28 Reference mm deg Tool-Change Position mm deg The flag itself is server-side, and it is the axis type rather than a separate setting: an axis stored as rotary or as spindle reports rotary, so a spindle-mode axis is labelled in degrees. The unit is a label, not a conversion. The base class writes a linear and a rotary rapid rate into the same per-axis cell and reads them back through the same lookup, differing only in the default returned when the cell is absent; the stroke-limit and home accessors are equally unit-blind. Nothing on these three leaves converts, so their numbers are the raw stored numbers, and the same values appear in Parameters (Native) under the brand's own parameter number: Role Fanuc, Mazak Syntec Siemens Heidenhain Axis type — the row set 1006 1006 30300 400 Reference position (home) 1240 1240 34010 410 Positive stroke limit 1300 1300 36100 420 Negative stroke limit 1320 1320 36110 430 Rapid rate 1420 1420 32000 1010 Mazak shares the Fanuc column because the Mazak preset carries the Fanuc parameter-table proxy; Siemens spends its rapid-rate role on the max-axis-velocity machine datum. Tool-Change Position is the exception on both counts: its values live on ToolingMcConfig, a plain runner-owned dependency rather than a parameter table, so they appear in no native form at all and a brand apply returns them to the preset defaults — see Machine and Controller Plane. Stays Put, and the Sentinel Behind It IToolingMcConfig stores one number per axis, and the contract gives one number a second meaning: NaN means the axis stays where it is during a tool change. The read splits that back into two fields — a stored NaN becomes the Stays put flag with no position, anything else becomes the position — and the panel renders the flag as a checkbox and the position as a numeric field disabled while the box is ticked. Writing goes the same way round. Ticking the box sends the stay flag and the reader writes NaN. Unticking it sends a position, and because the panel clears its own cell when the box is ticked, the position it sends on the way back is 0 — so unticking parks the axis at machine zero rather than restoring what was there before. A third state exists and is not the sentinel: an axis with no entry in the map at all. Its box is unticked and its Position cell blank, because the reader reports no position and no stay. At run time the two are indistinguishable — the tool-change motion overlays only those axes that carry a number and are not NaN onto the current pose, and leaves every other axis alone. So the machine stays put either way; the tick mark distinguishes only how that was recorded. The overlay has a vocabulary of its own, narrower than the table. X, Y and Z always take part; every other axis takes part only while the machine declares it rotary. A linear axis outside those three is stored, shown and editable on this leaf, and never moved. The preset default is exactly this mixture: X and Y carry the sentinel, Z carries 0, and no rotary axis carries an entry, which is why a rotary axis usually opens unticked and blank. Above the table sits Tool-change mechanism time, a single field in seconds bound to ToolingTime. It becomes the duration of the tool change step the runner emits, and it is the changer mechanism alone — the axis travel to and from the position is timed separately from the positions in the table. It is 0 on every brand preset, and it is written into the runner file only when non-zero. One Reader, Two Readings of Its Presence Flag All four reads answer the same shape: a present flag plus one row per axis. present reports whether the backing configuration resolved — stroke limit, rapid feedrate, home or tool change — and it is computed independently of the rows. Each reader builds the row list from the axis set whether or not that configuration resolved, and fills the value cells from an optional reference, so a missing configuration yields blank limit and home cells, a 0 rapid rate, and rows all the same. The two components read the answer differently, and this is the sharpest divergence between them. The axis-table panel discards present entirely. Its typed reader parses the flag; the panel assigns only the rows. Its second empty layer keys on the row count instead: with no axes it shows \"No machine axes yet — these rows are driven by the Machine Tool chain (MechBuilder). Attach a machine tool to edit per-axis values.\", and with axes it renders the table whatever the flag said. The tool-change panel reads present and, when it is false, shows \"No tool-change config on the active runner.\" What that costs: a runner that has axes but no stroke-limit, rapid-feedrate or home configuration renders a full, editable table of blank or zero cells, and every commit fails with a toast naming the missing dependency instead of the panel saying the table is absent. On the five shipped brand presets the state cannot arise, because the one object that supplies the axis set supplies all three configurations too. The reachable case is the mirror one, and it reaches the two panels differently: deleting the axis-type parameter row from Parameters (Native) empties the axis set, and the three axis-table leaves fall to the no-axes line while Tool-Change Position keeps its rows, because its reader falls back to the tool-change configuration's own axis keys when the axis set is empty. Rows recovered that way are reported as linear whatever they are. The tool-change flag itself is never false on a shipped preset: all five carry the tool-change configuration as a plain entry, so its empty line is reachable only on a hand-built or file-loaded runner. Above both layers sits the shared no-runner guard every leaf of the branch carries; it, and the commit, rollback and toast rules the four leaves share with the rest of the branch, are Editing Contract. Editing a Cell Numeric cells are the shared numeric field, so a value commits on blur or on Enter and never per keystroke — its full contract is Numeric Input. The Stays put checkbox commits on the click. Three details govern how these four leaves commit: The writes are per cell, not per row. Editing + Limit sends that side alone, and the endpoint leaves a side it was not sent unchanged. The branch's row-shaped editors do not agree on this: a tool-offset or work-coordinate edit resends the whole row, while Parameters (Native) writes one axis cell at a time as these four do. Clearing a cell writes nothing. An emptied field parses to null and the handler returns before the request, so the box is left blank on screen while the stored number stands, and the number returns when the panel is remounted by selecting another node and coming back. There is consequently no way to unset a stroke limit or a reference position from these panels; the only surface that removes one is the native leaf's whole-row delete. No cell is bounded. None of the four tables passes a minimum or a maximum to its fields, so a negative limit or a negative rapid rate is accepted and stored. The mechanism time is the one bounded field on the four leaves, at zero or above. What the Values Do When a Program Plays The stroke limits are checked at each played step against the chain's current machine pose while the session's stroke-limit check is on; a position past a configured limit is reported as a stroke-limit validation error anchored to that step, and pauses the player when pause-on-failure is set. The comparison carries a small tolerance (Tolerance), so an axis parked exactly on its limit is not reported. The rotary limits also steer the tilt solves: when a G53.1, G68.2, CYCLE800, PLANE SPATIAL or LN posture has its nearest rotary solution outside the travel, the solve takes the admissible branch nearest the entry instead of commanding a posture the machine cannot take. A project that declared its travel only in the legacy machine-limits boxes gets those ends copied into this table on load, for the axes carrying no end here. The check walks a fixed axis vocabulary — X, Y and Z from the machine point, A, B and C from its orientation — so a limit stored against any other axis name is kept and shown here but never tested. Rapid-traverse timing has the same shape and the same six names: a G00 move is timed axis-by-axis at each axis' rate and takes the slowest, falling back to the same 20000 mm/min and 36000 deg/min defaults when no configuration answers. The reference positions reach further, but only at the start. The initializer that sets the machine pose at the first block writes every declared axis, reading each axis' stored reference and falling back to 0 for one that has none. The G28 reference return reads the same store through a narrower window: X, Y and Z for its linear stage, and A, B or C for its rotary stage — and a rotary letter only while the machine declares that axis rotary and a reference position is stored for it, an unconfigured one being reported as a validation error instead. So an axis outside the six canonical names still carries its stored reference into the pose at the first block, while its stroke limit, its rapid rate and its G28 return are all inert. Layout General Setup Control Tree — the left dock of /general-setup Controller Node Row Machine / Controller Group Row Machine Limits (Stroke) Node Row — equipment/controller/machine/limits Rapid Feedrates Node Row — equipment/controller/machine/rapid Home / G28 Reference Node Row — equipment/controller/machine/home Tool-Change Position Node Row — equipment/controller/machine/tool-change Editor Row — the panel of whichever node is selected Machine Limits (Stroke) / Rapid Feedrates / Home / G28 Reference Panel — one component, its role taken from the selected id's last segment Description Caption — \"Machine travel limits per axis (empty = no limit set). Motions beyond a limit raise a stroke-limit validation error.\", \"G00 rapid traverse rate per axis.\" or \"G28 first reference (home) machine coordinate per axis. Axes without a value are seeded to 0 when a machine tool attaches.\" Axis Table — dense, flat, bordered Header Row — Axis, then + Limit and − Limit, or Rapid Rate, or Home Position, then Unit Axis Row, one per axis Axis Name Label — bold, not editable Value Numeric Field, one per value column Unit Label — mm / deg, or mm/min / deg/min on Rapid Feedrates Footer Caption — \"Axis rows follow the Machine Tool chain; they cannot be added here.\" No-Axes Block — replaces the description, the table and the footer caption when the axis set is empty: a precision-manufacturing icon beside \"No machine axes yet — these rows are driven by the Machine Tool chain (MechBuilder). Attach a machine tool to edit per-axis values.\" Tool-Change Position Panel Tool-change mechanism time Numeric Field — suffixed s, minimum 0 Axis Table — dense, flat, bordered Header Row — Axis, Stays put, Position, Unit Axis Row, one per axis Axis Name Label — bold, not editable Stays put CheckBox Position Numeric Field — disabled while Stays put is ticked Unit Label — mm / deg Footer Caption — “Stays put” leaves the axis where it is during a tool change. No-Config Block — replaces the field, the table and the caption: \"No tool-change config on the active runner.\" Shared Empty State — replaces either panel's whole body while the snapshot reports no runner: \"No NC runner — load a project first.\" Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/components/controlTree/SoftNcAxisTablePanel.vue — the panel behind the first three leaves: the role taken from the node id's last segment, the value columns and description per role, the unit strings computed from the row's rotary flag, the row-count empty layer that discards the read's presence flag, and the per-cell commit that returns on a cleared field. wwwroot-src/src/components/controlTree/SoftNcToolChangePanel.vue — the tool-change panel: the mechanism-time field, the Stays put checkbox that clears the position and sends 0 on the way back, the disabled position cell, and the presence-flag empty layer. wwwroot-src/src/components/controlTree/SoftNcEmptyState.vue — the shared no-runner line both panels open with. wwwroot-src/src/components/widgets/NumericInput.vue — the numeric cell: commit on blur or Enter, and the empty-text-to-null parse the panels reject. wwwroot-src/src/components/controlTree/softNcItemTypes.ts — the four node ids, their labels and label keys, and the two item types that bind them to the two panels. wwwroot-src/src/api/softNcRunner.ts — the four readers and their setters: the row shapes, the presence flag both panels receive, the per-side stroke-limit payload, and the stay-or-position tool-change payload. wwwroot-src/src/composables/useSoftNcRunner.ts — the shared runner snapshot the first empty layer reads. wwwroot-src/src/i18n/en/softNc.ts — the four node labels, the three descriptions, the column headers, the two footer captions and the two empty-state lines quoted above. wwwroot-src/src/i18n/en/common.ts — the shared Axis and Unit column headers. wwwroot-src/src/components/controlTree/SoftNcNativeParamsPanel.vue — the neighbouring leaf that edits the same parameter rows by number: the per-cell axis writes, the grid columns unioned from the existing axis names, the delete that drops a whole row, and the Add / Set footer whose free-text axis field is what widens the axis-type row. Mech/SoftNcRunnerController.cs — the REST surface: the chain-driven axis helper every reader builds its rows from, the four readers with their independently computed presence flags, the four per-axis writers that name an axis but never declare one, the native per-axis-integer route that does, the tool-change fallback to the tool-change configuration's own axis keys, the NaN sentinel write, and the rotary lookup the rapid write re-derives server-side. HiAPI Engine HiMech/NcParsers/Dependencys/ControllerParameterTableBase.cs — the one object behind three of the four leaves: the axis set as the keys of the axis-type row, the reference-position, rapid-rate and stroke-limit accessors over the per-axis buckets, the fixed rapid defaults, and the rotary configuration helper the chain walk calls, which writes the axis type, the reference position and the rapid rate together with no guard on the two values. HiMech/NcParsers/Dependencys/IMachineAxisConfig.cs — the axis contract and the axis-type enum whose rotary and spindle members both make a row rotary. HiMech/NcParsers/Dependencys/IStrokeLimitConfig.cs — the limit accessors, and the check itself with its fixed X/Y/Z and A/B/C vocabulary and its validation report. HiMech/NcParsers/Dependencys/IRapidFeedrateConfig.cs — the linear and rotary rate accessors. HiMech/NcParsers/Dependencys/IHomeMcConfig.cs — the reference-position accessors. HiMech/NcParsers/Dependencys/IToolingMcConfig.cs — the tool-change contract: the NaN sentinel and the mechanism time. HiMech/NcParsers/Dependencys/Generic/ToolingMcConfig.cs — the sole implementation: the per-axis map, the preset default of X and Y staying and Z at 0, and the serialization that omits a zero mechanism time. HiMech/NcParsers/Dependencys/Fanuc/FanucParameterTable.cs, HiMech/NcParsers/Dependencys/Syntec/SyntecParameterTable.cs, HiMech/NcParsers/Dependencys/Siemens/SiemensMachineDataTable.cs, HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainParameterTable.cs — the parameter numbers in the table above and the three-axis default each brand opens on. HiMech/NcParsers/Dependencys/Fanuc/FanucParameterTableProxy.cs, HiMech/NcParsers/Dependencys/Syntec/SyntecParameterTableProxy.cs, HiMech/NcParsers/Dependencys/Siemens/SiemensMachineDataTableProxy.cs, HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainParameterTableProxy.cs — the placeholders the brand presets actually carry: each clones its three-axis seed into the project's own dependency list when that list holds none, and resolves to the project's table when it does. HiMech/NcParsers/SoftNcRunner.cs — the chain walk that stamps axis codes, hands a rotary axis to the unconditional rotary helper on a brand table, and fills a missing reference position; and the five brand presets that decide which parameter table and which tool-change configuration a brand carries. HiNc/MachiningProcs/LocalProjectService.cs — where the chain walk is triggered from, why the generic axis configuration is cleared first and a brand table is not, and the per-step stroke-limit check that reads the limits through the proxy-resolved list. HiMech/MachiningProcs/MachiningSession.cs — the play loop that runs that check once per step and pauses on failure. HiMech/NcParsers/Semantics/LinearMotionUtil.cs — rapid-traverse timing: per-axis rates, the slowest axis, and the same six axis names the stroke check uses. HiMech/NcParsers/Initializers/HomeMcInitializer.cs — the reference positions written for every declared axis at the first block. HiMech/NcParsers/LogicSyntaxs/ReferenceReturnSyntax.cs — the G28 return: the three linear names it resolves a final position for, the three rotary letters it tests against the declared axes, and the validation error a rotary letter the machine has not declared raises. HiMech/NcParsers/LogicSyntaxs/ToolChangeMotionSyntax.cs — the overlay: X, Y and Z plus the declared rotary axes, of which only the ones carrying a non-NaN position move. HiMech/NcParsers/Semantics/ToolChangeSemantic.cs — the tool-change step that carries the mechanism time as its duration. See Also Machine and Controller Plane — the plane these four leaves sit on, and which half of the project each of their values is stored in Brand Matrix — why all four are ungated, and which table each brand resolves them through Editing Contract — the fetch, commit, rollback and empty-layer rules these panels share with the rest of the branch, and where they are recorded as departing from them" }, "anatomy/general-setup/controller/machine/program-reading.html": { "href": "anatomy/general-setup/controller/machine/program-reading.html", @@ -247,7 +247,7 @@ "anatomy/general-setup/index.html": { "href": "anatomy/general-setup/index.html", "title": "General Setup Page | HiAPI-C# 2025", - "summary": "General Setup Page General Setup is the equipment page at /general-setup. It is one of the two Control-Tree pages: the left dock names every piece of equipment in the project and edits whatever is selected, and the canvas on the right shows all of it at once. Selection rides the URL as ?tree=equipment/…, so any branch of it is a link. The tree's one root is a pure Group stem at equipment, selectable in its own right: it renders an orientation panel listing the equipment items beneath it. The page renders three columns in nested splitters — the Control-Tree dock, the content column, and the equipment canvas. The dock carries two stacked rows: the tree above, and below it the editor panel of whichever node is selected. The content column holds a second, wider view of the same selection, mounted only for the item types that register one — on this page the spindle branch and nothing else — while every other selection leaves it showing its empty hint. Column widths are device-local, and the dock aligns with the Execution page's so the two tree pages feel like one application. Ordered as the page builds its equipment children. Pages Machine Tool — The kinematic chain the whole scene hangs from, and the standalone route that loads and previews it Spindle Capability — The spindle envelope: thermal condition, gear shift, dry run, power and torque Background / Coolant — The two scene branches that are not machine parts: the backdrop and the coolant model Fixture — What holds the workpiece, its geometry and the two anchors that place it Workpiece — Raw and target geometry, the anchors that locate them, the mesh, and the material Controller — The SoftNcRunner-native controller branch: its two planes, the brand matrix behind which nodes appear at all, and the contract every leaf edits by Hidden Controller Branches — The two runner-suit nodes a fresh installation never builds, the device-local checkboxes that reveal them, and the second kind of invisibility a link cannot undo A bookmark to the retired /controller address — the Legacy Controller page, which edited the deprecating HardNcEnv model rather than the runner — now redirects here and lands on the Controller branch. See Also Execution Page — the other Control-Tree page, and the one this was split out of Tool House Page — the third equipment surface, a tab page rather than a tree page Main Panel — the shell whose Page menu reaches this route Control Tree — the engine behind this page's tree: how a branch is built, rebuilt and selected Controller Branch — the branch this page hosts whose node set changes with the controller brand Hidden Controller Branches — the two equipment nodes this page withholds until a preference or a link asks for them Legacy Controller Model (HardNcEnv) — the deprecating HardNcEnv model the project still carries beside the runner, what it shares with the Controller branch, and the three settings that retire with it rather than gaining an editor in the equipment tree" + "summary": "General Setup Page General Setup is the equipment page at /general-setup. It is one of the two Control-Tree pages: the left dock names every piece of equipment in the project and edits whatever is selected, and the canvas on the right shows all of it at once. Selection rides the URL as ?tree=equipment/…, so any branch of it is a link. The tree's one root is a pure Group stem at equipment, selectable in its own right: it renders an orientation panel listing the equipment items beneath it. The page renders three columns in nested splitters — the Control-Tree dock, the content column, and the equipment canvas. The dock carries two stacked rows: the tree above, and below it the editor panel of whichever node is selected. The content column holds a second, wider view of the same selection, mounted only for the item types that register one — on this page the spindle branch and nothing else — while every other selection leaves it showing its empty hint. Column widths are device-local, and the dock aligns with the Execution page's so the two tree pages feel like one application. Ordered as the page builds its equipment children. Pages Machine Tool — The kinematic chain the whole scene hangs from, and the standalone route that loads and previews it Spindle Capability — The spindle envelope: thermal condition, gear shift, dry run, power and torque Environment: Ambient Temperature / Coolant — The Environment root's two thermal leaves, the ones that are not machine parts: the ambient (shop) temperature the thermal model starts from, and the coolant model Fixture — What holds the workpiece, its geometry and the two anchors that place it Workpiece — Raw and target geometry, the anchors that locate them, the mesh, and the material Controller — The SoftNcRunner-native controller branch: its two planes, the brand matrix behind which nodes appear at all, and the contract every leaf edits by Hidden Controller Branches — The two runner-suit nodes a fresh installation never builds, the device-local checkboxes that reveal them, and the second kind of invisibility a link cannot undo A bookmark to the retired /controller address — the Legacy Controller page, which edited the deprecating HardNcEnv model rather than the runner — now redirects here and lands on the Controller branch. See Also Execution Page — the other Control-Tree page, and the one this was split out of Tool House Page — the third equipment surface, a tab page rather than a tree page Main Panel — the shell whose Page menu reaches this route Control Tree — the engine behind this page's tree: how a branch is built, rebuilt and selected Controller Branch — the branch this page hosts whose node set changes with the controller brand Hidden Controller Branches — the two equipment nodes this page withholds until a preference or a link asks for them Legacy Controller Model (HardNcEnv) — the deprecating HardNcEnv model the project still carries beside the runner, what it shares with the Controller branch, and the three settings that retire with it rather than gaining an editor in the equipment tree" }, "anatomy/general-setup/machine-tool.html": { "href": "anatomy/general-setup/machine-tool.html", @@ -257,7 +257,7 @@ "anatomy/general-setup/spindle-capability.html": { "href": "anatomy/general-setup/spindle-capability.html", "title": "Spindle Capability | HiAPI-C# 2025", - "summary": "Spindle Capability The Spindle Capability editor is the equipment/spindle branch of the General Setup page's Control Tree (/general-setup?tree=equipment/spindle), the equipment child after Machine Tool. Two older paths redirect onto it: /spindle-capability/:tab?, whose tab segment maps straight onto one of the branch's five children, and /equipment/spindle. The menu bar carries no entry of its own for it — the Page menu reaches General Setup, and the tree reaches the branch. It edits SpindleCapability on the project's authored equipment face, SetupEquipment, reached as SetupEquipment. It exposes the metadata (name, note), the thermal scalars (energy efficiency, working-temperature ceiling), the gear-shift spindle speed, the two dry-run coefficients, and the power / torque contour lists. Key Model: SpindleCapability Assistant Model: SetupEquipment — owns the capability as SpindleCapability and its optional side-file reference SpindleCapabilityFile. MachiningProject — carries that face across the .hincproj save. Layout The branch is one root plus five children, six selectable nodes in all. Each node's editor occupies the dock's PRIMARY row, and all six — the root included — register the same CONTENT-column view, the two contour charts, so the charts stay mounted while the operator walks the branch. Control Tree Branch Spindle Capability Root Panel — equipment/spindle, item type SpindleCapabilityRoot Object Management Menu Button — Load / Save As / Copy / Paste / XML over file extension .SpindleCapability, load type Hi.Milling.SpindleCapability, HiMech, rel file SpindleCapability.xml, based at the project directory. This is the whole file surface of the editor. Caption — the capability's name, or a “no capability” note. Empty state, while nothing is attached: an hourglass, a “not attached to project” line and a hint pointing at the ⋮ menu's Load entry. Name TextField — Name. Note TextField — Note. equipment/spindle/thermal — “Thermal / Energy”, item type SpindleScalars Energy Efficiency NumberField — EnergyEfficiency, clamped to 0 – 1. Working Temperature Upper Boundary NumberField (°C) — WorkingTemperatureUpperBoundary_C. equipment/spindle/gear-shift — “Gear Shift”, item type SpindleScalars Has-Gear-Shift CheckBox — flips GearShiftSpindleSpeed_rpm between null (no mechanism) and 0 (mechanism present; the operator dials in the speed). Gear Shift Spindle Speed NumberField (rpm) — always rendered, disabled until the checkbox is on. equipment/spindle/dry-run — “Dry-Run Coefficients”, item type SpindleScalars Friction Power Coefficient NumberField (mW/rpm) — DryRunFrictionPowerCoefficient_mWdrpm. Windage Power Coefficient NumberField (pW/rpm³) — DryRunWindagePowerCoefficient_pWdrpm3. equipment/spindle/power — “Power Contours”, item type SpindleContour Count line and an Add button. Contour Selector — a select over the contour list, each entry labelled by its workable duration (n min, or Continuous for the infinite one). Edit-duration Button — opens the modal below. Delete Button — confirms, then removes the selected contour. Disabled at one remaining contour. Points Table — the selected contour's points, one row per point: a spindle-speed cell (rpm, min: 0), a value cell, an insert-next button that clones the row, and a double-click remove that is disabled at one remaining point. A cell edit replaces the whole point list server-side. Empty state, when the axis has no contour yet. Edit-duration Modal Continuous (∞) CheckBox — disabled when another contour already holds the continuous key. Workable Duration NumberField (min), shown while Continuous is off, min: 0. Save rejects a non-positive duration and is a no-op when the key is unchanged. equipment/spindle/torque — “Torque Contours”, item type SpindleContour, the same shape over the torque list. Shared content view, registered by the root and by all five children: the two contour charts in the General Setup page's CONTENT column. Power chart and Torque chart, each with a chip legend — one chip per contour, showing its duration and, on hover, its point count. Clicking a chip selects the contour the PRIMARY-row editor edits. A vertical marker line at the gear-shift spindle speed, while one is set. Its own not-attached empty state, mirroring the root panel's. Behavior Rpm ↔ cycles/s conversion lives server-side. SpindleCapability stores spindle speed in cycles/s (Hz); the controller converts to rpm in its DTOs and back on write. The frontend only ever sees rpm. Nullable gear shift. The Has-Gear-Shift checkbox writes 0 when checked and null when cleared, which is how the model distinguishes “mechanism present, speed not yet dialled in” from “no gear-shift mechanism”. One state, thin views throughout. Every panel on the branch — root, the three scalar sections, the two contour sections and the charts — reads and writes one module-singleton composable. A point edit therefore redraws the chart in the same tick, and a legend click moves the editor. The composable installs a single project-change watch that reloads on open and clears on close. No cache chain. These scalars feed the cutting-force and thermal physics, not the setup canvas, so the branch's afterChange does nothing — unlike the geometry branches, nothing here clears a geometry cache. Add Contour. The prompt is pre-filled with 60; a blank entry means continuous (∞). A duration already present is refused, a second continuous contour included. The new contour is seeded from the currently selected contour, falling back to the first in the list, and to a built-in default curve when the axis is empty — so the operator rarely draws from scratch. Project-scoped, and forwarded to the run. The capability lives on the authored equipment face and is persisted with the .hincproj save; setting SpindleCapabilityFile externalizes it to a side-file instead. The runtime equipment face holds the same object by reference, so a scalar or point edit is visible to a run immediately; a replacement (Load, Paste, XML Apply) re-stamps that reference through the project service's ForwardSetupEnvironmentToExecution. Load / Paste / XML-Apply only swap the IndexService entry. The root panel then installs the result onto the equipment through the controller's update, and reloads the snapshot and the key. The controller's initialize indexes a blank placeholder when nothing is attached yet, which is what keeps the ⋮ menu usable — and Load reachable — on a project with no capability. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/components/controlTree/useControlTreeHost.ts — builds the equipment/spindle root (item type SpindleCapabilityRoot) and its five children: thermal, gear-shift and dry-run as SpindleScalars, power and torque as SpindleContour. wwwroot-src/src/components/controlTree/itemTypes.ts — registers those three item types and gives all of them the same CONTENT-column view. wwwroot-src/src/components/controlTree/SpindleCapabilityPanel.vue — the branch root panel: the Object Management button, the name caption, the not-attached empty state, and the Name / Note fields. wwwroot-src/src/components/controlTree/SpindleScalarsPanel.vue — one scalar section per role path: thermal, gear-shift (checkbox plus the rpm field, disabled while the value is null) and dry-run. wwwroot-src/src/components/controlTree/SpindleContourPanel.vue — the power / torque child: the count line, Add, the contour selector, the edit-duration modal and the delete button, hosting the point editor. wwwroot-src/src/components/spindle/SpindleContourEditor.vue — the selected contour's numeric points table; its own header is hidden when the tree panel drives it. wwwroot-src/src/components/spindle/SpindleContoursPanel.vue — the CONTENT-column view every spindle item registers: both charts. wwwroot-src/src/components/spindle/SpindleContoursChart.vue — one plotted chart with the clickable chip legend that selects the contour the editor edits, plus the gear-shift marker line. wwwroot-src/src/components/controlTree/ContentSlavePanel.vue — the General Setup page's CONTENT column, which mounts whichever content panel the selection's item type registers; it deliberately leaves that component unkeyed so the charts survive a move between the branch's six nodes. wwwroot-src/src/composables/useSpindleCapability.ts — the module-singleton state and every mutation on the branch: the scalar handlers, add / remove / rename contour, the point updates and the object-management install hooks. wwwroot-src/src/components/widgets/ObjectManagementMenuButton.vue — the reused ⋮ menu carrying Load / Save As / Copy / Paste / XML for the .SpindleCapability file surface. wwwroot-src/src/api/spindleCapability.ts — typed client for /api/mech/spindle-capability/*. wwwroot-src/src/router/routes.ts — the spindle-capability/:tab? redirect (the tab mapped onto the branch child id) and the equipment/spindle redirect, both landing on general-setup?tree=…. wwwroot-src/src/router/treeRoutes.ts — defines the tab segments that redirect accepts: thermal, gear-shift, dry-run, power, torque. Mech/SpindleCapabilityController.cs — REST surface at /api/mech/spindle-capability over the authored equipment face's capability: GET / — flat snapshot: metadata plus the contour keys of each axis. GET /power-contours, GET /torque-contours — per-axis contour lists with their points. PUT /name | /note | /energy-efficiency | /working-temperature-upper-boundary-c | /gear-shift-spindle-speed-rpm | /dry-run-friction-power-coefficient-mwdrpm | /dry-run-windage-power-coefficient-pwdrpm3 — one scalar each. POST /power-contours | /torque-contours — add one contour. DELETE /power-contours/{key} | /torque-contours/{key} — remove one contour ({key} accepts numeric strings and \"inf\" / \"infinity\"). PUT /power-contours/{key}/points | /torque-contours/{key}/points — replace one contour's points; this is what backs per-point editing. PUT /power-contours/{key}/key | /torque-contours/{key}/key — rename a contour's workable-duration key, refusing a key that already exists; this is what backs the edit-duration modal. GET /xml — serialise to XML text. POST /load, POST /load-file, POST /reload — install from XML text, from a file under a named root, or from the file already stamped on the equipment. PUT /capability-file — set the side-file reference without reloading. POST /initialize, POST /update — index the capability for the Object Management button, and install the swapped-in object back onto the equipment. HiAPI Engine HiMech/Milling/SpindleCapability.cs — the model: EnergyEfficiency, WorkingTemperatureUpperBoundary_K with its _C accessor, the nullable GearShiftSpindleSpeed_cycleds with its _rpm convenience property, the two dry-run coefficients and the power / torque contour dictionaries keyed by workable duration. HiMech/Machining/MachiningEquipmentUtils/SetupEquipment.cs — the authored equipment face that owns the capability and its file reference and serializes them, inline or as a side-file reference. See Also Mechanism Builder Page — same file-level IO pattern (Load / Reload / Save As) but user-scoped rather than project-scoped. Background / Coolant — sibling branch of the same Control Tree, editing the same authored equipment face. Spindle Capability — what the model represents physically and how the per-step ratios come out of it." + "summary": "Spindle Capability The Spindle Capability editor is the equipment/spindle branch of the General Setup page's Control Tree (/general-setup?tree=equipment/spindle), the equipment child after Machine Tool. Two older paths redirect onto it: /spindle-capability/:tab?, whose tab segment maps straight onto one of the branch's five children, and /equipment/spindle. The menu bar carries no entry of its own for it — the Page menu reaches General Setup, and the tree reaches the branch. It edits SpindleCapability on the project's authored equipment face, SetupEquipment, reached as SetupEquipment. It exposes the metadata (name, note), the thermal scalars (energy efficiency, working-temperature ceiling), the gear-shift spindle speed, the two dry-run coefficients, and the power / torque contour lists. Key Model: SpindleCapability Assistant Model: SetupEquipment — owns the capability as SpindleCapability and its optional side-file reference SpindleCapabilityFile. MachiningProject — carries that face across the .hincproj save. Layout The branch is one root plus five children, six selectable nodes in all. Each node's editor occupies the dock's PRIMARY row, and all six — the root included — register the same CONTENT-column view, the two contour charts, so the charts stay mounted while the operator walks the branch. Control Tree Branch Spindle Capability Root Panel — equipment/spindle, item type SpindleCapabilityRoot Object Management Menu Button — Load / Save As / Copy / Paste / XML over file extension .SpindleCapability, load type Hi.Milling.SpindleCapability, HiMech, rel file SpindleCapability.xml, based at the project directory. This is the whole file surface of the editor. Caption — the capability's name, or a “no capability” note. Empty state, while nothing is attached: an hourglass, a “not attached to project” line and a hint pointing at the ⋮ menu's Load entry. Name TextField — Name. Note TextField — Note. equipment/spindle/thermal — “Thermal / Energy”, item type SpindleScalars Energy Efficiency NumberField — EnergyEfficiency, clamped to 0 – 1. Working Temperature Upper Boundary NumberField (°C) — WorkingTemperatureUpperBoundary_C. equipment/spindle/gear-shift — “Gear Shift”, item type SpindleScalars Has-Gear-Shift CheckBox — flips GearShiftSpindleSpeed_rpm between null (no mechanism) and 0 (mechanism present; the operator dials in the speed). Gear Shift Spindle Speed NumberField (rpm) — always rendered, disabled until the checkbox is on. equipment/spindle/dry-run — “Dry-Run Coefficients”, item type SpindleScalars Friction Power Coefficient NumberField (mW/rpm) — DryRunFrictionPowerCoefficient_mWdrpm. Windage Power Coefficient NumberField (pW/rpm³) — DryRunWindagePowerCoefficient_pWdrpm3. equipment/spindle/power — “Power Contours”, item type SpindleContour Count line and an Add button. Contour Selector — a select over the contour list, each entry labelled by its workable duration (n min, or Continuous for the infinite one). Edit-duration Button — opens the modal below. Delete Button — confirms, then removes the selected contour. Disabled at one remaining contour. Points Table — the selected contour's points, one row per point: a spindle-speed cell (rpm, min: 0), a value cell, an insert-next button that clones the row, and a double-click remove that is disabled at one remaining point. A cell edit replaces the whole point list server-side. Empty state, when the axis has no contour yet. Edit-duration Modal Continuous (∞) CheckBox — disabled when another contour already holds the continuous key. Workable Duration NumberField (min), shown while Continuous is off, min: 0. Save rejects a non-positive duration and is a no-op when the key is unchanged. equipment/spindle/torque — “Torque Contours”, item type SpindleContour, the same shape over the torque list. Shared content view, registered by the root and by all five children: the two contour charts in the General Setup page's CONTENT column. Power chart and Torque chart, each with a chip legend — one chip per contour, showing its duration and, on hover, its point count. Clicking a chip selects the contour the PRIMARY-row editor edits. A vertical marker line at the gear-shift spindle speed, while one is set. Its own not-attached empty state, mirroring the root panel's. Behavior Rpm ↔ cycles/s conversion lives server-side. SpindleCapability stores spindle speed in cycles/s (Hz); the controller converts to rpm in its DTOs and back on write. The frontend only ever sees rpm. Nullable gear shift. The Has-Gear-Shift checkbox writes 0 when checked and null when cleared, which is how the model distinguishes “mechanism present, speed not yet dialled in” from “no gear-shift mechanism”. One state, thin views throughout. Every panel on the branch — root, the three scalar sections, the two contour sections and the charts — reads and writes one module-singleton composable. A point edit therefore redraws the chart in the same tick, and a legend click moves the editor. The composable installs a single project-change watch that reloads on open and clears on close. No cache chain. These scalars feed the cutting-force and thermal physics, not the setup canvas, so the branch's afterChange does nothing — unlike the geometry branches, nothing here clears a geometry cache. Add Contour. The prompt is pre-filled with 60; a blank entry means continuous (∞). A duration already present is refused, a second continuous contour included. The new contour is seeded from the currently selected contour, falling back to the first in the list, and to a built-in default curve when the axis is empty — so the operator rarely draws from scratch. Project-scoped, and forwarded to the run. The capability lives on the authored equipment face and is persisted with the .hincproj save; setting SpindleCapabilityFile externalizes it to a side-file instead. The runtime equipment face holds the same object by reference, so a scalar or point edit is visible to a run immediately; a replacement (Load, Paste, XML Apply) re-stamps that reference through the project service's ForwardSetupEnvironmentToExecution. Load / Paste / XML-Apply only swap the IndexService entry. The root panel then installs the result onto the equipment through the controller's update, and reloads the snapshot and the key. The controller's initialize indexes a blank placeholder when nothing is attached yet, which is what keeps the ⋮ menu usable — and Load reachable — on a project with no capability. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/components/controlTree/useControlTreeHost.ts — builds the equipment/spindle root (item type SpindleCapabilityRoot) and its five children: thermal, gear-shift and dry-run as SpindleScalars, power and torque as SpindleContour. wwwroot-src/src/components/controlTree/itemTypes.ts — registers those three item types and gives all of them the same CONTENT-column view. wwwroot-src/src/components/controlTree/SpindleCapabilityPanel.vue — the branch root panel: the Object Management button, the name caption, the not-attached empty state, and the Name / Note fields. wwwroot-src/src/components/controlTree/SpindleScalarsPanel.vue — one scalar section per role path: thermal, gear-shift (checkbox plus the rpm field, disabled while the value is null) and dry-run. wwwroot-src/src/components/controlTree/SpindleContourPanel.vue — the power / torque child: the count line, Add, the contour selector, the edit-duration modal and the delete button, hosting the point editor. wwwroot-src/src/components/spindle/SpindleContourEditor.vue — the selected contour's numeric points table; its own header is hidden when the tree panel drives it. wwwroot-src/src/components/spindle/SpindleContoursPanel.vue — the CONTENT-column view every spindle item registers: both charts. wwwroot-src/src/components/spindle/SpindleContoursChart.vue — one plotted chart with the clickable chip legend that selects the contour the editor edits, plus the gear-shift marker line. wwwroot-src/src/components/controlTree/ContentSlavePanel.vue — the General Setup page's CONTENT column, which mounts whichever content panel the selection's item type registers; it deliberately leaves that component unkeyed so the charts survive a move between the branch's six nodes. wwwroot-src/src/composables/useSpindleCapability.ts — the module-singleton state and every mutation on the branch: the scalar handlers, add / remove / rename contour, the point updates and the object-management install hooks. wwwroot-src/src/components/widgets/ObjectManagementMenuButton.vue — the reused ⋮ menu carrying Load / Save As / Copy / Paste / XML for the .SpindleCapability file surface. wwwroot-src/src/api/spindleCapability.ts — typed client for /api/mech/spindle-capability/*. wwwroot-src/src/router/routes.ts — the spindle-capability/:tab? redirect (the tab mapped onto the branch child id) and the equipment/spindle redirect, both landing on general-setup?tree=…. wwwroot-src/src/router/treeRoutes.ts — defines the tab segments that redirect accepts: thermal, gear-shift, dry-run, power, torque. Mech/SpindleCapabilityController.cs — REST surface at /api/mech/spindle-capability over the authored equipment face's capability: GET / — flat snapshot: metadata plus the contour keys of each axis. GET /power-contours, GET /torque-contours — per-axis contour lists with their points. PUT /name | /note | /energy-efficiency | /working-temperature-upper-boundary-c | /gear-shift-spindle-speed-rpm | /dry-run-friction-power-coefficient-mwdrpm | /dry-run-windage-power-coefficient-pwdrpm3 — one scalar each. POST /power-contours | /torque-contours — add one contour. DELETE /power-contours/{key} | /torque-contours/{key} — remove one contour ({key} accepts numeric strings and \"inf\" / \"infinity\"). PUT /power-contours/{key}/points | /torque-contours/{key}/points — replace one contour's points; this is what backs per-point editing. PUT /power-contours/{key}/key | /torque-contours/{key}/key — rename a contour's workable-duration key, refusing a key that already exists; this is what backs the edit-duration modal. GET /xml — serialise to XML text. POST /load, POST /load-file, POST /reload — install from XML text, from a file under a named root, or from the file already stamped on the equipment. PUT /capability-file — set the side-file reference without reloading. POST /initialize, POST /update — index the capability for the Object Management button, and install the swapped-in object back onto the equipment. HiAPI Engine HiMech/Milling/SpindleCapability.cs — the model: EnergyEfficiency, WorkingTemperatureUpperBoundary_K with its _C accessor, the nullable GearShiftSpindleSpeed_cycleds with its _rpm convenience property, the two dry-run coefficients and the power / torque contour dictionaries keyed by workable duration. HiMech/Machining/MachiningEquipmentUtils/SetupEquipment.cs — the authored equipment face that owns the capability and its file reference and serializes them, inline or as a side-file reference. See Also Mechanism Builder Page — same file-level IO pattern (Load / Reload / Save As) but user-scoped rather than project-scoped. Environment: Ambient Temperature / Coolant — sibling root of the same Control Tree, editing the same authored equipment face. Spindle Capability — what the model represents physically and how the per-step ratios come out of it." }, "anatomy/general-setup/workpiece.html": { "href": "anatomy/general-setup/workpiece.html", @@ -322,12 +322,12 @@ "anatomy/legacy-controller-settings.html": { "href": "anatomy/legacy-controller-settings.html", "title": "Legacy Controller Model (HardNcEnv) | HiAPI-C# 2025", - "summary": "Legacy Controller Model (HardNcEnv) HardNcEnv is the HardNc controller model: the one the project still carries as MachiningProject.NcEnv and serializes as its NcEnv element, and the one the deprecating HardNc pipeline plays. It is a model with no screen. The Legacy-Controller page at /controller/:tab? that edited it was removed on 2026-09-11 — /controller/… now redirects to /general-setup?tree=equipment/controller, following the route file's convention for retired pages — and controller settings are edited on the General Setup page's Controller Branch, the settings face of the SoftNc runner, which is the live pipeline. What survives of the legacy face is its REST implementation, Controller/ControllerController.cs, still mounted under /api/Controller/*, and its typed client wwwroot-src/src/api/controller.ts, kept as those endpoints' only client; one wrapper in it, getCncBrand, is still called from a live component. This page is what the model holds: how it stands to the runner, what the live pipeline still reads from it, the settings that retire with it, the ones the branch edits a runner-side copy of, and the one marker class both stores draw a work coordinate with. The Model, and the Runner Beside It The project carries both models side by side and serializes both. HardNcEnv is loaded from the project's own NcEnv element unconditionally; NcRunnerSuit — the runner plus the project's per-case dependency list — is read from its own nested element. The legacy element is a fallback source for the suit rather than a shared store: a project file that carries no runner element derives one from the legacy element at load time, and from then on the two drift apart, because every later edit lands on one of them alone. The legacy model is still read at play time. The legacy NC runner is constructed over a delegate onto the project's NcEnv, so a replacement installed through the update endpoint — the removed page's object-management chain was its caller, and nothing in the SPA calls it now — propagates without rewiring, and a project-level switch selects which of the two pipelines plays. That switch defaults to the SoftNc pipeline and no screen in the web application changes it; it is a scripting property, EnableSoftNcRunner(API). The legacy NC optimisation route is the other live reader: it is taken whenever the switch is off or the session holds no played SoftNc layers, and it is handed MachiningProject.NcEnv directly. What the Live Pipeline Still Reads From It Selecting the SoftNc pipeline does not silence the legacy model. Four reads still land on it with the switch on, so a value that only the legacy endpoints or the project XML can change still shows up on a runner play. Stroke limits, as a fallback. The per-step stroke check reads the runner's IStrokeLimitConfig when the switch is on and one is present, and falls back to the legacy stroke boxes otherwise — a CSV or NX-CL suit carries no stroke config, so a play on those falls through to the boxes. The pre-play audit that warns of an unlimited linear axis reads both sources end by end, the runner's first and the legacy box behind it, and stays silent for an axis either source guards. The home position, as a fallback. The chain is re-homed from the runner's home config; the legacy HomeMc fills in only when no linear axis was ever configured there. The Execution canvas's coordinate markers. The IsoCoordinate and HeidenhainCoordinate rendering flags on the Execution page draw from the legacy tables — see Two Faces of a Work Coordinate. The Execution tool bar's brand. The Scene dropdown offers its Heidenhain-coordinate entry only while the brand is Heidenhain, and the brand it asks for is the legacy model's, through getCncBrand — the one wrapper in wwwroot-src/src/api/controller.ts a live component still calls. The kinematics solver the service builds is mirrored onto NcEnv.XyzabcSolver as well, but that slot is wiring the service maintains rather than a setting, and it is never serialized. Settings That Retire With the Model Four controls had no editor anywhere in the web application but the removed screen. None of them gained one on the branch: three are legacy-only settings and retire with the model, and the fourth is an action the runner path does not offer. Every one keeps its endpoint under /api/Controller/*, so the value can still be read and written over REST or in the project XML — there is just no UI for it. Align P0 — not offered on the runner path The removed Coordinate Table tab carried a third row action beside P0 and M0: Align P0, which moves the part so that program zero lands on the offset the row holds — the reproducing direction, program zero onto the work offset in the manual's terms. It did not write the coordinate; it wrote the fixture's geometry-to-table transformer, so the workpiece and fixture moved together and the runtime face followed at the next rebuild. The branch's Work Coordinates leaf carries P0 and M0 only, which write the row from the machine position — the opposite direction — and no alignment. The operation is not offered on the runner path. The tab's undo history — Undo Align and Redo Align over two component-local stacks, the undo stack capped at 32 entries — was the component's own and went with it; the endpoint never kept an undo slot. It still answers with the assigned translation plus the transformer as it stood before and after the write, both serialized as XML, and the stateless revert endpoint still parses such a snapshot and assigns it as the fixture's transformer; nothing in the SPA posts to either now. The engine exposes the same operation as a script call, AlignWorkpieceProgramZeroToIso(API), which looks the row up in the legacy model's ISO coordinate table — an API for a script, not a replacement for the removed control. Enable Shortest Rotary Path EnableShortestRotary constructs true, and its only editor was the removed Config tab's single toggle. On the legacy pipeline the flag gates one step: each rotary axis of a block is cycled into the ±180° window around the previous block's value. The flag is narrower than its name, because that same cycle is applied unconditionally on Heidenhain — the brand branch runs it before the flag is consulted, so clearing it changes nothing there. The runner's dependency layer declares no counterpart: no brand parameter table, no generic config and no branch leaf carries a shortest-rotary switch. What the runner pipeline has instead is the Heidenhain M126 / M127 pair, modal codes read from the program text rather than from any setting. Max rotary speed per axis MaxRotarySpeedABC_radds is the per-axis rotary speed ceiling the HardNc pipeline clamps feed and cycle time against; its editor was the removed Machine tab's Max Speed (rpm) column. On the runner pipeline the ceiling is not a setting of its own: the polar feed clamp reads it from the per-axis rapid-feedrate bucket, IRapidFeedrateConfig, and the legacy import funnels this field into that bucket at rpm × 360 deg/min, so the branch's Rapid Feedrates leaf edits the runner-side number. The legacy field itself retires with the model. Heidenhain master-axis character HeidenhainMasterAxisChar is a character face over the integer axis direction the PLANE … SEQ solution family is resolved against; its editor was a second card the removed Brand tab grew while the brand was Heidenhain, one select over A, B, C. The setter takes only A, B or C and throws on anything else; the PUT endpoint upper-cases the first character it is sent and answers 400 to anything but those three. On the runner pipeline the master rotary is derived rather than configured — it is the first declared rotary axis — so the branch has nothing to expose and no leaf for it. What the Branch Edits a Runner-Side Copy Of Naming what is not legacy-only matters as much. The CNC brand, the stroke limits, the rapid feed, the tool-change time, the tool offset table with its tool-house dependence, the work coordinates with their P0 and M0 actions, and the Heidenhain datum preset and datum shift tables all have editors on the branch — see Brand Matrix for which of those leaves each brand grows. The branch edits the runner's copy of each; the legacy copy in HardNcEnv is reachable only through its endpoint and the project XML, and the two are not kept in step. One flag sits outside both models. Set ideal offset dependent on tool house is a project-level configuration flag, and the branch's Tool Offsets leaf and the legacy ideal-offset-dependent endpoint read and write that one flag. The two tables stay separate: the legacy set-ideal-offset-from-toolhouse endpoint — the removed Offset Table tab's Refresh from Tool House — recomputes MillingToolOffsetTable from MachiningToolHouse, while the branch's refresh recomputes the runner's own tool-offset table. Two Faces of a Work Coordinate The work-coordinate marker is one displayee class serving two providers. The Execution canvas draws it from IsoCoordinateTable — a IsoCoordinateTable instance owned by the legacy model, which constructs with G54 … G59 and G59.1 … G59.9 all at zero — and draws its Heidenhain datum marker from the legacy datum tables the same way. The General Setup canvas builds the same displayee over the active runner's effective IIsoCoordinateConfig instead, which on most brands is the brand parameter table. Same marker, same code, two stores. Which row the Execution marker draws is the displayee's own id, constructed as G54. Its only writer is the legacy iso-coordinate-selection endpoint, which the removed tab's row selection posted to and nothing in the SPA posts to now, so the Execution marker stays on G54. Whether it is drawn is the IsoCoordinate rendering flag, toggled from the Execution page's Scene dropdown; all three coordinate flags are off in the shipped rendering-flag set — as are the machine tool and the cutter, leaving the workpiece, the fixture, the dimension bar and the cutter-location strip as the four that arrive on. The General Setup marker's row is a user-config value of its own, with an endpoint on the equipment-setup display controller. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): Controller/ControllerController.cs — the model's REST face, still mounted: every legacy table and setting, the align endpoint that snapshots the transformer either side of the write, the stateless revert, the update rebind, and the marker-row selection. wwwroot-src/src/api/controller.ts — the typed wrappers over all of it, kept as those endpoints' only client; getCncBrand and the brand constants are what a live component still imports. wwwroot-src/src/components/execution/ExecutionExtendedToolBar.vue — that component: the Scene dropdown that toggles the coordinate flags, and asks the legacy model for its brand. wwwroot-src/src/api/renderingFlags.ts — the flag indices the Scene dropdown writes. Disp/ExecutionDisplayee.cs — the Execution canvas's displayee: the shipped flag set, and the work-coordinate and datum markers it builds over the legacy tables. Disp/IsoCoordinateEntryDisplayee.cs — the one marker class both canvases draw with. Disp/EquipmentSetupDisplayee.cs — the General Setup canvas's marker, over the runner's providers. wwwroot-src/src/router/routes.ts — the /controller/… redirect stub onto the Controller branch. HiAPI Engine HiUniNc/Numerical/HardNcEnv.cs — the model: the coordinate, datum and offset tables, the stroke boxes that construct infinite, the rapid rate and tooling time, the per-axis rotary speed ceiling, the shortest-rotary flag with its Heidenhain exclusion, and the master-axis character over its integer direction. HiUniNc/Numerical/HardNcLine.cs — the legacy consumers of two of those settings: the shortest-rotary path application and the SEQ solve that reads the master-axis direction. HiUniNc/Numerical/NcProc.cs — the legacy consumer of the rotary speed ceiling: feed and cycle time re-limited per rotary axis. HiUniNc/Numerical/MillingToolOffsetTable.cs — the offset table and the tool-house recompute the legacy refresh endpoint calls. HiMech/NcParsers/Dependencys/Generic/IsoCoordinateTable.cs — the coordinate table type and the fifteen G-code keys it constructs with, shared by name with the runner's brand-agnostic table. HiMech/Machining/MachiningEquipmentUtils/MachiningEquipmentUtil.cs — the alignment itself: the translation written into the fixture's geometry-to-table transformer. HiMech/NcParsers/SoftNcRunner.cs — the legacy import: which legacy fields are funnelled into which runner dependency, including the rotary speed conversion into the rapid-feedrate config. HiMech/NcParsers/LogicSyntaxs/PolarInterpolationUtil.cs — the rotary speed ceiling the runner pipeline reads, and why it is the rapid-rate bucket rather than a setting of its own. HiMech/NcParsers/LogicSyntaxs/Heidenhain/HeidenhainPlaneTiltSyntax.cs — the derived master rotary on the runner pipeline: the first declared rotary axis, with no configured alternative. HiNc/MachiningProcs/MachiningProject.cs — where both models hang off the project, and the load path that derives a runner from the legacy element only when no runner element is present. HiNc/MachiningProcs/LocalProjectService.cs — the legacy runner built over a delegate onto the project's model, the switch that selects which pipeline is active, and the stroke-limit and home-position fallbacks onto the legacy model. HiNc/Numerical/FilePlayers/HardNcRunner.cs — the legacy runner itself. HiNc/MachiningProcs/SessionShell.cs — the scripting face of the pipeline switch and of the alignment, and the optimisation route that passes the legacy model directly. See Also Controller Branch — the SoftNcRunner-native controller branch: the live settings face, and the editor for everything named above as having a runner-side copy General Setup Page — the page that hosts that branch, and the rest of the equipment tree beside it" + "summary": "Legacy Controller Model (HardNcEnv) HardNcEnv is the HardNc controller model: the one the project still carries as MachiningProject.NcEnv and serializes as its NcEnv element, and the one the deprecating HardNc pipeline plays. It is a model with no screen. The Legacy-Controller page at /controller/:tab? that edited it was removed on 2026-09-11 — /controller/… now redirects to /general-setup?tree=equipment/controller, following the route file's convention for retired pages — and controller settings are edited on the General Setup page's Controller Branch, the settings face of the SoftNc runner, which is the live pipeline. What survives of the legacy face is its REST implementation, Controller/ControllerController.cs, still mounted under /api/Controller/*, and its typed client wwwroot-src/src/api/controller.ts, kept as those endpoints' only client; one wrapper in it, getCncBrand, is still called from a live component. This page is what the model holds: how it stands to the runner, what the live pipeline still reads from it, the settings that retire with it, the ones the branch edits a runner-side copy of, and the one marker class both stores draw a work coordinate with. The Model, and the Runner Beside It The project carries both models side by side and serializes both. HardNcEnv is loaded from the project's own NcEnv element unconditionally; NcRunnerSuit — the runner plus the project's per-case dependency list — is read from its own nested element. The legacy element is a fallback source for the suit rather than a shared store: a project file that carries no runner element derives one from the legacy element at load time, and from then on the two drift apart, because every later edit lands on one of them alone. The legacy model is still read at play time. The legacy NC runner is constructed over a delegate onto the project's NcEnv, so a replacement installed through the update endpoint — the removed page's object-management chain was its caller, and nothing in the SPA calls it now — propagates without rewiring, and a project-level switch selects which of the two pipelines plays. That switch defaults to the SoftNc pipeline and no screen in the web application changes it; it is a scripting property, EnableSoftNcRunner(API). The legacy NC optimisation route is the other live reader: it is taken whenever the switch is off or the session holds no played SoftNc layers, and it is handed MachiningProject.NcEnv directly. What the Live Pipeline Still Reads From It Selecting the SoftNc pipeline does not silence the legacy model. Four reads still land on it with the switch on, so a value that only the legacy endpoints or the project XML can change still shows up on a runner play. Stroke limits, as a fallback and as a seed. The per-step stroke check reads the runner's IStrokeLimitConfig when the switch is on and one is present, and falls back to the legacy stroke boxes otherwise — a CSV or NX-CL suit carries no stroke config, so a play on those falls through to the boxes. When a project loads, the boxes' finite ends are also copied into the runner's controller parameter table for every axis that carries no end there (PopulateLegacyStrokeLimitsWhereUnset; an explicit row wins), so a project that declared its travel only in the boxes is checked against it on SoftNc — and its tilt solves prefer the rotary branch inside that travel. The pre-play audit that warns of an unlimited linear axis reads both sources end by end, the runner's first and the legacy box behind it, and stays silent for an axis either source guards. The home position, as a fallback. The chain is re-homed from the runner's home config; the legacy HomeMc fills in only when no linear axis was ever configured there. The Execution canvas's coordinate markers. The IsoCoordinate and HeidenhainCoordinate rendering flags on the Execution page draw from the legacy tables — see Two Faces of a Work Coordinate. The Execution tool bar's brand. The Scene dropdown offers its Heidenhain-coordinate entry only while the brand is Heidenhain, and the brand it asks for is the legacy model's, through getCncBrand — the one wrapper in wwwroot-src/src/api/controller.ts a live component still calls. The kinematics solver the service builds is mirrored onto NcEnv.XyzabcSolver as well, but that slot is wiring the service maintains rather than a setting, and it is never serialized. Settings That Retire With the Model Four controls had no editor anywhere in the web application but the removed screen. None of them gained one on the branch: three are legacy-only settings and retire with the model, and the fourth is an action the runner path does not offer. Every one keeps its endpoint under /api/Controller/*, so the value can still be read and written over REST or in the project XML — there is just no UI for it. Align P0 — not offered on the runner path The removed Coordinate Table tab carried a third row action beside P0 and M0: Align P0, which moves the part so that program zero lands on the offset the row holds — the reproducing direction, program zero onto the work offset in the manual's terms. It did not write the coordinate; it wrote the fixture's geometry-to-table transformer, so the workpiece and fixture moved together and the runtime face followed at the next rebuild. The branch's Work Coordinates leaf carries P0 and M0 only, which write the row from the machine position — the opposite direction — and no alignment. The operation is not offered on the runner path. The tab's undo history — Undo Align and Redo Align over two component-local stacks, the undo stack capped at 32 entries — was the component's own and went with it; the endpoint never kept an undo slot. It still answers with the assigned translation plus the transformer as it stood before and after the write, both serialized as XML, and the stateless revert endpoint still parses such a snapshot and assigns it as the fixture's transformer; nothing in the SPA posts to either now. The engine exposes the same operation as a script call, AlignWorkpieceProgramZeroToIso(API), which looks the row up in the legacy model's ISO coordinate table — an API for a script, not a replacement for the removed control. Enable Shortest Rotary Path EnableShortestRotary constructs true, and its only editor was the removed Config tab's single toggle. On the legacy pipeline the flag gates one step: each rotary axis of a block is cycled into the ±180° window around the previous block's value. The flag is narrower than its name, because that same cycle is applied unconditionally on Heidenhain — the brand branch runs it before the flag is consulted, so clearing it changes nothing there. The runner's dependency layer declares no counterpart: no brand parameter table, no generic config and no branch leaf carries a shortest-rotary switch. What the runner pipeline has instead is the Heidenhain M126 / M127 pair, modal codes read from the program text rather than from any setting. Max rotary speed per axis MaxRotarySpeedABC_radds is the per-axis rotary speed ceiling the HardNc pipeline clamps feed and cycle time against; its editor was the removed Machine tab's Max Speed (rpm) column. On the runner pipeline the ceiling is not a setting of its own: the polar feed clamp reads it from the per-axis rapid-feedrate bucket, IRapidFeedrateConfig, and the legacy import funnels this field into that bucket at rpm × 360 deg/min, so the branch's Rapid Feedrates leaf edits the runner-side number. The legacy field itself retires with the model. Heidenhain master-axis character HeidenhainMasterAxisChar is a character face over the integer axis direction the PLANE … SEQ solution family is resolved against; its editor was a second card the removed Brand tab grew while the brand was Heidenhain, one select over A, B, C. The setter takes only A, B or C and throws on anything else; the PUT endpoint upper-cases the first character it is sent and answers 400 to anything but those three. On the runner pipeline the master rotary is derived rather than configured — it is the first declared rotary axis — so the branch has nothing to expose and no leaf for it. What the Branch Edits a Runner-Side Copy Of Naming what is not legacy-only matters as much. The CNC brand, the stroke limits, the rapid feed, the tool-change time, the tool offset table with its tool-house dependence, the work coordinates with their P0 and M0 actions, and the Heidenhain datum preset and datum shift tables all have editors on the branch — see Brand Matrix for which of those leaves each brand grows. The branch edits the runner's copy of each; the legacy copy in HardNcEnv is reachable only through its endpoint and the project XML, and the two are not kept in step. One flag sits outside both models. Set ideal offset dependent on tool house is a project-level configuration flag, and the branch's Tool Offsets leaf and the legacy ideal-offset-dependent endpoint read and write that one flag. The two tables stay separate: the legacy set-ideal-offset-from-toolhouse endpoint — the removed Offset Table tab's Refresh from Tool House — recomputes MillingToolOffsetTable from MachiningToolHouse, while the branch's refresh recomputes the runner's own tool-offset table. Two Faces of a Work Coordinate The work-coordinate marker is one displayee class serving two providers. The Execution canvas draws it from IsoCoordinateTable — a IsoCoordinateTable instance owned by the legacy model, which constructs with G54 … G59 and G59.1 … G59.9 all at zero — and draws its Heidenhain datum marker from the legacy datum tables the same way. The General Setup canvas builds the same displayee over the active runner's effective IIsoCoordinateConfig instead, which on most brands is the brand parameter table. Same marker, same code, two stores. Which row the Execution marker draws is the displayee's own id, constructed as G54. Its only writer is the legacy iso-coordinate-selection endpoint, which the removed tab's row selection posted to and nothing in the SPA posts to now, so the Execution marker stays on G54. Whether it is drawn is the IsoCoordinate rendering flag, toggled from the Execution page's Scene dropdown; all three coordinate flags are off in the shipped rendering-flag set — as are the machine tool and the cutter, leaving the workpiece, the fixture, the dimension bar and the cutter-location strip as the four that arrive on. The General Setup marker's row is a user-config value of its own, with an endpoint on the equipment-setup display controller. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): Controller/ControllerController.cs — the model's REST face, still mounted: every legacy table and setting, the align endpoint that snapshots the transformer either side of the write, the stateless revert, the update rebind, and the marker-row selection. wwwroot-src/src/api/controller.ts — the typed wrappers over all of it, kept as those endpoints' only client; getCncBrand and the brand constants are what a live component still imports. wwwroot-src/src/components/execution/ExecutionExtendedToolBar.vue — that component: the Scene dropdown that toggles the coordinate flags, and asks the legacy model for its brand. wwwroot-src/src/api/renderingFlags.ts — the flag indices the Scene dropdown writes. Disp/ExecutionDisplayee.cs — the Execution canvas's displayee: the shipped flag set, and the work-coordinate and datum markers it builds over the legacy tables. Disp/IsoCoordinateEntryDisplayee.cs — the one marker class both canvases draw with. Disp/EquipmentSetupDisplayee.cs — the General Setup canvas's marker, over the runner's providers. wwwroot-src/src/router/routes.ts — the /controller/… redirect stub onto the Controller branch. HiAPI Engine HiUniNc/Numerical/HardNcEnv.cs — the model: the coordinate, datum and offset tables, the stroke boxes that construct infinite, the rapid rate and tooling time, the per-axis rotary speed ceiling, the shortest-rotary flag with its Heidenhain exclusion, and the master-axis character over its integer direction. HiUniNc/Numerical/HardNcLine.cs — the legacy consumers of two of those settings: the shortest-rotary path application and the SEQ solve that reads the master-axis direction. HiUniNc/Numerical/NcProc.cs — the legacy consumer of the rotary speed ceiling: feed and cycle time re-limited per rotary axis. HiUniNc/Numerical/MillingToolOffsetTable.cs — the offset table and the tool-house recompute the legacy refresh endpoint calls. HiMech/NcParsers/Dependencys/Generic/IsoCoordinateTable.cs — the coordinate table type and the fifteen G-code keys it constructs with, shared by name with the runner's brand-agnostic table. HiMech/Machining/MachiningEquipmentUtils/MachiningEquipmentUtil.cs — the alignment itself: the translation written into the fixture's geometry-to-table transformer. HiMech/NcParsers/SoftNcRunner.cs — the legacy import: which legacy fields are funnelled into which runner dependency, including the rotary speed conversion into the rapid-feedrate config. HiMech/NcParsers/LogicSyntaxs/PolarInterpolationUtil.cs — the rotary speed ceiling the runner pipeline reads, and why it is the rapid-rate bucket rather than a setting of its own. HiMech/NcParsers/LogicSyntaxs/Heidenhain/HeidenhainPlaneTiltSyntax.cs — the derived master rotary on the runner pipeline: the first declared rotary axis, with no configured alternative. HiNc/MachiningProcs/MachiningProject.cs — where both models hang off the project, and the load path that derives a runner from the legacy element only when no runner element is present. HiNc/MachiningProcs/LocalProjectService.cs — the legacy runner built over a delegate onto the project's model, the switch that selects which pipeline is active, and the stroke-limit and home-position fallbacks onto the legacy model. HiNc/Numerical/FilePlayers/HardNcRunner.cs — the legacy runner itself. HiNc/MachiningProcs/SessionShell.cs — the scripting face of the pipeline switch and of the alignment, and the optimisation route that passes the legacy model directly. See Also Controller Branch — the SoftNcRunner-native controller branch: the live settings face, and the editor for everything named above as having a runner-side copy General Setup Page — the page that hosts that branch, and the rest of the equipment tree beside it" }, "anatomy/platform/control-tree.html": { "href": "anatomy/platform/control-tree.html", "title": "Control Tree | HiAPI-C# 2025", - "summary": "Control Tree The Control Tree is the engine shared by the two tree-shaped pages of the web client: the Execution page at /execution and the General Setup page at /general-setup. Each page creates exactly one host — useControlTreeHost('execution') or useControlTreeHost('equipment') — provides it to its panes under one injection key, and the host owns everything after that: the node graph, the branch builders, the selection and the ?tree= query that carries it, the editor panel a selection resolves to, the mission enable ticks, and every structural operation on the Mission branch. The Tool House page at /tool-house reuses the same node shape and the same item-type registry but renders a branch as nested tabs and creates no host. Important Node ids are role paths, not identities that survive a version change. Anatomy makes no claim that a ?tree= id is stable across releases; see Tree Ids and Routes for the migration hop that keeps an older link resolving. The Node Every branch of every tree is built from one structure, ControlNode, declared in itemTypes.ts: id — the node's role path, slash-separated, whose first segment is the owning page's scope (execution/…, equipment/…, toolhouse/…). This is the addressing surface: the ?tree= query, the persisted expansion list and the persisted last selection all hold ids. The General Setup page's root carries its scope as its own id, equipment; the Execution page has no node with the bare execution id — its two roots are execution/mission and execution/program, and the segment is a scope key only. label, labelKey, labelParams — the display text; see Display Labels. itemType — the registry key that decides the node's editor and its child builder. key — the bound object. In the geometry and equipment branches it is an IndexService key, re-minted on every re-index; in the Mission branch it is the Mission API command path (0, 1, the dotted 0.2 of a nested list entry); in the Tool House branch it is the tool id as a string. Waves whose panels read a module-level state singleton rather than an indexed object leave it empty — the SoftNc controller leaves, the spindle sections, the Background and Coolant leaves and the Program branch all do. ctx — the parent-provided SlotCtx: the afterChange commit chain, a slot's onCreate create-and-rebind hook, and a slot picker's allowedKinds / allowNone constraints. children — grown by the builders, not declared by the tree column. selectable, info / infoKey, and the mission / program bookkeeping records the Mission and Program waves stamp on their own nodes. The split between id and key is the load-bearing one. A key is re-minted every time the host re-indexes the model, so nothing durable may hang off it; an id names a role in the model and therefore survives a rebuild, which is why expansion state, the URL and the landing selection are all keyed on ids. Two id families are positional rather than role-based: Mission entries are ${parentId}/${index} and Program files are ${parentId}/${index}, so moving or deleting a mission command renumbers its siblings and a link to one names a position in the list rather than that command. The host keeps three id sets of its own that must follow the rows rather than the numbers — the persisted expansion list, the Add Command focus and the selection — and translates all three through every mission row operation it runs; see the row operations. The Item-Type Registry ITEM_TYPES maps an itemType string onto a TreeItemDef carrying up to three members: panel — the editor mounted in the dock's editor row for a node of this type. contentPanel — a large view for the General Setup page's content column. buildChildren — an async builder that returns this node's children. Two flavours of type share the map. Slot types (Geometry, Transformer) have a kind picker as their panel and grow at most one child, the concrete kind, at the kind-independent id ${slot.id}/type — so switching a slot's kind keeps both the selection and the expansion. A slot holding nothing grows no child at all, which for the four geometry slots whose picker offers None is an ordinary state rather than a failure. Kind types (Box3d, StaticTranslation, …) register SoleEditorPanel, which looks the concrete editor up in the geometry and transformer editor maps and binds it to the node's key. The two composite geometry kinds do not embed nested editors: TransformationGeom grows an inner-geometry and an inner-transformer slot, and GeomCombination grows one slot per item, so the tree owns the structure and every panel stays shallow. The map is one flat namespace assembled in itemTypes.ts: the Group stem type and the geometry, transformer, workpiece-leaf, thermal-condition and spindle entries are written inline, and five per-wave registries are spread in beside them. The Execution page's two roots are registry types — MissionRoot and ProgramRoot, from their waves — and no wrapper type stands over them. The three roots the panel host renders itself — Machine Tool, Fixture and Workpiece — have no entry here at all. Wave File What it contributes Mission missionItemTypes.ts MissionRoot, whose panel is informational — the command count and the run-order hint that names the row affordances; MissionCommand, whose panel is the kind's editor, or only a Title field for a List; MissionSection; section children at ${command.id}/${sectionId}; the per-kind bespoke editors, with a generic field editor as the fallback Program programItemTypes.ts ProgramRoot, ProgramFile, ProgramConversionFile; writeback conversions at ${root.id}/dst-${index} Tool House toolHouseItemTypes.ts the tool collection and the per-tool editor branches under toolhouse/tool-/… SoftNc controller softNcItemTypes.ts the controller root and its leaves on two planes — …/machine/ and …/program-data/ — a core every runner grows plus the brand-driven ones Runner suits runnerSuitItemTypes.ts CsvRunnerRoot and ClRunnerRoot, flat single-panel leaves with no builder The Program branch is fetched whole: its root builder takes one file-tree response plus one conversions response and stashes each file's raw subtree on the node, so the file nodes' builder only maps what is already in hand. The SoftNc branch is the opposite — its builder reads the runner snapshot once, and with no runner installed grows nothing at all. Where one resolves, the two plane stems appear over a fixed core that stands for every brand: six machine leaves, and Work Coordinates and Tool Offsets on the program-data plane. The leaves beside that core are the brand-driven ones — each appears only where the snapshot reports its backing table, so a brand switch changes which nodes exist. One flag does double duty: the Siemens $TC_DP flag adds its own two leaves and renames the core Tool Offsets leaf to its ISO G43 H reading, so the two offset ledgers do not read as one. The two runner-suit nodes are conditional, and the host — not the registry — decides. With a project open, a CSV or CL controller node is built when its Preference checkbox is on, or when the current ?tree= value starts with that node's id. The checkbox is device-local and off by default; the route is the only other reveal, deliberately not the persisted last selection, so a node switched off while it is selected does not resurrect itself. Stepping off comes first: when the selection sits on a node the user has just unchecked, the host re-points the URL at the page root before rebuilding. Building a Branch buildSubtree(node, services, depth) is the whole builder. It looks the node's type up, returns without touching children when the type declares no buildChildren or when depth has reached MAX_DEPTH (12, a guard against a self-referencing model), and otherwise awaits the builder, recurses into each returned child, and assigns the result. Building is eager: a branch is materialised in full at build time rather than lazily on expansion. Builders receive one service, registerKey, which registers a freshly minted IndexService key with the page's cleanup hub — see Webapi with Hub-Cleanup Assistance. rebuildBranch(node) is buildSubtree plus one thing: it adds the node's id to the expansion list so the fresh children are visible, and reports a failure as a toast named after the node's display label. The structure-changed event A panel that has changed the shape of the model emits structure-changed (or type-changed, wired to the same handler). The optional payload is a StructureChangeRequest: scopeId — the branch to rebuild. Without it the scope is the selected node itself, which is correct only while the change stays inside the emitting panel's own branch. selectId — the selection to adopt afterwards. It is assigned directly, bypassing the dirty-switch gate, because the emitting panel is being replaced on purpose. A null clears the selection. inserted — entries a panel inserted into a mission list itself: the list node's id, the child index the run starts at and its count. The host then treats the rebuild as a mission operation — it holds the busy gate and slides its index-based ids past the new siblings — rather than as a plain branch refresh. One command editor emits the event: the Program File editor, whose multi-pick turns every extra file into a new Program File command inserted right after it, in pick order; the command panel hosting it re-scopes the event to the parent list, keeps that command selected and passes the insert range along. Two panels emit it with no payload and so take the default scope, their own node: the Program root panel's refresh button, which re-reads the file tree from the current session and rebuilds the Program branch through rebuildBranch, so the branch opens under it; and the GeomCombination item panel after an item add, an item remove or a clear, since its item slots must be regrown. The controller brand switch and the runner's Object-Management install re-scope to the controller root. The Tool House type selectors and a flute add re-scope to their own node; everything that rewrites the tool collection — a new tool, a duplicate, a delete, an id rename, an Object-Management install — re-scopes to the tool-house root, and a flute delete re-scopes to its fluting parent. Every other structural change to the Mission branch is an operation of the host itself, not an event, because the tree rows are the only surface that offers it: Add Command, a drag between rows, Move up / Move down, Duplicate and Delete. A drag is HTML5 drag-and-drop between mission rows; every command row drags, the Mission root row only receives, and where the pointer sits in the target row decides the operation. A plain command row has no edge band: it splits at its midline, the upper half putting the dragged command before that row and the lower half after it — a reorder when both share a list, a relocation across lists otherwise. A List row keeps that before / after reading only in its top and bottom quarters; its middle half, and the whole of the Mission root row, take the command into that list, at the tail. A drop onto the dragged row's own subtree is refused, and a drop aborts when a rebuild mid-drag re-stamped the dragged node, since its id may then name another command. All five run through one helper that holds a busy gate (one operation at a time), runs the open panel's dirty-switch gate, calls the Mission API, translates the expansion list and the Add Command focus through the operation, rebuilds the branch of the list or lists it rewrote — the one list, or the nearest list above both ends of a cross-list drag — and only then translates the selection and names any post-operation selection, since the ids it names exist only after the rebuild. A refused gate drops the operation and says so in a notification (\"Cancelled — the open editor keeps its unsaved edits.\"); the delete's own confirm dialog runs before the gate, so a cancelled delete forces no save prompt on the open editor. The selection moves only when it rides on the acted-on row — that row itself, or a section or nested entry under it. Then it follows a stepped or dragged command, lands on the clone after a duplicate, and after a delete lands on the nearest remaining entry of that list, or on the list node itself once the list is empty. Otherwise the editor the user is in stays on its own, re-indexed row. Add Command never moves the selection: it reveals the new row and makes it the focus, so a run of adds lands in order. The focus is the command most recently selected — a section row counts for its owning command — or the last one added, and an Add Command from a list row's + inserts right after that focus when the focus is a direct entry of that list, and at the list's tail otherwise; the Mission root row's + therefore never chases a focus inside a nested list. Whole-tree rebuilds, and the refreshes that are not rebuilds rebuildTree() replaces the root array outright, and runs after an Object-Management swap of the machine tool or the fixture, after a blank machining chain is created, and after either runner-suit preference flips. On the execution host, an execution-status transition re-runs buildSubtree on the Program root directly rather than through rebuildBranch, so a run does not force that branch open on every transition. Two refreshes deliberately mutate existing nodes instead of rebuilding: A mission command's title is re-read from the entry list and written onto the node's label. A file-backed geometry leaf's label is re-read when its source file changes. The mission one exists because a rebuild of the Mission branch re-mints the per-build stamp that forms part of the editor's remount key, and remounting an open editor mid-edit would cost the user their cursor and any staged autosave. The geometry one is the same principle without the stamp: a title change and a source-file change alter no structure, so the label is all that has to move, and replacing the node under an open file editor would buy nothing. The commit chain The tree has no component bubbling, so the full post-edit commit chain lives on each node as ctx.afterChange, composed level by level as the branch is built. A GeomCombination item's chain cleans that combination's aggregated cache before running its parent's chain; the fixture's chain ends in a geometry-cache clear; the two workpiece geometry slots re-commit the swap-in before clearing their own cache, and skip that re-commit when the slot has been set to none; the fixture's two anchor transformers re-commit and then clear the geometry cache, while the workpiece's two re-commit and clear nothing, since a placement change invalidates no cached solid. Tool-house nodes all share one refresh. Every other family carries a no-op: the Mission, Program, spindle, SoftNc and thermal-condition nodes and the workpiece's Mesh and Material leaves have panels that write straight to the model, and the pages' canvases draw that model; the group stems and the Machine Tool and Workpiece roots have no field editor to commit for at all. Selection and the Dirty-Switch Gate Every selection change funnels through requestSelect(id). It returns immediately when the id is already selected; it refuses outright while a mission row operation, or a tick's own writes, are in flight — the operation ends by naming the post-operation selection, which would silently undo a change landed during its rebuild; otherwise it awaits the mounted panel's optional tryConsumeBeforeSwitch() and abandons the switch when that returns false. Three entrances use it: a click in the tree, a change to the URL's ?tree= value, and a select-node event from the mounted panel — the wire the panel host puts on every registry panel, so a group stem's child list and the Program branch's conversion jumps both arrive through that one. Two paths assign the selection directly and skip the gate: the selectId of a structure change, and the post-operation selection of a mission row operation, which has already run the gate itself. There is no “nothing selected” state. Re-clicking the selected row makes the tree yield null, and that is ignored; an empty ?tree= lands on the persisted last selection for that page when the built tree still contains it, and otherwise on the page's root — General Setup on the equipment host, and Mission, the first of its two roots, on the execution host. The editor row is therefore always alive, and reclaiming its height is the row's own collapse toggle rather than a deselection. The gate itself is registered by the panel host: the mounted registry panel is handed to the host through a template ref, and the host asks that instance for tryConsumeBeforeSwitch. Panels that write one field per request need no gate and register none. One panel exposes it — MissionCommandSlavePanel: on a list entry it waits for a title save already on the wire, then flushes the debounced title save while the command path is still live, and allows the switch only when that save landed; on any other entry it forwards its inner editor's gate. Two editors have one. The Script editor first lets a save already on the wire land, then with unsaved text asks save, discard or cancel: cancel returns false, discard reverts to the last confirmed text and puts the autosave to sleep until the next keystroke, and save proceeds only when the flush landed — a conflict answered with Cancel leaves the edit staged and the switch refused. The NC Code editor waits for a save on the wire, drains its debounced field save, and returns false when that save failed. The same gate runs before every mission row operation, not only before a selection change, because the operation's rebuild remounts the open editor and mission paths are index-based: a debounced save that outlived the remount would land on whichever command slid into the path it captured at mount. For the same reason both the NC Code editor and the list title cancel, never flush, on unmount. Display Labels nodeDisplayLabel(n) returns the translation of labelKey — with labelParams interpolated — when one is set, and the verbatim label otherwise. labelKey is therefore the form every role label the client translates itself takes, while label is the storage for text it cannot: server-composed mission titles, file-backed geometry paths and engine type names. The translator function is read inside the call rather than captured, so a language change re-renders the whole tree's role labels. Two labels are composed rather than looked up. A mission command's label is the title the server composes for it — the command's kind name in the request language, with the command's own text in brackets when there is one, as in Script [Warm-Up]. That title always arrives filled in, so the node's labelKey is always dropped and the tree's own kind-name fallback is a safety net that never fires in practice. Because titles are composed server-side per request, a language change also re-pulls the command entries and rewrites those labels in place. A file-backed geometry leaf carries its source file in brackets, so sibling instances read apart: StlFile [Geom/x.stl]. The voxel kind is renamed for display, appearing as MeshedGeomFile [...] rather than by its type name. Group stems take the same treatment for their intro text: infoKey wins over info, and a stem with neither falls back to a sentence naming the group. The Panel Host PrimarySlavePanel decides what the editor row shows, in this order: The three inline root types — MachineToolRoot, FixtureRoot, WorkpieceRoot — are rendered by the panel itself as a summary, and are never resolved from the registry. The two with a stand-alone file surface, Machine Tool and Fixture, carry an Object-Management button above it; the workpiece has none, since it is authored entirely through its child tree items. Otherwise the registry's panel for the selection's item type, mounted with the node as its only prop, with changed, type-changed, structure-changed, select-node and error wired to the host. A spinner while the first build is still running, and the select-an-item hint after that when the selection's type registers no panel. What decides a remount is the mounted component's key, ${id}|${key}|${stamp} — the node id, the node key, and the mission stamp where the node has one. So the editor remounts when the selection moves, when the bound object's key is re-minted, and when the Mission branch was rebuilt beneath it. That third term is exactly why the mission label refresh above mutates the node instead of rebuilding. The editor row carries nothing but the editor. The run controls sit in the tree pane instead: on the Execution page the Control Tree pane pins a run header above its tree scroller — the transport bar and the live execution-status badge — whatever the selection is. It rides the pane's content rather than the dock's expansion header because that header is the same component on General Setup, which renders neither piece. This is the page's sole ExecutionToolBar, so it owns the F5–F8 shortcuts, and because the dock keeps the tree pane mounted while its row is collapsed, a collapsed tree row does not drop them. When the tree column narrows, the six-button strip scrolls horizontally and the badge never shrinks, so the run state is the last thing a resize can hide. A pure Group stem is not a node without an editor. Group registers GroupInfoPanel, whose body is the stem's intro line followed by a clickable list of its children; a row click emits select-node and the host moves the selection there. The General Setup root, the two Anchor stems, the workpiece Material stem and the controller's two plane stems are all of this kind. The General Setup page adds a second slave, ContentSlavePanel, which resolves contentPanel from the same registry. Three item types declare one — the spindle root and its scalar and contour section types — and all three name the same contours view, so the charts stay mounted while the selection moves across the spindle branch: the component takes no props and is mounted unkeyed on purpose. Every other selection shows the column's empty hint. NodeTabCascade is the third consumer of the registry. It renders a branch as nested tabs rather than tree rows: the node's own panel on top, a single child inlined below it, several children as a dense tab strip in which only the active child mounts. The active tab is remembered per role path at module scope, with the per-tool segment wildcarded, so switching tools keeps every level's tab. Its panels report through an injected cascade host that carries the emitting node, because — unlike the tree's one-panel-at-a-time model — several panels are mounted at once. The Tick Column The tree runs a strict tick strategy, and a node hides its checkbox unless it is a mission command or a mission section that carries its own enable flag. Writing the ticked set walks every command node at any depth: a command whose state changed is PUT to the Mission API and, on success, has the new state copied onto its section children; a section whose state changed is dispatched to its kind's writer. A failed write raises a toast and leaves the model untouched, so the getter re-derives the old value and the box snaps back. The ticks share the mission operations' busy gate in both directions: a tick during a row operation is ignored — it would write to the node's pre-operation path — and the box snaps back the same way, while a tick's own writes hold the gate so no row operation can overtake them on the server and land the enable flag on whichever command slid into the ticked path. A row dims when it is itself disabled — a disabled command, or a section whose own flag is off — or when an ancestor command is disabled, which is how a disabled command greys its whole subtree while each descendant keeps its own state. The switch decides only whether the command runs: a disabled command stays fully editable. Layout Left Dock — both tree pages, one nav-bar button toggling the whole column Control Tree Expansion Row — collapses in place, keeping its header, which is the same page-neutral header on both pages; stays mounted while collapsed, so the tree keeps its scroll position and the run header keeps its shortcuts Run Header — Execution page only, pinned above the tree scroller and separated from it by a rule Execution Transport Bar — the six transport buttons; the strip scrolls horizontally when the column is narrower than it Execution Status Badge — the status label in its status colour; never shrinks Tree — the Execution page has two root rows, Mission above Program; the General Setup page has one, General Setup Drag Handle — on every mission command row, List rows included, immediately before the label. It is the first thing the row's own header renders, but the tree puts the expand arrow, on a row with children, and then the enable checkbox ahead of that header, so the handle sits to the checkbox's right rather than at the row's left edge. The Mission root row has none. While a drag is under way the dragged row dims, a line along the target row's top or bottom edge marks a before / after drop, and a tinted target row marks a drop into that list Node Row — the label is a real link to this node's ?tree= URL on the page, so the browser's context menu offers open-in-new-tab and copy-link; a plain left click keeps the in-app selection instead of navigating, while a modified or middle click opens a tab and leaves the current selection where it is. No node icons are rendered. Node CheckBox — mission command rows, and mission section rows carrying an enable flag Row Operations — on every mission command row, right-aligned: Move up, Move down, Duplicate and Delete. Absent from the layout at rest, so a resting label keeps the column's full width, and shown on the hovered row and on the selected row; on a device with no hover they are always shown. Move up is disabled on a list's first entry, Move down on its last, and all four while an operation is in flight Add Command — the + at the right edge of the Mission root row and of every List row, always visible, scoped to that row's list; disabled without an open project and while an operation is in flight. It opens the Add Command dialog — a search box over the command catalog, grouped by category, which fetches the catalog on every opening and accepts one pick per opening Spinner and “Loading project…” — shown instead of the tree until the first build lands Row Divider — a 5 px bar between the rows, shown only while both are open; dragging it upwards grows the editor row, which keeps a stored pixel height while the tree above absorbs the change, down to a 120 px editor floor and a 100 px tree floor Editor Expansion Row — its header carries the selection breadcrumb, the node path joined with slashes, and falls back to Editor; stays mounted while collapsed The selected node's editor panel, or “Select an item in the Control Tree to edit it here.” Content Column — General Setup page only, one nav-bar button The selected node's large content view, or “The selected item has no expanded content.” Both dock rows and both column widths are device-local browser preferences, shared by the two pages through one preferences module; each page keeps its own visibility record, and both pages share one expansion list because their id spaces do not overlap. Lifecycle The host is created while its page's script runs and provided before the dock mounts; the page's onMounted then awaits initialize(). That call connects the cleanup hub and builds the tree — on the equipment host, after re-indexing the machine tool, the workpiece and the fixture in that order — and finishes by adopting whatever the URL's ?tree= names. A loading flag is held for the whole call, which is what the tree and editor rows render their spinners from; later rebuilds mutate an already-populated tree and never re-enter it. A missing project, or a project without a fixture or workpiece, answers 404, and those are treated as empty states rather than errors, so no toast appears. Without an open project the Mission, Program and controller branches are still declared, as childless stems: their builders run only once a project is loaded. Because the layout keys its keep-alive wrapper on a project epoch, every page is destroyed and rebuilt when the project changes, and a host is therefore created once per project per page. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/components/controlTree/useControlTreeHost.ts — the host: the two scopes' root builders, the selection gate, the ?tree= sync, the mission ticks, the five mission row operations with their shared busy gate and id translation, the rebuild entry points, the re-index and Object-Management handlers, and the reactive surface the panes consume. wwwroot-src/src/components/controlTree/useMissionTreeDrag.ts — the drag-and-drop bookkeeping between mission rows: which rows drag, the drop mode from the pointer's position in the target row, and the row classes behind the drop indicators. wwwroot-src/src/components/controlTree/itemTypes.ts — the ControlNode and TreeItemDef shapes, the SlotCtx hooks, the structure-change payload, nodeDisplayLabel / nodeDisplayInfo, the geometry and transformer builders, the ITEM_TYPES map and buildSubtree. wwwroot-src/src/components/controlTree/ControlTreePanel.vue — the tree column: the Execution page's run header with the transport bar and the execution-status badge, the node anchors, the click handling that keeps a plain click in-app, the drag handles, the row operations, the Add Command + and the dialog it opens. wwwroot-src/src/components/execution/ExecutionToolBar.vue — the six transport buttons, and the F5–F8 shortcuts the sole instance registers. wwwroot-src/src/utils/executionStatusPresent.ts — the badge's status label and colour. wwwroot-src/src/components/controlTree/AddCommandDialog.vue — the search-first command picker over the server-served catalog. wwwroot-src/src/components/controlTree/ControlTreeDock.vue — the two-row dock and the height divider that sets the editor row's stored pixel height. wwwroot-src/src/components/controlTree/PrimarySlavePanel.vue — the panel host: the three inline root types, the registry lookup, the remount key and the gate registration. wwwroot-src/src/components/controlTree/ContentSlavePanel.vue — the General Setup content column and its unkeyed content panel. wwwroot-src/src/components/controlTree/GroupInfoPanel.vue — a group stem's intro and its navigating child list. wwwroot-src/src/components/controlTree/SoleEditorPanel.vue — a kind node's editor, resolved from the geometry and transformer editor maps. wwwroot-src/src/components/controlTree/NodeTabCascade.vue — the same branches rendered as nested tabs, with the remembered per-role tab and the cascade host injection. wwwroot-src/src/components/controlTree/missionItemTypes.ts — the Mission wave: node bookkeeping, the section table and its enable-flag readers and writers, the per-kind editors and display names. wwwroot-src/src/components/controlTree/programItemTypes.ts — the Program wave: the file tree from one response, and the writeback conversion nodes. wwwroot-src/src/components/controlTree/softNcItemTypes.ts — the controller wave: the two planes, the core leaves every runner grows, and the snapshot flags that decide which brand leaves join them. wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts — the Tool House wave and its tool- role paths. wwwroot-src/src/components/controlTree/runnerSuitItemTypes.ts — the two runner-suit leaves. wwwroot-src/src/components/controlTree/MissionRootPanel.vue — the Mission root's informational panel: the command count and the run-order hint. wwwroot-src/src/components/controlTree/ProgramRootPanel.vue — the Program root's summary panel and the refresh button that emits a payload-less structure-changed. wwwroot-src/src/components/controlTree/GeomCombinationTreePanel.vue — the combination's item list, whose add, remove and clear emit the same payload-less event. wwwroot-src/src/components/controlTree/MissionCommandSlavePanel.vue — a command's editor host: a List's Title field with its debounced save, and the only panel that exposes a dirty-switch gate. wwwroot-src/src/components/mission/ScriptCommandPanel.vue — the autosaving editor whose gate is forwarded, with its save / discard / cancel prompt. wwwroot-src/src/composables/useAutoSave.ts — the Script editor's autosave: the flush, the wait for a save on the wire, and the discard that sleeps the instance until the next edit. wwwroot-src/src/components/mission/NcCodeCommandPanel.vue — the second forwarded gate: the debounced field save it drains, and the unmount that cancels instead of flushing. wwwroot-src/src/components/mission/NcFileCommandPanel.vue — the one command editor that emits structure-changed, with the inserted range of its multi-pick. wwwroot-src/src/components/panels/PanelExpansion.vue — the expansion row both dock rows are built from. wwwroot-src/src/composables/useViewPrefs.ts — the device-local expansion list, last selections, dock sizes and the two runner-suit checkboxes. wwwroot-src/src/composables/useCleanupHub.ts — the key registration the builders call. wwwroot-src/src/router/treeRoutes.ts — the id migration hop and the page a given id belongs to. wwwroot-src/src/pages/ExecutionPage.vue — creates and provides the execution host. wwwroot-src/src/pages/GeneralSetupPage.vue — creates and provides the equipment host, and adds the content column. wwwroot-src/src/pages/ToolHousePage.vue — the registry consumer that renders tabs instead of a tree. wwwroot-src/src/layouts/MainLayout.vue — the project epoch that decides when a host is rebuilt. wwwroot-src/src/i18n/en/tree.ts — the dock labels, the group intros and the node role labels. See Also Tree Ids and Routes — how a node id becomes a URL, which page owns a given id, and how an older id keeps resolving Session State — the project epoch and the stores a host is rebuilt around Execution Page — the first live host: the run cockpit's Mission and Program branches General Setup Page — the second live host: the equipment branches and the content column Controller Branch — the one branch whose node set is not fixed: it is regrown from a snapshot, so which children exist depends on the controller in the project" + "summary": "Control Tree The Control Tree is the engine shared by the two tree-shaped pages of the web client: the Execution page at /execution and the General Setup page at /general-setup. Each page creates exactly one host — useControlTreeHost('execution') or useControlTreeHost('equipment') — provides it to its panes under one injection key, and the host owns everything after that: the node graph, the branch builders, the selection and the ?tree= query that carries it, the editor panel a selection resolves to, the mission enable ticks, and every structural operation on the Mission branch. The Tool House page at /tool-house reuses the same node shape and the same item-type registry but renders a branch as nested tabs and creates no host. Important Node ids are role paths, not identities that survive a version change. Anatomy makes no claim that a ?tree= id is stable across releases; see Tree Ids and Routes for the migration hop that keeps an older link resolving. The Node Every branch of every tree is built from one structure, ControlNode, declared in itemTypes.ts: id — the node's role path, slash-separated, whose first segment is the owning page's scope (execution/…, equipment/…, toolhouse/…). This is the addressing surface: the ?tree= query, the persisted expansion list and the persisted last selection all hold ids. The General Setup page's root carries its scope as its own id, equipment; the Execution page has no node with the bare execution id — its two roots are execution/mission and execution/program, and the segment is a scope key only. label, labelKey, labelParams — the display text; see Display Labels. itemType — the registry key that decides the node's editor and its child builder. key — the bound object. In the geometry and equipment branches it is an IndexService key, re-minted on every re-index; in the Mission branch it is the Mission API command path (0, 1, the dotted 0.2 of a nested list entry); in the Tool House branch it is the tool id as a string. Waves whose panels read a module-level state singleton rather than an indexed object leave it empty — the SoftNc controller leaves, the spindle sections, the Environment root's Ambient Temperature and Coolant leaves and the Program branch all do. ctx — the parent-provided SlotCtx: the afterChange commit chain, a slot's onCreate create-and-rebind hook, and a slot picker's allowedKinds / allowNone constraints. children — grown by the builders, not declared by the tree column. selectable, info / infoKey, and the mission / program bookkeeping records the Mission and Program waves stamp on their own nodes. The split between id and key is the load-bearing one. A key is re-minted every time the host re-indexes the model, so nothing durable may hang off it; an id names a role in the model and therefore survives a rebuild, which is why expansion state, the URL and the landing selection are all keyed on ids. Two id families are positional rather than role-based: Mission entries are ${parentId}/${index} and Program files are ${parentId}/${index}, so moving or deleting a mission command renumbers its siblings and a link to one names a position in the list rather than that command. The host keeps three id sets of its own that must follow the rows rather than the numbers — the persisted expansion list, the Add Command focus and the selection — and translates all three through every mission row operation it runs; see the row operations. The Item-Type Registry ITEM_TYPES maps an itemType string onto a TreeItemDef carrying up to three members: panel — the editor mounted in the dock's editor row for a node of this type. contentPanel — a large view for the General Setup page's content column. buildChildren — an async builder that returns this node's children. Two flavours of type share the map. Slot types (Geometry, Transformer) have a kind picker as their panel and grow at most one child, the concrete kind, at the kind-independent id ${slot.id}/type — so switching a slot's kind keeps both the selection and the expansion. A slot holding nothing grows no child at all, which for the four geometry slots whose picker offers None is an ordinary state rather than a failure. Kind types (Box3d, StaticTranslation, …) register SoleEditorPanel, which looks the concrete editor up in the geometry and transformer editor maps and binds it to the node's key. The two composite geometry kinds do not embed nested editors: TransformationGeom grows an inner-geometry and an inner-transformer slot, and GeomCombination grows one slot per item, so the tree owns the structure and every panel stays shallow. The map is one flat namespace assembled in itemTypes.ts: the Group stem type and the geometry, transformer, workpiece-leaf, thermal-condition and spindle entries are written inline, and five per-wave registries are spread in beside them. The Execution page's two roots are registry types — MissionRoot and ProgramRoot, from their waves — and no wrapper type stands over them. The three roots the panel host renders itself — Machine Tool, Fixture and Workpiece — have no entry here at all. Wave File What it contributes Mission missionItemTypes.ts MissionRoot, whose panel is informational — the command count and the run-order hint that names the row affordances; MissionCommand, whose panel is the kind's editor, or only a Title field for a List; MissionSection; section children at ${command.id}/${sectionId}; the per-kind bespoke editors, with a generic field editor as the fallback Program programItemTypes.ts ProgramRoot, ProgramFile, ProgramConversionFile; writeback conversions at ${root.id}/dst-${index} Tool House toolHouseItemTypes.ts the tool collection and the per-tool editor branches under toolhouse/tool-/… SoftNc controller softNcItemTypes.ts the controller root and its leaves on two planes — …/machine/ and …/program-data/ — a core every runner grows plus the brand-driven ones Runner suits runnerSuitItemTypes.ts CsvRunnerRoot and ClRunnerRoot, flat single-panel leaves with no builder The Program branch is fetched whole: its root builder takes one file-tree response plus one conversions response and stashes each file's raw subtree on the node, so the file nodes' builder only maps what is already in hand. The SoftNc branch is the opposite — its builder reads the runner snapshot once, and with no runner installed grows nothing at all. Where one resolves, the two plane stems appear over a fixed core that stands for every brand: six machine leaves, and Work Coordinates and Tool Offsets on the program-data plane. The leaves beside that core are the brand-driven ones — each appears only where the snapshot reports its backing table, so a brand switch changes which nodes exist. One flag does double duty: the Siemens $TC_DP flag adds its own two leaves and renames the core Tool Offsets leaf to its ISO G43 H reading, so the two offset ledgers do not read as one. The two runner-suit nodes are conditional, and the host — not the registry — decides. With a project open, a CSV or CL controller node is built when its Preference checkbox is on, or when the current ?tree= value starts with that node's id. The checkbox is device-local and off by default; the route is the only other reveal, deliberately not the persisted last selection, so a node switched off while it is selected does not resurrect itself. Stepping off comes first: when the selection sits on a node the user has just unchecked, the host re-points the URL at the page root before rebuilding. Building a Branch buildSubtree(node, services, depth) is the whole builder. It looks the node's type up, returns without touching children when the type declares no buildChildren or when depth has reached MAX_DEPTH (12, a guard against a self-referencing model), and otherwise awaits the builder, recurses into each returned child, and assigns the result. Building is eager: a branch is materialised in full at build time rather than lazily on expansion. Builders receive one service, registerKey, which registers a freshly minted IndexService key with the page's cleanup hub — see Webapi with Hub-Cleanup Assistance. rebuildBranch(node) is buildSubtree plus one thing: it adds the node's id to the expansion list so the fresh children are visible, and reports a failure as a toast named after the node's display label. The structure-changed event A panel that has changed the shape of the model emits structure-changed (or type-changed, wired to the same handler). The optional payload is a StructureChangeRequest: scopeId — the branch to rebuild. Without it the scope is the selected node itself, which is correct only while the change stays inside the emitting panel's own branch. selectId — the selection to adopt afterwards. It is assigned directly, bypassing the dirty-switch gate, because the emitting panel is being replaced on purpose. A null clears the selection. inserted — entries a panel inserted into a mission list itself: the list node's id, the child index the run starts at and its count. The host then treats the rebuild as a mission operation — it holds the busy gate and slides its index-based ids past the new siblings — rather than as a plain branch refresh. One command editor emits the event: the Program File editor, whose multi-pick turns every extra file into a new Program File command inserted right after it, in pick order; the command panel hosting it re-scopes the event to the parent list, keeps that command selected and passes the insert range along. Two panels emit it with no payload and so take the default scope, their own node: the Program root panel's refresh button, which re-reads the file tree from the current session and rebuilds the Program branch through rebuildBranch, so the branch opens under it; and the GeomCombination item panel after an item add, an item remove or a clear, since its item slots must be regrown. The controller brand switch and the runner's Object-Management install re-scope to the controller root. The Tool House type selectors and a flute add re-scope to their own node; everything that rewrites the tool collection — a new tool, a duplicate, a delete, an id rename, an Object-Management install — re-scopes to the tool-house root, and a flute delete re-scopes to its fluting parent. Every other structural change to the Mission branch is an operation of the host itself, not an event, because the tree rows are the only surface that offers it: Add Command, a drag between rows, Move up / Move down, Duplicate and Delete. A drag is HTML5 drag-and-drop between mission rows; every command row drags, the Mission root row only receives, and where the pointer sits in the target row decides the operation. A plain command row has no edge band: it splits at its midline, the upper half putting the dragged command before that row and the lower half after it — a reorder when both share a list, a relocation across lists otherwise. A List row keeps that before / after reading only in its top and bottom quarters; its middle half, and the whole of the Mission root row, take the command into that list, at the tail. A drop onto the dragged row's own subtree is refused, and a drop aborts when a rebuild mid-drag re-stamped the dragged node, since its id may then name another command. All five run through one helper that holds a busy gate (one operation at a time), runs the open panel's dirty-switch gate, calls the Mission API, translates the expansion list and the Add Command focus through the operation, rebuilds the branch of the list or lists it rewrote — the one list, or the nearest list above both ends of a cross-list drag — and only then translates the selection and names any post-operation selection, since the ids it names exist only after the rebuild. A refused gate drops the operation and says so in a notification (\"Cancelled — the open editor keeps its unsaved edits.\"); the delete's own confirm dialog runs before the gate, so a cancelled delete forces no save prompt on the open editor. The selection moves only when it rides on the acted-on row — that row itself, or a section or nested entry under it. Then it follows a stepped or dragged command, lands on the clone after a duplicate, and after a delete lands on the nearest remaining entry of that list, or on the list node itself once the list is empty. Otherwise the editor the user is in stays on its own, re-indexed row. Add Command never moves the selection: it reveals the new row and makes it the focus, so a run of adds lands in order. The focus is the command most recently selected — a section row counts for its owning command — or the last one added, and an Add Command from a list row's + inserts right after that focus when the focus is a direct entry of that list, and at the list's tail otherwise; the Mission root row's + therefore never chases a focus inside a nested list. Whole-tree rebuilds, and the refreshes that are not rebuilds rebuildTree() replaces the root array outright, and runs after an Object-Management swap of the machine tool or the fixture, after a blank machining chain is created, and after either runner-suit preference flips. On the execution host, an execution-status transition re-runs buildSubtree on the Program root directly rather than through rebuildBranch, so a run does not force that branch open on every transition. Two refreshes deliberately mutate existing nodes instead of rebuilding: A mission command's title is re-read from the entry list and written onto the node's label. A file-backed geometry leaf's label is re-read when its source file changes. The mission one exists because a rebuild of the Mission branch re-mints the per-build stamp that forms part of the editor's remount key, and remounting an open editor mid-edit would cost the user their cursor and any staged autosave. The geometry one is the same principle without the stamp: a title change and a source-file change alter no structure, so the label is all that has to move, and replacing the node under an open file editor would buy nothing. The commit chain The tree has no component bubbling, so the full post-edit commit chain lives on each node as ctx.afterChange, composed level by level as the branch is built. A GeomCombination item's chain cleans that combination's aggregated cache before running its parent's chain; the fixture's chain ends in a geometry-cache clear; the two workpiece geometry slots re-commit the swap-in before clearing their own cache, and skip that re-commit when the slot has been set to none; the fixture's two anchor transformers re-commit and then clear the geometry cache, while the workpiece's two re-commit and clear nothing, since a placement change invalidates no cached solid. Tool-house nodes all share one refresh. Every other family carries a no-op: the Mission, Program, spindle, SoftNc and thermal-condition nodes and the workpiece's Mesh and Material leaves have panels that write straight to the model, and the pages' canvases draw that model; the group stems and the Machine Tool and Workpiece roots have no field editor to commit for at all. Selection and the Dirty-Switch Gate Every selection change funnels through requestSelect(id). It returns immediately when the id is already selected; it refuses outright while a mission row operation, or a tick's own writes, are in flight — the operation ends by naming the post-operation selection, which would silently undo a change landed during its rebuild; otherwise it awaits the mounted panel's optional tryConsumeBeforeSwitch() and abandons the switch when that returns false. Three entrances use it: a click in the tree, a change to the URL's ?tree= value, and a select-node event from the mounted panel — the wire the panel host puts on every registry panel, so a group stem's child list and the Program branch's conversion jumps both arrive through that one. Two paths assign the selection directly and skip the gate: the selectId of a structure change, and the post-operation selection of a mission row operation, which has already run the gate itself. There is no “nothing selected” state. Re-clicking the selected row makes the tree yield null, and that is ignored; an empty ?tree= lands on the persisted last selection for that page when the built tree still contains it, and otherwise on the page's root — General Setup on the equipment host, and Mission, the first of its two roots, on the execution host. The editor row is therefore always alive, and reclaiming its height is the row's own collapse toggle rather than a deselection. The gate itself is registered by the panel host: the mounted registry panel is handed to the host through a template ref, and the host asks that instance for tryConsumeBeforeSwitch. Panels that write one field per request need no gate and register none. One panel exposes it — MissionCommandSlavePanel: on a list entry it waits for a title save already on the wire, then flushes the debounced title save while the command path is still live, and allows the switch only when that save landed; on any other entry it forwards its inner editor's gate. Two editors have one. The Script editor first lets a save already on the wire land, then with unsaved text asks save, discard or cancel: cancel returns false, discard reverts to the last confirmed text and puts the autosave to sleep until the next keystroke, and save proceeds only when the flush landed — a conflict answered with Cancel leaves the edit staged and the switch refused. The NC Code editor waits for a save on the wire, drains its debounced field save, and returns false when that save failed. The same gate runs before every mission row operation, not only before a selection change, because the operation's rebuild remounts the open editor and mission paths are index-based: a debounced save that outlived the remount would land on whichever command slid into the path it captured at mount. For the same reason both the NC Code editor and the list title cancel, never flush, on unmount. Display Labels nodeDisplayLabel(n) returns the translation of labelKey — with labelParams interpolated — when one is set, and the verbatim label otherwise. labelKey is therefore the form every role label the client translates itself takes, while label is the storage for text it cannot: server-composed mission titles, file-backed geometry paths and engine type names. The translator function is read inside the call rather than captured, so a language change re-renders the whole tree's role labels. Two labels are composed rather than looked up. A mission command's label is the title the server composes for it — the command's kind name in the request language, with the command's own text in brackets when there is one, as in Script [Warm-Up]. That title always arrives filled in, so the node's labelKey is always dropped and the tree's own kind-name fallback is a safety net that never fires in practice. Because titles are composed server-side per request, a language change also re-pulls the command entries and rewrites those labels in place. A file-backed geometry leaf carries its source file in brackets, so sibling instances read apart: StlFile [Geom/x.stl]. The voxel kind is renamed for display, appearing as MeshedGeomFile [...] rather than by its type name. Group stems take the same treatment for their intro text: infoKey wins over info, and a stem with neither falls back to a sentence naming the group. The Panel Host PrimarySlavePanel decides what the editor row shows, in this order: The three inline root types — MachineToolRoot, FixtureRoot, WorkpieceRoot — are rendered by the panel itself as a summary, and are never resolved from the registry. The two with a stand-alone file surface, Machine Tool and Fixture, carry an Object-Management button above it; the workpiece has none, since it is authored entirely through its child tree items. Otherwise the registry's panel for the selection's item type, mounted with the node as its only prop, with changed, type-changed, structure-changed, select-node and error wired to the host. A spinner while the first build is still running, and the select-an-item hint after that when the selection's type registers no panel. What decides a remount is the mounted component's key, ${id}|${key}|${stamp} — the node id, the node key, and the mission stamp where the node has one. So the editor remounts when the selection moves, when the bound object's key is re-minted, and when the Mission branch was rebuilt beneath it. That third term is exactly why the mission label refresh above mutates the node instead of rebuilding. The editor row carries nothing but the editor. The run controls sit in the tree pane instead: on the Execution page the Control Tree pane pins a run header above its tree scroller — the transport bar and the live execution-status badge — whatever the selection is. It rides the pane's content rather than the dock's expansion header because that header is the same component on General Setup, which renders neither piece. This is the page's sole ExecutionToolBar, so it owns the F5–F8 shortcuts, and because the dock keeps the tree pane mounted while its row is collapsed, a collapsed tree row does not drop them. When the tree column narrows, the six-button strip scrolls horizontally and the badge never shrinks, so the run state is the last thing a resize can hide. A pure Group stem is not a node without an editor. Group registers GroupInfoPanel, whose body is the stem's intro line followed by a clickable list of its children; a row click emits select-node and the host moves the selection there. The General Setup root, the two Anchor stems, the workpiece Material stem and the controller's two plane stems are all of this kind. The General Setup page adds a second slave, ContentSlavePanel, which resolves contentPanel from the same registry. Three item types declare one — the spindle root and its scalar and contour section types — and all three name the same contours view, so the charts stay mounted while the selection moves across the spindle branch: the component takes no props and is mounted unkeyed on purpose. Every other selection shows the column's empty hint. NodeTabCascade is the third consumer of the registry. It renders a branch as nested tabs rather than tree rows: the node's own panel on top, a single child inlined below it, several children as a dense tab strip in which only the active child mounts. The active tab is remembered per role path at module scope, with the per-tool segment wildcarded, so switching tools keeps every level's tab. Its panels report through an injected cascade host that carries the emitting node, because — unlike the tree's one-panel-at-a-time model — several panels are mounted at once. The Tick Column The tree runs a strict tick strategy, and a node hides its checkbox unless it is a mission command or a mission section that carries its own enable flag. Writing the ticked set walks every command node at any depth: a command whose state changed is PUT to the Mission API and, on success, has the new state copied onto its section children; a section whose state changed is dispatched to its kind's writer. A failed write raises a toast and leaves the model untouched, so the getter re-derives the old value and the box snaps back. The ticks share the mission operations' busy gate in both directions: a tick during a row operation is ignored — it would write to the node's pre-operation path — and the box snaps back the same way, while a tick's own writes hold the gate so no row operation can overtake them on the server and land the enable flag on whichever command slid into the ticked path. A row dims when it is itself disabled — a disabled command, or a section whose own flag is off — or when an ancestor command is disabled, which is how a disabled command greys its whole subtree while each descendant keeps its own state. The switch decides only whether the command runs: a disabled command stays fully editable. Layout Left Dock — both tree pages, one nav-bar button toggling the whole column Control Tree Expansion Row — collapses in place, keeping its header, which is the same page-neutral header on both pages; stays mounted while collapsed, so the tree keeps its scroll position and the run header keeps its shortcuts Run Header — Execution page only, pinned above the tree scroller and separated from it by a rule Execution Transport Bar — the six transport buttons; the strip scrolls horizontally when the column is narrower than it Execution Status Badge — the status label in its status colour; never shrinks Tree — the Execution page has two root rows, Mission above Program; the General Setup page has one, General Setup Drag Handle — on every mission command row, List rows included, immediately before the label. It is the first thing the row's own header renders, but the tree puts the expand arrow, on a row with children, and then the enable checkbox ahead of that header, so the handle sits to the checkbox's right rather than at the row's left edge. The Mission root row has none. While a drag is under way the dragged row dims, a line along the target row's top or bottom edge marks a before / after drop, and a tinted target row marks a drop into that list Node Row — the label is a real link to this node's ?tree= URL on the page, so the browser's context menu offers open-in-new-tab and copy-link; a plain left click keeps the in-app selection instead of navigating, while a modified or middle click opens a tab and leaves the current selection where it is. No node icons are rendered. Node CheckBox — mission command rows, and mission section rows carrying an enable flag Row Operations — on every mission command row, right-aligned: Move up, Move down, Duplicate and Delete. Absent from the layout at rest, so a resting label keeps the column's full width, and shown on the hovered row and on the selected row; on a device with no hover they are always shown. Move up is disabled on a list's first entry, Move down on its last, and all four while an operation is in flight Add Command — the + at the right edge of the Mission root row and of every List row, always visible, scoped to that row's list; disabled without an open project and while an operation is in flight. It opens the Add Command dialog — a search box over the command catalog, grouped by category, which fetches the catalog on every opening and accepts one pick per opening Spinner and “Loading project…” — shown instead of the tree until the first build lands Row Divider — a 5 px bar between the rows, shown only while both are open; dragging it upwards grows the editor row, which keeps a stored pixel height while the tree above absorbs the change, down to a 120 px editor floor and a 100 px tree floor Editor Expansion Row — its header carries the selection breadcrumb, the node path joined with slashes, and falls back to Editor; stays mounted while collapsed The selected node's editor panel, or “Select an item in the Control Tree to edit it here.” Content Column — General Setup page only, one nav-bar button The selected node's large content view, or “The selected item has no expanded content.” Both dock rows and both column widths are device-local browser preferences, shared by the two pages through one preferences module; each page keeps its own visibility record, and both pages share one expansion list because their id spaces do not overlap. Lifecycle The host is created while its page's script runs and provided before the dock mounts; the page's onMounted then awaits initialize(). That call connects the cleanup hub and builds the tree — on the equipment host, after re-indexing the machine tool, the workpiece and the fixture in that order — and finishes by adopting whatever the URL's ?tree= names. A loading flag is held for the whole call, which is what the tree and editor rows render their spinners from; later rebuilds mutate an already-populated tree and never re-enter it. A missing project, or a project without a fixture or workpiece, answers 404, and those are treated as empty states rather than errors, so no toast appears. Without an open project the Mission, Program and controller branches are still declared, as childless stems: their builders run only once a project is loaded. Because the layout keys its keep-alive wrapper on a project epoch, every page is destroyed and rebuilt when the project changes, and a host is therefore created once per project per page. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/components/controlTree/useControlTreeHost.ts — the host: the two scopes' root builders, the selection gate, the ?tree= sync, the mission ticks, the five mission row operations with their shared busy gate and id translation, the rebuild entry points, the re-index and Object-Management handlers, and the reactive surface the panes consume. wwwroot-src/src/components/controlTree/useMissionTreeDrag.ts — the drag-and-drop bookkeeping between mission rows: which rows drag, the drop mode from the pointer's position in the target row, and the row classes behind the drop indicators. wwwroot-src/src/components/controlTree/itemTypes.ts — the ControlNode and TreeItemDef shapes, the SlotCtx hooks, the structure-change payload, nodeDisplayLabel / nodeDisplayInfo, the geometry and transformer builders, the ITEM_TYPES map and buildSubtree. wwwroot-src/src/components/controlTree/ControlTreePanel.vue — the tree column: the Execution page's run header with the transport bar and the execution-status badge, the node anchors, the click handling that keeps a plain click in-app, the drag handles, the row operations, the Add Command + and the dialog it opens. wwwroot-src/src/components/execution/ExecutionToolBar.vue — the six transport buttons, and the F5–F8 shortcuts the sole instance registers. wwwroot-src/src/utils/executionStatusPresent.ts — the badge's status label and colour. wwwroot-src/src/components/controlTree/AddCommandDialog.vue — the search-first command picker over the server-served catalog. wwwroot-src/src/components/controlTree/ControlTreeDock.vue — the two-row dock and the height divider that sets the editor row's stored pixel height. wwwroot-src/src/components/controlTree/PrimarySlavePanel.vue — the panel host: the three inline root types, the registry lookup, the remount key and the gate registration. wwwroot-src/src/components/controlTree/ContentSlavePanel.vue — the General Setup content column and its unkeyed content panel. wwwroot-src/src/components/controlTree/GroupInfoPanel.vue — a group stem's intro and its navigating child list. wwwroot-src/src/components/controlTree/SoleEditorPanel.vue — a kind node's editor, resolved from the geometry and transformer editor maps. wwwroot-src/src/components/controlTree/NodeTabCascade.vue — the same branches rendered as nested tabs, with the remembered per-role tab and the cascade host injection. wwwroot-src/src/components/controlTree/missionItemTypes.ts — the Mission wave: node bookkeeping, the section table and its enable-flag readers and writers, the per-kind editors and display names. wwwroot-src/src/components/controlTree/programItemTypes.ts — the Program wave: the file tree from one response, and the writeback conversion nodes. wwwroot-src/src/components/controlTree/softNcItemTypes.ts — the controller wave: the two planes, the core leaves every runner grows, and the snapshot flags that decide which brand leaves join them. wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts — the Tool House wave and its tool- role paths. wwwroot-src/src/components/controlTree/runnerSuitItemTypes.ts — the two runner-suit leaves. wwwroot-src/src/components/controlTree/MissionRootPanel.vue — the Mission root's informational panel: the command count and the run-order hint. wwwroot-src/src/components/controlTree/ProgramRootPanel.vue — the Program root's summary panel and the refresh button that emits a payload-less structure-changed. wwwroot-src/src/components/controlTree/GeomCombinationTreePanel.vue — the combination's item list, whose add, remove and clear emit the same payload-less event. wwwroot-src/src/components/controlTree/MissionCommandSlavePanel.vue — a command's editor host: a List's Title field with its debounced save, and the only panel that exposes a dirty-switch gate. wwwroot-src/src/components/mission/ScriptCommandPanel.vue — the autosaving editor whose gate is forwarded, with its save / discard / cancel prompt. wwwroot-src/src/composables/useAutoSave.ts — the Script editor's autosave: the flush, the wait for a save on the wire, and the discard that sleeps the instance until the next edit. wwwroot-src/src/components/mission/NcCodeCommandPanel.vue — the second forwarded gate: the debounced field save it drains, and the unmount that cancels instead of flushing. wwwroot-src/src/components/mission/NcFileCommandPanel.vue — the one command editor that emits structure-changed, with the inserted range of its multi-pick. wwwroot-src/src/components/panels/PanelExpansion.vue — the expansion row both dock rows are built from. wwwroot-src/src/composables/useViewPrefs.ts — the device-local expansion list, last selections, dock sizes and the two runner-suit checkboxes. wwwroot-src/src/composables/useCleanupHub.ts — the key registration the builders call. wwwroot-src/src/router/treeRoutes.ts — the id migration hop and the page a given id belongs to. wwwroot-src/src/pages/ExecutionPage.vue — creates and provides the execution host. wwwroot-src/src/pages/GeneralSetupPage.vue — creates and provides the equipment host, and adds the content column. wwwroot-src/src/pages/ToolHousePage.vue — the registry consumer that renders tabs instead of a tree. wwwroot-src/src/layouts/MainLayout.vue — the project epoch that decides when a host is rebuilt. wwwroot-src/src/i18n/en/tree.ts — the dock labels, the group intros and the node role labels. See Also Tree Ids and Routes — how a node id becomes a URL, which page owns a given id, and how an older id keeps resolving Session State — the project epoch and the stores a host is rebuilt around Execution Page — the first live host: the run cockpit's Mission and Program branches General Setup Page — the second live host: the equipment branches and the content column Controller Branch — the one branch whose node set is not fixed: it is regrown from a snapshot, so which children exist depends on the controller in the project" }, "anatomy/platform/i18n.html": { "href": "anatomy/platform/i18n.html", @@ -362,7 +362,7 @@ "anatomy/platform/tree-ids-and-routes.html": { "href": "anatomy/platform/tree-ids-and-routes.html", "title": "Tree Ids and Routes | HiAPI-C# 2025", - "summary": "Tree Ids and Routes The web client addresses itself with two things: a vue-router path, and — on the two Control-Tree pages — a tree query argument naming the selected tree node, as in /general-setup?tree=equipment/fixture/geometry. This page is the reference for both surfaces: the route table, the redirect-only paths that keep older bookmarks resolving, the id-migration chain, and the resolver that decides which page owns a given ?tree= id. The router runs in HTML5 history mode, so every one of these paths is a real URL the server has to answer. Important Nothing here promises that a Control-Tree id is stable. The guarantee is narrower and exact: an id keeps resolving, because every regroup adds a migration hop to migrateLegacyTreeId rather than rewriting the previous one. The ids themselves have moved repeatedly, and a page that quotes one is quoting a value that can move again. The Route Table / is the shell-layout record itself; every route below it except the login and catch-all records is one of its children, so each renders inside the Main Panel's frame and menu bar. Path Route name What it owns / — The shell layout. It carries no page of its own; its empty child redirects to the Execution route. /execution execution The run cockpit and the Execution Control Tree, whose selection rides ?tree=execution/…. /general-setup general-setup The equipment Control Tree, whose selection rides ?tree=equipment/…. /machine-tool machine-tool The machining chain on a canvas of its own, beside a left column that shows either a read-only identity panel or the chain's XML source — two states of one column, chosen with a GUI/XML toggle. A load button installs a chain file into the project. Carries no Page-menu entry and is reached by URL. /tool-house/:toolId(\\d+)?/:tab?/:subtab? tool-house The tool library and the per-tool editor. The three optional segments carry the selected tool and the two nested tab levels. /preference/log preference-log The Log Viewer, reached from the menu bar's Show Log button. It is not under /util/. /util/file-explorer/:location(.*)* util-file-explorer The File Explorer. Its catch-all mirrors the browsed location — root display name followed by the relative segments — into the path. /util/mech-builder util-mech-builder The Mechanism Builder. /login login The sign-in form. It sits outside the shell layout and carries its own Quasar layout. /:catchAll(.*)* — The 404 page, likewise outside the shell layout: it prints the unmatched full path and offers one button back to the Execution route. The menu bar's Page dropdown holds every one of these that is menu-reachable, in setup order: Tool House, General Setup and Execution, then File Explorer and Mechanism Builder below a separator. The Log Viewer has a button of its own rather than a menu entry, and /machine-tool has neither — it is reached by URL. The Tool House route's tool segment is constrained to digits, but all three of its segments are optional, so a non-numeric segment in the tool position is not rejected: the router skips the tool parameter and reads that segment as the tab, which is what makes /tool-house/cutter a working tab deep link with no tool named. The consequence is that the record absorbs three segments when the first is a number and only two when it is not, and a URL carrying more than the record can absorb — /tool-house/abc/def/ghi — falls through to the catch-all. An unrecognised tab name is not an error either: the page canonicalises it to that level's default, as The Tool House Translation sets out. Redirect-Only Paths These records carry no component. They exist so that a link minted before the corresponding editor moved into a Control Tree still lands on the editor. Path Lands on /controller/:rest(.*)* /general-setup?tree=equipment/controller — any trailing path is discarded, the retired Controller page's / segment included, so every form lands on the branch root. /spindle-capability/:tab? /general-setup?tree=equipment/spindle, with / appended when the segment is one of thermal, gear-shift, dry-run, power, torque. An unrecognised segment is dropped and the branch root is selected. /equipment/spindle /general-setup?tree=equipment/spindle /fixture/:rest(.*)* /general-setup?tree=equipment/fixture — any trailing path is discarded. /workpiece/:rest(.*)* /general-setup?tree=equipment/workpiece — any trailing path is discarded. /equipment/background-coolant /general-setup?tree=equipment/background. Background and Coolant are two separate tree nodes; the redirect picks Background. /mission /execution?tree=execution/mission The five spindle tab names are declared in treeRoutes.ts as SPINDLE_TABS, and imported by wwwroot-src/src/router/routes.ts — which is the list the redirect tests its :tab? segment against. The equipment tree does not import that constant: it spells the same five segments as literals while building the equipment/spindle/ children, so redirect and branch agree by convention rather than through a shared list — renaming a spindle section is therefore an edit in two places. The Tool House name lists below are the other case, genuinely shared. The ?tree= Query Selection and URL are synced two ways by the Control-Tree host, one instance per tree page. URL to selection. A watcher on the query drives applyRouteSelection(), and it is registered immediate, so an id belonging to another page redirects on the first tick rather than after this page's first tree build. The host also calls the same function once the tree has actually been built, which is when a deep link can finally be honoured. Selection to URL. A watcher on the selected id replaces the tree argument, preserving the rest of the query. It uses router.replace, so browsing the tree does not fill the browser's history with one entry per node. The comparison that breaks the loop is made against the raw query rather than the migrated form, which is what makes an older id canonicalise: opening ?tree=controller selects the node and then rewrites the URL to ?tree=equipment/controller. Neither watcher touches the URL unless the current route name is the page's own. The shell layout keeps every visited page alive, so a host whose page is not showing keeps receiving route changes, and without the guard it would write another page's URL. The selection watcher does one thing before that guard: it records the id as this page's last selection. That ordering is load-bearing, because a selection can move while its page is off screen — unticking a CSV or CL Controller checkbox steps the equipment host off that node onto the equipment root, and the Preference menu that carries those checkboxes is open on every page — and the landing selection has to have followed it. That same checkbox flip is a third writer of the tree argument, and the one place the guard is absent. The equipment host watches both checkboxes, and when the standing selection is a node the flip removes, it replaces tree with equipment — the rest of the query preserved — before stepping the selection off. The route name is not consulted there, so the replacement goes to whichever route is showing. What applyRouteSelection Does The change is ignored unless this page owns the current route. The raw query is migrated into today's id. If its first segment names a different page and that segment is one of the known roots, the location is replaced with the route that owns it and the pass stops. An empty query falls back to the landing selection: the persisted last id for this page when that id exists in the tree just built, otherwise the page's root node — which is always present once the tree is built, so the editor column always has something to show. An id the built tree does not contain is ignored — the current selection stands and the URL keeps the unrecognised value until the next selection overwrites it. This is deliberate: the redirect in step 2 fires only for known roots, because sending an unroutable id back to the same page would loop. Otherwise every ancestor prefix of the id is added to the expanded set so the node is visible, and the selection is requested through the same gate a tree click uses. A panel holding unsaved edits may refuse the switch, and a refusal re-points the URL at the selection that actually stands. The Id the URL Names, Before the Tree Exists treePathOfRoute() — the raw query put through migrateLegacyTreeId — is not read only by the selection logic. The equipment tree consults it while it is being built, to decide whether to materialise the CSV Controller and CL Controller nodes: each is normally shown only when its Preference checkbox is ticked, and a URL naming one reveals it regardless. That reveal has to happen at build time precisely because step 4 above refuses an id the built tree lacks, so a bookmark to a switched-off node would otherwise dead-end. Only the URL reveals a node this way; the persisted last selection does not, so a node the user has just unticked while standing on it does not resurrect itself. Id Migration migrateLegacyTreeId is one pass of ordered guards over the whole id; the first that matches returns, and an id matching none is returned unchanged. An id shaped like Becomes controller, controller/… equipment/controller, equipment/controller/… spindle, spindle/… equipment/spindle, equipment/spindle/… mission, mission/… execution/mission, execution/mission/… equipment/mission, equipment/mission/… execution/mission, execution/mission/… any id ending in /contours/tray, or containing /contours/tray/ the same id with that segment spelled fluting The last rule renames one segment in place and leaves its children — baseline, flute-, side, bottom — untouched, so a deep link into a flute contour survives the engine's Fluting type naming. The two mission rules cover the two id shapes separately rather than chaining, because the first matching guard returns. The function is applied at four points, which is what makes the guarantee hold in practice: to the raw ?tree= query, on every read; to the persisted last selection, before it is looked up in the tree; to the persisted list of expanded node ids, once when a host is constructed, so an older expansion set still unfolds the branches it names; as the first step of routeForTreeId, so the id-to-page resolver never sees an unmigrated id. Note what the first rule implies: a bare ?tree=controller selects the equipment/controller branch — the controller editor on the General Setup page — and the redirect-only /controller path above lands on the same branch, so a bookmark from the retired Controller page's era resolves in either form. Landing an Id on Its Page TREE_PAGE_ROOTS lists the first segments that name a page: execution, equipment and toolhouse. spindle is absent on purpose — migration folds it into equipment/… before any root check runs, so no root check ever sees it. routeForTreeId migrates the id, then dispatches on its first segment: toolhouse — the Tool House route, with the id's segments translated into path params (below). equipment — the General Setup route, carrying the migrated id as ?tree=. anything else — the Execution route, carrying the migrated id as ?tree=. This is a fall-through, not a test for execution, so an unrecognised id handed to this function lands on the Execution page. Reaching it with a genuinely unroutable id is prevented upstream: the host calls the function only for ids whose root is in TREE_PAGE_ROOTS. The returned location replaces the whole current location. Only the tree argument survives the hop; any other query argument on the URL being redirected away from is dropped, and the Tool House form carries no query at all. The Tool House Translation The Tool House page keeps its state in path segments rather than a query, so an id arriving from another page has to be translated. routeForTreeId walks the segments of toolhouse/tool-//: segment two contributes toolId when it is tool- followed by an integer; segment three contributes tab when it is one of general, cutter, holder, clamping, intelligent; segment four contributes subtab when it is one of the cutter sections — material, profile, contours, upper-beam, opt — or one of the holder sections, geometry and resolution. Only the sub-tab step is nested inside the tab step: an unrecognised tab discards the sub-tab with it, whereas the tool step is tested on its own, so a second segment that is not tool- costs the toolId param alone and the tab still translates. Everything deeper than the last segment the URL can carry is discarded either way — an id pointing at a single flute contour under …/cutter/contours/fluting/… lands on the nearest tab the URL can express. The same three name lists are imported by the page itself, so the tab set and the translation cannot drift apart. Once on the page, the tab segments are kept in step with the tabs by useRouteTabs, a composable whose only consumer this page is. It gives each tab level one route param, a valid-name set and a default; a nested level may declare which parent values make it apply, and while its parent is something else the level is dormant — its segment is dropped from the URL while its reference quietly remembers the last value, so returning to that parent tab returns to the sub-tab it had. The Tool House sub-tab level applies under cutter and holder only, and both its valid set and its default depend on which of the two is showing. A segment the level does not recognise resolves to that default rather than failing. Canonicalisation runs on the first mount and on every keep-alive re-entry, which is why a bare /tool-house acquires its tab segments. The tool segment is not one of the composable's levels: the page fills it in itself, adopting the URL's tool when the project holds it and the first tool in the list otherwise, then replacing the URL with what it adopted. That resolver reacts to the toolId param and to the tool list rather than to page activation, so it also re-points the URL when the list changes underneath it. The Tool House page never reads or writes ?tree=. A toolhouse/… id reaches it only by way of the redirect above, which is issued by one of the two tree pages' hosts. Reading an Id An id's first segment names the page that owns it, and therefore the folder that documents it: ?tree= root Route Documented under execution/… /execution Execution Page equipment/… /general-setup General Setup Page toolhouse/… /tool-house/… Tool House Page The remaining segments are the branch path, one segment per level of the tree, and the branch's own page sits in that folder — equipment/workpiece/material/cutting-parameter is the Cutting Parameter item of the Workpiece branch on the General Setup page. Most segments are kebab-case role names; the two list-backed branches, Mission entries and Program files, use a positional index instead. Every segment comes from the node id, never from the label the user reads: the General Setup page's root node is labelled General Setup and carries the id equipment. A label is a display string — the translation of the node's labelKey where it has one, and otherwise raw data such as an NC file name or a mission command's user-typed title, as Control Tree sets out — while an id is neither translated nor taken from data. Two consequences follow. A ?tree= link is locale-independent, and an id can never be read off what is on screen. Titles A route's meta.title holds an i18n key, such as routes.execution, not a title. The router resolves it through the active locale in an afterEach hook and sets the document title to the translated name followed by - HiNC; a route with no key — the catch-all — leaves the bare product name. The sibling name: is the route id used by every programmatic navigation and is never translated; the two must not be confused, which is why the route table above lists them side by side. The same resolver is handed to the i18n module through registerRetitle, so that switching language re-titles a parked tab without a navigation. The registration is indirect because the router already imports the i18n module for its translation function, and importing back would close a cycle. Serving These URLs History mode means the browser sends the whole path to the server on a refresh or a pasted link, so the back end maps two SPA fallbacks. The bare fallback carries an implicit constraint that rejects any URL whose last segment contains a dot, which is exactly the shape a File Explorer deep link takes, since those mirror real file names. An explicit fallback for the explorer's path is therefore mapped ahead of it with no such constraint. Static assets cannot be shadowed by either, because static-file serving runs earlier in the pipeline. Both fallbacks allow anonymous access, so the SPA itself always loads and the sign-in decision is made in the client. That decision is a navigation guard: it hydrates the authentication status once, lets every navigation through when the back end reports the feature disabled, and otherwise sends an unauthenticated visitor to the login route with the original full path — ?tree= included — parked in a redirect query. A successful sign-in replays that path as a full page load rather than a router navigation, so the application re-initialises with the cookie present. A visitor who is already signed in, or who arrives while the feature is off, is sent straight back out of the login route to the same parked path. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/router/routes.ts — the route table, the redirect-only records, the login route outside the shell layout, and the trailing catch-all. wwwroot-src/src/router/treeRoutes.ts — migrateLegacyTreeId, TREE_PAGE_ROOTS, routeForTreeId, the three tab-name lists it shares with the Tool House page, and SPINDLE_TABS, which only the spindle redirect reads. wwwroot-src/src/router/index.ts — the history-mode router factory, the authentication guard, and the retitle hook registered with the i18n module. wwwroot-src/src/components/controlTree/useControlTreeHost.ts — the tree-page host: rawTreePathOfRoute, treePathOfRoute, the two selection/URL watchers and the unguarded controller-checkbox watcher beside them, landingSelection, applyRouteSelection and syncUrlBack, plus the build-time reveal of a URL-named CSV or CL controller node. wwwroot-src/src/composables/useRouteTabs.ts — the tab-to-param sync the Tool House route uses, including dormant levels and the keep-alive re-entry canonicalisation. wwwroot-src/src/pages/ToolHousePage.vue — consumes the shared tab lists, resolves the tool from its path param, and navigates by route name when the tool changes. wwwroot-src/src/pages/FileExplorerPage.vue — mirrors the browsed location into the route's catch-all param and back. wwwroot-src/src/pages/MachineToolPage.vue — the component behind the URL-only machine-tool route. wwwroot-src/src/pages/NotFoundPage.vue — the catch-all component, carrying its own layout. wwwroot-src/src/pages/LoginPage.vue — reads the guard's redirect argument and replays it. wwwroot-src/src/composables/useViewPrefs.ts — the browser-local store holding the per-page last selected id and the expanded-node list that migration is applied to. wwwroot-src/src/components/AppMenuBar.vue — the menu entries that navigate by route name. wwwroot-src/src/i18n/en/routes.ts — the English strings the meta.title keys resolve to. wwwroot-src/src/i18n/index.ts — registerRetitle and the locale switch that calls it. wwwroot-src/quasar.config.ts — selects history mode and names the build output folder the server serves. Program.cs — the two SPA fallbacks, the explorer-specific one ahead of the bare one. See Also Control Tree — the tree these ids name: how a node id is formed and what a branch is made of Main Panel — the shell whose menus navigate to these routes and whose keep-alive cache makes the route-name guards necessary Execution Page — the busiest consumer of ?tree=, and the page a fall-through id lands on" + "summary": "Tree Ids and Routes The web client addresses itself with two things: a vue-router path, and — on the two Control-Tree pages — a tree query argument naming the selected tree node, as in /general-setup?tree=equipment/fixture/geometry. This page is the reference for both surfaces: the route table, the redirect-only paths that keep older bookmarks resolving, the id-migration chain, and the resolver that decides which page owns a given ?tree= id. The router runs in HTML5 history mode, so every one of these paths is a real URL the server has to answer. Important Nothing here promises that a Control-Tree id is stable. The guarantee is narrower and exact: an id keeps resolving, because every regroup adds a migration hop to migrateLegacyTreeId rather than rewriting the previous one. The ids themselves have moved repeatedly, and a page that quotes one is quoting a value that can move again. The Route Table / is the shell-layout record itself; every route below it except the login and catch-all records is one of its children, so each renders inside the Main Panel's frame and menu bar. Path Route name What it owns / — The shell layout. It carries no page of its own; its empty child redirects to the Execution route. /execution execution The run cockpit and the Execution Control Tree, whose selection rides ?tree=execution/…. /general-setup general-setup The equipment Control Tree, whose selection rides ?tree=equipment/…. /machine-tool machine-tool The machining chain on a canvas of its own, beside a left column that shows either a read-only identity panel or the chain's XML source — two states of one column, chosen with a GUI/XML toggle. A load button installs a chain file into the project. Carries no Page-menu entry and is reached by URL. /tool-house/:toolId(\\d+)?/:tab?/:subtab? tool-house The tool library and the per-tool editor. The three optional segments carry the selected tool and the two nested tab levels. /preference/log preference-log The Log Viewer, reached from the menu bar's Show Log button. It is not under /util/. /util/file-explorer/:location(.*)* util-file-explorer The File Explorer. Its catch-all mirrors the browsed location — root display name followed by the relative segments — into the path. /util/mech-builder util-mech-builder The Mechanism Builder. /login login The sign-in form. It sits outside the shell layout and carries its own Quasar layout. /:catchAll(.*)* — The 404 page, likewise outside the shell layout: it prints the unmatched full path and offers one button back to the Execution route. The menu bar's Page dropdown holds every one of these that is menu-reachable, in setup order: Tool House, General Setup and Execution, then File Explorer and Mechanism Builder below a separator. The Log Viewer has a button of its own rather than a menu entry, and /machine-tool has neither — it is reached by URL. The Tool House route's tool segment is constrained to digits, but all three of its segments are optional, so a non-numeric segment in the tool position is not rejected: the router skips the tool parameter and reads that segment as the tab, which is what makes /tool-house/cutter a working tab deep link with no tool named. The consequence is that the record absorbs three segments when the first is a number and only two when it is not, and a URL carrying more than the record can absorb — /tool-house/abc/def/ghi — falls through to the catch-all. An unrecognised tab name is not an error either: the page canonicalises it to that level's default, as The Tool House Translation sets out. Redirect-Only Paths These records carry no component. They exist so that a link minted before the corresponding editor moved into a Control Tree still lands on the editor. Path Lands on /controller/:rest(.*)* /general-setup?tree=equipment/controller — any trailing path is discarded, the retired Controller page's / segment included, so every form lands on the branch root. /spindle-capability/:tab? /general-setup?tree=equipment/spindle, with / appended when the segment is one of thermal, gear-shift, dry-run, power, torque. An unrecognised segment is dropped and the branch root is selected. /equipment/spindle /general-setup?tree=equipment/spindle /fixture/:rest(.*)* /general-setup?tree=equipment/fixture — any trailing path is discarded. /workpiece/:rest(.*)* /general-setup?tree=equipment/workpiece — any trailing path is discarded. /equipment/background-coolant /general-setup?tree=equipment/background. That id is the Environment root over the Ambient Temperature and Coolant leaves (equipment/background/environment-temperature, equipment/background/coolant); the redirect lands on the root (the ids and the route keep the legacy background spelling). /mission /execution?tree=execution/mission The five spindle tab names are declared in treeRoutes.ts as SPINDLE_TABS, and imported by wwwroot-src/src/router/routes.ts — which is the list the redirect tests its :tab? segment against. The equipment tree does not import that constant: it spells the same five segments as literals while building the equipment/spindle/ children, so redirect and branch agree by convention rather than through a shared list — renaming a spindle section is therefore an edit in two places. The Tool House name lists below are the other case, genuinely shared. The ?tree= Query Selection and URL are synced two ways by the Control-Tree host, one instance per tree page. URL to selection. A watcher on the query drives applyRouteSelection(), and it is registered immediate, so an id belonging to another page redirects on the first tick rather than after this page's first tree build. The host also calls the same function once the tree has actually been built, which is when a deep link can finally be honoured. Selection to URL. A watcher on the selected id replaces the tree argument, preserving the rest of the query. It uses router.replace, so browsing the tree does not fill the browser's history with one entry per node. The comparison that breaks the loop is made against the raw query rather than the migrated form, which is what makes an older id canonicalise: opening ?tree=controller selects the node and then rewrites the URL to ?tree=equipment/controller. Neither watcher touches the URL unless the current route name is the page's own. The shell layout keeps every visited page alive, so a host whose page is not showing keeps receiving route changes, and without the guard it would write another page's URL. The selection watcher does one thing before that guard: it records the id as this page's last selection. That ordering is load-bearing, because a selection can move while its page is off screen — unticking a CSV or CL Controller checkbox steps the equipment host off that node onto the equipment root, and the Preference menu that carries those checkboxes is open on every page — and the landing selection has to have followed it. That same checkbox flip is a third writer of the tree argument, and the one place the guard is absent. The equipment host watches both checkboxes, and when the standing selection is a node the flip removes, it replaces tree with equipment — the rest of the query preserved — before stepping the selection off. The route name is not consulted there, so the replacement goes to whichever route is showing. What applyRouteSelection Does The change is ignored unless this page owns the current route. The raw query is migrated into today's id. If its first segment names a different page and that segment is one of the known roots, the location is replaced with the route that owns it and the pass stops. An empty query falls back to the landing selection: the persisted last id for this page when that id exists in the tree just built, otherwise the page's root node — which is always present once the tree is built, so the editor column always has something to show. An id the built tree does not contain is ignored — the current selection stands and the URL keeps the unrecognised value until the next selection overwrites it. This is deliberate: the redirect in step 2 fires only for known roots, because sending an unroutable id back to the same page would loop. Otherwise every ancestor prefix of the id is added to the expanded set so the node is visible, and the selection is requested through the same gate a tree click uses. A panel holding unsaved edits may refuse the switch, and a refusal re-points the URL at the selection that actually stands. The Id the URL Names, Before the Tree Exists treePathOfRoute() — the raw query put through migrateLegacyTreeId — is not read only by the selection logic. The equipment tree consults it while it is being built, to decide whether to materialise the CSV Controller and CL Controller nodes: each is normally shown only when its Preference checkbox is ticked, and a URL naming one reveals it regardless. That reveal has to happen at build time precisely because step 4 above refuses an id the built tree lacks, so a bookmark to a switched-off node would otherwise dead-end. Only the URL reveals a node this way; the persisted last selection does not, so a node the user has just unticked while standing on it does not resurrect itself. Id Migration migrateLegacyTreeId is one pass of ordered guards over the whole id; the first that matches returns, and an id matching none is returned unchanged. An id shaped like Becomes controller, controller/… equipment/controller, equipment/controller/… spindle, spindle/… equipment/spindle, equipment/spindle/… mission, mission/… execution/mission, execution/mission/… equipment/mission, equipment/mission/… execution/mission, execution/mission/… any id ending in /contours/tray, or containing /contours/tray/ the same id with that segment spelled fluting The last rule renames one segment in place and leaves its children — baseline, flute-, side, bottom — untouched, so a deep link into a flute contour survives the engine's Fluting type naming. The two mission rules cover the two id shapes separately rather than chaining, because the first matching guard returns. The function is applied at four points, which is what makes the guarantee hold in practice: to the raw ?tree= query, on every read; to the persisted last selection, before it is looked up in the tree; to the persisted list of expanded node ids, once when a host is constructed, so an older expansion set still unfolds the branches it names; as the first step of routeForTreeId, so the id-to-page resolver never sees an unmigrated id. Note what the first rule implies: a bare ?tree=controller selects the equipment/controller branch — the controller editor on the General Setup page — and the redirect-only /controller path above lands on the same branch, so a bookmark from the retired Controller page's era resolves in either form. Landing an Id on Its Page TREE_PAGE_ROOTS lists the first segments that name a page: execution, equipment and toolhouse. spindle is absent on purpose — migration folds it into equipment/… before any root check runs, so no root check ever sees it. routeForTreeId migrates the id, then dispatches on its first segment: toolhouse — the Tool House route, with the id's segments translated into path params (below). equipment — the General Setup route, carrying the migrated id as ?tree=. anything else — the Execution route, carrying the migrated id as ?tree=. This is a fall-through, not a test for execution, so an unrecognised id handed to this function lands on the Execution page. Reaching it with a genuinely unroutable id is prevented upstream: the host calls the function only for ids whose root is in TREE_PAGE_ROOTS. The returned location replaces the whole current location. Only the tree argument survives the hop; any other query argument on the URL being redirected away from is dropped, and the Tool House form carries no query at all. The Tool House Translation The Tool House page keeps its state in path segments rather than a query, so an id arriving from another page has to be translated. routeForTreeId walks the segments of toolhouse/tool-//: segment two contributes toolId when it is tool- followed by an integer; segment three contributes tab when it is one of general, cutter, holder, clamping, intelligent; segment four contributes subtab when it is one of the cutter sections — material, profile, contours, upper-beam, opt — or one of the holder sections, geometry and resolution. Only the sub-tab step is nested inside the tab step: an unrecognised tab discards the sub-tab with it, whereas the tool step is tested on its own, so a second segment that is not tool- costs the toolId param alone and the tab still translates. Everything deeper than the last segment the URL can carry is discarded either way — an id pointing at a single flute contour under …/cutter/contours/fluting/… lands on the nearest tab the URL can express. The same three name lists are imported by the page itself, so the tab set and the translation cannot drift apart. Once on the page, the tab segments are kept in step with the tabs by useRouteTabs, a composable whose only consumer this page is. It gives each tab level one route param, a valid-name set and a default; a nested level may declare which parent values make it apply, and while its parent is something else the level is dormant — its segment is dropped from the URL while its reference quietly remembers the last value, so returning to that parent tab returns to the sub-tab it had. The Tool House sub-tab level applies under cutter and holder only, and both its valid set and its default depend on which of the two is showing. A segment the level does not recognise resolves to that default rather than failing. Canonicalisation runs on the first mount and on every keep-alive re-entry, which is why a bare /tool-house acquires its tab segments. The tool segment is not one of the composable's levels: the page fills it in itself, adopting the URL's tool when the project holds it and the first tool in the list otherwise, then replacing the URL with what it adopted. That resolver reacts to the toolId param and to the tool list rather than to page activation, so it also re-points the URL when the list changes underneath it. The Tool House page never reads or writes ?tree=. A toolhouse/… id reaches it only by way of the redirect above, which is issued by one of the two tree pages' hosts. Reading an Id An id's first segment names the page that owns it, and therefore the folder that documents it: ?tree= root Route Documented under execution/… /execution Execution Page equipment/… /general-setup General Setup Page toolhouse/… /tool-house/… Tool House Page The remaining segments are the branch path, one segment per level of the tree, and the branch's own page sits in that folder — equipment/workpiece/material/cutting-parameter is the Cutting Parameter item of the Workpiece branch on the General Setup page. Most segments are kebab-case role names; the two list-backed branches, Mission entries and Program files, use a positional index instead. Every segment comes from the node id, never from the label the user reads: the General Setup page's root node is labelled General Setup and carries the id equipment. A label is a display string — the translation of the node's labelKey where it has one, and otherwise raw data such as an NC file name or a mission command's user-typed title, as Control Tree sets out — while an id is neither translated nor taken from data. Two consequences follow. A ?tree= link is locale-independent, and an id can never be read off what is on screen. Titles A route's meta.title holds an i18n key, such as routes.execution, not a title. The router resolves it through the active locale in an afterEach hook and sets the document title to the translated name followed by - HiNC; a route with no key — the catch-all — leaves the bare product name. The sibling name: is the route id used by every programmatic navigation and is never translated; the two must not be confused, which is why the route table above lists them side by side. The same resolver is handed to the i18n module through registerRetitle, so that switching language re-titles a parked tab without a navigation. The registration is indirect because the router already imports the i18n module for its translation function, and importing back would close a cycle. Serving These URLs History mode means the browser sends the whole path to the server on a refresh or a pasted link, so the back end maps two SPA fallbacks. The bare fallback carries an implicit constraint that rejects any URL whose last segment contains a dot, which is exactly the shape a File Explorer deep link takes, since those mirror real file names. An explicit fallback for the explorer's path is therefore mapped ahead of it with no such constraint. Static assets cannot be shadowed by either, because static-file serving runs earlier in the pipeline. Both fallbacks allow anonymous access, so the SPA itself always loads and the sign-in decision is made in the client. That decision is a navigation guard: it hydrates the authentication status once, lets every navigation through when the back end reports the feature disabled, and otherwise sends an unauthenticated visitor to the login route with the original full path — ?tree= included — parked in a redirect query. A successful sign-in replays that path as a full page load rather than a router navigation, so the application re-initialises with the cookie present. A visitor who is already signed in, or who arrives while the feature is off, is sent straight back out of the login route to the same parked path. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): wwwroot-src/src/router/routes.ts — the route table, the redirect-only records, the login route outside the shell layout, and the trailing catch-all. wwwroot-src/src/router/treeRoutes.ts — migrateLegacyTreeId, TREE_PAGE_ROOTS, routeForTreeId, the three tab-name lists it shares with the Tool House page, and SPINDLE_TABS, which only the spindle redirect reads. wwwroot-src/src/router/index.ts — the history-mode router factory, the authentication guard, and the retitle hook registered with the i18n module. wwwroot-src/src/components/controlTree/useControlTreeHost.ts — the tree-page host: rawTreePathOfRoute, treePathOfRoute, the two selection/URL watchers and the unguarded controller-checkbox watcher beside them, landingSelection, applyRouteSelection and syncUrlBack, plus the build-time reveal of a URL-named CSV or CL controller node. wwwroot-src/src/composables/useRouteTabs.ts — the tab-to-param sync the Tool House route uses, including dormant levels and the keep-alive re-entry canonicalisation. wwwroot-src/src/pages/ToolHousePage.vue — consumes the shared tab lists, resolves the tool from its path param, and navigates by route name when the tool changes. wwwroot-src/src/pages/FileExplorerPage.vue — mirrors the browsed location into the route's catch-all param and back. wwwroot-src/src/pages/MachineToolPage.vue — the component behind the URL-only machine-tool route. wwwroot-src/src/pages/NotFoundPage.vue — the catch-all component, carrying its own layout. wwwroot-src/src/pages/LoginPage.vue — reads the guard's redirect argument and replays it. wwwroot-src/src/composables/useViewPrefs.ts — the browser-local store holding the per-page last selected id and the expanded-node list that migration is applied to. wwwroot-src/src/components/AppMenuBar.vue — the menu entries that navigate by route name. wwwroot-src/src/i18n/en/routes.ts — the English strings the meta.title keys resolve to. wwwroot-src/src/i18n/index.ts — registerRetitle and the locale switch that calls it. wwwroot-src/quasar.config.ts — selects history mode and names the build output folder the server serves. Program.cs — the two SPA fallbacks, the explorer-specific one ahead of the bare one. See Also Control Tree — the tree these ids name: how a node id is formed and what a branch is made of Main Panel — the shell whose menus navigate to these routes and whose keep-alive cache makes the route-name guards necessary Execution Page — the busiest consumer of ?tree=, and the page a fall-through id lands on" }, "anatomy/shell/bottom-message-bar.html": { "href": "anatomy/shell/bottom-message-bar.html", @@ -382,7 +382,7 @@ "anatomy/shell/main-panel.html": { "href": "anatomy/shell/main-panel.html", "title": "Main Panel | HiAPI-C# 2025", - "summary": "Main Panel The Main Panel is the primary window of the HiNC application, providing navigation and access to all major features. Key Models Project Service: injects ProxyProjectService, the IProjectService implementation that reaches the session's project across the connection User Service: UserService Layout Structure Top Navigation Menu Brand logo, and the HiAPI version as an outlined badge beside it. The badge carries the HiNc assembly version reported by the anonymous authentication-status probe the router runs before the first route resolves, so it needs neither a loaded project nor a signed-in session; it is omitted only while that probe has reported no version. Project Menu Dropdown Project Path Text Field — readonly; reads “No Project Loaded” until a project is loaded New MenuItem Load MenuItem ReLoad MenuItem Save MenuItem Save As MenuItem Close Project MenuItem (below a separator) ReLoad, Save, Save As and Close Project are disabled until a project is loaded, and New, Load and Save As open the shared file-picker dialog with a .hincproj filter. The picker is allowed the Admin and Project roots and is denied the Resource root, which holds read-only templates the project endpoints cannot save through; it asks for the Admin root by name, so that is where it opens, and it seeds its path box with the directory holding the loaded project, or with the admin root itself when there is none. The Project root is one of the two only while a project is loaded: the roots endpoint lists a root only when its directory resolves, and the project directory resolves to nothing until a project is open, so with no project the picker offers Admin alone. Page Menu Dropdown — the three workflow pages in setup order (fill the tool house, set up the equipment, run), then the utilities. Tool House MenuItem Open Tool House Page General Setup MenuItem The equipment Control Tree — Machine Tool, Spindle Capability, Background, Coolant, Fixture, Workpiece, Controller, in that order — plus the shared equipment canvas. Two further controller branches, CSV Controller and CL Controller, are hidden by default and are switched on from the Preference dropdown. Execution MenuItem Open Execution Page File Explorer MenuItem (below a separator). See Util Pages. Mechanism Builder MenuItem Open Mechanism Builder Page The dropdown is not every route the application has. The Machine Tool page stays reachable by URL for its chain-only canvas preview, the Log Viewer is reached by the Show Log button, and the Fixture, Workpiece, Spindle Capability, Mission, Background / Coolant and legacy Controller paths resolve as redirects into the two tree pages. Preference Menu Dropdown Show Log Button — a button, not a menu item. It sits on the menu bar's right side and routes to the Log Viewer page. The Log Viewer presents the server's application log for the current day, with a manual refresh, a selectable auto-refresh interval, copy to the clipboard, and download of the day's log file for offline analysis. Central Page Panel — one router outlet wrapped in a keep-alive cache keyed on a project epoch: an integer the layout owns, raised by two watchers and read by nothing else. The first watches the project store's path, which New, Load and Save As each assign from the response they get back, which Close Project clears, and which a store-level watcher on the shared execution-status hub adopts from every broadcast — so a project change made in another tab, from another browser, or outside the browser altogether bumps the epoch here as well, and so does the boot status fetch, once, on a service that already has a project open. The second watches a counter the store raises in exactly one place, ReLoad, which is what makes a re-read of the same path remount at all: the backend raises its project-changed event with the path it already had, so the broadcast cannot be told apart from a no-op. Assigning the path it already holds moves neither watcher, so Save on the current path does not remount and neither does a Save As written back onto the path already open. A bump discards every cached page and rebuilds it, so each page initializes on its own mount hook rather than watching for project changes itself. Bottom footer — the routine-progress bar: the latest foreground message with a recent-messages history menu on the left, the live session status in the middle, and in-flight background job progress on the right. See Message Section on Main Panel. The menu bar carries no run tool bars at all: the transport controls and the execution status badge ride the run header the Execution Page‘s Control Tree pane pins above its tree, and the view controls ride its canvas panel header. What the menu bar keeps instead is the page's set of column quick-toggles, the connection badge, the active page's title, the Show Log button and — when authentication is on — the logout button. The toggles follow whichever tree page is current: four on the Execution page (control dock, canvas, strip charts, step info) and three on General Setup (control dock, content, canvas); the Tool House page lays itself out with plain splitters and gets none. The connection badge is Execution-only — the other pages’ canvases carry their own in-panel badges. Project Menu Behavior The Project Path Text Field displays the current project path when a project is loaded. It is implemented as a pure text field (not a button) that allows users to select and copy the path. The Project Menu manages MachiningProject with the following operations: Operation Description Example New Creates a new project See DemoBuildGeomOnlyMachiningProject Load Opens an existing project See DemoUseMachiningProject ReLoad Re-reads the current project from disk, same path — Save Saves the current project See DemoBuildGeomOnlyMachiningProject Save As Saves the project to a new location See DemoBuildGeomOnlyMachiningProject Close Closes the current project and clears the shell — Every Project action reports through two channels: a background progress line on the footer while it runs, then a toast when it lands — positive on success, a “busy” warning when a concurrent action has already claimed the service (HTTP 409), negative otherwise. What a project change drives in the shell is the layout's keep-alive epoch, not a canvas view: every cached page is discarded and rebuilt. Note Project actions report through the toast helper and the routine-progress footer store, and none of them routes a message through MessageUtil. Project I/O is asynchronous, so the shell stays responsive during file I/O. Platform-Specific Differences Web Application The Execution Page is the landing route — / redirects to /execution The page URL and panel state are synchronized (bi-directional navigation) There is no Environment dropdown. Machine Tool, Fixture, Workpiece, Controller, Background / Coolant and Spindle Capability are branches of the General Setup page's Control Tree, and Tool House and Execution are pages of their own; the remaining paths resolve as redirects into those pages. The menu bar is therefore Project ▾ | Page ▾ | Preference ▾. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): Environments/PreferenceController.cs — the endpoints behind the Preference dropdown. Environments/ProjectController.cs — the project endpoints: status, new, load, save, reload, saveas and close, plus the log endpoints. Environments/UserService.cs — the shell's user model. wwwroot-src/src/components/AppMenuBar.vue — the whole navigation menu. wwwroot-src/src/components/AppFooter.vue — the routine-progress footer the layout docks. wwwroot-src/src/layouts/MainLayout.vue — the shell that hosts the menu bar, the keep-alive page panel and the footer. wwwroot-src/src/router/routes.ts — the routes the Page dropdown targets and the redirect-only legacy paths. wwwroot-src/src/i18n/en/menu.ts — the menu bar's English labels. wwwroot-src/src/stores/project.ts — the six Project actions and the busy error a 409 becomes. wwwroot-src/src/stores/routineProgress.ts — the foreground-message and background-progress store the Project handlers share with the footer. wwwroot-src/src/composables/useToast.ts — the toasts every Project action ends in. wwwroot-src/src/composables/useViewPrefs.ts — the device-local per-page column visibility and the CSV / CL controller switches. wwwroot-src/src/composables/useConnectionsHealth.ts — the aggregate state behind the Execution connection badge. wwwroot-src/src/components/widgets/FileExplorerDialog.vue — the shared picker New, Load and Save As open. wwwroot-src/src/components/widgets/ColumnToggleIcon.vue — the glyph each column quick-toggle draws. wwwroot-src/src/pages/LogViewerPage.vue — the Log Viewer the Show Log button opens. See Also Execution Page — the landing page the shell routes to Preference Menu Dropdown — the third menu on the bar Bottom Message Bar — the notification bar the shell docks along the bottom General Setup Page — the equipment page the Page menu reaches Tree Ids and Routes — the route table this bar navigates, and how a ?tree= id lands on the page that owns it Session State — the keep-alive this shell wraps the router view in, and what a project change destroys Login and Authentication — the gate in front of this shell, and the sign-out entry on this bar Log Viewer Page — the screen the Show Log button opens" + "summary": "Main Panel The Main Panel is the primary window of the HiNC application, providing navigation and access to all major features. Key Models Project Service: injects ProxyProjectService, the IProjectService implementation that reaches the session's project across the connection User Service: UserService Layout Structure Top Navigation Menu Brand logo, and the HiAPI version as an outlined badge beside it. The badge carries the HiNc assembly version reported by the anonymous authentication-status probe the router runs before the first route resolves, so it needs neither a loaded project nor a signed-in session; it is omitted only while that probe has reported no version. Project Menu Dropdown Project Path Text Field — readonly; reads “No Project Loaded” until a project is loaded New MenuItem Load MenuItem ReLoad MenuItem Save MenuItem Save As MenuItem Close Project MenuItem (below a separator) ReLoad, Save, Save As and Close Project are disabled until a project is loaded, and New, Load and Save As open the shared file-picker dialog with a .hincproj filter. The picker is allowed the Admin and Project roots and is denied the Resource root, which holds read-only templates the project endpoints cannot save through; it asks for the Admin root by name, so that is where it opens, and it seeds its path box with the directory holding the loaded project, or with the admin root itself when there is none. The Project root is one of the two only while a project is loaded: the roots endpoint lists a root only when its directory resolves, and the project directory resolves to nothing until a project is open, so with no project the picker offers Admin alone. Page Menu Dropdown — the three workflow pages in setup order (fill the tool house, set up the equipment, run), then the utilities. Tool House MenuItem Open Tool House Page General Setup MenuItem The equipment Control Tree — four roots: Mechanism (Machine Tool / Fixture / Workpiece), Spindle Capability, Environment (Ambient Temperature / Coolant) and Controller, in that order — plus the shared equipment canvas. Two further controller branches, CSV Controller and CL Controller, are hidden by default and are switched on from the Preference dropdown. Execution MenuItem Open Execution Page File Explorer MenuItem (below a separator). See Util Pages. Mechanism Builder MenuItem Open Mechanism Builder Page The dropdown is not every route the application has. The Machine Tool page stays reachable by URL for its chain-only canvas preview, the Log Viewer is reached by the Show Log button, and the Fixture, Workpiece, Spindle Capability, Mission, Environment (Ambient Temperature / Coolant) and legacy Controller paths resolve as redirects into the two tree pages. Preference Menu Dropdown Show Log Button — a button, not a menu item. It sits on the menu bar's right side and routes to the Log Viewer page. The Log Viewer presents the server's application log for the current day, with a manual refresh, a selectable auto-refresh interval, copy to the clipboard, and download of the day's log file for offline analysis. Central Page Panel — one router outlet wrapped in a keep-alive cache keyed on a project epoch: an integer the layout owns, raised by two watchers and read by nothing else. The first watches the project store's path, which New, Load and Save As each assign from the response they get back, which Close Project clears, and which a store-level watcher on the shared execution-status hub adopts from every broadcast — so a project change made in another tab, from another browser, or outside the browser altogether bumps the epoch here as well, and so does the boot status fetch, once, on a service that already has a project open. The second watches a counter the store raises in exactly one place, ReLoad, which is what makes a re-read of the same path remount at all: the backend raises its project-changed event with the path it already had, so the broadcast cannot be told apart from a no-op. Assigning the path it already holds moves neither watcher, so Save on the current path does not remount and neither does a Save As written back onto the path already open. A bump discards every cached page and rebuilds it, so each page initializes on its own mount hook rather than watching for project changes itself. Bottom footer — the routine-progress bar: the latest foreground message with a recent-messages history menu on the left, the live session status in the middle, and in-flight background job progress on the right. See Message Section on Main Panel. The menu bar carries no run tool bars at all: the transport controls and the execution status badge ride the run header the Execution Page‘s Control Tree pane pins above its tree, and the view controls ride its canvas panel header. What the menu bar keeps instead is the page's set of column quick-toggles, the connection badge, the active page's title, the Show Log button and — when authentication is on — the logout button. The toggles follow whichever tree page is current: four on the Execution page (control dock, canvas, strip charts, step info) and three on General Setup (control dock, content, canvas); the Tool House page lays itself out with plain splitters and gets none. The connection badge is Execution-only — the other pages’ canvases carry their own in-panel badges. Project Menu Behavior The Project Path Text Field displays the current project path when a project is loaded. It is implemented as a pure text field (not a button) that allows users to select and copy the path. The Project Menu manages MachiningProject with the following operations: Operation Description Example New Creates a new project See DemoBuildGeomOnlyMachiningProject Load Opens an existing project See DemoUseMachiningProject ReLoad Re-reads the current project from disk, same path — Save Saves the current project See DemoBuildGeomOnlyMachiningProject Save As Saves the project to a new location See DemoBuildGeomOnlyMachiningProject Close Closes the current project and clears the shell — Every Project action reports through two channels: a background progress line on the footer while it runs, then a toast when it lands — positive on success, a “busy” warning when a concurrent action has already claimed the service (HTTP 409), negative otherwise. What a project change drives in the shell is the layout's keep-alive epoch, not a canvas view: every cached page is discarded and rebuilt. Note Project actions report through the toast helper and the routine-progress footer store, and none of them routes a message through MessageUtil. Project I/O is asynchronous, so the shell stays responsive during file I/O. Platform-Specific Differences Web Application The Execution Page is the landing route — / redirects to /execution The page URL and panel state are synchronized (bi-directional navigation) There is no Environment dropdown (Environment is now a root of the General Setup page's Control Tree, over Ambient Temperature / Coolant). Mechanism (Machine Tool / Fixture / Workpiece), Spindle Capability, Environment and Controller are the roots of that tree, and Tool House and Execution are pages of their own; the remaining paths resolve as redirects into those pages. The menu bar is therefore Project ▾ | Page ▾ | Preference ▾. Source Code Path See HiNC App Anatomy for git repository links. Web Application HiNC-2025-webservice (Quasar CLI SPA): Environments/PreferenceController.cs — the endpoints behind the Preference dropdown. Environments/ProjectController.cs — the project endpoints: status, new, load, save, reload, saveas and close, plus the log endpoints. Environments/UserService.cs — the shell's user model. wwwroot-src/src/components/AppMenuBar.vue — the whole navigation menu. wwwroot-src/src/components/AppFooter.vue — the routine-progress footer the layout docks. wwwroot-src/src/layouts/MainLayout.vue — the shell that hosts the menu bar, the keep-alive page panel and the footer. wwwroot-src/src/router/routes.ts — the routes the Page dropdown targets and the redirect-only legacy paths. wwwroot-src/src/i18n/en/menu.ts — the menu bar's English labels. wwwroot-src/src/stores/project.ts — the six Project actions and the busy error a 409 becomes. wwwroot-src/src/stores/routineProgress.ts — the foreground-message and background-progress store the Project handlers share with the footer. wwwroot-src/src/composables/useToast.ts — the toasts every Project action ends in. wwwroot-src/src/composables/useViewPrefs.ts — the device-local per-page column visibility and the CSV / CL controller switches. wwwroot-src/src/composables/useConnectionsHealth.ts — the aggregate state behind the Execution connection badge. wwwroot-src/src/components/widgets/FileExplorerDialog.vue — the shared picker New, Load and Save As open. wwwroot-src/src/components/widgets/ColumnToggleIcon.vue — the glyph each column quick-toggle draws. wwwroot-src/src/pages/LogViewerPage.vue — the Log Viewer the Show Log button opens. See Also Execution Page — the landing page the shell routes to Preference Menu Dropdown — the third menu on the bar Bottom Message Bar — the notification bar the shell docks along the bottom General Setup Page — the equipment page the Page menu reaches Tree Ids and Routes — the route table this bar navigates, and how a ?tree= id lands on the page that owns it Session State — the keep-alive this shell wraps the router view in, and what a project change destroys Login and Authentication — the gate in front of this shell, and the sign-out entry on this bar Log Viewer Page — the screen the Show Log button opens" }, "anatomy/shell/preference-menu.html": { "href": "anatomy/shell/preference-menu.html", @@ -2447,7 +2447,7 @@ "api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html": { "href": "api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html", "title": "Class MachiningEquipment | HiAPI-C# 2025", - "summary": "Class MachiningEquipment Namespace Hi.Machining.MachiningEquipmentUtils Assembly HiMech.dll The runtime (execution) face of the machining equipment: the topology instance the runner drives — tool-change graph surgery, collision detection, live axis poses. Materialised from the authored face (MaterialiseMachiningEquipment(string, IProgress)) and NEVER serialized: runtime data cannot reach the project file by construction. public class MachiningEquipment : IMachiningEquipment, IDisplayee, IExpandToBox3d, IGetAnchoredDisplayeeList, IGetProgramCl, IGetAsmb, IGetAnchor, IGetTopoIndex, IGetMachiningChain, IGetMachiningEquipment Inheritance object MachiningEquipment Implements IMachiningEquipment IDisplayee IExpandToBox3d IGetAnchoredDisplayeeList IGetProgramCl IGetAsmb IGetAnchor IGetTopoIndex IGetMachiningChain IGetMachiningEquipment Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DispUtil.Display(IDisplayee, Bind, Mat4d) MachiningEquipmentUtil.AlignWorkpieceProgramZeroToIso(IMachiningEquipment, Vec3d) MachiningEquipmentUtil.GetIsoCoordinatePosition(IMachiningEquipment, Vec3d) MachiningEquipmentUtil.GetMachinePositionAtProgramZero(IMachiningEquipment) MachiningEquipmentUtil.GetMachinePositionAtTableBuckleZero(IMachiningEquipment) MachiningEquipmentUtil.GetProgramToPnMat4d(IMachiningEquipment) DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) TopoUtil.Display(IGetAnchor, Bind, Dictionary) TopoUtil.ExpandToBox3d(IGetAnchor, Box3d, Dictionary) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors MachiningEquipment() Ctor. public MachiningEquipment() Properties Asmb Asmb of the entire equipment. public Asmb Asmb { get; } Property Value Asmb BackgroundTemperature_C Gets or sets the background temperature in Celsius. This is a convenience property that converts between Celsius and Kelvin. public double BackgroundTemperature_C { get; set; } Property Value double BackgroundTemperature_K Gets or sets the background temperature in Kelvin. Runtime-stamped from the authored face at materialise; the authored value's home is BackgroundTemperature_K. public double BackgroundTemperature_K { get; set; } Property Value double CoolantHeatCondition Gets or sets the coolant heat condition settings. Runtime-stamped from the authored face at materialise (shared reference — the runtime only reads it); the authored home is CoolantHeatCondition. public CoolantHeatCondition CoolantHeatCondition { get; set; } Property Value CoolantHeatCondition Fixture Fixture. public Fixture Fixture { get; set; } Property Value Fixture MachiningChain Body of the equipment. public IMachiningChain MachiningChain { get; set; } Property Value IMachiningChain MachiningTool Milling tool. public IMachiningTool MachiningTool { get; set; } Property Value IMachiningTool SpindleCapability Gets or sets the spindle capability configuration. Runtime-stamped from the authored face at materialise (shared reference — the runtime only reads it); the authored home is SpindleCapability. public SpindleCapability SpindleCapability { get; set; } Property Value SpindleCapability TableToComp Transformer of the branch from table buckle to workpiece side buckle. Note that the workpiece side buckle links to Fixture if fixture exist; otherwise, it links to Workpiece if workpiece exist. If Workpiece either Fixture do not exist, this property makes no effect. public ITransformer TableToComp { get; set; } Property Value ITransformer Workpiece Workpiece. public Workpiece Workpiece { get; set; } Property Value Workpiece WorkpieceDisplayee Displayee for workpiece rendering. Set by the runtime service layer. public IDisplayee WorkpieceDisplayee { get; set; } Property Value IDisplayee Methods Detect(bool) Performs collision detection. public MechCollisionResult Detect(bool addFluteAndWorkpieceDetection) Parameters addFluteAndWorkpieceDetection bool Whether to include flute and workpiece in detection. Returns MechCollisionResult Significant collision result. Display(Bind) Display function called in DispEngine rendering loop. public void Display(Bind bind) Parameters bind Bind Bind with DispEngine. See Bind. ExpandToBox3d(Box3d) Expands the destination box. This function is usually used to compute the bounding box of elements. public void ExpandToBox3d(Box3d dst) Parameters dst Box3d Destination box GetAnchor() Get key anchor. (i.e. root anchor) public Anchor GetAnchor() Returns Anchor key anchor GetAnchoredDisplayeeList() Gets a list of anchored displayable objects. public List GetAnchoredDisplayeeList() Returns List A list of IAnchoredDisplayee objects GetAsmb() Gets the key asmb. public Asmb GetAsmb() Returns Asmb The key asmb. GetMachiningChain() Gets the machining chain instance. public IMachiningChain GetMachiningChain() Returns IMachiningChain The machining chain instance. GetMachiningEquipment() Get the runtime MachiningEquipment. public MachiningEquipment GetMachiningEquipment() Returns MachiningEquipment MachiningEquipment GetProgramCl() Get CL (Cutter Location). Where Point is tool tip position; Normal is tool orientation. public DVec3d GetProgramCl() Returns DVec3d CL GetToolTipXyzOnProgramZero() Get tool tip xyz from workpiece geom anchor. public Vec3d GetToolTipXyzOnProgramZero() Returns Vec3d if no MachiningTool or no Workpiece equiping, return null; otherwise, return the XYZ from workpiece geomanchor to tool tip. GetTransformFromRootToProgramZero() Gets the transform matrix from the root coordinate system to the program zero coordinate system. public Mat4d GetTransformFromRootToProgramZero() Returns Mat4d A 4x4 transformation matrix representing the coordinate system transformation. IsCollisionRed(object) Whether the latest Detect(bool) pass flagged item as colliding. Display paths use this through CollisionRedScope to paint the part red. public bool IsCollisionRed(object item) Parameters item object A displayed item (typically a Solid). Returns bool true if the item is currently collision-red. PrepareCollidableItems() Prepares all collidable items for collision detection. This method should be called before performing collision detection. public void PrepareCollidableItems() ResetCollisionFlags() Resets all collision flags to their default states. This should be called after collision detection is complete, and by a runtime reset so no part stays painted red. public void ResetCollisionFlags() Tooling(int, MachiningToolHouse) Set MachiningTool by toolId and toolHouse. public bool Tooling(int toolId, MachiningToolHouse toolHouse) Parameters toolId int tool ID toolHouse MachiningToolHouse tool house Returns bool true if tool changed; otherwise, false. Exceptions ToolNotFoundException Throw If toolId does not exist on toolHouse." + "summary": "Class MachiningEquipment Namespace Hi.Machining.MachiningEquipmentUtils Assembly HiMech.dll The runtime (execution) face of the machining equipment: the topology instance the runner drives — tool-change graph surgery, collision detection, live axis poses. Materialised from the authored face (MaterialiseMachiningEquipment(string, IProgress)) and NEVER serialized: runtime data cannot reach the project file by construction. public class MachiningEquipment : IMachiningEquipment, IDisplayee, IExpandToBox3d, IGetAnchoredDisplayeeList, IGetProgramCl, IGetAsmb, IGetAnchor, IGetTopoIndex, IGetMachiningChain, IGetMachiningEquipment Inheritance object MachiningEquipment Implements IMachiningEquipment IDisplayee IExpandToBox3d IGetAnchoredDisplayeeList IGetProgramCl IGetAsmb IGetAnchor IGetTopoIndex IGetMachiningChain IGetMachiningEquipment Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DispUtil.Display(IDisplayee, Bind, Mat4d) MachiningEquipmentUtil.AlignWorkpieceProgramZeroToIso(IMachiningEquipment, Vec3d) MachiningEquipmentUtil.GetIsoCoordinatePosition(IMachiningEquipment, Vec3d) MachiningEquipmentUtil.GetMachinePositionAtProgramZero(IMachiningEquipment) MachiningEquipmentUtil.GetMachinePositionAtTableBuckleZero(IMachiningEquipment) MachiningEquipmentUtil.GetProgramToPnMat4d(IMachiningEquipment) DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) TopoUtil.Display(IGetAnchor, Bind, Dictionary) TopoUtil.ExpandToBox3d(IGetAnchor, Box3d, Dictionary) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors MachiningEquipment() Ctor. public MachiningEquipment() Properties AmbientTemperature_C Gets or sets the ambient temperature in Celsius. This is a convenience property that converts between Celsius and Kelvin. public double AmbientTemperature_C { get; set; } Property Value double AmbientTemperature_K Gets or sets the ambient temperature in Kelvin. Runtime-stamped from the authored face at materialise; the authored value's home is AmbientTemperature_K. public double AmbientTemperature_K { get; set; } Property Value double Asmb Asmb of the entire equipment. public Asmb Asmb { get; } Property Value Asmb BackgroundTemperature_C Source-compatible delegate of AmbientTemperature_C. [Obsolete(\"Renamed to AmbientTemperature_C.\")] public double BackgroundTemperature_C { get; set; } Property Value double BackgroundTemperature_K Source-compatible delegate of AmbientTemperature_K. [Obsolete(\"Renamed to AmbientTemperature_K.\")] public double BackgroundTemperature_K { get; set; } Property Value double CoolantHeatCondition Gets or sets the coolant heat condition settings. Runtime-stamped from the authored face at materialise (shared reference — the runtime only reads it); the authored home is CoolantHeatCondition. public CoolantHeatCondition CoolantHeatCondition { get; set; } Property Value CoolantHeatCondition Fixture Fixture. public Fixture Fixture { get; set; } Property Value Fixture MachiningChain Body of the equipment. public IMachiningChain MachiningChain { get; set; } Property Value IMachiningChain MachiningTool Milling tool. public IMachiningTool MachiningTool { get; set; } Property Value IMachiningTool SpindleCapability Gets or sets the spindle capability configuration. Runtime-stamped from the authored face at materialise (shared reference — the runtime only reads it); the authored home is SpindleCapability. public SpindleCapability SpindleCapability { get; set; } Property Value SpindleCapability TableToComp Transformer of the branch from table buckle to workpiece side buckle. Note that the workpiece side buckle links to Fixture if fixture exist; otherwise, it links to Workpiece if workpiece exist. If Workpiece either Fixture do not exist, this property makes no effect. public ITransformer TableToComp { get; set; } Property Value ITransformer Workpiece Workpiece. public Workpiece Workpiece { get; set; } Property Value Workpiece WorkpieceDisplayee Displayee for workpiece rendering. Set by the runtime service layer. public IDisplayee WorkpieceDisplayee { get; set; } Property Value IDisplayee Methods Detect(bool) Performs collision detection. public MechCollisionResult Detect(bool addFluteAndWorkpieceDetection) Parameters addFluteAndWorkpieceDetection bool Whether to include flute and workpiece in detection. Returns MechCollisionResult Significant collision result. Display(Bind) Display function called in DispEngine rendering loop. public void Display(Bind bind) Parameters bind Bind Bind with DispEngine. See Bind. ExpandToBox3d(Box3d) Expands the destination box. This function is usually used to compute the bounding box of elements. public void ExpandToBox3d(Box3d dst) Parameters dst Box3d Destination box GetAnchor() Get key anchor. (i.e. root anchor) public Anchor GetAnchor() Returns Anchor key anchor GetAnchoredDisplayeeList() Gets a list of anchored displayable objects. public List GetAnchoredDisplayeeList() Returns List A list of IAnchoredDisplayee objects GetAsmb() Gets the key asmb. public Asmb GetAsmb() Returns Asmb The key asmb. GetMachiningChain() Gets the machining chain instance. public IMachiningChain GetMachiningChain() Returns IMachiningChain The machining chain instance. GetMachiningEquipment() Get the runtime MachiningEquipment. public MachiningEquipment GetMachiningEquipment() Returns MachiningEquipment MachiningEquipment GetProgramCl() Get CL (Cutter Location). Where Point is tool tip position; Normal is tool orientation. public DVec3d GetProgramCl() Returns DVec3d CL GetToolTipXyzOnProgramZero() Get tool tip xyz from workpiece geom anchor. public Vec3d GetToolTipXyzOnProgramZero() Returns Vec3d if no MachiningTool or no Workpiece equiping, return null; otherwise, return the XYZ from workpiece geomanchor to tool tip. GetTransformFromRootToProgramZero() Gets the transform matrix from the root coordinate system to the program zero coordinate system. public Mat4d GetTransformFromRootToProgramZero() Returns Mat4d A 4x4 transformation matrix representing the coordinate system transformation. IsCollisionRed(object) Whether the latest Detect(bool) pass flagged item as colliding. Display paths use this through CollisionRedScope to paint the part red. public bool IsCollisionRed(object item) Parameters item object A displayed item (typically a Solid). Returns bool true if the item is currently collision-red. PrepareCollidableItems() Prepares all collidable items for collision detection. This method should be called before performing collision detection. public void PrepareCollidableItems() ResetCollisionFlags() Resets all collision flags to their default states. This should be called after collision detection is complete, and by a runtime reset so no part stays painted red. public void ResetCollisionFlags() Tooling(int, MachiningToolHouse) Set MachiningTool by toolId and toolHouse. public bool Tooling(int toolId, MachiningToolHouse toolHouse) Parameters toolId int tool ID toolHouse MachiningToolHouse tool house Returns bool true if tool changed; otherwise, false. Exceptions ToolNotFoundException Throw If toolId does not exist on toolHouse." }, "api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipmentCollisionIndex.html": { "href": "api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipmentCollisionIndex.html", @@ -2467,7 +2467,7 @@ "api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html": { "href": "api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html", "title": "Class SetupEquipment | HiAPI-C# 2025", - "summary": "Class SetupEquipment Namespace Hi.Machining.MachiningEquipmentUtils Assembly HiMech.dll The authored (setup) face of the machining equipment: the machine chain, workpiece, fixture, environment data and the Setup-page tool selection, with the project XML IO. This is the ONLY face that persists — the runtime face (MachiningEquipment) is materialised from it and never serialized, so a mid-run save can no longer write live poses or the runner-equipped tool into the project file. The XML wire name stays \"MachiningEquipment\" (see XName): shipped project files keep their layout, only the deserialized object changed. public class SetupEquipment : IMachiningEquipment, IDisplayee, IExpandToBox3d, IGetAnchoredDisplayeeList, IGetProgramCl, IGetAsmb, IGetAnchor, IGetTopoIndex, IGetMachiningChain, IMakeXmlSource Inheritance object SetupEquipment Implements IMachiningEquipment IDisplayee IExpandToBox3d IGetAnchoredDisplayeeList IGetProgramCl IGetAsmb IGetAnchor IGetTopoIndex IGetMachiningChain IMakeXmlSource Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DispUtil.Display(IDisplayee, Bind, Mat4d) MachiningEquipmentUtil.AlignWorkpieceProgramZeroToIso(IMachiningEquipment, Vec3d) MachiningEquipmentUtil.GetIsoCoordinatePosition(IMachiningEquipment, Vec3d) MachiningEquipmentUtil.GetMachinePositionAtProgramZero(IMachiningEquipment) MachiningEquipmentUtil.GetMachinePositionAtTableBuckleZero(IMachiningEquipment) MachiningEquipmentUtil.GetProgramToPnMat4d(IMachiningEquipment) DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) TopoUtil.Display(IGetAnchor, Bind, Dictionary) TopoUtil.ExpandToBox3d(IGetAnchor, Box3d, Dictionary) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors SetupEquipment() Ctor. public SetupEquipment() SetupEquipment(XElement, string, string, IProgress) Initializes a new instance of the SetupEquipment class from XML data. public SetupEquipment(XElement src, string baseDirectory, string relFile, IProgress progress) Parameters src XElement The XML element containing the equipment configuration. baseDirectory string The base directory for resolving relative file paths. relFile string The relative file path for XML serialization. progress IProgress Progress reporter for diagnostic messages emitted during construction. Properties Asmb Asmb of the entire authored equipment topology. public Asmb Asmb { get; } Property Value Asmb BackgroundTemperature_C Gets or sets the background temperature in Celsius. This is a convenience property that converts between Celsius and Kelvin. public double BackgroundTemperature_C { get; set; } Property Value double BackgroundTemperature_K Gets or sets the background temperature in Kelvin. This represents the ambient temperature of the machining environment. public double BackgroundTemperature_K { get; set; } Property Value double CoolantHeatCondition Gets or sets the coolant heat condition settings. This includes coolant temperature and heat transfer coefficients. public CoolantHeatCondition CoolantHeatCondition { get; set; } Property Value CoolantHeatCondition CoolantHeatConditionFile Gets or sets the file path of the coolant heat condition (WorkpieceMaterial pattern: when set, XML IO externalizes CoolantHeatCondition to this side-file; when null the condition serializes inline). public string CoolantHeatConditionFile { get; set; } Property Value string Fixture Fixture. public Fixture Fixture { get; set; } Property Value Fixture MachiningChain Body of the equipment — the authored machine topology instance. The runtime face gets its own instance from MaterialiseMachiningEquipment(string, IProgress); the two never share graph objects (only leaf Solid geometry is shared). public IMachiningChain MachiningChain { get; set; } Property Value IMachiningChain MachiningChainFile Gets or sets the file path of the solid machining chain. This is used for XML serialization and file management. public string MachiningChainFile { get; set; } Property Value string MachiningTool The Setup-page selected tool (persisted as the project's ). Never the tool-house instance itself — see Tooling(int, MachiningToolHouse). public IMachiningTool MachiningTool { get; set; } Property Value IMachiningTool SpindleCapability Gets or sets the spindle capability configuration. This defines the operational capabilities and limits of the spindle. public SpindleCapability SpindleCapability { get; set; } Property Value SpindleCapability SpindleCapabilityFile Gets or sets the file path of the spindle capability configuration. This is used for XML serialization and file management. public string SpindleCapabilityFile { get; set; } Property Value string TableToComp Transformer of the branch from table buckle to workpiece side buckle. Note that the workpiece side buckle links to Fixture if fixture exist; otherwise, it links to Workpiece if workpiece exist. If Workpiece either Fixture do not exist, this property makes no effect. public ITransformer TableToComp { get; set; } Property Value ITransformer Workpiece Workpiece. public Workpiece Workpiece { get; set; } Property Value Workpiece WorkpieceDisplayee Displayee for workpiece rendering. Optional on the authored face — setup views typically draw the workpiece through their own display composition instead. public IDisplayee WorkpieceDisplayee { get; set; } Property Value IDisplayee XName Name for XML IO. Pinned to the shipped wire name “MachiningEquipment” — the type was split off the runtime face, the file layout was not. public static string XName { get; } Property Value string Methods Display(Bind) Display function called in DispEngine rendering loop. public void Display(Bind bind) Parameters bind Bind Bind with DispEngine. See Bind. ExpandToBox3d(Box3d) Expands the destination box. This function is usually used to compute the bounding box of elements. public void ExpandToBox3d(Box3d dst) Parameters dst Box3d Destination box GetAnchor() Get key anchor. (i.e. root anchor) public Anchor GetAnchor() Returns Anchor key anchor GetAnchoredDisplayeeList() Gets a list of anchored displayable objects. public List GetAnchoredDisplayeeList() Returns List A list of IAnchoredDisplayee objects GetAsmb() Gets the key asmb. public Asmb GetAsmb() Returns Asmb The key asmb. GetMachiningChain() Gets the machining chain instance. public IMachiningChain GetMachiningChain() Returns IMachiningChain The machining chain instance. GetProgramCl() Get CL (Cutter Location). Where Point is tool tip position; Normal is tool orientation. public DVec3d GetProgramCl() Returns DVec3d CL GetToolTipXyzOnProgramZero() Get tool tip xyz from workpiece geom anchor. public Vec3d GetToolTipXyzOnProgramZero() Returns Vec3d if no MachiningTool or no Workpiece equiping, return null; otherwise, return the XYZ from workpiece geomanchor to tool tip. GetTransformFromRootToProgramZero() Gets the transform matrix from the root coordinate system to the program zero coordinate system. public Mat4d GetTransformFromRootToProgramZero() Returns Mat4d A 4x4 transformation matrix representing the coordinate system transformation. MakeXmlSource(string, string, bool) Creates an XML representation of the object. This method may also generate additional resources such as related files. public XElement MakeXmlSource(string baseDirectory, string relFile, bool exhibitionOnly) Parameters baseDirectory string The base directory for resolving relative paths relFile string The relative file path for the XML source exhibitionOnly bool if true, the extended file creation is suppressed. Returns XElement An XML element representing the object's state Remarks For the demand of easy moving source folder (especially project folder) without configuration file path corruption, the relative file path is applied. The baseDirectory is typically the folder at the nearest configuration file folder. Since the folder can be moving with the configuration file. MaterialiseMachiningEquipment(string, IProgress) Builds the runtime face from this authored face: a fresh MachiningEquipment whose topology is an XML round-trip copy of this one (chain, fixture, workpiece, table transformer, tool), with the heavy machine-body and fixture Solid instances SHARED (this face keeps their lifecycle), axis poses copied, and the environment data stamped by reference. Information flows one way: the returned instance never writes back into this one. public MachiningEquipment MaterialiseMachiningEquipment(string baseDirectory, IProgress progress) Parameters baseDirectory string The project base directory this equipment's relative paths (e.g. MachiningChainFile) resolve against. progress IProgress Progress reporter for diagnostics during the copy. Returns MachiningEquipment The materialised runtime equipment. Reg(XFactory) Registers this type's deserializer with the given XFactory and chains Reg(factory) on dependents. Idempotent. public static void Reg(XFactory factory = null) Parameters factory XFactory Tooling(int, MachiningToolHouse) Selects the Setup-page tool by toolId from toolHouse. The authored face never hosts the tool-house instance itself: the runtime face equips house instances (and mutates their tessellation mid-run), and one tool's Asmb cannot live in two topologies — so this hosts a private duplicate. Clear the selection (“do not show”) by setting MachiningTool to null. public bool Tooling(int toolId, MachiningToolHouse toolHouse) Parameters toolId int tool ID toolHouse MachiningToolHouse tool house Returns bool true if the selection changed; otherwise, false. Exceptions ToolNotFoundException Throw If toolId does not exist on toolHouse." + "summary": "Class SetupEquipment Namespace Hi.Machining.MachiningEquipmentUtils Assembly HiMech.dll The authored (setup) face of the machining equipment: the machine chain, workpiece, fixture, environment data and the Setup-page tool selection, with the project XML IO. This is the ONLY face that persists — the runtime face (MachiningEquipment) is materialised from it and never serialized, so a mid-run save can no longer write live poses or the runner-equipped tool into the project file. The XML wire name stays \"MachiningEquipment\" (see XName): shipped project files keep their layout, only the deserialized object changed. public class SetupEquipment : IMachiningEquipment, IDisplayee, IExpandToBox3d, IGetAnchoredDisplayeeList, IGetProgramCl, IGetAsmb, IGetAnchor, IGetTopoIndex, IGetMachiningChain, IMakeXmlSource Inheritance object SetupEquipment Implements IMachiningEquipment IDisplayee IExpandToBox3d IGetAnchoredDisplayeeList IGetProgramCl IGetAsmb IGetAnchor IGetTopoIndex IGetMachiningChain IMakeXmlSource Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DispUtil.Display(IDisplayee, Bind, Mat4d) MachiningEquipmentUtil.AlignWorkpieceProgramZeroToIso(IMachiningEquipment, Vec3d) MachiningEquipmentUtil.GetIsoCoordinatePosition(IMachiningEquipment, Vec3d) MachiningEquipmentUtil.GetMachinePositionAtProgramZero(IMachiningEquipment) MachiningEquipmentUtil.GetMachinePositionAtTableBuckleZero(IMachiningEquipment) MachiningEquipmentUtil.GetProgramToPnMat4d(IMachiningEquipment) DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) TopoUtil.Display(IGetAnchor, Bind, Dictionary) TopoUtil.ExpandToBox3d(IGetAnchor, Box3d, Dictionary) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors SetupEquipment() Ctor. public SetupEquipment() SetupEquipment(XElement, string, string, IProgress) Initializes a new instance of the SetupEquipment class from XML data. public SetupEquipment(XElement src, string baseDirectory, string relFile, IProgress progress) Parameters src XElement The XML element containing the equipment configuration. baseDirectory string The base directory for resolving relative file paths. relFile string The relative file path for XML serialization. progress IProgress Progress reporter for diagnostic messages emitted during construction. Properties AmbientTemperature_C Gets or sets the ambient temperature in Celsius. This is a convenience property that converts between Celsius and Kelvin. public double AmbientTemperature_C { get; set; } Property Value double AmbientTemperature_K Gets or sets the ambient temperature in Kelvin: the shop-floor temperature the workpiece, cutter, chips and spindle start at and the spindle cools toward. The cutting zone itself convects to CoolantTemperature_K. Serialized as AmbientTemperature_C; the pre-rename element BackgroundTemperature_C is still read. public double AmbientTemperature_K { get; set; } Property Value double Asmb Asmb of the entire authored equipment topology. public Asmb Asmb { get; } Property Value Asmb BackgroundTemperature_C Source-compatible delegate of AmbientTemperature_C. [Obsolete(\"Renamed to AmbientTemperature_C.\")] public double BackgroundTemperature_C { get; set; } Property Value double BackgroundTemperature_K Source-compatible delegate of AmbientTemperature_K. [Obsolete(\"Renamed to AmbientTemperature_K.\")] public double BackgroundTemperature_K { get; set; } Property Value double CoolantHeatCondition Gets or sets the coolant heat condition settings. This includes coolant temperature and heat transfer coefficients. public CoolantHeatCondition CoolantHeatCondition { get; set; } Property Value CoolantHeatCondition CoolantHeatConditionFile Gets or sets the file path of the coolant heat condition (WorkpieceMaterial pattern: when set, XML IO externalizes CoolantHeatCondition to this side-file; when null the condition serializes inline). public string CoolantHeatConditionFile { get; set; } Property Value string Fixture Fixture. public Fixture Fixture { get; set; } Property Value Fixture MachiningChain Body of the equipment — the authored machine topology instance. The runtime face gets its own instance from MaterialiseMachiningEquipment(string, IProgress); the two never share graph objects (only leaf Solid geometry is shared). public IMachiningChain MachiningChain { get; set; } Property Value IMachiningChain MachiningChainFile Gets or sets the file path of the solid machining chain. This is used for XML serialization and file management. public string MachiningChainFile { get; set; } Property Value string MachiningTool The Setup-page selected tool (persisted as the project's ). Never the tool-house instance itself — see Tooling(int, MachiningToolHouse). public IMachiningTool MachiningTool { get; set; } Property Value IMachiningTool SpindleCapability Gets or sets the spindle capability configuration. This defines the operational capabilities and limits of the spindle. public SpindleCapability SpindleCapability { get; set; } Property Value SpindleCapability SpindleCapabilityFile Gets or sets the file path of the spindle capability configuration. This is used for XML serialization and file management. public string SpindleCapabilityFile { get; set; } Property Value string TableToComp Transformer of the branch from table buckle to workpiece side buckle. Note that the workpiece side buckle links to Fixture if fixture exist; otherwise, it links to Workpiece if workpiece exist. If Workpiece either Fixture do not exist, this property makes no effect. public ITransformer TableToComp { get; set; } Property Value ITransformer Workpiece Workpiece. public Workpiece Workpiece { get; set; } Property Value Workpiece WorkpieceDisplayee Displayee for workpiece rendering. Optional on the authored face — setup views typically draw the workpiece through their own display composition instead. public IDisplayee WorkpieceDisplayee { get; set; } Property Value IDisplayee XName Name for XML IO. Pinned to the shipped wire name “MachiningEquipment” — the type was split off the runtime face, the file layout was not. public static string XName { get; } Property Value string Methods Display(Bind) Display function called in DispEngine rendering loop. public void Display(Bind bind) Parameters bind Bind Bind with DispEngine. See Bind. ExpandToBox3d(Box3d) Expands the destination box. This function is usually used to compute the bounding box of elements. public void ExpandToBox3d(Box3d dst) Parameters dst Box3d Destination box GetAnchor() Get key anchor. (i.e. root anchor) public Anchor GetAnchor() Returns Anchor key anchor GetAnchoredDisplayeeList() Gets a list of anchored displayable objects. public List GetAnchoredDisplayeeList() Returns List A list of IAnchoredDisplayee objects GetAsmb() Gets the key asmb. public Asmb GetAsmb() Returns Asmb The key asmb. GetMachiningChain() Gets the machining chain instance. public IMachiningChain GetMachiningChain() Returns IMachiningChain The machining chain instance. GetProgramCl() Get CL (Cutter Location). Where Point is tool tip position; Normal is tool orientation. public DVec3d GetProgramCl() Returns DVec3d CL GetToolTipXyzOnProgramZero() Get tool tip xyz from workpiece geom anchor. public Vec3d GetToolTipXyzOnProgramZero() Returns Vec3d if no MachiningTool or no Workpiece equiping, return null; otherwise, return the XYZ from workpiece geomanchor to tool tip. GetTransformFromRootToProgramZero() Gets the transform matrix from the root coordinate system to the program zero coordinate system. public Mat4d GetTransformFromRootToProgramZero() Returns Mat4d A 4x4 transformation matrix representing the coordinate system transformation. MakeXmlSource(string, string, bool) Creates an XML representation of the object. This method may also generate additional resources such as related files. public XElement MakeXmlSource(string baseDirectory, string relFile, bool exhibitionOnly) Parameters baseDirectory string The base directory for resolving relative paths relFile string The relative file path for the XML source exhibitionOnly bool if true, the extended file creation is suppressed. Returns XElement An XML element representing the object's state Remarks For the demand of easy moving source folder (especially project folder) without configuration file path corruption, the relative file path is applied. The baseDirectory is typically the folder at the nearest configuration file folder. Since the folder can be moving with the configuration file. MaterialiseMachiningEquipment(string, IProgress) Builds the runtime face from this authored face: a fresh MachiningEquipment whose topology is an XML round-trip copy of this one (chain, fixture, workpiece, table transformer, tool), with the heavy machine-body and fixture Solid instances SHARED (this face keeps their lifecycle), axis poses copied, and the environment data stamped by reference. Information flows one way: the returned instance never writes back into this one. public MachiningEquipment MaterialiseMachiningEquipment(string baseDirectory, IProgress progress) Parameters baseDirectory string The project base directory this equipment's relative paths (e.g. MachiningChainFile) resolve against. progress IProgress Progress reporter for diagnostics during the copy. Returns MachiningEquipment The materialised runtime equipment. Reg(XFactory) Registers this type's deserializer with the given XFactory and chains Reg(factory) on dependents. Idempotent. public static void Reg(XFactory factory = null) Parameters factory XFactory Tooling(int, MachiningToolHouse) Selects the Setup-page tool by toolId from toolHouse. The authored face never hosts the tool-house instance itself: the runtime face equips house instances (and mutates their tessellation mid-run), and one tool's Asmb cannot live in two topologies — so this hosts a private duplicate. Clear the selection (“do not show”) by setting MachiningTool to null. public bool Tooling(int toolId, MachiningToolHouse toolHouse) Parameters toolId int tool ID toolHouse MachiningToolHouse tool house Returns bool true if the selection changed; otherwise, false. Exceptions ToolNotFoundException Throw If toolId does not exist on toolHouse." }, "api/Hi.Machining.MachiningEquipmentUtils.html": { "href": "api/Hi.Machining.MachiningEquipmentUtils.html", @@ -2482,7 +2482,7 @@ "api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html": { "href": "api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html", "title": "Class MachiningVolumeRemovalProc.StepMotionSnapshot | HiAPI-C# 2025", - "summary": "Class MachiningVolumeRemovalProc.StepMotionSnapshot Namespace Hi.Machining Assembly HiMech.dll Represents a snapshot of the machining motion state. public record MachiningVolumeRemovalProc.StepMotionSnapshot : IEquatable Inheritance object MachiningVolumeRemovalProc.StepMotionSnapshot Implements IEquatable Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors StepMotionSnapshot(DVec3d, DVec3d, SeqPair, Dictionary, double[], bool, IMachiningTool, WorkpieceService, double, CoolantHeatCondition, SortedList, DVec3d) Represents a snapshot of the machining motion state. public StepMotionSnapshot(DVec3d GeomCl, DVec3d ProgramCl, SeqPair Seq, Dictionary AnchorTransformDictionary, double[] McValues, bool EnableSweeping, IMachiningTool MachiningTool, WorkpieceService WorkpieceService, double BackgroundTemperature_K, CoolantHeatCondition CoolantHeatCondition, SortedList FluteZToDzList, DVec3d PreTipPose = null) Parameters GeomCl DVec3d The geometric CL point. ProgramCl DVec3d The program CL point. Seq SeqPair The sequence pair of transformation matrices. AnchorTransformDictionary Dictionary Dictionary mapping anchors to their transformation matrices. McValues double[] Array of machine values. EnableSweeping bool Whether sweeping is enabled. MachiningTool IMachiningTool The machining tool being used. WorkpieceService WorkpieceService Service that owns the workpiece being machined. BackgroundTemperature_K double Background temperature in Kelvin. CoolantHeatCondition CoolantHeatCondition The coolant heat condition. FluteZToDzList SortedList Sorted list mapping flute Z positions to their deltas. PreTipPose DVec3d The tip pose the previous StepMotion(bool, double, Mat4d) call fed to the valve, on the workpiece-geometry coordinate – whether or not that call produced a step (the valve skips a collinear return over a segment it already covered). Null on the first call after a reset. The one-step reference for the real tip feedrate; Seq.pre is not, it may span two steps back. Properties AnchorTransformDictionary Dictionary mapping anchors to their transformation matrices. public Dictionary AnchorTransformDictionary { get; init; } Property Value Dictionary BackgroundTemperature_K Background temperature in Kelvin. public double BackgroundTemperature_K { get; init; } Property Value double CoolantHeatCondition The coolant heat condition. public CoolantHeatCondition CoolantHeatCondition { get; init; } Property Value CoolantHeatCondition EnableSweeping Whether sweeping is enabled. public bool EnableSweeping { get; init; } Property Value bool FluteZToDzList Sorted list mapping flute Z positions to their deltas. public SortedList FluteZToDzList { get; init; } Property Value SortedList GeomCl The geometric CL point. public DVec3d GeomCl { get; init; } Property Value DVec3d MachiningTool The machining tool being used. public IMachiningTool MachiningTool { get; init; } Property Value IMachiningTool McValues Array of machine values. public double[] McValues { get; init; } Property Value double[] PreTipPose The tip pose the previous StepMotion(bool, double, Mat4d) call fed to the valve, on the workpiece-geometry coordinate – whether or not that call produced a step (the valve skips a collinear return over a segment it already covered). Null on the first call after a reset. The one-step reference for the real tip feedrate; Seq.pre is not, it may span two steps back. public DVec3d PreTipPose { get; init; } Property Value DVec3d ProgramCl The program CL point. public DVec3d ProgramCl { get; init; } Property Value DVec3d Seq The sequence pair of transformation matrices. public SeqPair Seq { get; init; } Property Value SeqPair Workpiece The workpiece data model. public Workpiece Workpiece { get; } Property Value Workpiece WorkpieceService Service that owns the workpiece being machined. public WorkpieceService WorkpieceService { get; init; } Property Value WorkpieceService" + "summary": "Class MachiningVolumeRemovalProc.StepMotionSnapshot Namespace Hi.Machining Assembly HiMech.dll Represents a snapshot of the machining motion state. public record MachiningVolumeRemovalProc.StepMotionSnapshot : IEquatable Inheritance object MachiningVolumeRemovalProc.StepMotionSnapshot Implements IEquatable Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors StepMotionSnapshot(DVec3d, DVec3d, SeqPair, Dictionary, double[], bool, IMachiningTool, WorkpieceService, double, CoolantHeatCondition, SortedList, DVec3d) Represents a snapshot of the machining motion state. public StepMotionSnapshot(DVec3d GeomCl, DVec3d ProgramCl, SeqPair Seq, Dictionary AnchorTransformDictionary, double[] McValues, bool EnableSweeping, IMachiningTool MachiningTool, WorkpieceService WorkpieceService, double AmbientTemperature_K, CoolantHeatCondition CoolantHeatCondition, SortedList FluteZToDzList, DVec3d PreTipPose = null) Parameters GeomCl DVec3d The geometric CL point. ProgramCl DVec3d The program CL point. Seq SeqPair The sequence pair of transformation matrices. AnchorTransformDictionary Dictionary Dictionary mapping anchors to their transformation matrices. McValues double[] Array of machine values. EnableSweeping bool Whether sweeping is enabled. MachiningTool IMachiningTool The machining tool being used. WorkpieceService WorkpieceService Service that owns the workpiece being machined. AmbientTemperature_K double Ambient temperature in Kelvin. CoolantHeatCondition CoolantHeatCondition The coolant heat condition. FluteZToDzList SortedList Sorted list mapping flute Z positions to their deltas. PreTipPose DVec3d The tip pose the previous StepMotion(bool, double, Mat4d) call fed to the valve, on the workpiece-geometry coordinate – whether or not that call produced a step (the valve skips a collinear return over a segment it already covered). Null on the first call after a reset. The one-step reference for the real tip feedrate; Seq.pre is not, it may span two steps back. Properties AmbientTemperature_K Ambient temperature in Kelvin. public double AmbientTemperature_K { get; init; } Property Value double AnchorTransformDictionary Dictionary mapping anchors to their transformation matrices. public Dictionary AnchorTransformDictionary { get; init; } Property Value Dictionary CoolantHeatCondition The coolant heat condition. public CoolantHeatCondition CoolantHeatCondition { get; init; } Property Value CoolantHeatCondition EnableSweeping Whether sweeping is enabled. public bool EnableSweeping { get; init; } Property Value bool FluteZToDzList Sorted list mapping flute Z positions to their deltas. public SortedList FluteZToDzList { get; init; } Property Value SortedList GeomCl The geometric CL point. public DVec3d GeomCl { get; init; } Property Value DVec3d MachiningTool The machining tool being used. public IMachiningTool MachiningTool { get; init; } Property Value IMachiningTool McValues Array of machine values. public double[] McValues { get; init; } Property Value double[] PreTipPose The tip pose the previous StepMotion(bool, double, Mat4d) call fed to the valve, on the workpiece-geometry coordinate – whether or not that call produced a step (the valve skips a collinear return over a segment it already covered). Null on the first call after a reset. The one-step reference for the real tip feedrate; Seq.pre is not, it may span two steps back. public DVec3d PreTipPose { get; init; } Property Value DVec3d ProgramCl The program CL point. public DVec3d ProgramCl { get; init; } Property Value DVec3d Seq The sequence pair of transformation matrices. public SeqPair Seq { get; init; } Property Value SeqPair Workpiece The workpiece data model. public Workpiece Workpiece { get; } Property Value Workpiece WorkpieceService Service that owns the workpiece being machined. public WorkpieceService WorkpieceService { get; init; } Property Value WorkpieceService" }, "api/Hi.Machining.MachiningVolumeRemovalProc.html": { "href": "api/Hi.Machining.MachiningVolumeRemovalProc.html", @@ -2562,7 +2562,7 @@ "api/Hi.MachiningProcs.LocalProjectService.html": { "href": "api/Hi.MachiningProcs.LocalProjectService.html", "title": "Class LocalProjectService | HiAPI-C# 2025", - "summary": "Class LocalProjectService Namespace Hi.MachiningProcs Assembly HiNc.dll Root(Local) project service. Apply absolute file path. public class LocalProjectService : IProjectService, IMachiningProjectGetter, IMachiningService, IGetMachiningEquipment, IStepPropertyAccessHost, IDisposable Inheritance object LocalProjectService Implements IProjectService IMachiningProjectGetter IMachiningService IGetMachiningEquipment IStepPropertyAccessHost IDisposable Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Remarks LocalProjectService handles the runtime data and cache generally not requires configuration IO. Compare to MachiningProject, LocalProjectService also handles events that does not reset on the MachiningProject been reloaded. Constructors LocalProjectService(ILogger) Ctor. public LocalProjectService(ILogger logger = null) Parameters logger ILogger Optional logger instance. Properties ActiveNcRunner Gets the active NC runner based on EnableSoftNcRunner. public INcRunner ActiveNcRunner { get; } Property Value INcRunner BaseDirectory Gets the project base directory (relative-path root). public string BaseDirectory { get; } Property Value string BoundSelectorHost Gets the bound selector host for managing selection boundaries. public BoundSelectorHost BoundSelectorHost { get; } Property Value BoundSelectorHost ClRunner Gets the NX-CL (CLSF) runner of the project (NxClRunner); null when there is no project. public INcRunner ClRunner { get; } Property Value INcRunner ClStrip Gets the cutter location strip containing the machining steps. public ClStrip ClStrip { get; } Property Value ClStrip CsvRunner Gets the CSV runner — the CSV suit's pipeline (GeneralCsvRunner); null when there is no project. public INcRunner CsvRunner { get; } Property Value INcRunner DictionaryColorGuide Gets the color guide for dictionary-based coloring. public DictionaryColorGuide DictionaryColorGuide { get; } Property Value DictionaryColorGuide EnablePauseOnFailure Gets or sets whether to pause execution on failure. public bool EnablePauseOnFailure { get; set; } Property Value bool EnableSoftNcRunner Switches between SoftNcRunner and the legacy HardNcRunner. Default true (2026-07-17): SoftNcRunner is the flagship NC pipeline; set false to fall back to HardNcRunner for the features that still depend on it (e.g. Hi.NcOpt.NcOptProc optimization reads NcLines). Will be removed when HardNcRunner is fully replaced. public bool EnableSoftNcRunner { get; set; } Property Value bool EnableStrokeLimitCheck Gets or sets whether stroke limit checking is enabled. public bool EnableStrokeLimitCheck { get; set; } Property Value bool Fixture Gets or sets the authored fixture (setup face). The runtime face follows by rebuild; runtime readers use MachiningEquipment.Fixture. public Fixture Fixture { get; set; } Property Value Fixture Global global variable for SessionShell. Not save on XML. public Dictionary Global { get; set; } Property Value Dictionary InspectingKey Gets or sets the current inspecting key for visualization. When set, updates the inspecting quantity function. public string InspectingKey { get; set; } Property Value string InspectingQuantityFunc Gets the function that retrieves the quantity value for the current inspecting key. public Func InspectingQuantityFunc { get; } Property Value Func IsCollisionDetectionEnabled Gets whether collision detection is currently enabled. public bool IsCollisionDetectionEnabled { get; } Property Value bool LastMillingParaTrainResult Snapshot of the most recent TrainMillingPara(SampleFlag, bool, double, string, CancellationToken, ICuttingPara, IProgress) / ReTrainMillingPara(SampleFlag, double, string, CancellationToken, IProgress) outcome — sampleFlags, correlation R, filtered sample count, output file and the built parameter's XML — so a caller (e.g. the webservice) can read the training result without re-opening the output .mp file. Service lifetime, last-wins; null until the first training call completes. Deliberately not cleared by ResetRuntime(IProgress) so the result stays readable after a post-run reset. public MillingParaTrainResult LastMillingParaTrainResult { get; } Property Value MillingParaTrainResult Logger Gets the logger instance for this service. public ILogger Logger { get; } Property Value ILogger MachiningActRunner Gets the machining act runner responsible for executing machining operations. public MachiningActRunner MachiningActRunner { get; } Property Value MachiningActRunner MachiningChain Gets or sets the authored machining chain (setup face). The runtime face follows by rebuild; runtime readers use MachiningEquipment.MachiningChain. public IMachiningChain MachiningChain { get; set; } Property Value IMachiningChain MachiningChainFile Gets or sets the file path of the solid machining chain. This is used for XML serialization and file management. public string MachiningChainFile { get; set; } Property Value string MachiningEquipment The runtime (execution) equipment face — service-owned, materialised from SetupEquipment at project assignment and session boundaries, never serialized. Runtime consumers (runner, physics, collision, execution display) read this. public MachiningEquipment MachiningEquipment { get; } Property Value MachiningEquipment MachiningMotionResolution Gets or sets the machining motion resolution strategy (project-level; backed by MachiningActRunner). public IMachiningMotionResolution MachiningMotionResolution { get; set; } Property Value IMachiningMotionResolution MachiningProject Gets or sets the machining project. The setter runs the full change lifecycle (teardown of the outgoing project, then Hi.MachiningProcs.LocalProjectService.OnMachiningProjectChanged()), so external assignment — e.g. through MachiningProject or a desktop host — can no longer bypass the hooks and leave the runner config un-wired (equipment-split P2). public MachiningProject MachiningProject { get; set; } Property Value MachiningProject MachiningProjectPath public string MachiningProjectPath { get; set; } Property Value string MachiningResolution_mm Gets the machining resolution (mm) — the act-runner value, or the workpiece bottom resolution when unset. Set via SetMachiningResolution_mm(double, IProgress) (have-both: the caller injects the message host). Seeded from InitResolution when a project is loaded/assigned; an explicit setting then survives ResetRuntime(IProgress) and workpiece swaps. public double MachiningResolution_mm { get; } Property Value double MachiningSession Gets the current machining session. public MachiningSession MachiningSession { get; set; } Property Value MachiningSession MachiningTool Gets or sets the Setup-page selected tool (setup face). The tool the runner currently drives is MachiningEquipment.MachiningTool. public IMachiningTool MachiningTool { get; set; } Property Value IMachiningTool MachiningToolHouse Gets or sets the machining tool house containing tool configurations. public MachiningToolHouse MachiningToolHouse { get; set; } Property Value MachiningToolHouse MachiningToolHouseFile Gets or sets the file path to the milling tool house configuration. public string MachiningToolHouseFile { get; set; } Property Value string MillingStepLuggageReader Gets the reader for accessing milling step luggage data. public ParallelBulkReader MillingStepLuggageReader { get; } Property Value ParallelBulkReader NcDiagnosticProgress NC-pipeline diagnostic sink on the IMessage channel — sibling of StepDiagnosticProgress. Stable for the service lifetime (created in the ctor, only Cleared on reset, never swapped per session). public NcDiagnosticProgress NcDiagnosticProgress { get; } Property Value NcDiagnosticProgress NcManipulationDiagnosticProgress Gets the NC-manipulation diagnostic sink — the second diagnostic home, for operations that rework an already-played NC/CL program (writeback conversion, NC optimization) as opposed to the play-time pipeline diagnostics in NcDiagnosticProgress. Keeping the two scenarios in separate homes lets a play reset clear run diagnostics without discarding manipulation results, and vice versa; each manipulation run clears this home at its start so it always holds the latest run. public NcDiagnosticProgress NcManipulationDiagnosticProgress { get; } Property Value NcDiagnosticProgress NcOptProc Gets the NC optimization processor for optimizing NC programs. public NcOptProc NcOptProc { get; } Property Value NcOptProc NcRunner Gets the legacy NC runner. public HardNcRunner NcRunner { get; } Property Value HardNcRunner PacePlayer Gets the pace player for controlling execution pace of milling operations. public PacePlayer PacePlayer { get; } Property Value PacePlayer ProjectDirectory Gets the directory containing the machining project. public string ProjectDirectory { get; } Property Value string ScriptOptions Project-level Roslyn script options for session script execution. Initialized from DefaultScriptOptions. public ScriptOptions ScriptOptions { get; set; } Property Value ScriptOptions SessionShell Gets the shell API for the active session. Created at BeginSession(), nulled at EndSession(); null outside a session — its lifetime is unified with MachiningSession, so a non-null instance always implies an active session. public SessionShell SessionShell { get; } Property Value SessionShell SetupEquipment The authored (setup) equipment face of the loaded project — the only persisted face. Authoring surfaces (setup pages, equipment editors) read and write this; runtime follows by rebuild (see NotifySetupEquipmentEdited()). public SetupEquipment SetupEquipment { get; } Property Value SetupEquipment ShellProgress Session-level routine / lifecycle message sink on the IMessage channel (cache reset, file progress, …). Owned by MachiningSession (truly session-scoped); null outside a session. Use null-safely. public ShellProgress ShellProgress { get; } Property Value ShellProgress SoftNcRunner Facade over the active suit's NC pipeline (MachiningProject.NcRunnerSuit.SoftNcRunner). The getter is null-safe (returns null when there is no project/suit). The setter is the single rewiring entry point: it assigns the suit's runner and re-binds everything that depends on it (proxy hosts, kinematics provider, session script dictionaries, and the per-session NcRunnerSessionState). public SoftNcRunner SoftNcRunner { get; set; } Property Value SoftNcRunner StepDiagnosticProgress Step-anchored message sink on the IMessage channel, threaded through the runner / act-processing chain. public StepDiagnosticProgress StepDiagnosticProgress { get; } Property Value StepDiagnosticProgress StepPropertyAccessDictionary Gets the dictionary mapping property keys to their access methods. public ConcurrentDictionary> StepPropertyAccessDictionary { get; } Property Value ConcurrentDictionary> TimeMapping Gets or sets the time mapping for synchronizing different time-based data streams. public TimeMapping TimeMapping { get; set; } Property Value TimeMapping Workpiece Gets or sets the authored workpiece (setup face). The runtime face follows by rebuild; runtime readers use MachiningEquipment.Workpiece. public Workpiece Workpiece { get; set; } Property Value Workpiece WorkpieceService Gets the workpiece runtime service. public WorkpieceService WorkpieceService { get; } Property Value WorkpieceService XyzabcSolver Gets the shared kinematics solver — the third topology entity of the equipment split, owned by the service (runtime side) rather than the persisted project graph. Rebuilt by Hi.MachiningProcs.LocalProjectService.BuildCoordinateConverter() whenever the machine chain changes. public XyzabcSolver XyzabcSolver { get; } Property Value XyzabcSolver Methods Act(IAct, ISentenceCarrier, CancellationToken?) Executes an act and collects all results. public void Act(IAct act, ISentenceCarrier sourceCommand = null, CancellationToken? cancellationToken = null) Parameters act IAct The act to execute. sourceCommand ISentenceCarrier The source command that triggered the act. cancellationToken CancellationToken? Cancellation token to cancel the operation. BeginNcRunner() Prepares the NC runner for a play session by initializing the workpiece meshed geometry (when not already initialized), reporting progress through ShellProgress. public void BeginNcRunner() BeginSession() Initiate a simulation session. Clear the state from previous session (if existed). public void BeginSession() CheckStrokeLimitOnStep() Checks stroke limit at the current MC position. Uses IStrokeLimitConfig when EnableSoftNcRunner is active, otherwise falls back to CheckStrokeLimit(DVec3d, IProgress). public bool CheckStrokeLimitOnStep() Returns bool True if within limits or no limits configured. CloseProject() Closes the current project. Like the other five project-file operations this runs under RunExclusiveProjectFileOp(Action): a close arriving while a load or a save holds the file is cancelled with ProjectFileBusyException instead of interleaving with it. It was the one operation left outside the gate, which is why ProjectController.CloseProject's 409 handler could never fire. public void CloseProject() Exceptions ProjectFileBusyException Another project-file operation is in progress. ConvertClToNcFiles(string, IProgress) Converts the CLSF play of the current session into Fanuc NC files (writeback synthesis — MSYS tilt becomes G68.2, RTCP becomes G43.4). Play a CL file on an XYZABC machine chain first, then convert; see ConvertClToNcFiles(string, string, IProgress). public IReadOnlyList ConvertClToNcFiles(string relNcFileTemplate = \"Output/[NcName].nc\", IProgress messageProgress = null) Parameters relNcFileTemplate string Output path template; [NcName] is replaced by the source file name. messageProgress IProgress Optional message sink for lifecycle reporting. Returns IReadOnlyList Written NC file paths, relative to the project base directory. Dispose() Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. public void Dispose() Dispose(bool) protected virtual void Dispose(bool disposing) Parameters disposing bool EnableCollisionDetection(bool, IProgress) Enables or disables collision detection. When enabling, prepares the collidable items; when disabling, resets collision flags. Progress is reported to the injected messageProgress. public void EnableCollisionDetection(bool value, IProgress messageProgress = null) Parameters value bool Whether collision detection should be enabled. messageProgress IProgress Sink-agnostic message host for progress reporting. EndSession() Ends the current machining session and releases associated resources. public void EndSession() EnsureExecutionEquipment() Ensures the runtime MachiningEquipment reflects the authored setup face — re-materialising it when setup edits are pending (equipment split: follow = rebuild at session boundaries). Default: no-op, for hosts without a setup face (e.g. test stubs). public void EnsureExecutionEquipment() FixedPace(double, double) Creates a fixed machining motion resolution with the specified linear (mm) and rotary (deg) resolutions. public FixedMachiningMotionResolution FixedPace(double linearResolution_mm, double rotaryResolution_deg) Parameters linearResolution_mm double Linear resolution in millimeters. rotaryResolution_deg double Rotary resolution in degrees. Returns FixedMachiningMotionResolution ForwardSetupEnvironmentToExecution() Forwards the authored environment values (background temperature, coolant condition, spindle capability) onto the runtime face. These are pure data with no topology involvement, so eager forwarding is safe and keeps environment edits immediate — a full materialise is not needed for them. Call after writing the environment members on SetupEquipment. public void ForwardSetupEnvironmentToExecution() GetInspectingKeyPresentName(StringLocalizer) Gets the localized presentation name for the current inspecting key. public string GetInspectingKeyPresentName(StringLocalizer stringLocalizer) Parameters stringLocalizer StringLocalizer The string localizer to use for localization Returns string The localized presentation name GetLocalProjectService() Get Local Project Service as base-service. public LocalProjectService GetLocalProjectService() Returns LocalProjectService Local Project Service GetMachiningEquipment() Get the runtime MachiningEquipment. public MachiningEquipment GetMachiningEquipment() Returns MachiningEquipment MachiningEquipment GetMachiningProject() Gets the MachiningProject instance. public MachiningProject GetMachiningProject() Returns MachiningProject The MachiningProject instance. GetSessionShell() Returns the session shell that exposes the runtime surface of the active machining session. public ISessionShell GetSessionShell() Returns ISessionShell LoadProject(string, IProgress) Loads a project by absolute file path. Load-time diagnostics (a machine or part STL the project references but that is missing on disk, an unloadable child XML, …) do not fail the load: the project comes up without that geometry and each problem is reported as an IMessage — always to the service logger, and also to messageProgress when the caller injects one. public void LoadProject(string projectPath, IProgress messageProgress = null) Parameters projectPath string The absolute file path messageProgress IProgress Optional caller-injected sink for the load-time diagnostics (e.g. a MessageCollector a web controller hands back in its response). Null keeps logger-only reporting. NewProject(string) Creates a new project by file path. public void NewProject(string projectPath) Parameters projectPath string The absolute file path NotifySetupEquipmentEdited() Marks the authored face edited so the runtime face follows. Follow is a REBUILD (never live incremental sync): immediately when no session is active, otherwise at the next session boundary (BeginSession() / the next play's EnsureExecutionEquipment() / a player reset). The facade setters call this; call it manually after mutating SetupEquipment members in place. public void NotifySetupEquipmentEdited() PlayBrandNcFile(string, string) Plays a famous-brand NC code file from the specified path with pace control (no kind dispatch — always the brand runner). public void PlayBrandNcFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths relFilePath string Relative path to the NC file PlayClFile(string, string) Plays an NX-CL (CLSF) file from the specified path. public void PlayClFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the CLSF file. PlayCsvFile(string, string) Plays a CSV file from the specified path. public void PlayCsvFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the CSV file. PlayNc(string, string) Plays NC commands from raw text with pace control. public void PlayNc(string ncText, string fileNameAlternative = \"--\") Parameters ncText string The NC command text to execute fileNameAlternative string Alternative name to associate with the NC program PlayNcFile(string, string, NcKind) Plays an NC program file from the specified path, the runner picked by kind (Auto = by file extension: known CL/CSV extensions map to those runners, anything else plays as brand NC). public void PlayNcFile(string baseDirectory, string relFilePath, NcKind kind = NcKind.Auto) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the NC program file. kind NcKind Which runner plays the file; Auto detects by extension. PowerReset() Performs a controller power reset, modelling a power-off / power-on cycle: Every IPowerResettable dependency clears its volatile subset. Persistent dependency state (controller parameters, Fanuc #500-#999, etc.) is left intact. The active MachiningSession's NcRunnerSessionState is reset so the per-layer SyntaxPiece dataflow — including Vars.Volatile, modal carries, and the init seed — is dropped. The next RunNcLines(string, IEnumerable, MachiningSession, StepDiagnosticProgress, NcDiagnosticProgress, CancellationToken) call re-initialises everything from scratch. Without the second step, calling PowerReset while a project is loaded would leave volatile commons alive across the supposed power cycle (they live in the SyntaxPiece JSON dataflow rather than in any IPowerResettable dependency). public void PowerReset() ProcAct(IAct, ISentenceCarrier, CancellationToken?) Processes an act and returns the results. public IEnumerable ProcAct(IAct act, ISentenceCarrier sourceCommand = null, CancellationToken? cancellationToken = null) Parameters act IAct The act to process. sourceCommand ISentenceCarrier The source command that triggered the act. cancellationToken CancellationToken? Cancellation token to cancel the operation. Returns IEnumerable Enumerable of results from processing the act. ReTrainMillingPara(SampleFlag, double, string, CancellationToken, IProgress) Train Milling Parameter. public void ReTrainMillingPara(SampleFlag sampleFlags, double outlierRatio, string dstRelFile, CancellationToken cancellationToken, IProgress messageProgress = null) Parameters sampleFlags SampleFlag outlierRatio double dstRelFile string cancellationToken CancellationToken messageProgress IProgress ReadNcRunnerSuit(string) Reads an NcRunnerSuit from relFile (project relative) and makes it the active suit — switching the active parser (NC or CSV) — then re-binds every host hookup (see Hi.MachiningProcs.LocalProjectService.RewireForActiveSuit()). Refused while an NC program is playing: the runner's per-session layers are mid-enumeration and cannot be safely reset (an IProgress error is reported instead). public void ReadNcRunnerSuit(string relFile) Parameters relFile string RefreshDrawing() Refreshes the visual display of the milling course. public void RefreshDrawing() Reg(XFactory) Bootstraps XML-factory registration for the simulation pipeline. Entry points must call this once at startup before any project XML is deserialized. Pass a custom XFactory for test isolation, or null to populate Default. Idempotent. public static void Reg(XFactory factory = null) Parameters factory XFactory RegisterStepVariable(string, string, string, string, Func) Registers a step variable so downstream components (strip charts, CSV exports, scripting) can read it from MachiningStep. Idempotent on key. public void RegisterStepVariable(string key, string name, string unit, string formatString, Func variableFunc = null) Parameters key string Unique key. name string Human-readable name; may equal key. unit string Physical unit name (PhysicsUnit); nullable. formatString string Display format string; nullable. variableFunc Func Optional value extractor; nullable when the value comes from the step's flex dictionary. ReloadProject(IProgress) Reloads the current project from disk, discarding in-memory edits. Load-time diagnostics are reported the same way as in LoadProject(string, IProgress). public void ReloadProject(IProgress messageProgress = null) Parameters messageProgress IProgress Optional caller-injected sink for the load-time diagnostics; null keeps logger-only reporting. ResetRuntime(IProgress) Reset the runtime states including: meshed geometry, collision flags, machine tool position, CL strips, message buffer and etc.. MachiningResolution_mm is deliberately left untouched so an explicit setting survives resets; it is seeded from InitResolution only when a project is loaded/assigned. public void ResetRuntime(IProgress messageProgress = null) Parameters messageProgress IProgress RunBrandNcFile(string, string) Runs a famous-brand NC code file from the specified path (no kind dispatch — always the brand runner). public IEnumerable RunBrandNcFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. If the value is null, BaseDirectory substitutes the value. relFilePath string Relative path to the NC file. Returns IEnumerable An enumerable of actions to be executed. RunClFile(string, string) Runs an NX-CL (CLSF) file from the specified path. public IEnumerable RunClFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the CLSF file. Returns IEnumerable An enumerable of actions to be executed. RunCsvFile(string, string) Runs a CSV file from the specified path. public IEnumerable RunCsvFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the CSV file. Returns IEnumerable An enumerable of actions to be executed. RunNc(string, string) Runs NC commands from raw text. public IEnumerable RunNc(string ncText, string fileNameAlternative = \"--\") Parameters ncText string The NC command text to execute fileNameAlternative string Alternative name to associate with the NC program Returns IEnumerable An enumerable of actions to be executed RunNcFile(string, string, NcKind) Runs an NC program file from the specified path, the runner picked by kind (Auto = by file extension: known CL/CSV extensions map to those runners, anything else runs as brand NC). public IEnumerable RunNcFile(string baseDirectory, string relFilePath, NcKind kind = NcKind.Auto) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the NC program file. kind NcKind Which runner runs the file; Auto detects by extension. Returns IEnumerable An enumerable of actions to be executed. RunToLineEnd() Advances the player by one NC/CSV line and pauses. public void RunToLineEnd() SaveAsProject(string) Saves the current project to a specified relative file path. public void SaveAsProject(string projectPath) Parameters projectPath string The absolute file path SaveProject() Save project by project path. public void SaveProject() SetMachiningResolution_mm(double, IProgress) Sets the machining resolution (mm). Progress is reported to the injected messageProgress. public void SetMachiningResolution_mm(double value, IProgress messageProgress = null) Parameters value double The machining resolution in millimeters. messageProgress IProgress Sink-agnostic message host for progress reporting. TrainMillingPara(SampleFlag, bool, double, string, CancellationToken, ICuttingPara, IProgress) Train Milling Parameter. public void TrainMillingPara(SampleFlag sampleFlags, bool enableFzOnlyDuringDrilling, double outlierRatio, string dstRelFile, CancellationToken cancellationToken, ICuttingPara paraTemplate, IProgress messageProgress = null) Parameters sampleFlags SampleFlag enableFzOnlyDuringDrilling bool outlierRatio double dstRelFile string cancellationToken CancellationToken paraTemplate ICuttingPara messageProgress IProgress UpdateByMachiningChain() Updates components when the machining chain changes. public void UpdateByMachiningChain() UpdateByMachiningEquipment() Re-binds everything derived from the runtime equipment face. Runs as the tail of Hi.MachiningProcs.LocalProjectService.MaterialiseExecutionEquipment(); call manually only after mutating the runtime face outside the service. public void UpdateByMachiningEquipment() UpdateIdealMillingToolOffsetTableByToolHouse() Updates the ideal milling tool offset table based on the current tool house configuration. The radius column follows the project's RadiusOffsetBasis so a zero-based (tool-centre path) program keeps its D rows at wear only. public void UpdateIdealMillingToolOffsetTableByToolHouse() WriteNcRunnerSuit(string) Writes the active NcRunnerSuit to relFile (project relative). Pure file IO — does not update any in-memory pointer. public void WriteNcRunnerSuit(string relFile) Parameters relFile string WriteShotFile(TimeSpan, string, IProgress) Writes time-based shot data to a file with the specified sampling period. public void WriteShotFile(TimeSpan samplingPeriod, string relFileTemplate = \"Output/[NcName].shot.csv\", IProgress messageProgress = null) Parameters samplingPeriod TimeSpan The time period between samples relFileTemplate string Template for the output file path, can include [NcName] placeholder messageProgress IProgress Optional caller-supplied progress sink for start/finish messages. WriteStepFile(string, IProgress) Writes step-based data to a file. public void WriteStepFile(string relFileTemplate = \"Output/[NcName].step.csv\", IProgress messageProgress = null) Parameters relFileTemplate string Template for the output file path, can include [NcName] placeholder messageProgress IProgress Optional caller-supplied progress sink for start/finish messages. Events MachiningProjectChanged Event raised when the machining project changes. public event LocalProjectService.MachiningProjectChangedDelegate MachiningProjectChanged Event Type LocalProjectService.MachiningProjectChangedDelegate MachiningStepBuilt event to configure steps. The first parameter is the previous step; the second parameter is the current step. The previous step is null if no previous step exists. public event MachiningActRunner.MachiningStepBuiltDelegate MachiningStepBuilt Event Type MachiningActRunner.MachiningStepBuiltDelegate OnNcFileRan Event triggered after an NC file is executed. public event Action OnNcFileRan Event Type Action OnShellMessageAdded App-lifetime bridge for ShellProgress appends. Because ShellProgress is session-scoped (recreated at BeginSession(), null outside a session), a consumer that wants every session's shell messages subscribes here once instead of chasing the swapping instance — BeginSession() re-wires the bridge to the new sink each session, the same way OnSourcedActEntry is bridged. Carries the append index and the message. public event Action OnShellMessageAdded Event Type Action OnShellMessageCleared App-lifetime bridge for ShellProgress clears (see OnShellMessageAdded). public event Action OnShellMessageCleared Event Type Action OnSourcedActEntry App-lifetime event triggered for each SourcedActEntry produced during NC/CSV execution. public event Action OnSourcedActEntry Event Type Action OnSyntaxPieceRan Raised after each SyntaxPiece has been run during NC execution (app lifetime). public event Action OnSyntaxPieceRan Event Type Action OnUpdatedInspectingQuantityFunc Event triggered when the inspecting quantity function is updated. public event Action OnUpdatedInspectingQuantityFunc Event Type Action WorkpieceChanged Event that is raised when the workpiece is changed. public event Action> WorkpieceChanged Event Type Action> Remarks This event is triggered whenever the workpiece property is modified. Subscribers can use this event to respond to changes in the workpiece configuration, such as updating visualizations or recalculating machining parameters. The event provides both the previous and new workpiece values through a SeqPair." + "summary": "Class LocalProjectService Namespace Hi.MachiningProcs Assembly HiNc.dll Root(Local) project service. Apply absolute file path. public class LocalProjectService : IProjectService, IMachiningProjectGetter, IMachiningService, IGetMachiningEquipment, IStepPropertyAccessHost, IDisposable Inheritance object LocalProjectService Implements IProjectService IMachiningProjectGetter IMachiningService IGetMachiningEquipment IStepPropertyAccessHost IDisposable Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Remarks LocalProjectService handles the runtime data and cache generally not requires configuration IO. Compare to MachiningProject, LocalProjectService also handles events that does not reset on the MachiningProject been reloaded. Constructors LocalProjectService(ILogger) Ctor. public LocalProjectService(ILogger logger = null) Parameters logger ILogger Optional logger instance. Properties ActiveNcRunner Gets the active NC runner based on EnableSoftNcRunner. public INcRunner ActiveNcRunner { get; } Property Value INcRunner BaseDirectory Gets the project base directory (relative-path root). public string BaseDirectory { get; } Property Value string BoundSelectorHost Gets the bound selector host for managing selection boundaries. public BoundSelectorHost BoundSelectorHost { get; } Property Value BoundSelectorHost ClRunner Gets the NX-CL (CLSF) runner of the project (NxClRunner); null when there is no project. public INcRunner ClRunner { get; } Property Value INcRunner ClStrip Gets the cutter location strip containing the machining steps. public ClStrip ClStrip { get; } Property Value ClStrip CsvRunner Gets the CSV runner — the CSV suit's pipeline (GeneralCsvRunner); null when there is no project. public INcRunner CsvRunner { get; } Property Value INcRunner DictionaryColorGuide Gets the color guide for dictionary-based coloring. public DictionaryColorGuide DictionaryColorGuide { get; } Property Value DictionaryColorGuide EnablePauseOnFailure Gets or sets whether to pause execution on failure. public bool EnablePauseOnFailure { get; set; } Property Value bool EnableSoftNcRunner Switches between SoftNcRunner and the legacy HardNcRunner. Default true (2026-07-17): SoftNcRunner is the flagship NC pipeline; set false to fall back to HardNcRunner for the features that still depend on it (e.g. Hi.NcOpt.NcOptProc optimization reads NcLines). Will be removed when HardNcRunner is fully replaced. public bool EnableSoftNcRunner { get; set; } Property Value bool EnableStrokeLimitCheck Gets or sets whether stroke limit checking is enabled. public bool EnableStrokeLimitCheck { get; set; } Property Value bool Fixture Gets or sets the authored fixture (setup face). The runtime face follows by rebuild; runtime readers use MachiningEquipment.Fixture. public Fixture Fixture { get; set; } Property Value Fixture Global global variable for SessionShell. Not save on XML. public Dictionary Global { get; set; } Property Value Dictionary InspectingKey Gets or sets the current inspecting key for visualization. When set, updates the inspecting quantity function. public string InspectingKey { get; set; } Property Value string InspectingQuantityFunc Gets the function that retrieves the quantity value for the current inspecting key. public Func InspectingQuantityFunc { get; } Property Value Func IsCollisionDetectionEnabled Gets whether collision detection is currently enabled. public bool IsCollisionDetectionEnabled { get; } Property Value bool LastMillingParaTrainResult Snapshot of the most recent TrainMillingPara(SampleFlag, bool, double, string, CancellationToken, ICuttingPara, IProgress) / ReTrainMillingPara(SampleFlag, double, string, CancellationToken, IProgress) outcome — sampleFlags, correlation R, filtered sample count, output file and the built parameter's XML — so a caller (e.g. the webservice) can read the training result without re-opening the output .mp file. Service lifetime, last-wins; null until the first training call completes. Deliberately not cleared by ResetRuntime(IProgress) so the result stays readable after a post-run reset. public MillingParaTrainResult LastMillingParaTrainResult { get; } Property Value MillingParaTrainResult Logger Gets the logger instance for this service. public ILogger Logger { get; } Property Value ILogger MachiningActRunner Gets the machining act runner responsible for executing machining operations. public MachiningActRunner MachiningActRunner { get; } Property Value MachiningActRunner MachiningChain Gets or sets the authored machining chain (setup face). The runtime face follows by rebuild; runtime readers use MachiningEquipment.MachiningChain. public IMachiningChain MachiningChain { get; set; } Property Value IMachiningChain MachiningChainFile Gets or sets the file path of the solid machining chain. This is used for XML serialization and file management. public string MachiningChainFile { get; set; } Property Value string MachiningEquipment The runtime (execution) equipment face — service-owned, materialised from SetupEquipment at project assignment and session boundaries, never serialized. Runtime consumers (runner, physics, collision, execution display) read this. public MachiningEquipment MachiningEquipment { get; } Property Value MachiningEquipment MachiningMotionResolution Gets or sets the machining motion resolution strategy (project-level; backed by MachiningActRunner). public IMachiningMotionResolution MachiningMotionResolution { get; set; } Property Value IMachiningMotionResolution MachiningProject Gets or sets the machining project. The setter runs the full change lifecycle (teardown of the outgoing project, then Hi.MachiningProcs.LocalProjectService.OnMachiningProjectChanged()), so external assignment — e.g. through MachiningProject or a desktop host — can no longer bypass the hooks and leave the runner config un-wired (equipment-split P2). public MachiningProject MachiningProject { get; set; } Property Value MachiningProject MachiningProjectPath public string MachiningProjectPath { get; set; } Property Value string MachiningResolution_mm Gets the machining resolution (mm) — the act-runner value, or the workpiece bottom resolution when unset. Set via SetMachiningResolution_mm(double, IProgress) (have-both: the caller injects the message host). Seeded from InitResolution when a project is loaded/assigned; an explicit setting then survives ResetRuntime(IProgress) and workpiece swaps. public double MachiningResolution_mm { get; } Property Value double MachiningSession Gets the current machining session. public MachiningSession MachiningSession { get; set; } Property Value MachiningSession MachiningTool Gets or sets the Setup-page selected tool (setup face). The tool the runner currently drives is MachiningEquipment.MachiningTool. public IMachiningTool MachiningTool { get; set; } Property Value IMachiningTool MachiningToolHouse Gets or sets the machining tool house containing tool configurations. public MachiningToolHouse MachiningToolHouse { get; set; } Property Value MachiningToolHouse MachiningToolHouseFile Gets or sets the file path to the milling tool house configuration. public string MachiningToolHouseFile { get; set; } Property Value string MillingStepLuggageReader Gets the reader for accessing milling step luggage data. public ParallelBulkReader MillingStepLuggageReader { get; } Property Value ParallelBulkReader NcDiagnosticProgress NC-pipeline diagnostic sink on the IMessage channel — sibling of StepDiagnosticProgress. Stable for the service lifetime (created in the ctor, only Cleared on reset, never swapped per session). public NcDiagnosticProgress NcDiagnosticProgress { get; } Property Value NcDiagnosticProgress NcManipulationDiagnosticProgress Gets the NC-manipulation diagnostic sink — the second diagnostic home, for operations that rework an already-played NC/CL program (writeback conversion, NC optimization) as opposed to the play-time pipeline diagnostics in NcDiagnosticProgress. Keeping the two scenarios in separate homes lets a play reset clear run diagnostics without discarding manipulation results, and vice versa; each manipulation run clears this home at its start so it always holds the latest run. public NcDiagnosticProgress NcManipulationDiagnosticProgress { get; } Property Value NcDiagnosticProgress NcOptProc Gets the NC optimization processor for optimizing NC programs. public NcOptProc NcOptProc { get; } Property Value NcOptProc NcRunner Gets the legacy NC runner. public HardNcRunner NcRunner { get; } Property Value HardNcRunner PacePlayer Gets the pace player for controlling execution pace of milling operations. public PacePlayer PacePlayer { get; } Property Value PacePlayer ProjectDirectory Gets the directory containing the machining project. public string ProjectDirectory { get; } Property Value string ScriptOptions Project-level Roslyn script options for session script execution. Initialized from DefaultScriptOptions. public ScriptOptions ScriptOptions { get; set; } Property Value ScriptOptions SessionShell Gets the shell API for the active session. Created at BeginSession(), nulled at EndSession(); null outside a session — its lifetime is unified with MachiningSession, so a non-null instance always implies an active session. public SessionShell SessionShell { get; } Property Value SessionShell SetupEquipment The authored (setup) equipment face of the loaded project — the only persisted face. Authoring surfaces (setup pages, equipment editors) read and write this; runtime follows by rebuild (see NotifySetupEquipmentEdited()). public SetupEquipment SetupEquipment { get; } Property Value SetupEquipment ShellProgress Session-level routine / lifecycle message sink on the IMessage channel (cache reset, file progress, …). Owned by MachiningSession (truly session-scoped); null outside a session. Use null-safely. public ShellProgress ShellProgress { get; } Property Value ShellProgress SoftNcRunner Facade over the active suit's NC pipeline (MachiningProject.NcRunnerSuit.SoftNcRunner). The getter is null-safe (returns null when there is no project/suit). The setter is the single rewiring entry point: it assigns the suit's runner and re-binds everything that depends on it (proxy hosts, kinematics provider, session script dictionaries, and the per-session NcRunnerSessionState). public SoftNcRunner SoftNcRunner { get; set; } Property Value SoftNcRunner StepDiagnosticProgress Step-anchored message sink on the IMessage channel, threaded through the runner / act-processing chain. public StepDiagnosticProgress StepDiagnosticProgress { get; } Property Value StepDiagnosticProgress StepPropertyAccessDictionary Gets the dictionary mapping property keys to their access methods. public ConcurrentDictionary> StepPropertyAccessDictionary { get; } Property Value ConcurrentDictionary> TimeMapping Gets or sets the time mapping for synchronizing different time-based data streams. public TimeMapping TimeMapping { get; set; } Property Value TimeMapping Workpiece Gets or sets the authored workpiece (setup face). The runtime face follows by rebuild; runtime readers use MachiningEquipment.Workpiece. public Workpiece Workpiece { get; set; } Property Value Workpiece WorkpieceService Gets the workpiece runtime service. public WorkpieceService WorkpieceService { get; } Property Value WorkpieceService XyzabcSolver Gets the shared kinematics solver — the third topology entity of the equipment split, owned by the service (runtime side) rather than the persisted project graph. Rebuilt by Hi.MachiningProcs.LocalProjectService.BuildCoordinateConverter() whenever the machine chain changes. public XyzabcSolver XyzabcSolver { get; } Property Value XyzabcSolver Methods Act(IAct, ISentenceCarrier, CancellationToken?) Executes an act and collects all results. public void Act(IAct act, ISentenceCarrier sourceCommand = null, CancellationToken? cancellationToken = null) Parameters act IAct The act to execute. sourceCommand ISentenceCarrier The source command that triggered the act. cancellationToken CancellationToken? Cancellation token to cancel the operation. BeginNcRunner() Prepares the NC runner for a play session by initializing the workpiece meshed geometry (when not already initialized), reporting progress through ShellProgress. public void BeginNcRunner() BeginSession() Initiate a simulation session. Clear the state from previous session (if existed). public void BeginSession() CheckStrokeLimitOnStep() Checks stroke limit at the current MC position. Uses IStrokeLimitConfig when EnableSoftNcRunner is active, otherwise falls back to CheckStrokeLimit(DVec3d, IProgress). public bool CheckStrokeLimitOnStep() Returns bool True if within limits or no limits configured. CloseProject() Closes the current project. Like the other five project-file operations this runs under RunExclusiveProjectFileOp(Action): a close arriving while a load or a save holds the file is cancelled with ProjectFileBusyException instead of interleaving with it. It was the one operation left outside the gate, which is why ProjectController.CloseProject's 409 handler could never fire. public void CloseProject() Exceptions ProjectFileBusyException Another project-file operation is in progress. ConvertClToNcFiles(string, IProgress) Converts the CLSF play of the current session into Fanuc NC files (writeback synthesis — MSYS tilt becomes G68.2, RTCP becomes G43.4). Play a CL file on an XYZABC machine chain first, then convert; see ConvertClToNcFiles(string, string, IProgress). public IReadOnlyList ConvertClToNcFiles(string relNcFileTemplate = \"Output/[NcName].nc\", IProgress messageProgress = null) Parameters relNcFileTemplate string Output path template; [NcName] is replaced by the source file name. messageProgress IProgress Optional message sink for lifecycle reporting. Returns IReadOnlyList Written NC file paths, relative to the project base directory. Dispose() Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. public void Dispose() Dispose(bool) protected virtual void Dispose(bool disposing) Parameters disposing bool EnableCollisionDetection(bool, IProgress) Enables or disables collision detection. When enabling, prepares the collidable items; when disabling, resets collision flags. Progress is reported to the injected messageProgress. public void EnableCollisionDetection(bool value, IProgress messageProgress = null) Parameters value bool Whether collision detection should be enabled. messageProgress IProgress Sink-agnostic message host for progress reporting. EndSession() Ends the current machining session and releases associated resources. public void EndSession() EnsureExecutionEquipment() Ensures the runtime MachiningEquipment reflects the authored setup face — re-materialising it when setup edits are pending (equipment split: follow = rebuild at session boundaries). Default: no-op, for hosts without a setup face (e.g. test stubs). public void EnsureExecutionEquipment() FixedPace(double, double) Creates a fixed machining motion resolution with the specified linear (mm) and rotary (deg) resolutions. public FixedMachiningMotionResolution FixedPace(double linearResolution_mm, double rotaryResolution_deg) Parameters linearResolution_mm double Linear resolution in millimeters. rotaryResolution_deg double Rotary resolution in degrees. Returns FixedMachiningMotionResolution ForwardSetupEnvironmentToExecution() Forwards the authored environment values (ambient temperature, coolant condition, spindle capability) onto the runtime face. These are pure data with no topology involvement, so eager forwarding is safe and keeps environment edits immediate — a full materialise is not needed for them. Call after writing the environment members on SetupEquipment. public void ForwardSetupEnvironmentToExecution() GetInspectingKeyPresentName(StringLocalizer) Gets the localized presentation name for the current inspecting key. public string GetInspectingKeyPresentName(StringLocalizer stringLocalizer) Parameters stringLocalizer StringLocalizer The string localizer to use for localization Returns string The localized presentation name GetLocalProjectService() Get Local Project Service as base-service. public LocalProjectService GetLocalProjectService() Returns LocalProjectService Local Project Service GetMachiningEquipment() Get the runtime MachiningEquipment. public MachiningEquipment GetMachiningEquipment() Returns MachiningEquipment MachiningEquipment GetMachiningProject() Gets the MachiningProject instance. public MachiningProject GetMachiningProject() Returns MachiningProject The MachiningProject instance. GetSessionShell() Returns the session shell that exposes the runtime surface of the active machining session. public ISessionShell GetSessionShell() Returns ISessionShell LoadProject(string, IProgress) Loads a project by absolute file path. Load-time diagnostics (a machine or part STL the project references but that is missing on disk, an unloadable child XML, …) do not fail the load: the project comes up without that geometry and each problem is reported as an IMessage — always to the service logger, and also to messageProgress when the caller injects one. public void LoadProject(string projectPath, IProgress messageProgress = null) Parameters projectPath string The absolute file path messageProgress IProgress Optional caller-injected sink for the load-time diagnostics (e.g. a MessageCollector a web controller hands back in its response). Null keeps logger-only reporting. NewProject(string) Creates a new project by file path. public void NewProject(string projectPath) Parameters projectPath string The absolute file path NotifySetupEquipmentEdited() Marks the authored face edited so the runtime face follows. Follow is a REBUILD (never live incremental sync): immediately when no session is active, otherwise at the next session boundary (BeginSession() / the next play's EnsureExecutionEquipment() / a player reset). The facade setters call this; call it manually after mutating SetupEquipment members in place. public void NotifySetupEquipmentEdited() PlayBrandNcFile(string, string) Plays a famous-brand NC code file from the specified path with pace control (no kind dispatch — always the brand runner). public void PlayBrandNcFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths relFilePath string Relative path to the NC file PlayClFile(string, string) Plays an NX-CL (CLSF) file from the specified path. public void PlayClFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the CLSF file. PlayCsvFile(string, string) Plays a CSV file from the specified path. public void PlayCsvFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the CSV file. PlayNc(string, string) Plays NC commands from raw text with pace control. public void PlayNc(string ncText, string fileNameAlternative = \"--\") Parameters ncText string The NC command text to execute fileNameAlternative string Alternative name to associate with the NC program PlayNcFile(string, string, NcKind) Plays an NC program file from the specified path, the runner picked by kind (Auto = by file extension: known CL/CSV extensions map to those runners, anything else plays as brand NC). public void PlayNcFile(string baseDirectory, string relFilePath, NcKind kind = NcKind.Auto) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the NC program file. kind NcKind Which runner plays the file; Auto detects by extension. PowerReset() Performs a controller power reset, modelling a power-off / power-on cycle: Every IPowerResettable dependency clears its volatile subset. Persistent dependency state (controller parameters, Fanuc #500-#999, etc.) is left intact. The active MachiningSession's NcRunnerSessionState is reset so the per-layer SyntaxPiece dataflow — including Vars.Volatile, modal carries, and the init seed — is dropped. The next RunNcLines(string, IEnumerable, MachiningSession, StepDiagnosticProgress, NcDiagnosticProgress, CancellationToken) call re-initialises everything from scratch. Without the second step, calling PowerReset while a project is loaded would leave volatile commons alive across the supposed power cycle (they live in the SyntaxPiece JSON dataflow rather than in any IPowerResettable dependency). public void PowerReset() ProcAct(IAct, ISentenceCarrier, CancellationToken?) Processes an act and returns the results. public IEnumerable ProcAct(IAct act, ISentenceCarrier sourceCommand = null, CancellationToken? cancellationToken = null) Parameters act IAct The act to process. sourceCommand ISentenceCarrier The source command that triggered the act. cancellationToken CancellationToken? Cancellation token to cancel the operation. Returns IEnumerable Enumerable of results from processing the act. ReTrainMillingPara(SampleFlag, double, string, CancellationToken, IProgress) Train Milling Parameter. public void ReTrainMillingPara(SampleFlag sampleFlags, double outlierRatio, string dstRelFile, CancellationToken cancellationToken, IProgress messageProgress = null) Parameters sampleFlags SampleFlag outlierRatio double dstRelFile string cancellationToken CancellationToken messageProgress IProgress ReadNcRunnerSuit(string) Reads an NcRunnerSuit from relFile (project relative) and makes it the active suit — switching the active parser (NC or CSV) — then re-binds every host hookup (see Hi.MachiningProcs.LocalProjectService.RewireForActiveSuit()). Refused while an NC program is playing: the runner's per-session layers are mid-enumeration and cannot be safely reset (an IProgress error is reported instead). public void ReadNcRunnerSuit(string relFile) Parameters relFile string RefreshDrawing() Refreshes the visual display of the milling course. public void RefreshDrawing() Reg(XFactory) Bootstraps XML-factory registration for the simulation pipeline. Entry points must call this once at startup before any project XML is deserialized. Pass a custom XFactory for test isolation, or null to populate Default. Idempotent. public static void Reg(XFactory factory = null) Parameters factory XFactory RegisterStepVariable(string, string, string, string, Func) Registers a step variable so downstream components (strip charts, CSV exports, scripting) can read it from MachiningStep. Idempotent on key. public void RegisterStepVariable(string key, string name, string unit, string formatString, Func variableFunc = null) Parameters key string Unique key. name string Human-readable name; may equal key. unit string Physical unit name (PhysicsUnit); nullable. formatString string Display format string; nullable. variableFunc Func Optional value extractor; nullable when the value comes from the step's flex dictionary. ReloadProject(IProgress) Reloads the current project from disk, discarding in-memory edits. Load-time diagnostics are reported the same way as in LoadProject(string, IProgress). public void ReloadProject(IProgress messageProgress = null) Parameters messageProgress IProgress Optional caller-injected sink for the load-time diagnostics; null keeps logger-only reporting. ResetRuntime(IProgress) Reset the runtime states including: meshed geometry, collision flags, machine tool position, CL strips, message buffer and etc.. MachiningResolution_mm is deliberately left untouched so an explicit setting survives resets; it is seeded from InitResolution only when a project is loaded/assigned. public void ResetRuntime(IProgress messageProgress = null) Parameters messageProgress IProgress RunBrandNcFile(string, string) Runs a famous-brand NC code file from the specified path (no kind dispatch — always the brand runner). public IEnumerable RunBrandNcFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. If the value is null, BaseDirectory substitutes the value. relFilePath string Relative path to the NC file. Returns IEnumerable An enumerable of actions to be executed. RunClFile(string, string) Runs an NX-CL (CLSF) file from the specified path. public IEnumerable RunClFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the CLSF file. Returns IEnumerable An enumerable of actions to be executed. RunCsvFile(string, string) Runs a CSV file from the specified path. public IEnumerable RunCsvFile(string baseDirectory, string relFilePath) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the CSV file. Returns IEnumerable An enumerable of actions to be executed. RunNc(string, string) Runs NC commands from raw text. public IEnumerable RunNc(string ncText, string fileNameAlternative = \"--\") Parameters ncText string The NC command text to execute fileNameAlternative string Alternative name to associate with the NC program Returns IEnumerable An enumerable of actions to be executed RunNcFile(string, string, NcKind) Runs an NC program file from the specified path, the runner picked by kind (Auto = by file extension: known CL/CSV extensions map to those runners, anything else runs as brand NC). public IEnumerable RunNcFile(string baseDirectory, string relFilePath, NcKind kind = NcKind.Auto) Parameters baseDirectory string Base directory for resolving relative paths. relFilePath string Relative path to the NC program file. kind NcKind Which runner runs the file; Auto detects by extension. Returns IEnumerable An enumerable of actions to be executed. RunToLineEnd() Advances the player by one NC/CSV line and pauses. public void RunToLineEnd() SaveAsProject(string) Saves the current project to a specified relative file path. public void SaveAsProject(string projectPath) Parameters projectPath string The absolute file path SaveProject() Save project by project path. public void SaveProject() SetMachiningResolution_mm(double, IProgress) Sets the machining resolution (mm). Progress is reported to the injected messageProgress. public void SetMachiningResolution_mm(double value, IProgress messageProgress = null) Parameters value double The machining resolution in millimeters. messageProgress IProgress Sink-agnostic message host for progress reporting. TrainMillingPara(SampleFlag, bool, double, string, CancellationToken, ICuttingPara, IProgress) Train Milling Parameter. public void TrainMillingPara(SampleFlag sampleFlags, bool enableFzOnlyDuringDrilling, double outlierRatio, string dstRelFile, CancellationToken cancellationToken, ICuttingPara paraTemplate, IProgress messageProgress = null) Parameters sampleFlags SampleFlag enableFzOnlyDuringDrilling bool outlierRatio double dstRelFile string cancellationToken CancellationToken paraTemplate ICuttingPara messageProgress IProgress UpdateByMachiningChain() Updates components when the machining chain changes. public void UpdateByMachiningChain() UpdateByMachiningEquipment() Re-binds everything derived from the runtime equipment face. Runs as the tail of Hi.MachiningProcs.LocalProjectService.MaterialiseExecutionEquipment(); call manually only after mutating the runtime face outside the service. public void UpdateByMachiningEquipment() UpdateIdealMillingToolOffsetTableByToolHouse() Updates the ideal milling tool offset table based on the current tool house configuration. The radius column follows the project's RadiusOffsetBasis so a zero-based (tool-centre path) program keeps its D rows at wear only. public void UpdateIdealMillingToolOffsetTableByToolHouse() WriteNcRunnerSuit(string) Writes the active NcRunnerSuit to relFile (project relative). Pure file IO — does not update any in-memory pointer. public void WriteNcRunnerSuit(string relFile) Parameters relFile string WriteShotFile(TimeSpan, string, IProgress) Writes time-based shot data to a file with the specified sampling period. public void WriteShotFile(TimeSpan samplingPeriod, string relFileTemplate = \"Output/[NcName].shot.csv\", IProgress messageProgress = null) Parameters samplingPeriod TimeSpan The time period between samples relFileTemplate string Template for the output file path, can include [NcName] placeholder messageProgress IProgress Optional caller-supplied progress sink for start/finish messages. WriteStepFile(string, IProgress) Writes step-based data to a file. public void WriteStepFile(string relFileTemplate = \"Output/[NcName].step.csv\", IProgress messageProgress = null) Parameters relFileTemplate string Template for the output file path, can include [NcName] placeholder messageProgress IProgress Optional caller-supplied progress sink for start/finish messages. Events MachiningProjectChanged Event raised when the machining project changes. public event LocalProjectService.MachiningProjectChangedDelegate MachiningProjectChanged Event Type LocalProjectService.MachiningProjectChangedDelegate MachiningStepBuilt event to configure steps. The first parameter is the previous step; the second parameter is the current step. The previous step is null if no previous step exists. public event MachiningActRunner.MachiningStepBuiltDelegate MachiningStepBuilt Event Type MachiningActRunner.MachiningStepBuiltDelegate OnNcFileRan Event triggered after an NC file is executed. public event Action OnNcFileRan Event Type Action OnNcPipelineReset App-lifetime event raised after the per-session NC pipeline state has been rewound (Hi.MachiningProcs.LocalProjectService.ResetNcPipelineState()): the next RunNcLines(string, IEnumerable, MachiningSession, StepDiagnosticProgress, NcDiagnosticProgress, CancellationToken) re-initialises from scratch, so its FileIndex / SentenceIndex counters restart at 0. Raised on EVERY rewind path — a runner-suit rewire (brand switch), PowerReset() and ResetRuntime(IProgress) (including a mission script's ResetRuntime() between two NC files) — not only on a PacePlayer reset or a project swap, which are the two boundaries a session-lifetime consumer already sees. Anything keyed by those counters must drop its index here, or the next file's pieces land under the previous file's numbers. public event Action OnNcPipelineReset Event Type Action OnShellMessageAdded App-lifetime bridge for ShellProgress appends. Because ShellProgress is session-scoped (recreated at BeginSession(), null outside a session), a consumer that wants every session's shell messages subscribes here once instead of chasing the swapping instance — BeginSession() re-wires the bridge to the new sink each session, the same way OnSourcedActEntry is bridged. Carries the append index and the message. public event Action OnShellMessageAdded Event Type Action OnShellMessageCleared App-lifetime bridge for ShellProgress clears (see OnShellMessageAdded). public event Action OnShellMessageCleared Event Type Action OnSourcedActEntry App-lifetime event triggered for each SourcedActEntry produced during NC/CSV execution. public event Action OnSourcedActEntry Event Type Action OnSyntaxPieceRan Raised after each SyntaxPiece has been run during NC execution (app lifetime). public event Action OnSyntaxPieceRan Event Type Action OnUpdatedInspectingQuantityFunc Event triggered when the inspecting quantity function is updated. public event Action OnUpdatedInspectingQuantityFunc Event Type Action WorkpieceChanged Event that is raised when the workpiece is changed. public event Action> WorkpieceChanged Event Type Action> Remarks This event is triggered whenever the workpiece property is modified. Subscribers can use this event to respond to changes in the workpiece configuration, such as updating visualizations or recalculating machining parameters. The event provides both the previous and new workpiece values through a SeqPair." }, "api/Hi.MachiningProcs.LocalProjectServiceController.html": { "href": "api/Hi.MachiningProcs.LocalProjectServiceController.html", @@ -2587,7 +2587,7 @@ "api/Hi.MachiningProcs.MachiningParallelProc.StepTaskBundle.html": { "href": "api/Hi.MachiningProcs.MachiningParallelProc.StepTaskBundle.html", "title": "Class MachiningParallelProc.StepTaskBundle | HiAPI-C# 2025", - "summary": "Class MachiningParallelProc.StepTaskBundle Namespace Hi.MachiningProcs Assembly HiMech.dll Represents a bundle of tasks related to a milling step. public class MachiningParallelProc.StepTaskBundle Inheritance object MachiningParallelProc.StepTaskBundle Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors StepTaskBundle(double, double) Initializes a new instance of the MachiningParallelProc.StepTaskBundle class with background and spindle temperatures. public StepTaskBundle(double backgroundTemperature_K, double spindleTemperature_K) Parameters backgroundTemperature_K double The background temperature in Kelvin. spindleTemperature_K double The spindle temperature in Kelvin. Properties MachineMotionStep Gets the machining step. public MachineMotionStep MachineMotionStep { get; } Property Value MachineMotionStep StepIndex Gets the index of the step. public int StepIndex { get; } Property Value int Methods Wait(CancellationToken) Waits for the completion of the post-sequential physics task. public void Wait(CancellationToken token) Parameters token CancellationToken The cancellation token." + "summary": "Class MachiningParallelProc.StepTaskBundle Namespace Hi.MachiningProcs Assembly HiMech.dll Represents a bundle of tasks related to a milling step. public class MachiningParallelProc.StepTaskBundle Inheritance object MachiningParallelProc.StepTaskBundle Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors StepTaskBundle(double, double) Initializes a new instance of the MachiningParallelProc.StepTaskBundle class with background and spindle temperatures. public StepTaskBundle(double ambientTemperature_K, double spindleTemperature_K) Parameters ambientTemperature_K double The ambient temperature in Kelvin. spindleTemperature_K double The spindle temperature in Kelvin. Properties MachineMotionStep Gets the machining step. public MachineMotionStep MachineMotionStep { get; } Property Value MachineMotionStep StepIndex Gets the index of the step. public int StepIndex { get; } Property Value int Methods Wait(CancellationToken) Waits for the completion of the post-sequential physics task. public void Wait(CancellationToken token) Parameters token CancellationToken The cancellation token." }, "api/Hi.MachiningProcs.MachiningParallelProc.SubstractionResult.html": { "href": "api/Hi.MachiningProcs.MachiningParallelProc.SubstractionResult.html", @@ -2652,7 +2652,7 @@ "api/Hi.MachiningProcs.RapidCutMonitor.html": { "href": "api/Hi.MachiningProcs.RapidCutMonitor.html", "title": "Class RapidCutMonitor | HiAPI-C# 2025", - "summary": "Class RapidCutMonitor Namespace Hi.MachiningProcs Assembly HiMech.dll Reports a rapid traverse that removed stock: the steps of one NC line that were commanded as rapid traverse (G00, IsRapid) and touched the workpiece fold into one Play-RapidCut–Detected validation warning, anchored on the line's first touching step and carrying the line's total removed volume and its largest cutting depth. A rapid move through material breaks the tool or crashes the machine on a real run, yet with the spindle turning the engine treats it as ordinary cutting: the collision rule (Hi.Machining.MachiningEquipment.Detect) pairs flute and workpiece only while the spindle is stopped, so such a line used to pass with no message at all. One instance per MachiningActRunner. Observe(in Sample, double, bool, IProgress) runs on the sequential post-physics stage of every built step (one thread, step order), Flush(double, IProgress) closes the last line at the end of a play and Reset() drops a pending line on a session reset; both run on the shell thread after WaitAll(), so no lock is needed. Folding: consecutive rapid steps with the same LineKey (the NC line number, or the sentence itself where a runner has no line numbers) form one report; a feed step, a different line or the end of the play closes it. A line re-entered later (a subprogram loop) reports again, deliberately. The report is emitted only when the line's total removed volume reaches RapidCutVolumeThreshold_mm3 (default 0: any contact). Steps with the spindle stopped are skipped while collision detection is on — that rule owns them and raises Collision--Detected — and counted otherwise. public sealed class RapidCutMonitor Inheritance object RapidCutMonitor Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Fields MessageId Id of the warning this monitor emits. public const string MessageId = \"Play-RapidCut--Detected\" Field Value string Methods Flush(double, IProgress) Closes the pending rapid line: reports it when its total removed volume reaches volumeThreshold_mm3, then forgets it. Called by Observe(in Sample, double, bool, IProgress) at a line boundary and by the session at the end of a play, for the last line. public void Flush(double volumeThreshold_mm3, IProgress sink) Parameters volumeThreshold_mm3 double Line-total removed volume below which the line is not reported. sink IProgress Step-anchored sink for the report; no-op if null. Observe(in Sample, double, bool, IProgress) Feeds one built step, in step order. A feed step or a step of another line closes the pending rapid line (see Flush(double, IProgress)); a rapid step that touched the stock opens or extends it. public void Observe(in RapidCutMonitor.Sample sample, double volumeThreshold_mm3, bool collisionDetectionEnabled, IProgress sink) Parameters sample RapidCutMonitor.Sample The step, see SampleOf(MachiningStep). volumeThreshold_mm3 double Line-total removed volume below which the line is not reported. collisionDetectionEnabled bool When true, steps with the spindle stopped are left to collision detection. sink IProgress Step-anchored sink for the report; no-op if null. Reset() Forgets a pending line without reporting it (session reset). public void Reset() SampleOf(MachiningStep) Builds the monitor's view of a built step. The removed volume is the step's material removal rate (Mrr_mm3ds, the swept engagement cross-section times the tip feedrate) over the step duration — a geometry-only quantity, so the report needs no physics; a NaN rate (undefined tip feedrate) counts as 0 but the contact still counts. public static RapidCutMonitor.Sample SampleOf(MachiningStep step) Parameters step MachiningStep A built step. Returns RapidCutMonitor.Sample" + "summary": "Class RapidCutMonitor Namespace Hi.MachiningProcs Assembly HiMech.dll Reports a rapid traverse that removed stock: the steps of one NC line that were commanded as rapid traverse (G00, IsRapid) and touched the workpiece fold into one Play-RapidCut–Detected validation warning, anchored on the line's first touching step and carrying the line's total removed volume and its largest cutting depth. A rapid move through material breaks the tool or crashes the machine on a real run, yet with the spindle turning the engine treats it as ordinary cutting: the collision rule (Detect(bool)) pairs flute and workpiece only while the spindle is stopped, so such a line used to pass with no message at all. One instance per MachiningActRunner. Observe(in Sample, double, bool, IProgress) runs on the sequential post-physics stage of every built step (one thread, step order), Flush(double, IProgress) closes the last line at the end of a play and Reset() drops a pending line on a session reset; both run on the shell thread after WaitAll(), so no lock is needed. Folding: consecutive rapid steps with the same LineKey (the NC line number, or the sentence itself where a runner has no line numbers) form one report; a feed step, a different line or the end of the play closes it. A line re-entered later (a subprogram loop) reports again, deliberately. The report is emitted only when the line's total removed volume reaches RapidCutVolumeThreshold_mm3 (default 0: any contact). Steps with the spindle stopped are skipped while collision detection is on — that rule owns them and raises Collision--Detected — and counted otherwise. public sealed class RapidCutMonitor Inheritance object RapidCutMonitor Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Fields MessageId Id of the warning this monitor emits. public const string MessageId = \"Play-RapidCut--Detected\" Field Value string Methods Flush(double, IProgress) Closes the pending rapid line: reports it when its total removed volume reaches volumeThreshold_mm3, then forgets it. Called by Observe(in Sample, double, bool, IProgress) at a line boundary and by the session at the end of a play, for the last line. public void Flush(double volumeThreshold_mm3, IProgress sink) Parameters volumeThreshold_mm3 double Line-total removed volume below which the line is not reported. sink IProgress Step-anchored sink for the report; no-op if null. Observe(in Sample, double, bool, IProgress) Feeds one built step, in step order. A feed step or a step of another line closes the pending rapid line (see Flush(double, IProgress)); a rapid step that touched the stock opens or extends it. public void Observe(in RapidCutMonitor.Sample sample, double volumeThreshold_mm3, bool collisionDetectionEnabled, IProgress sink) Parameters sample RapidCutMonitor.Sample The step, see SampleOf(MachiningStep). volumeThreshold_mm3 double Line-total removed volume below which the line is not reported. collisionDetectionEnabled bool When true, steps with the spindle stopped are left to collision detection. sink IProgress Step-anchored sink for the report; no-op if null. Reset() Forgets a pending line without reporting it (session reset). public void Reset() SampleOf(MachiningStep) Builds the monitor's view of a built step. The removed volume is the step's material removal rate (Mrr_mm3ds, the swept engagement cross-section times the tip feedrate) over the step duration — a geometry-only quantity, so the report needs no physics; a NaN rate (undefined tip feedrate) counts as 0 but the contact still counts. public static RapidCutMonitor.Sample SampleOf(MachiningStep step) Parameters step MachiningStep A built step. Returns RapidCutMonitor.Sample" }, "api/Hi.MachiningProcs.RenderingFlag.html": { "href": "api/Hi.MachiningProcs.RenderingFlag.html", @@ -2717,7 +2717,7 @@ "api/Hi.MachiningProcs.html": { "href": "api/Hi.MachiningProcs.html", "title": "Namespace Hi.MachiningProcs | HiAPI-C# 2025", - "summary": "Namespace Hi.MachiningProcs Classes AllowNoActiveSessionAttribute Marks a session-scoped controller action as callable without an active session, exempting it from RequireActiveSessionAttribute. Use on the session lifecycle entry points (BeginSession / EndSession), which by definition run when no session exists yet. AllowNoLoadedProjectAttribute Marks a project-level controller action as callable without a loaded project, exempting it from RequireLoadedProjectAttribute. Use on the endpoints that create or load a project (which by definition run when no project is open yet). ApiActionResult The shared outcome envelope for a web-API action: whether it succeeded and the messages it reported, in order. Returned by the project-level surface (LocalProjectServiceController) and, on the no-active-session boundary, by the session-scoped surface (SessionShellController via RequireActiveSessionAttribute). A REST / AI caller therefore reads the progress / success / error notifications inline in the HTTP response instead of only out-of-band via the SignalR sinks, and can branch on Success without parsing severities. LocalProjectService Root(Local) project service. Apply absolute file path. LocalProjectServiceController HTTP controller exposing the project-level (session-independent) operations of Hi.MachiningProcs.LocalProjectServiceController.LocalProjectService — the lean API-user surface, parallel to SessionShellController (which mirrors the session-scoped SessionShell). A controller mirrors exactly one body; project-level settings belong here, not bolted onto the session controller. MachiningActRunner Represents a runner for machining actions that manages milling steps, tool paths, and collision detection. MachiningActRunnerConfig Represents the configuration for a milling act runner. Provides settings for physics simulation, evaluation, and temperature control. MachiningParallelProc Represents a parallel processing system for milling operations that manages various tasks such as sweeping, subtraction, force calculation, and physics simulation. MachiningParallelProc.StepTaskBundle Represents a bundle of tasks related to a milling step. MachiningParallelProc.SubstractionResult Represents the result of a subtraction operation. MachiningProject Represents a milling project that manages the execution, simulation, and analysis of NC programs. MachiningSession Represents a machining session that manages the execution and optimization of machining operations. Provides functionality for controlling the machining process, handling optimization options, and managing session state. Implements IDisposable to clean up SessionWriters on session end. MessageDto One reported IMessage, flattened for JSON transport. MillingUtil Provides utility methods for milling calculations and operations. NcKindUtil NcKind helpers. NcRunnerSessionState NC pipeline state held on a MachiningSession and shared across multiple RunNcLines(string, IEnumerable, MachiningSession, StepDiagnosticProgress, NcDiagnosticProgress, CancellationToken) calls within that session. The per-layer SyntaxPieceLayers are extended via AppendSource(IEnumerable) for each subsequent file so that Previous/Next connectivity (and thus ModalCarrySyntax deep-clone) crosses file boundaries. ProjectFileBusyException Thrown when a project-file operation (New / Load / Save / SaveAs / Reload) is requested while another one is already in progress. The newcomer is cancelled rather than queued; controllers surface this as HTTP 409 Conflict. ProxyProjectService Delegate (User-based) Project Service. Apply relative file path from AdminDirectory. RapidCutMonitor Reports a rapid traverse that removed stock: the steps of one NC line that were commanded as rapid traverse (G00, IsRapid) and touched the workpiece fold into one Play-RapidCut–Detected validation warning, anchored on the line's first touching step and carrying the line's total removed volume and its largest cutting depth. A rapid move through material breaks the tool or crashes the machine on a real run, yet with the spindle turning the engine treats it as ordinary cutting: the collision rule (Hi.Machining.MachiningEquipment.Detect) pairs flute and workpiece only while the spindle is stopped, so such a line used to pass with no message at all. One instance per MachiningActRunner. Observe(in Sample, double, bool, IProgress) runs on the sequential post-physics stage of every built step (one thread, step order), Flush(double, IProgress) closes the last line at the end of a play and Reset() drops a pending line on a session reset; both run on the shell thread after WaitAll(), so no lock is needed. Folding: consecutive rapid steps with the same LineKey (the NC line number, or the sentence itself where a runner has no line numbers) form one report; a feed step, a different line or the end of the play closes it. A line re-entered later (a subprogram loop) reports again, deliberately. The report is emitted only when the line's total removed volume reaches RapidCutVolumeThreshold_mm3 (default 0: any contact). Steps with the spindle stopped are skipped while collision detection is on — that rule owns them and raises Collision--Detected — and counted otherwise. RequireActiveSessionAttribute Action filter for the session-scoped web-API surface: before a guarded action runs, verifies a machining session is active (SessionShell is non-null). When none is active it short-circuits with HTTP 409 and an NoActiveSession() envelope, so a REST / AI caller gets a helpful “call BeginSession() first” notice instead of a null-reference 500. Apply at the controller level; exempt the session lifecycle entry points (BeginSession / EndSession) with AllowNoActiveSessionAttribute. RequireLoadedProjectAttribute Action filter for the project-level web-API surface: before a guarded action runs, verifies a project is loaded (MachiningProject is non-null). When none is loaded it short-circuits with HTTP 409 and an NoProjectLoaded() envelope, so a REST / AI caller gets a helpful “create or load a project first” notice instead of a null-reference 500 (the project-level members — MachiningActRunner.Config, workpiece, runners — are null until a project is open). Apply at the controller level; exempt the endpoints that create or load a project with AllowNoLoadedProjectAttribute. SessionShell End-user-facing facade for a machining session: aggregates session lifecycle, NC playback, optimization, geometry I/O, and scripting infrastructure into a single delegation surface. Used as the C# script globals object and as the concrete target of ISessionCommand implementations. SessionShellController HTTP controller exposing SessionShell over the web API. Each action delegates to the underlying SessionShell instance owned by Hi.MachiningProcs.SessionShellController.LocalProjectService. SetupController Controller for setup operations of machining projects. ShellProgress Append-only, thread-safe sink for session-level routine / lifecycle messages on the IMessage channel — one of the partitioned message homes. This is partitioned by message kind, orthogonal to the other sinks: plain SimpleMessage notices that belong to the session as a whole (cache reset, file load / save progress, session start/done) live here; messages tied to a particular machining step live in StepDiagnosticProgress; NC-pipeline diagnostics live in NcDiagnosticProgress. Append-only: session-routine messages are emitted sequentially, so report order already is execution order — there is no per-step anchor and no stable-index bookkeeping. SpindleSpeedCache Represents cached spindle speed information. StepDiagnostic An IMessage produced while constructing a MachiningStep, anchored to the step's execution-order StepIndex and (when available) its NC-source SentenceCarrier. Decorator over an inner Message — the five IMessage members delegate to it — so a plain SimpleMessage emitted during step processing can be upgraded to a step-anchored diagnostic without the producer needing to know the step context. StepDiagnosticAnchorUtil Bridges a step-anchored IProgress sink (e.g. StepDiagnosticProgress) back to the generic IProgress surface, so out-of-step-pipeline producers can keep using the id-first MessageUtil shorthands (ValidationError, ConfigurationWarning, …) and still land a StepDiagnostic on the sink. StepDiagnosticProgress Append-only, thread-safe sink for step-anchored diagnostics on the IMessage channel. This sink stores only StepDiagnostic: every message is anchored to a motion step. Per-step batches arrive via FlushTo(IProgress); out-of-pipeline emits (e.g. stroke-limit / tooling diagnostics) anchor themselves with AnchoredToStep(IProgress, int, ISentenceCarrier) before reporting. Data that already has another owner is not duplicated here — NC diagnostics live in NcDiagnosticProgress, plain session-level notices live in ShellProgress, cutter positions live in the CL strip. Because every StepDiagnostic carries its own StepIndex anchor, ordering is recovered downstream by sorting on that anchor. Producers therefore only ever Report(StepDiagnostic) (append) — even from parallel step-processing tasks — and never insert at a computed position. StepScopedProgress A per-step IProgress of IMessage that accumulates the messages emitted while one step is built, upgrading any plain message to a StepDiagnostic anchored to this step's StepIndex / SentenceCarrier. An already step-anchored StepDiagnostic is kept unchanged. (NC diagnostics are not seen here — they live in their own NcDiagnosticProgress, not on this channel.) It does not forward to a downstream sink as messages arrive; instead it collects them into MessageList and is drained once via FlushTo(IProgress) at the step's sequential post-physics stage. Because that stage runs strictly in step order, the per-step batches land in execution order with no position-scanning insert. No locking: a single step's construction is a data-dependency chain (substraction → physics → post-physics), so only one task writes MessageList at a time; parallelism across steps writes to different scopes. Each parallel step task therefore holds its own instance — never a shared mutable \"current step\" on StepDiagnosticProgress, which would race. Structs RapidCutMonitor.Sample One built step as the monitor sees it — the few facts the fold needs, detached from MachiningStep so the fold is testable on synthetic steps. Interfaces IMachiningProjectGetter Interface for objects that can provide a MachiningProject instance. IProjectService Interface for services that manage machining projects. Enums NcKind Kind of an NC program file — selects which of the session's runners plays it (ActiveNcRunner / ClRunner / CsvRunner). RenderingFlag Flags that control which elements are rendered in the visualization. Delegates ConfigStepFunc Delegate for configuring a milling step with additional arguments. LocalProjectService.MachiningProjectChangedDelegate Delegate for machining project changed events. MachiningActRunner.MachiningStepBuiltDelegate Delegate for configuring a step with previous and current step information." + "summary": "Namespace Hi.MachiningProcs Classes AllowNoActiveSessionAttribute Marks a session-scoped controller action as callable without an active session, exempting it from RequireActiveSessionAttribute. Use on the session lifecycle entry points (BeginSession / EndSession), which by definition run when no session exists yet. AllowNoLoadedProjectAttribute Marks a project-level controller action as callable without a loaded project, exempting it from RequireLoadedProjectAttribute. Use on the endpoints that create or load a project (which by definition run when no project is open yet). ApiActionResult The shared outcome envelope for a web-API action: whether it succeeded and the messages it reported, in order. Returned by the project-level surface (LocalProjectServiceController) and, on the no-active-session boundary, by the session-scoped surface (SessionShellController via RequireActiveSessionAttribute). A REST / AI caller therefore reads the progress / success / error notifications inline in the HTTP response instead of only out-of-band via the SignalR sinks, and can branch on Success without parsing severities. LocalProjectService Root(Local) project service. Apply absolute file path. LocalProjectServiceController HTTP controller exposing the project-level (session-independent) operations of Hi.MachiningProcs.LocalProjectServiceController.LocalProjectService — the lean API-user surface, parallel to SessionShellController (which mirrors the session-scoped SessionShell). A controller mirrors exactly one body; project-level settings belong here, not bolted onto the session controller. MachiningActRunner Represents a runner for machining actions that manages milling steps, tool paths, and collision detection. MachiningActRunnerConfig Represents the configuration for a milling act runner. Provides settings for physics simulation, evaluation, and temperature control. MachiningParallelProc Represents a parallel processing system for milling operations that manages various tasks such as sweeping, subtraction, force calculation, and physics simulation. MachiningParallelProc.StepTaskBundle Represents a bundle of tasks related to a milling step. MachiningParallelProc.SubstractionResult Represents the result of a subtraction operation. MachiningProject Represents a milling project that manages the execution, simulation, and analysis of NC programs. MachiningSession Represents a machining session that manages the execution and optimization of machining operations. Provides functionality for controlling the machining process, handling optimization options, and managing session state. Implements IDisposable to clean up SessionWriters on session end. MessageDto One reported IMessage, flattened for JSON transport. MillingUtil Provides utility methods for milling calculations and operations. NcKindUtil NcKind helpers. NcRunnerSessionState NC pipeline state held on a MachiningSession and shared across multiple RunNcLines(string, IEnumerable, MachiningSession, StepDiagnosticProgress, NcDiagnosticProgress, CancellationToken) calls within that session. The per-layer SyntaxPieceLayers are extended via AppendSource(IEnumerable) for each subsequent file so that Previous/Next connectivity (and thus ModalCarrySyntax deep-clone) crosses file boundaries. ProjectFileBusyException Thrown when a project-file operation (New / Load / Save / SaveAs / Reload) is requested while another one is already in progress. The newcomer is cancelled rather than queued; controllers surface this as HTTP 409 Conflict. ProxyProjectService Delegate (User-based) Project Service. Apply relative file path from AdminDirectory. RapidCutMonitor Reports a rapid traverse that removed stock: the steps of one NC line that were commanded as rapid traverse (G00, IsRapid) and touched the workpiece fold into one Play-RapidCut–Detected validation warning, anchored on the line's first touching step and carrying the line's total removed volume and its largest cutting depth. A rapid move through material breaks the tool or crashes the machine on a real run, yet with the spindle turning the engine treats it as ordinary cutting: the collision rule (Detect(bool)) pairs flute and workpiece only while the spindle is stopped, so such a line used to pass with no message at all. One instance per MachiningActRunner. Observe(in Sample, double, bool, IProgress) runs on the sequential post-physics stage of every built step (one thread, step order), Flush(double, IProgress) closes the last line at the end of a play and Reset() drops a pending line on a session reset; both run on the shell thread after WaitAll(), so no lock is needed. Folding: consecutive rapid steps with the same LineKey (the NC line number, or the sentence itself where a runner has no line numbers) form one report; a feed step, a different line or the end of the play closes it. A line re-entered later (a subprogram loop) reports again, deliberately. The report is emitted only when the line's total removed volume reaches RapidCutVolumeThreshold_mm3 (default 0: any contact). Steps with the spindle stopped are skipped while collision detection is on — that rule owns them and raises Collision--Detected — and counted otherwise. RequireActiveSessionAttribute Action filter for the session-scoped web-API surface: before a guarded action runs, verifies a machining session is active (SessionShell is non-null). When none is active it short-circuits with HTTP 409 and an NoActiveSession() envelope, so a REST / AI caller gets a helpful “call BeginSession() first” notice instead of a null-reference 500. Apply at the controller level; exempt the session lifecycle entry points (BeginSession / EndSession) with AllowNoActiveSessionAttribute. RequireLoadedProjectAttribute Action filter for the project-level web-API surface: before a guarded action runs, verifies a project is loaded (MachiningProject is non-null). When none is loaded it short-circuits with HTTP 409 and an NoProjectLoaded() envelope, so a REST / AI caller gets a helpful “create or load a project first” notice instead of a null-reference 500 (the project-level members — MachiningActRunner.Config, workpiece, runners — are null until a project is open). Apply at the controller level; exempt the endpoints that create or load a project with AllowNoLoadedProjectAttribute. SessionShell End-user-facing facade for a machining session: aggregates session lifecycle, NC playback, optimization, geometry I/O, and scripting infrastructure into a single delegation surface. Used as the C# script globals object and as the concrete target of ISessionCommand implementations. SessionShellController HTTP controller exposing SessionShell over the web API. Each action delegates to the underlying SessionShell instance owned by Hi.MachiningProcs.SessionShellController.LocalProjectService. SetupController Controller for setup operations of machining projects. ShellProgress Append-only, thread-safe sink for session-level routine / lifecycle messages on the IMessage channel — one of the partitioned message homes. This is partitioned by message kind, orthogonal to the other sinks: plain SimpleMessage notices that belong to the session as a whole (cache reset, file load / save progress, session start/done) live here; messages tied to a particular machining step live in StepDiagnosticProgress; NC-pipeline diagnostics live in NcDiagnosticProgress. Append-only: session-routine messages are emitted sequentially, so report order already is execution order — there is no per-step anchor and no stable-index bookkeeping. SpindleSpeedCache Represents cached spindle speed information. StepDiagnostic An IMessage produced while constructing a MachiningStep, anchored to the step's execution-order StepIndex and (when available) its NC-source SentenceCarrier. Decorator over an inner Message — the five IMessage members delegate to it — so a plain SimpleMessage emitted during step processing can be upgraded to a step-anchored diagnostic without the producer needing to know the step context. StepDiagnosticAnchorUtil Bridges a step-anchored IProgress sink (e.g. StepDiagnosticProgress) back to the generic IProgress surface, so out-of-step-pipeline producers can keep using the id-first MessageUtil shorthands (ValidationError, ConfigurationWarning, …) and still land a StepDiagnostic on the sink. StepDiagnosticProgress Append-only, thread-safe sink for step-anchored diagnostics on the IMessage channel. This sink stores only StepDiagnostic: every message is anchored to a motion step. Per-step batches arrive via FlushTo(IProgress); out-of-pipeline emits (e.g. stroke-limit / tooling diagnostics) anchor themselves with AnchoredToStep(IProgress, int, ISentenceCarrier) before reporting. Data that already has another owner is not duplicated here — NC diagnostics live in NcDiagnosticProgress, plain session-level notices live in ShellProgress, cutter positions live in the CL strip. Because every StepDiagnostic carries its own StepIndex anchor, ordering is recovered downstream by sorting on that anchor. Producers therefore only ever Report(StepDiagnostic) (append) — even from parallel step-processing tasks — and never insert at a computed position. StepScopedProgress A per-step IProgress of IMessage that accumulates the messages emitted while one step is built, upgrading any plain message to a StepDiagnostic anchored to this step's StepIndex / SentenceCarrier. An already step-anchored StepDiagnostic is kept unchanged. (NC diagnostics are not seen here — they live in their own NcDiagnosticProgress, not on this channel.) It does not forward to a downstream sink as messages arrive; instead it collects them into MessageList and is drained once via FlushTo(IProgress) at the step's sequential post-physics stage. Because that stage runs strictly in step order, the per-step batches land in execution order with no position-scanning insert. No locking: a single step's construction is a data-dependency chain (substraction → physics → post-physics), so only one task writes MessageList at a time; parallelism across steps writes to different scopes. Each parallel step task therefore holds its own instance — never a shared mutable \"current step\" on StepDiagnosticProgress, which would race. Structs RapidCutMonitor.Sample One built step as the monitor sees it — the few facts the fold needs, detached from MachiningStep so the fold is testable on synthetic steps. Interfaces IMachiningProjectGetter Interface for objects that can provide a MachiningProject instance. IProjectService Interface for services that manage machining projects. Enums NcKind Kind of an NC program file — selects which of the session's runners plays it (ActiveNcRunner / ClRunner / CsvRunner). RenderingFlag Flags that control which elements are rendered in the visualization. Delegates ConfigStepFunc Delegate for configuring a milling step with additional arguments. LocalProjectService.MachiningProjectChangedDelegate Delegate for machining project changed events. MachiningActRunner.MachiningStepBuiltDelegate Delegate for configuring a step with previous and current step information." }, "api/Hi.MachiningSteps.IFlagText.html": { "href": "api/Hi.MachiningSteps.IFlagText.html", @@ -7557,7 +7557,7 @@ "api/Hi.Physics.SeqPhysicsBrief.html": { "href": "api/Hi.Physics.SeqPhysicsBrief.html", "title": "Class SeqPhysicsBrief | HiAPI-C# 2025", - "summary": "Class SeqPhysicsBrief Namespace Hi.Physics Assembly HiMech.dll Represents a brief summary of physical properties and measurements during a machining sequence. public class SeqPhysicsBrief : IGetQuantityByKey Inheritance object SeqPhysicsBrief Implements IGetQuantityByKey Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors SeqPhysicsBrief(SeqPhysicsBrief) Creates a new instance by copying from an existing SeqPhysicsBrief. public SeqPhysicsBrief(SeqPhysicsBrief src) Parameters src SeqPhysicsBrief The source object to copy from. SeqPhysicsBrief(double, double) Initializes a new instance of the SeqPhysicsBrief class. public SeqPhysicsBrief(double backgroundTemperature_K, double spindleTemperature_K) Parameters backgroundTemperature_K double The background temperature in Kelvin. spindleTemperature_K double The spindle temperature in Kelvin. Properties AccumulatedCraterWear_um Gets or sets the accumulated crater wear in micrometers. public double AccumulatedCraterWear_um { get; set; } Property Value double AccumulatedFlankWearDepth_um Gets or sets the accumulated flank wear depth in micrometers. public double AccumulatedFlankWearDepth_um { get; set; } Property Value double AccumulatedFlankWearWidth_um Gets or sets the accumulated flank wear width in micrometers. public double AccumulatedFlankWearWidth_um { get; set; } Property Value double ChipTemperature_C Gets or sets the chip temperature in Celsius. [NotMapped] public double ChipTemperature_C { get; set; } Property Value double ChipTemperature_K Gets or sets the chip temperature in Kelvin. public double ChipTemperature_K { get; set; } Property Value double CutterBodyTemperature_C Gets or sets the cutter body temperature in Celsius. [NotMapped] public double CutterBodyTemperature_C { get; set; } Property Value double CutterBodyTemperature_K Gets or sets the cutter body temperature in Kelvin. public double CutterBodyTemperature_K { get; set; } Property Value double CutterFluteTemperatureList Gets or sets the list of cutter dermis temperatures at different depths. [0] represents the temperature at the rake surface. public List CutterFluteTemperatureList { get; set; } Property Value List CutterShankTemperatureList Gets or sets the list of cutter body temperatures at different points. public List CutterShankTemperatureList { get; set; } Property Value List CutterSurfaceTemperature_C Gets or sets the cutter surface temperature in Celsius. [NotMapped] public double CutterSurfaceTemperature_C { get; set; } Property Value double CutterSurfaceTemperature_K Gets or sets the cutter surface temperature in Kelvin. public double CutterSurfaceTemperature_K { get; set; } Property Value double InstantCraterWear_um Gets or sets the instant crater wear in micrometers. public double InstantCraterWear_um { get; set; } Property Value double InstantFlankWearDepth_um Gets or sets the instant flank wear depth in micrometers. public double InstantFlankWearDepth_um { get; set; } Property Value double SpindleEnergyConsumption_kJ Accumulation of Spindle input energy. public double SpindleEnergyConsumption_kJ { get; } Property Value double SpindleTemperature_C Gets or sets the spindle temperature in Celsius. public double SpindleTemperature_C { get; } Property Value double SpindleTemperature_K Gets or sets the spindle temperature in Kelvin. public double SpindleTemperature_K { get; } Property Value double SpindleWorkingTemperatureRatio Gets or sets the ratio of current spindle temperature to its working temperature range. public double SpindleWorkingTemperatureRatio { get; set; } Property Value double ThermalStress_MPa Gets or sets the thermal stress in megapascals. public double ThermalStress_MPa { get; } Property Value double ThermalYieldRatio Ratio between Thermal Stress and tensile strength. The tensile strength is applied since the compressive strength is high. so assume if the material shrink back, there arise tensile stress. public double ThermalYieldRatio { get; } Property Value double WorkpieceDermisTemperatureList Gets or sets the list of workpiece dermis temperatures at different depths. public List WorkpieceDermisTemperatureList { get; set; } Property Value List WorkpieceSurfaceTemperature_C Gets or sets the workpiece surface temperature in Celsius. [NotMapped] public double WorkpieceSurfaceTemperature_C { get; set; } Property Value double WorkpieceSurfaceTemperature_K Gets or sets the workpiece surface temperature in Kelvin. public double WorkpieceSurfaceTemperature_K { get; set; } Property Value double Methods AddToCsvDictionary(Dictionary) Adds physical quantities to a CSV dictionary representation. public void AddToCsvDictionary(Dictionary dst) Parameters dst Dictionary The destination dictionary to add values to. AddToQuantityDictionary(Dictionary) Adds physical quantities to a numeric dictionary representation. public void AddToQuantityDictionary(Dictionary dst) Parameters dst Dictionary The destination dictionary to add values to. BuildCuttingTemperatureAndWear(SeqPhysicsBrief, MachineMotionStep, MachineMotionStep, double, SpindleCapability, IMachiningTool, Workpiece, int, Substraction, LayerMillingEngagement, MillingPhysicsBrief, CoolantHeatCondition, CoolantMode, bool, MillingToolPhysicsPack, Action) Builds cutting temperature and wear calculations for the current step. public void BuildCuttingTemperatureAndWear(SeqPhysicsBrief preSeqPhysicsBrief, MachineMotionStep preMachineMotionStep, MachineMotionStep curMachineMotionStep, double backgroundTemperature_K, SpindleCapability spindleCapability, IMachiningTool machiningTool, Workpiece workpiece, int stepIndex, Substraction substraction, LayerMillingEngagement layerMillingEngagement, MillingPhysicsBrief millingPhysicsBrief, CoolantHeatCondition coolantHeatCondition, CoolantMode coolantMode, bool enableWearEffect, MillingToolPhysicsPack physicsPack = null, Action onWarning = null) Parameters preSeqPhysicsBrief SeqPhysicsBrief The previous sequence physics brief. preMachineMotionStep MachineMotionStep The previous machine motion step. curMachineMotionStep MachineMotionStep The current machine motion step. backgroundTemperature_K double The background temperature in Kelvin. spindleCapability SpindleCapability The spindle capability information. machiningTool IMachiningTool The machining tool. workpiece Workpiece The workpiece. stepIndex int The step index. substraction Substraction The substraction data. layerMillingEngagement LayerMillingEngagement The layer milling engagement. millingPhysicsBrief MillingPhysicsBrief The milling physics brief. coolantHeatCondition CoolantHeatCondition The coolant heat condition. coolantMode CoolantMode Current coolant delivery mode — selects which convection coefficient in coolantHeatCondition is used by the temperature FEM. Callers must supply the per-step mode (e.g. from CoolantMode) so the FEM sees the real runtime state rather than a silent default. enableWearEffect bool Whether to enable wear effect calculations. physicsPack MillingToolPhysicsPack The frozen per-session physics pack of machiningTool; null computes the tool's scalar derivations on use. onWarning Action Optional callback invoked with a warning message when the computation cannot complete. BuildSpindleTemperatureAndRatio(MachineMotionStep, MillingPhysicsBrief, double, SpindleCapability, SpindleSpeedCache, double) Internal Use Only. public void BuildSpindleTemperatureAndRatio(MachineMotionStep machiningStep, MillingPhysicsBrief rakeFacePhysicsBrief, double backgroundTemperature_K, SpindleCapability spindleCapability, SpindleSpeedCache spindleSpeedCache, double preSpindleTemperature_K) Parameters machiningStep MachineMotionStep rakeFacePhysicsBrief MillingPhysicsBrief backgroundTemperature_K double spindleCapability SpindleCapability spindleSpeedCache SpindleSpeedCache preSpindleTemperature_K double GetCutterDermisAvgTemperature_K(double, IList) Gets the average cutter dermis temperature up to a specific depth. public double GetCutterDermisAvgTemperature_K(double depth, IList thermalLayerList) Parameters depth double The depth to calculate the average temperature to thermalLayerList IList The list of thermal layers Returns double The average temperature in Kelvin up to the specified depth GetCutterDermisTemperature_K(double, IList) Gets the cutter dermis temperature at a specified depth. public double GetCutterDermisTemperature_K(double depth_mm, IList thermalLayerList) Parameters depth_mm double The depth in millimeters. thermalLayerList IList The thermal layer list. Returns double The temperature in Kelvin. GetQuantityByKey(string) Gets a quantity value associated with the specified key. public double GetQuantityByKey(string key) Parameters key string The key to look up Returns double The quantity value associated with the key SetByCsvDictionary(Dictionary, bool) Sets properties from a CSV dictionary. public void SetByCsvDictionary(Dictionary src, bool removeFromSource = false) Parameters src Dictionary The source dictionary containing values. removeFromSource bool Whether to remove keys from the source dictionary after reading." + "summary": "Class SeqPhysicsBrief Namespace Hi.Physics Assembly HiMech.dll Represents a brief summary of physical properties and measurements during a machining sequence. public class SeqPhysicsBrief : IGetQuantityByKey Inheritance object SeqPhysicsBrief Implements IGetQuantityByKey Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Extension Methods DuplicateUtil.TryDuplicate(TSelf, params object[]) InvokeUtil.SelfInvoke(TSrc, Action) InvokeUtil.SelfInvoke(TSrc, Func) ColorUtil.GetGloomyColor(object, double, double) NameUtil.GetSelectionName(object) StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool) LockUtil.Lock(object) Constructors SeqPhysicsBrief(SeqPhysicsBrief) Creates a new instance by copying from an existing SeqPhysicsBrief. public SeqPhysicsBrief(SeqPhysicsBrief src) Parameters src SeqPhysicsBrief The source object to copy from. SeqPhysicsBrief(double, double) Initializes a new instance of the SeqPhysicsBrief class. public SeqPhysicsBrief(double ambientTemperature_K, double spindleTemperature_K) Parameters ambientTemperature_K double The ambient temperature in Kelvin. spindleTemperature_K double The spindle temperature in Kelvin. Properties AccumulatedCraterWear_um Gets or sets the accumulated crater wear in micrometers. public double AccumulatedCraterWear_um { get; set; } Property Value double AccumulatedFlankWearDepth_um Gets or sets the accumulated flank wear depth in micrometers. public double AccumulatedFlankWearDepth_um { get; set; } Property Value double AccumulatedFlankWearWidth_um Gets or sets the accumulated flank wear width in micrometers. public double AccumulatedFlankWearWidth_um { get; set; } Property Value double ChipTemperature_C Gets or sets the chip temperature in Celsius. [NotMapped] public double ChipTemperature_C { get; set; } Property Value double ChipTemperature_K Gets or sets the chip temperature in Kelvin. public double ChipTemperature_K { get; set; } Property Value double CutterBodyTemperature_C Gets or sets the cutter body temperature in Celsius. [NotMapped] public double CutterBodyTemperature_C { get; set; } Property Value double CutterBodyTemperature_K Gets or sets the cutter body temperature in Kelvin. public double CutterBodyTemperature_K { get; set; } Property Value double CutterFluteTemperatureList Gets or sets the list of cutter dermis temperatures at different depths. [0] represents the temperature at the rake surface. public List CutterFluteTemperatureList { get; set; } Property Value List CutterShankTemperatureList Gets or sets the list of cutter body temperatures at different points. public List CutterShankTemperatureList { get; set; } Property Value List CutterSurfaceTemperature_C Gets or sets the cutter surface temperature in Celsius. [NotMapped] public double CutterSurfaceTemperature_C { get; set; } Property Value double CutterSurfaceTemperature_K Gets or sets the cutter surface temperature in Kelvin. public double CutterSurfaceTemperature_K { get; set; } Property Value double InstantCraterWear_um Gets or sets the instant crater wear in micrometers. public double InstantCraterWear_um { get; set; } Property Value double InstantFlankWearDepth_um Gets or sets the instant flank wear depth in micrometers. public double InstantFlankWearDepth_um { get; set; } Property Value double SpindleEnergyConsumption_kJ Accumulation of Spindle input energy. public double SpindleEnergyConsumption_kJ { get; } Property Value double SpindleTemperature_C Gets or sets the spindle temperature in Celsius. public double SpindleTemperature_C { get; } Property Value double SpindleTemperature_K Gets or sets the spindle temperature in Kelvin. public double SpindleTemperature_K { get; } Property Value double SpindleWorkingTemperatureRatio Gets or sets the ratio of current spindle temperature to its working temperature range. public double SpindleWorkingTemperatureRatio { get; set; } Property Value double ThermalStress_MPa Gets or sets the thermal stress in megapascals. public double ThermalStress_MPa { get; } Property Value double ThermalYieldRatio Ratio between Thermal Stress and tensile strength. The tensile strength is applied since the compressive strength is high. so assume if the material shrink back, there arise tensile stress. public double ThermalYieldRatio { get; } Property Value double WorkpieceDermisTemperatureList Gets or sets the list of workpiece dermis temperatures at different depths. public List WorkpieceDermisTemperatureList { get; set; } Property Value List WorkpieceSurfaceTemperature_C Gets or sets the workpiece surface temperature in Celsius. [NotMapped] public double WorkpieceSurfaceTemperature_C { get; set; } Property Value double WorkpieceSurfaceTemperature_K Gets or sets the workpiece surface temperature in Kelvin. public double WorkpieceSurfaceTemperature_K { get; set; } Property Value double Methods AddToCsvDictionary(Dictionary) Adds physical quantities to a CSV dictionary representation. public void AddToCsvDictionary(Dictionary dst) Parameters dst Dictionary The destination dictionary to add values to. AddToQuantityDictionary(Dictionary) Adds physical quantities to a numeric dictionary representation. public void AddToQuantityDictionary(Dictionary dst) Parameters dst Dictionary The destination dictionary to add values to. BuildCuttingTemperatureAndWear(SeqPhysicsBrief, MachineMotionStep, MachineMotionStep, double, SpindleCapability, IMachiningTool, Workpiece, int, Substraction, LayerMillingEngagement, MillingPhysicsBrief, CoolantHeatCondition, CoolantMode, bool, MillingToolPhysicsPack, Action) Builds cutting temperature and wear calculations for the current step. public void BuildCuttingTemperatureAndWear(SeqPhysicsBrief preSeqPhysicsBrief, MachineMotionStep preMachineMotionStep, MachineMotionStep curMachineMotionStep, double ambientTemperature_K, SpindleCapability spindleCapability, IMachiningTool machiningTool, Workpiece workpiece, int stepIndex, Substraction substraction, LayerMillingEngagement layerMillingEngagement, MillingPhysicsBrief millingPhysicsBrief, CoolantHeatCondition coolantHeatCondition, CoolantMode coolantMode, bool enableWearEffect, MillingToolPhysicsPack physicsPack = null, Action onWarning = null) Parameters preSeqPhysicsBrief SeqPhysicsBrief The previous sequence physics brief. preMachineMotionStep MachineMotionStep The previous machine motion step. curMachineMotionStep MachineMotionStep The current machine motion step. ambientTemperature_K double The ambient temperature in Kelvin. spindleCapability SpindleCapability The spindle capability information. machiningTool IMachiningTool The machining tool. workpiece Workpiece The workpiece. stepIndex int The step index. substraction Substraction The substraction data. layerMillingEngagement LayerMillingEngagement The layer milling engagement. millingPhysicsBrief MillingPhysicsBrief The milling physics brief. coolantHeatCondition CoolantHeatCondition The coolant heat condition. coolantMode CoolantMode Current coolant delivery mode — selects which convection coefficient in coolantHeatCondition is used by the temperature FEM. Callers must supply the per-step mode (e.g. from CoolantMode) so the FEM sees the real runtime state rather than a silent default. enableWearEffect bool Whether to enable wear effect calculations. physicsPack MillingToolPhysicsPack The frozen per-session physics pack of machiningTool; null computes the tool's scalar derivations on use. onWarning Action Optional callback invoked with a warning message when the computation cannot complete. BuildSpindleTemperatureAndRatio(MachineMotionStep, MillingPhysicsBrief, double, SpindleCapability, SpindleSpeedCache, double) Internal Use Only. public void BuildSpindleTemperatureAndRatio(MachineMotionStep machiningStep, MillingPhysicsBrief rakeFacePhysicsBrief, double ambientTemperature_K, SpindleCapability spindleCapability, SpindleSpeedCache spindleSpeedCache, double preSpindleTemperature_K) Parameters machiningStep MachineMotionStep rakeFacePhysicsBrief MillingPhysicsBrief ambientTemperature_K double spindleCapability SpindleCapability spindleSpeedCache SpindleSpeedCache preSpindleTemperature_K double GetCutterDermisAvgTemperature_K(double, IList) Gets the average cutter dermis temperature up to a specific depth. public double GetCutterDermisAvgTemperature_K(double depth, IList thermalLayerList) Parameters depth double The depth to calculate the average temperature to thermalLayerList IList The list of thermal layers Returns double The average temperature in Kelvin up to the specified depth GetCutterDermisTemperature_K(double, IList) Gets the cutter dermis temperature at a specified depth. public double GetCutterDermisTemperature_K(double depth_mm, IList thermalLayerList) Parameters depth_mm double The depth in millimeters. thermalLayerList IList The thermal layer list. Returns double The temperature in Kelvin. GetQuantityByKey(string) Gets a quantity value associated with the specified key. public double GetQuantityByKey(string key) Parameters key string The key to look up Returns double The quantity value associated with the key SetByCsvDictionary(Dictionary, bool) Sets properties from a CSV dictionary. public void SetByCsvDictionary(Dictionary src, bool removeFromSource = false) Parameters src Dictionary The source dictionary containing values. removeFromSource bool Whether to remove keys from the source dictionary after reading." }, "api/Hi.Physics.StructureMaterial.html": { "href": "api/Hi.Physics.StructureMaterial.html", @@ -7942,7 +7942,7 @@ "manual/basics/finding-your-way.html": { "href": "manual/basics/finding-your-way.html", "title": "Finding Your Way | HiAPI-C# 2025", - "summary": "Finding Your Way The application is a handful of screens, and most of what a job configures lives inside a tree on two of them. The Page menu reaches five of those screens, and it is not all of them. Every node of a tree has an address of its own, so a place in the application can be linked to rather than described. The screens The Page dropdown on the menu bar carries five entries in two groups. The first group is the job, in the order a job uses it: Tool House — the tools, one editor per tool General Setup — the equipment: the machine tool, the spindle capability, the background and coolant conditions, the fixture, the workpiece and the controller Execution — the run: the mission that is executed, the program as it was played, and what the run reports Below a separator, the two utilities: File Explorer — browsing the files under the roots the service exposes Mechanism Builder — authoring a kinematic chain No entry is ever greyed out. All five are selectable with no project open; what they lead to is what changes. Three screens have no entry in this menu: Machine Tool, at /machine-tool, reached by address only. It shows the machine chain beside a folder button — whose tooltip reads Browse once a project is open, and Load a project first before that — and a GUI / XML view switch, so it is more than a look at the chain, and it needs a project open. Log Viewer, reached from the Show Log button near the right-hand end of the menu bar. Its address is /preference/log. The sign-in page, which the service raises on its own when it wants one. Selecting inside a tree General Setup and Execution each carry a Control Tree in their left dock, under a header reading Control Tree, with the selected node's editor in the row beneath it. That editor row names the path of the selection — General Setup / Workpiece / Anchor / Geom To Fixture — which is also how these pages name a place in prose; the header shows as much of it as the dock is wide, so a deep path arrives truncated. General Setup's tree has one root, General Setup, holding Machine Tool, Spindle Capability, Background, Coolant, Fixture, Workpiece and Controller, in that order. With a project open, a CSV Controller and a CL Controller node follow, each behind its own Preference checkbox — as siblings of Controller at the same level, not as children of it. With no project open neither node is built, whatever the preferences say. Execution's tree has one root, Execution, holding Mission above Program. General Setup's middle column belongs to the Spindle Capability branch: its items put their power and torque charts there. Every other selection leaves the column reading The selected item has no expanded content. That is the column's resting state rather than a fault. General Setup at /general-setup?tree=equipment/workpiece/anchor/geom-to-fixture, with the Workpiece branch's Anchor group expanded and Geom To Fixture selected. Its editor is the row below the tree, the middle column carries the empty-content message, and the canvas on the right draws the workpiece with its anchor labels. Linking to a node The selection rides in the address as a ?tree= value, so the address bar is already the link: copying it copies the node, not just the page. To take a link from the tree instead, right-click a node's label. Every label is a real link to that node's address, so the browser's own copy-link and open-in-new-tab entries both apply to it. Ctrl-click or Cmd-click a label to open that node in a new tab; Shift-click and middle-click open it wherever the browser opens any other link. The current tab's selection stays where it is. A plain left click selects the node in place, without navigating. Paste a ?tree= value belonging to another page's tree and it redirects to the page that owns it — the other tree page, or Tool House — so a link does not have to name the right screen to reach the right node. Tool House has no ?tree= at all — its address names the selection down to the sub-tab, as /tool-house///, so /tool-house/1/cutter/material is a link to one tool's Material sub-tab. Arriving at a tree page with no ?tree= still lands on a selected node — the last selection this browser made there, or the tree's root — and the address takes that node's ?tree= value on as soon as the tree is built, so the address bar is a whole link from then on. Important An address for a node its Preference checkbox is currently hiding — a CSV Controller or CL Controller node — is honoured only when the tree is built while that address is the current one, and it reveals nothing without a project open. In practice that means the tree's first build on that address: pasting the link into a new tab, reloading on it, or opening General Setup for the first time since the page or the project was loaded. Jumping to it from a screen that has already shown General Setup for the current project does not rebuild that tree, so the address is dropped in silence: the address bar keeps the value, the node does not appear, and the selection stays where it was. The same page at /general-setup?tree=equipment/controller-csv, loaded fresh on that address with the CSV Controller preference still off — the address alone is what puts the node in the tree. CSV Controller sits below Controller at the same indent — a sibling of it — and its editor describes the fields as column tags matched against the CSV header line: Machine coordinate prefix MC., Cutter location prefix CL. and Tool id column ToolId. The addresses Eight addresses render a screen of their own. The bracketed segments are optional, so the bare address resolves too and the screen fills them in from its own state; File Explorer's trailing path carries as many segments as the browsed folder is deep. Address Screen /execution Execution /general-setup General Setup /tool-house/// Tool House /machine-tool Machine Tool /util/file-explorer// File Explorer /util/mech-builder Mechanism Builder /preference/log Log Viewer /login the sign-in page / lands on Execution. Seven further addresses render nothing of their own and redirect into a tree page's node instead: Address Lands on /controller, and anything below it General Setup, the Controller branch — the trailing path, the retired Legacy-Controller page's tab names included, is discarded /spindle-capability/ General Setup, the Spindle Capability branch — on that tab's item when the segment names one, on the branch itself otherwise /equipment/spindle General Setup, the Spindle Capability branch /fixture, and anything below it General Setup, the Fixture branch /workpiece, and anything below it General Setup, the Workpiece branch /equipment/background-coolant General Setup, the Background item /mission Execution, the Mission branch An address matching none of these lands on the application's own 404 Not Found page, which prints the address it could not match and offers Back to Execution. A ?tree= value naming no node of the built tree is ignored instead: the page opens with nothing selected, and the editor row reads Select an item in the Control Tree to edit it here. Warning Tree ids are not promised to survive a version change. An old link keeps resolving because the application migrates known older ids, but nothing should be built on an id staying the same. If the tree is not there The left dock is one of the column toggles at the right-hand end of the menu bar, left of the page title — three of them on General Setup, one per column — and its title is Toggle the Control Tree / editor dock. Switching it off removes the dock whole, tree and editor together, and the browser remembers the choice, so the dock is still gone after a reload. The same button switches it back on. General Setup's middle column has a toggle of its own beside it, which is the other way that page can arrive looking short of a column. See Also Basics — the rest of what is true on every screen The Application Window — the menu bar the Page dropdown sits on, and what keeps a visited screen alive between visits Signing In — the screen that has no menu entry because the service raises it Projects — what a project change does to a tree, and to the node an address selects Preferences — the two checkboxes behind the controller nodes, and the setting that changes what a tree carries" + "summary": "Finding Your Way The application is a handful of screens, and most of what a job configures lives inside a tree on two of them. The Page menu reaches five of those screens, and it is not all of them. Every node of a tree has an address of its own, so a place in the application can be linked to rather than described. The screens The Page dropdown on the menu bar carries five entries in two groups. The first group is the job, in the order a job uses it: Tool House — the tools, one editor per tool General Setup — the equipment: the machine tool, the spindle capability, the ambient and coolant conditions, the fixture, the workpiece and the controller Execution — the run: the mission that is executed, the program as it was played, and what the run reports Below a separator, the two utilities: File Explorer — browsing the files under the roots the service exposes Mechanism Builder — authoring a kinematic chain No entry is ever greyed out. All five are selectable with no project open; what they lead to is what changes. Three screens have no entry in this menu: Machine Tool, at /machine-tool, reached by address only. It shows the machine chain beside a folder button — whose tooltip reads Browse once a project is open, and Load a project first before that — and a GUI / XML view switch, so it is more than a look at the chain, and it needs a project open. Log Viewer, reached from the Show Log button near the right-hand end of the menu bar. Its address is /preference/log. The sign-in page, which the service raises on its own when it wants one. Selecting inside a tree General Setup and Execution each carry a Control Tree in their left dock, under a header reading Control Tree, with the selected node's editor in the row beneath it. That editor row names the path of the selection — General Setup / Workpiece / Anchor / Geom To Fixture — which is also how these pages name a place in prose; the header shows as much of it as the dock is wide, so a deep path arrives truncated. General Setup's tree has four roots — Mechanism (holding Machine Tool, Fixture and Workpiece), Spindle Capability, Environment (holding Ambient Temperature and Coolant) and Controller — in that order. With a project open, a CSV Controller and a CL Controller node follow, each behind its own Preference checkbox — as siblings of Controller at the same level, not as children of it. With no project open neither node is built, whatever the preferences say. Execution's tree has one root, Execution, holding Mission above Program. General Setup's middle column belongs to the Spindle Capability branch: its items put their power and torque charts there. Every other selection leaves the column reading The selected item has no expanded content. That is the column's resting state rather than a fault. General Setup at /general-setup?tree=equipment/workpiece/anchor/geom-to-fixture, with the Workpiece branch's Anchor group expanded and Geom To Fixture selected. Its editor is the row below the tree, the middle column carries the empty-content message, and the canvas on the right draws the workpiece with its anchor labels. Linking to a node The selection rides in the address as a ?tree= value, so the address bar is already the link: copying it copies the node, not just the page. To take a link from the tree instead, right-click a node's label. Every label is a real link to that node's address, so the browser's own copy-link and open-in-new-tab entries both apply to it. Ctrl-click or Cmd-click a label to open that node in a new tab; Shift-click and middle-click open it wherever the browser opens any other link. The current tab's selection stays where it is. A plain left click selects the node in place, without navigating. Paste a ?tree= value belonging to another page's tree and it redirects to the page that owns it — the other tree page, or Tool House — so a link does not have to name the right screen to reach the right node. Tool House has no ?tree= at all — its address names the selection down to the sub-tab, as /tool-house///, so /tool-house/1/cutter/material is a link to one tool's Material sub-tab. Arriving at a tree page with no ?tree= still lands on a selected node — the last selection this browser made there, or the tree's root — and the address takes that node's ?tree= value on as soon as the tree is built, so the address bar is a whole link from then on. Important An address for a node its Preference checkbox is currently hiding — a CSV Controller or CL Controller node — is honoured only when the tree is built while that address is the current one, and it reveals nothing without a project open. In practice that means the tree's first build on that address: pasting the link into a new tab, reloading on it, or opening General Setup for the first time since the page or the project was loaded. Jumping to it from a screen that has already shown General Setup for the current project does not rebuild that tree, so the address is dropped in silence: the address bar keeps the value, the node does not appear, and the selection stays where it was. The same page at /general-setup?tree=equipment/controller-csv, loaded fresh on that address with the CSV Controller preference still off — the address alone is what puts the node in the tree. CSV Controller sits below Controller at the same indent — a sibling of it — and its editor describes the fields as column tags matched against the CSV header line: Machine coordinate prefix MC., Cutter location prefix CL. and Tool id column ToolId. The addresses Eight addresses render a screen of their own. The bracketed segments are optional, so the bare address resolves too and the screen fills them in from its own state; File Explorer's trailing path carries as many segments as the browsed folder is deep. Address Screen /execution Execution /general-setup General Setup /tool-house/// Tool House /machine-tool Machine Tool /util/file-explorer// File Explorer /util/mech-builder Mechanism Builder /preference/log Log Viewer /login the sign-in page / lands on Execution. Seven further addresses render nothing of their own and redirect into a tree page's node instead: Address Lands on /controller, and anything below it General Setup, the Controller branch — the trailing path, the retired Legacy-Controller page's tab names included, is discarded /spindle-capability/ General Setup, the Spindle Capability branch — on that tab's item when the segment names one, on the branch itself otherwise /equipment/spindle General Setup, the Spindle Capability branch /fixture, and anything below it General Setup, the Fixture branch /workpiece, and anything below it General Setup, the Workpiece branch /equipment/background-coolant General Setup, the Environment root (Ambient Temperature / Coolant) /mission Execution, the Mission branch An address matching none of these lands on the application's own 404 Not Found page, which prints the address it could not match and offers Back to Execution. A ?tree= value naming no node of the built tree is ignored instead: the page opens with nothing selected, and the editor row reads Select an item in the Control Tree to edit it here. Warning Tree ids are not promised to survive a version change. An old link keeps resolving because the application migrates known older ids, but nothing should be built on an id staying the same. If the tree is not there The left dock is one of the column toggles at the right-hand end of the menu bar, left of the page title — three of them on General Setup, one per column — and its title is Toggle the Control Tree / editor dock. Switching it off removes the dock whole, tree and editor together, and the browser remembers the choice, so the dock is still gone after a reload. The same button switches it back on. General Setup's middle column has a toggle of its own beside it, which is the other way that page can arrive looking short of a column. See Also Basics — the rest of what is true on every screen The Application Window — the menu bar the Page dropdown sits on, and what keeps a visited screen alive between visits Signing In — the screen that has no menu entry because the service raises it Projects — what a project change does to a tree, and to the node an address selects Preferences — the two checkboxes behind the controller nodes, and the setting that changes what a tree carries" }, "manual/basics/index.html": { "href": "manual/basics/index.html", @@ -7962,7 +7962,7 @@ "manual/basics/projects.html": { "href": "manual/basics/projects.html", "title": "Projects | HiAPI-C# 2025", - "summary": "Projects A project is the whole of what a simulation runs against: the machine tool, the spindle capability, the background and coolant conditions, the fixture, the workpiece, the tool house, the controller and the NC programs a mission plays. It is a project file together with the folder that file sits in, and the Project dropdown on the menu bar is where one is created, opened, saved and closed. The equipment and mission screens are editors on whichever project is open, so a change of project reaches all of them at once. Where it is The Project dropdown, at the left of the menu bar beside Page and Preference. Its first row is a read-only field holding the path of the open project — selectable, so it can be copied — and reading No Project Loaded until one is open. The path is written relative to the admin directory the service was started against rather than as a location on the machine running it. That row is the only place the path stays put; everywhere else it is transient — a line drawn while something is happening, or a record of something that has. While a project action is running, the footer's background zone names the action and the path together, as Loading project: … and its equivalents for the other entries. The toast that reports the finished action carries the path as its caption, and that line outlives the toast in the footer's Recent messages list. The service holds one open project rather than one per browser, so every browser connected to it is working on the same project. What each entry does Entry What it does New Creates a project at a chosen path and opens it, refusing a path that already holds a file Load Opens an existing project file ReLoad Re-reads the open project from its own path, discarding anything unsaved Save Writes the open project back to its own path Save As Writes it to a chosen path, which then becomes the open project Close Project Closes it, leaving the application with no project ReLoad, Save, Save As and Close Project are greyed out until a project is open. New and Load are always selectable. The three entries that need a path — New, Load and Save As — open the shared file browser as a picker, filtered to HiNC Project (*.hincproj). It never offers the Resource root: the Admin root is always there, and the Project root beside it only while a project is open. It opens at the Admin root — in the folder the open project sits in, when there is one. Saving forces the extension, so a name typed without one still gets it. What a project actually is The project file is an XML document of references. Values that mean nothing outside this one project are written into it directly, while the pieces that are shared, large or edited on their own — the machine chain, the spindle capability, the workpiece and cutter materials, the cutting parameters, the mesh geometry — are held as references to files beside it, each named by a path relative to the project file's own folder. Opening the project file in a text editor shows those references rather than what they point at. Important A raw geometry that points at nothing does not stop the project opening; a missing side file does. Load and ReLoad read what they can and report what they could not — a missing STL, say — and the project comes up with that body simply having no geometry, the action still reporting success. A mesh-geometry .wct file a raw geometry names is quieter still: the load neither opens it nor mentions it, and the first word about it is a warning raised when the meshed geometry is first needed. A side file named as a reference is the other case altogether: when the machine chain, the spindle capability, a material or a cutting parameter set is not where the project file says it is, the load fails outright — no project opens, and the failure is reported as an error rather than as a diagnostic beside a successful load. Where a load does succeed with a hole, the message is the only thing that says otherwise, and it is not kept where a run's messages are kept: see Messages a project load raises. A project is therefore a folder at least as much as a file. Copying one to another machine, archiving one, or handing one to somebody else means taking the folder. The demo project's own folder, at /util/file-explorer/Project. The File Explorer's root switcher, beside the page name, is set to Project — the root that exists only while a project is open, and that resolves to the folder holding the open project file — and the path field reads ., the root folder itself. Three folders sit at the top, MachineTool, NC and Output, and five files below them: the cutting parameters and the workpiece material, the project file itself at 138.1 KB, the spindle capability, and a cutter material. The right-hand pane is the explorer's text editor, waiting on a file to be given to it. Warning A Save As into a new folder can produce a project that finds none of its programs. Save As writes out the side files the project file references — the machine chain, the spindle capability, the materials, the cutting parameters, and the STL meshes the equipment and the workpiece name — into the new folder and at the same relative place. Two things travel as a path with nothing behind them: a mesh-geometry .wct, which is never written out at all, and an STL that was already missing when the project opened, which is deliberately left missing rather than replaced by an empty file. Neither are the NC programs a mission plays: the project records each as a path, and nothing on the save side copies the file. Nothing rewrites those paths either, so the saved project still asks for NC/…, now underneath the new folder, where nothing has put it. The programs have to be brought across by hand, or the Save As aimed at a folder that already holds them. The folder a run writes its output into is named the same way, and it is not a dependency of the same kind: nothing has to put it there, because the writers create it on demand under the folder the open project was read from. A Save As does not move it — a run still writes beside the folder the project came from, until that project is opened at its new path. What a project change does to the rest of the window What decides a rebuild is the path changing, not the entry chosen. New, a Load that picks a different project, Close Project and a Save As to a location other than the one already open all change it, and each throws away every screen the browser has built and rebuilds against whatever the project is afterwards — which is what stops one screen showing values from a project that is not open any more. ReLoad always rebuilds as well, being the entry meant for re-reading the same path. A Load that picks the project already open rebuilds nothing: the file is read again on the service, but the screens keep what they were showing. The Application Window states the same rule from the frame's side, and covers what a rebuild costs a screen carrying unsaved state. How far a change travels beyond the browser that made it is not the same for every entry. The three that change which project the service holds open are announced to every browser connected to it, so all of them follow. ReLoad re-reads the same path: the browser that asked for it rebuilds, while a second browser — whose path did not change — carries on with what it was showing. Save As announces nothing at all. The service moves onto the new path, and only the browser that performed the Save As is told, in the reply to its own request. Every other browser goes on displaying the old path in its Project dropdown, although the service is working with the new one underneath — so a Save from any of them writes to the new path. A stale row corrects itself the next time the service reports its state to that browser: a reload, the browser's status connection dropping and coming back, another project change, or a run being started, paused, finished or reset from any browser. New, Load, ReLoad, Save, Save As and Close Project take a turn each. A second one asked for while the first is still running is refused rather than queued, and the refusal arrives as a warning reading Another project operation is in progress. Please try again. Close Project holds the turn like the other five: a Close asked for while a Load is still reading is refused, and so is a Load asked for while a Close is still tearing the project down. Losing work Nothing keeps track of whether the open project has unsaved changes. No marker in the menu bar or in the path row says the project has been edited, there is no prompt in front of ReLoad or Close Project, and nothing at all stands in the way of a browser tab being closed or reloaded. Both ReLoad and Close Project discard what the service is holding and has not written, in silence and at once; a Save beforehand is the only thing that keeps it. Save As asks nothing either. Its dialog opens on the open project's own folder with the open project's own file name already filled in, and nothing checks whether a file is already at the path chosen: confirming writes over whatever is there. Confirming on the name as it arrives therefore overwrites the project that is open — which is harmless, being what Save does — but the same confirmation one folder away overwrites a different project just as quietly. New is the one entry that refuses: it will not create a project where a file already exists, and reports that as an error whose message can carry the location in full. Before one is built The data to collect from the machine owner before a project can be built is a checklist of its own: Project Data Checklist. The order the pieces then go together in is Project Construction. See Also Basics — the rest of what is true on every screen The Application Window — the menu bar this dropdown sits on, and the page rebuild a project change triggers Finding Your Way — the screens a project change rebuilds, and what happens to a selection in one Messages and Logs — the footer's background zone and the toasts a project action raises, and where they can be read afterwards File Explorer — the browser these entries open as a picker, and the Project root that is this folder A Mission That Resumes — what a project's folder has to hold for a run to restart where the last one stopped" + "summary": "Projects A project is the whole of what a simulation runs against: the machine tool, the spindle capability, the ambient and coolant conditions, the fixture, the workpiece, the tool house, the controller and the NC programs a mission plays. It is a project file together with the folder that file sits in, and the Project dropdown on the menu bar is where one is created, opened, saved and closed. The equipment and mission screens are editors on whichever project is open, so a change of project reaches all of them at once. Where it is The Project dropdown, at the left of the menu bar beside Page and Preference. Its first row is a read-only field holding the path of the open project — selectable, so it can be copied — and reading No Project Loaded until one is open. The path is written relative to the admin directory the service was started against rather than as a location on the machine running it. That row is the only place the path stays put; everywhere else it is transient — a line drawn while something is happening, or a record of something that has. While a project action is running, the footer's background zone names the action and the path together, as Loading project: … and its equivalents for the other entries. The toast that reports the finished action carries the path as its caption, and that line outlives the toast in the footer's Recent messages list. The service holds one open project rather than one per browser, so every browser connected to it is working on the same project. What each entry does Entry What it does New Creates a project at a chosen path and opens it, refusing a path that already holds a file Load Opens an existing project file ReLoad Re-reads the open project from its own path, discarding anything unsaved Save Writes the open project back to its own path Save As Writes it to a chosen path, which then becomes the open project Close Project Closes it, leaving the application with no project ReLoad, Save, Save As and Close Project are greyed out until a project is open. New and Load are always selectable. The three entries that need a path — New, Load and Save As — open the shared file browser as a picker, filtered to HiNC Project (*.hincproj). It never offers the Resource root: the Admin root is always there, and the Project root beside it only while a project is open. It opens at the Admin root — in the folder the open project sits in, when there is one. Saving forces the extension, so a name typed without one still gets it. What a project actually is The project file is an XML document of references. Values that mean nothing outside this one project are written into it directly, while the pieces that are shared, large or edited on their own — the machine chain, the spindle capability, the workpiece and cutter materials, the cutting parameters, the mesh geometry — are held as references to files beside it, each named by a path relative to the project file's own folder. Opening the project file in a text editor shows those references rather than what they point at. Important A raw geometry that points at nothing does not stop the project opening; a missing side file does. Load and ReLoad read what they can and report what they could not — a missing STL, say — and the project comes up with that body simply having no geometry, the action still reporting success. A mesh-geometry .wct file a raw geometry names is quieter still: the load neither opens it nor mentions it, and the first word about it is a warning raised when the meshed geometry is first needed. A side file named as a reference is the other case altogether: when the machine chain, the spindle capability, a material or a cutting parameter set is not where the project file says it is, the load fails outright — no project opens, and the failure is reported as an error rather than as a diagnostic beside a successful load. Where a load does succeed with a hole, the message is the only thing that says otherwise, and it is not kept where a run's messages are kept: see Messages a project load raises. A project is therefore a folder at least as much as a file. Copying one to another machine, archiving one, or handing one to somebody else means taking the folder. The demo project's own folder, at /util/file-explorer/Project. The File Explorer's root switcher, beside the page name, is set to Project — the root that exists only while a project is open, and that resolves to the folder holding the open project file — and the path field reads ., the root folder itself. Three folders sit at the top, MachineTool, NC and Output, and five files below them: the cutting parameters and the workpiece material, the project file itself at 138.1 KB, the spindle capability, and a cutter material. The right-hand pane is the explorer's text editor, waiting on a file to be given to it. Warning A Save As into a new folder can produce a project that finds none of its programs. Save As writes out the side files the project file references — the machine chain, the spindle capability, the materials, the cutting parameters, and the STL meshes the equipment and the workpiece name — into the new folder and at the same relative place. Two things travel as a path with nothing behind them: a mesh-geometry .wct, which is never written out at all, and an STL that was already missing when the project opened, which is deliberately left missing rather than replaced by an empty file. Neither are the NC programs a mission plays: the project records each as a path, and nothing on the save side copies the file. Nothing rewrites those paths either, so the saved project still asks for NC/…, now underneath the new folder, where nothing has put it. The programs have to be brought across by hand, or the Save As aimed at a folder that already holds them. The folder a run writes its output into is named the same way, and it is not a dependency of the same kind: nothing has to put it there, because the writers create it on demand under the folder the open project was read from. A Save As does not move it — a run still writes beside the folder the project came from, until that project is opened at its new path. What a project change does to the rest of the window What decides a rebuild is the path changing, not the entry chosen. New, a Load that picks a different project, Close Project and a Save As to a location other than the one already open all change it, and each throws away every screen the browser has built and rebuilds against whatever the project is afterwards — which is what stops one screen showing values from a project that is not open any more. ReLoad always rebuilds as well, being the entry meant for re-reading the same path. A Load that picks the project already open rebuilds nothing: the file is read again on the service, but the screens keep what they were showing. The Application Window states the same rule from the frame's side, and covers what a rebuild costs a screen carrying unsaved state. How far a change travels beyond the browser that made it is not the same for every entry. The three that change which project the service holds open are announced to every browser connected to it, so all of them follow. ReLoad re-reads the same path: the browser that asked for it rebuilds, while a second browser — whose path did not change — carries on with what it was showing. Save As announces nothing at all. The service moves onto the new path, and only the browser that performed the Save As is told, in the reply to its own request. Every other browser goes on displaying the old path in its Project dropdown, although the service is working with the new one underneath — so a Save from any of them writes to the new path. A stale row corrects itself the next time the service reports its state to that browser: a reload, the browser's status connection dropping and coming back, another project change, or a run being started, paused, finished or reset from any browser. New, Load, ReLoad, Save, Save As and Close Project take a turn each. A second one asked for while the first is still running is refused rather than queued, and the refusal arrives as a warning reading Another project operation is in progress. Please try again. Close Project holds the turn like the other five: a Close asked for while a Load is still reading is refused, and so is a Load asked for while a Close is still tearing the project down. Losing work Nothing keeps track of whether the open project has unsaved changes. No marker in the menu bar or in the path row says the project has been edited, there is no prompt in front of ReLoad or Close Project, and nothing at all stands in the way of a browser tab being closed or reloaded. Both ReLoad and Close Project discard what the service is holding and has not written, in silence and at once; a Save beforehand is the only thing that keeps it. Save As asks nothing either. Its dialog opens on the open project's own folder with the open project's own file name already filled in, and nothing checks whether a file is already at the path chosen: confirming writes over whatever is there. Confirming on the name as it arrives therefore overwrites the project that is open — which is harmless, being what Save does — but the same confirmation one folder away overwrites a different project just as quietly. New is the one entry that refuses: it will not create a project where a file already exists, and reports that as an error whose message can carry the location in full. Before one is built The data to collect from the machine owner before a project can be built is a checklist of its own: Project Data Checklist. The order the pieces then go together in is Project Construction. See Also Basics — the rest of what is true on every screen The Application Window — the menu bar this dropdown sits on, and the page rebuild a project change triggers Finding Your Way — the screens a project change rebuilds, and what happens to a selection in one Messages and Logs — the footer's background zone and the toasts a project action raises, and where they can be read afterwards File Explorer — the browser these entries open as a picker, and the Project root that is this folder A Mission That Resumes — what a project's folder has to hold for a run to restart where the last one stopped" }, "manual/basics/signing-in.html": { "href": "manual/basics/signing-in.html", @@ -8042,7 +8042,7 @@ "manual/setup/coolant.html": { "href": "manual/setup/coolant.html", "title": "Coolant | HiAPI-C# 2025", - "summary": "Coolant Two thermal settings sit beside each other in the equipment tree: how the cutting zone is cooled, and how warm the shop is around it. Both feed the milling-temperature model, so they move computed temperatures and everything downstream of them — and setting them needs no heat-transfer numbers at all, because the cooling types ship as ready-made files. Where it is The General Setup page, at /general-setup, reached from the menu bar's Page dropdown. Background (/general-setup?tree=equipment/background) and Coolant (/general-setup?tree=equipment/coolant) are two leaves of the Control Tree, sitting together between Spindle Capability and Fixture. Both are inert until a project is open: the fields are disabled and the panel says so. The Coolant leaf selected on a demo project. The panel under the tree opens with the file row — the Select dropdown, the path field reading No coolant file (saved inline), and Save As… — then the read-only Name and Note of whatever file is loaded, and then the condition's own values. Neither leaf puts anything in the middle column. Pick a cooling type The three standard cooling types ship as ready-made .CoolantHeatCondition files, so picking one is the cooling-type selection — exactly the way a workpiece material file is picked. Select the Coolant leaf. Open the Select dropdown at the left of the file row and choose Browse Resource…. It opens the file picker in the shipped library's own coolant folder, so the three files below are what it lists. Browse… above it opens the same picker without that jump, which is how a condition you saved yourself is reached. Pick the file that matches the machine. Shipped file Pick it when StandardForcedAir The machine only blows air at the cutter — no liquid coolant. StandardWaterSolubleCoolant Water-based emulsion coolant, the common flood coolant. StandardOilBasedCoolant Neat-oil cutting fluid: better lubrication, noticeably less heat removal than water-based. Loading a file fills the read-only Name and Note and every value below them, and reports the name it loaded. A project nobody has touched here is not neutral. Every project carries a coolant condition from the moment it exists, and it starts on the water-soluble numbers — 25 °C, a flood baseline of 1000 W/(m²·K), a mist ratio of 0.5 and 50 W/(m²·K) with the coolant off. The read-only Name is blank, because no file has been picked, and that blank is the only sign that nobody chose these values. A dry-cutting machine left alone therefore simulates as though it were flooded with water-soluble coolant, and its computed temperatures come out low. The four values They are visible whether or not a file is loaded, and editing one tunes this project's copy rather than the file it came from. Each carries the app's own working range as a hint: Field What it is Range the panel suggests Coolant Temperature (°C) The temperature of the coolant as it arrives at the cut — Flood Convection Coefficient (W/(m²·K)) Heat removal with the coolant on Forced air 10–500; typical liquid coolant 1000–10000 Mist / Flood Ratio Mist heat removal relative to flood Typically 0.4–0.8 Off (Air) Convection Coefficient (W/(m²·K)) Heat removal with the coolant off Natural air 5–25; forced air inside an enclosure about 50 Negative temperatures are accepted, for cryogenic coolant; the three convection coefficients cannot go below zero. Which of the three coefficients is in force at any moment is not decided here — the NC program's own M07 / M08 / M09 decide it, step by step. That, and what the numbers do to the simulation, are Coolant Model. Keeping a tuned condition Save As… writes the current values out as a .CoolantHeatCondition file in the project folder and starts tracking it, so the project saves a reference to the file instead of a copy of the values. It offers a name taken from the loaded condition; a file picked from the shipped library loses its .default marker on the way, because that marker means shipped and a file you saved is yours. The result is loadable into the next project through the same Select dropdown — which is the point of saving one: a shop with its own measured coolant performance describes it once. Background temperature The Background leaf carries a single field, Background Temperature in °C: the surrounding temperature the thermal model works against. It defaults to 25 °C, it belongs to the project exactly as the coolant condition does, and it is read by the same milling-temperature model and by the feed optimizer, so it is not a display setting. Set it to the shop's real ambient. There is no file to load and nothing else to configure: one number, applied to the whole project. See Also Coolant Model — the coefficients, the M-code that selects one, the shipped presets and the file format Background / Coolant Page — the Control-Tree editor for these values, field by field Setup — the rest of the pre-simulation configuration" + "summary": "Coolant Two thermal settings sit beside each other in the equipment tree: how the cutting zone is cooled, and how warm the shop is around it. Both feed the milling-temperature model, so they move computed temperatures and everything downstream of them — and setting them needs no heat-transfer numbers at all, because the cooling types ship as ready-made files. Where it is The General Setup page, at /general-setup, reached from the menu bar's Page dropdown. Ambient Temperature (/general-setup?tree=equipment/background/environment-temperature) and Coolant (/general-setup?tree=equipment/background/coolant) are the two leaves of the Control Tree's Environment root, between Spindle Capability and Controller (the ids keep the legacy background spelling). Both are inert until a project is open: the fields are disabled and the panel says so. The Coolant leaf selected on a demo project. The panel under the tree opens with the file row — the Select dropdown, the path field reading No coolant file (saved inline), and Save As… — then the read-only Name and Note of whatever file is loaded, and then the condition's own values. Neither leaf puts anything in the middle column. Pick a cooling type The three standard cooling types ship as ready-made .CoolantHeatCondition files, so picking one is the cooling-type selection — exactly the way a workpiece material file is picked. Select the Coolant leaf. Open the Select dropdown at the left of the file row and choose Browse Resource…. It opens the file picker in the shipped library's own coolant folder, so the three files below are what it lists. Browse… above it opens the same picker without that jump, which is how a condition you saved yourself is reached. Pick the file that matches the machine. Shipped file Pick it when StandardForcedAir The machine only blows air at the cutter — no liquid coolant. StandardWaterSolubleCoolant Water-based emulsion coolant, the common flood coolant. StandardOilBasedCoolant Neat-oil cutting fluid: better lubrication, noticeably less heat removal than water-based. Loading a file fills the read-only Name and Note and every value below them, and reports the name it loaded. A project nobody has touched here is not neutral. Every project carries a coolant condition from the moment it exists, and it starts on the water-soluble numbers — 25 °C, a flood baseline of 1000 W/(m²·K), a mist ratio of 0.5 and 50 W/(m²·K) with the coolant off. The read-only Name is blank, because no file has been picked, and that blank is the only sign that nobody chose these values. A dry-cutting machine left alone therefore simulates as though it were flooded with water-soluble coolant, and its computed temperatures come out low. The four values They are visible whether or not a file is loaded, and editing one tunes this project's copy rather than the file it came from. Each carries the app's own working range as a hint: Field What it is Range the panel suggests Coolant Temperature (°C) The temperature of the coolant as it arrives at the cut — Flood Convection Coefficient (W/(m²·K)) Heat removal with the coolant on Forced air 10–500; typical liquid coolant 1000–10000 Mist / Flood Ratio Mist heat removal relative to flood Typically 0.4–0.8 Off (Air) Convection Coefficient (W/(m²·K)) Heat removal with the coolant off Natural air 5–25; forced air inside an enclosure about 50 Negative temperatures are accepted, for cryogenic coolant; the three convection coefficients cannot go below zero. Which of the three coefficients is in force at any moment is not decided here — the NC program's own M07 / M08 / M09 decide it, step by step. That, and what the numbers do to the simulation, are Coolant Model. Keeping a tuned condition Save As… writes the current values out as a .CoolantHeatCondition file in the project folder and starts tracking it, so the project saves a reference to the file instead of a copy of the values. It offers a name taken from the loaded condition; a file picked from the shipped library loses its .default marker on the way, because that marker means shipped and a file you saved is yours. The result is loadable into the next project through the same Select dropdown — which is the point of saving one: a shop with its own measured coolant performance describes it once. Ambient temperature The Ambient Temperature leaf carries a single field of the same name, in °C: the shop-floor ambient temperature — the temperature the workpiece, the cutter, the chips and the spindle start at, and the one the spindle cools toward. The cutting zone itself convects to the Coolant leaf's coolant temperature, not to this one. It defaults to 25 °C, it belongs to the project exactly as the coolant condition does, and it is read by the same milling-temperature model and by the feed optimizer, so it is not a display setting. Set it to the shop's real ambient temperature. There is no file to load and nothing else to configure: one number, applied to the whole project. See Also Coolant Model — the coefficients, the M-code that selects one, the shipped presets and the file format Environment: Ambient Temperature / Coolant Page — the Control-Tree editor for these values, field by field Setup — the rest of the pre-simulation configuration" }, "manual/setup/cutter.html": { "href": "manual/setup/cutter.html", @@ -8057,7 +8057,7 @@ "manual/setup/index.html": { "href": "manual/setup/index.html", "title": "Setup | HiAPI-C# 2025", - "summary": "Setup Pre-simulation configuration: the physical entities and components you configure before running a simulation. Once set, these form the fixed environment of the simulation. Tip New to building a project? Start with the Project Data Checklist — the list of data to collect from the machine owner before any of the components below can be configured. It is a workflow rather than a setup task, so it lives with the other end-to-end guides. Ordered as the General Setup page builds its equipment, with the placement tasks, the tool house and the environment after it. Equipment Machine Tool — Build a virtual machine tool's chain, and attach one to a project Spindle Capability — What the spindle delivers: power, torque, thermal ceiling and gear shift Fixture — What holds the workpiece on the table, its geometry, and the two transforms that place it Workpiece — The stock and the finished shape, where they sit, how finely they are meshed, and what they are made of Controller — The brand your NC programs are read with, and the tables that brand grew Placing It All Anchor — Place the workpiece, fixture and tool relative to the machine Program Zero Alignment — Put the program origin where the NC code expects it, once the workpiece is placed Cutting Tools Cutter — Create a tool, give it a cutting geometry and a holder, and reuse a whole tool house across projects Environment Coolant — Pick how the cutting zone is cooled, and set the ambient temperature it works against Which NC vocabulary a controller brand honours is not a setup task and no longer lives here — it is NC Dialects. Neither is what a cutter's quantities mean: the body types, the two ways a cutting envelope is expressed, the upper beam and the angles are Cutter Geometry, and the smart holder's sensor settings are Smart Tool Holder. See Also Technique — the models behind these settings: milling physics, NC dialects, machine capability NC Dialects — what each controller brand's code actually does, brand by brand Basics — the window, the project and the screens these tasks are performed in Running a Simulation — what the equipment configured here is then used for Utilities — the screens beside these tasks: browsing a project's files and assembling a machine chain" + "summary": "Setup Pre-simulation configuration: the physical entities and components you configure before running a simulation. Once set, these form the fixed environment of the simulation. Tip New to building a project? Start with the Project Data Checklist — the list of data to collect from the machine owner before any of the components below can be configured. It is a workflow rather than a setup task, so it lives with the other end-to-end guides. Ordered as the General Setup page builds its equipment, with the placement tasks, the tool house and the environment after it. Equipment Machine Tool — Build a virtual machine tool's chain, and attach one to a project Spindle Capability — What the spindle delivers: power, torque, thermal ceiling and gear shift Fixture — What holds the workpiece on the table, its geometry, and the two transforms that place it Workpiece — The stock and the finished shape, where they sit, how finely they are meshed, and what they are made of Controller — The brand your NC programs are read with, and the tables that brand grew Placing It All Anchor — Place the workpiece, fixture and tool relative to the machine Program Zero Alignment — Put the program origin where the NC code expects it, once the workpiece is placed Cutting Tools Cutter — Create a tool, give it a cutting geometry and a holder, and reuse a whole tool house across projects Environment Coolant — Pick how the cutting zone is cooled, and set the shop's ambient temperature the thermal model starts from Which NC vocabulary a controller brand honours is not a setup task and no longer lives here — it is NC Dialects. Neither is what a cutter's quantities mean: the body types, the two ways a cutting envelope is expressed, the upper beam and the angles are Cutter Geometry, and the smart holder's sensor settings are Smart Tool Holder. See Also Technique — the models behind these settings: milling physics, NC dialects, machine capability NC Dialects — what each controller brand's code actually does, brand by brand Basics — the window, the project and the screens these tasks are performed in Running a Simulation — what the equipment configured here is then used for Utilities — the screens beside these tasks: browsing a project's files and assembling a machine chain" }, "manual/setup/machine-tool.html": { "href": "manual/setup/machine-tool.html", @@ -8092,7 +8092,7 @@ "manual/utilities/mech-builder.html": { "href": "manual/utilities/mech-builder.html", "title": "Mechanism Builder | HiAPI-C# 2025", - "summary": "Mechanism Builder Building a mechanism: anchors joined by branches, each branch carrying the transform between its two ends, and each anchor optionally carrying a shape. It is where a virtual machine tool's topology is assembled and then written out as a file a project can load. Where it is Its own page, reached from the menu bar's Page → Mechanism Builder, at /util/mech-builder. Nothing on it belongs to a project, so it opens and edits with no project loaded, as the File Explorer beside it does. The mechanism is held by the server rather than by the page — more than the page keep-alive The Application Window grants every screen, because there is one mechanism per server rather than one per browser: a second person editing at the same time is editing the same one. Three fixed, equal-width columns, none of them draggable: the File menu, the Add Anchor button and the graph of anchors and branches on the left, where clicking a node, or the label on an edge, selects it; the editor for whatever is selected in the middle, headed Anchor or Branch; and Display, the 3D view of the mechanism, on the right, which redraws as the mechanism changes. At /util/mech-builder, with an anchor picked in the graph. The open file's path sits under the File menu; the header of the middle column carries Extend and the delete button; and the Geometry card here holds a TransformationGeom, so its own inner geometry — an STL file — and its own inner transformer are edited underneath it. What the anchors and branches must be called — the motion-axis and end-anchor keywords, which way branches must point, and how to take the numbers off a CAD assembly — is Building Virtual Machine Tools; this page is only how to drive the editor. Starting, loading and saving File menu entry What it does New Discards the mechanism on screen and starts an empty one holding a single root anchor. Load… Opens the server file picker — File Explorer's browser in picker mode, over the roots that page lists — filtered to *.GeneralMechanism, *.general-mech and *.xml — the first is what this page's own Save As writes and what the shipped mechanism is named; the second is the older spelling hand-authored files still carry, and it loads the same way. The server reads the file where it sits and remembers its folder. ReLoad Re-reads the file you last loaded, dropping the edits made since. Disabled until a file has been loaded. Save As General Mechanism Writes the mechanism as a .GeneralMechanism XML where you pick, and re-points ReLoad at it. Save As Machine Tool Wraps the same mechanism as a machine tool and writes a .MachineTool XML. ReLoad goes on pointing at the mechanism file, because a machine tool is a different file type. There is no plain Save that overwrites what you opened: both writes are Save As and both ask where the result goes. Under the File menu the left column shows the open file's relative path, or (unsaved) while the mechanism has no file yet — after New, until the first Save As. Note Save As Machine Tool does not check the end-anchor keywords. The write succeeds and reports the file saved whatever the anchors are called, including a mechanism whose tool-end and worktable-end anchors are mis-cased or missing altogether. A file written here asks for its collision pairs to be generated, and generating them needs those two anchors by their exact names, so such a file is refused the first time anything reads it — on the General Setup page's Machine Tool branch, not here, and with a message naming the keyword it wanted. Get the names right before saving; they are in Building Virtual Machine Tools. A .MachineTool written here is not a project's chain until it is loaded onto one, on the General Setup page's Machine Tool branch — see Building Virtual Machine Tools. Growing the chain Click an anchor in the graph to select it. The root carries a Root badge and is the one anchor that cannot be deleted. Press Extend in its header. That creates a new anchor and the branch reaching it from the selected one, then selects the new anchor — the normal way a chain grows. Add Anchor, beside the File menu, is for a loose anchor instead: it creates one connected to nothing, which you join up afterwards with the Add Branch picker on an anchor's Identity card. That picker offers every anchor except the selected one and those already joined to it in either direction. Name each anchor as you make it. New ones arrive as NewAnchor-001, NewAnchor-002 and so on, so type the real name into Name on the Identity card; it commits a moment after you stop typing. A branch carries a Name field of its own in the same place. Deleting an anchor or a branch is a double-click on the red delete button in its header. Geometry on an anchor Geometry is optional and belongs to one anchor at a time. Select the anchor and tick Geometry on the Geometry card; a badge beside the checkbox names the shape currently held, and un-ticking the box removes it. Five kinds can be built here — Box3d, Cylindroid, StlFile, TransformationGeom and GeomCombination — and TransformationGeom carries its own inner geometry and inner transformer, so a shape can be offset from the anchor it hangs on. Display color, above the shape editor, is written into the mechanism file itself, so everyone who opens that file sees the same colour; until you set one the badge reads auto and the view uses a stable colour of its own, which the reset button beside the swatch returns to. The branch transformer Click the label on a branch's edge — the transformer type, or the branch's name and type — to select the branch. Its Identity card names the two anchors it joins in order, the one the branch starts from and then the one it reaches, with an arrow between them; that order is the branch's direction. Below that, the Transformer card picks between seven kinds, in the order the picker lists them: Static Translation, Static Rotation, Static Freeform, Dynamic Translation, Dynamic Rotation, General Transform and No Transform — which is what every new branch starts on. Pick a kind and its fields appear underneath; the choice takes effect at once, so the right-hand view shows the joint as you edit it. The two dynamic kinds are the ones whose value varies at runtime — a machine's moving axes are branches carrying those. At /util/mech-builder, with a branch picked. A Dynamic Rotation carries the axis it turns about and the pivot it turns around; the angle is the value a run varies, so the number shown here is the resting one. The sentence under the fields names the same three parts. See Also File Explorer — the server-side browser behind this page's Load and Save As dialogs, and the roots they offer Utilities — the other screens the Page menu lists beside this one Building Virtual Machine Tools — the naming keywords, branch direction and CAD practice a machine chain built here must follow, and where the saved file is attached to a project Mechanism Builder Page — the component behind this page: its cards, its file IO and how edits reach the canvas" + "summary": "Mechanism Builder Building a mechanism: anchors joined by branches, each branch carrying the transform between its two ends, and each anchor optionally carrying a shape. It is where a virtual machine tool's topology is assembled and then written out as a file a project can load. Where it is Its own page, reached from the menu bar's Page → Mechanism Builder, at /util/mech-builder. Nothing on it belongs to a project, so it opens and edits with no project loaded, as the File Explorer beside it does. The mechanism is held by the server rather than by the page — more than the page keep-alive The Application Window grants every screen, because there is one mechanism per server rather than one per browser: a second person editing at the same time is editing the same one. Three fixed, equal-width columns, none of them draggable: the File menu, the Add Anchor button and the graph of anchors and branches on the left, where clicking a node, or the label on an edge, selects it; the editor for whatever is selected in the middle, headed Anchor or Branch; and Display, the 3D view of the mechanism, on the right, which redraws as the mechanism changes. At /util/mech-builder, with an anchor picked in the graph. The open file's path sits under the File menu; the header of the middle column carries Extend and the delete button; and the Geometry card here holds a TransformationGeom, so its own inner geometry — an STL file — and its own inner transformer are edited underneath it. What the anchors and branches must be called — the motion-axis and end-anchor keywords, which way branches must point, and how to take the numbers off a CAD assembly — is Building Virtual Machine Tools; this page is only how to drive the editor. Starting, loading and saving File menu entry What it does New Discards the mechanism on screen and starts an empty one holding a single root anchor. Load… Opens the server file picker — File Explorer's browser in picker mode, over the roots that page lists — filtered to *.GeneralMechanism, *.general-mech and *.xml — the first is what this page's own Save As writes and what the shipped mechanism is named; the second is the older spelling hand-authored files still carry, and it loads the same way. The server reads the file where it sits and remembers its folder. ReLoad Re-reads the file you last loaded, dropping the edits made since. Disabled until a file has been loaded. Save As General Mechanism Writes the mechanism as a .GeneralMechanism XML where you pick, and re-points ReLoad at it. Save As Machine Tool Wraps the same mechanism as a machine tool and writes a .MachineTool XML. ReLoad goes on pointing at the mechanism file, because a machine tool is a different file type. There is no plain Save that overwrites what you opened: both writes are Save As and both ask where the result goes. Under the File menu the left column shows the open file's relative path, or (unsaved) while the mechanism has no file yet — after New, until the first Save As. Note Save As Machine Tool does not check the end-anchor keywords. The write succeeds and reports the file saved whatever the anchors are called, including a mechanism whose tool-end and worktable-end anchors are mis-cased or missing altogether. A file written here asks for its collision pairs to be generated, and generating them needs those two anchors by their exact names, so such a file is refused the first time anything reads it — on the General Setup page's Machine Tool branch, not here, and with a message naming the keyword it wanted. Get the names right before saving; they are in Building Virtual Machine Tools. A .MachineTool written here is not a project's chain until it is loaded onto one, on the General Setup page's Machine Tool branch — see Building Virtual Machine Tools. Growing the chain Click an anchor in the graph to select it. The root carries a Root badge and is the one anchor that cannot be deleted. Press Extend in its header. That creates a new anchor and the branch reaching it from the selected one, then selects the new anchor — the normal way a chain grows. Add Anchor, beside the File menu, is for a loose anchor instead: it creates one connected to nothing, which you join up afterwards with the Add Branch picker on an anchor's Identity card. That picker offers every anchor except the selected one and those already joined to it in either direction. Name each anchor as you make it. New ones arrive as NewAnchor-001, NewAnchor-002 and so on, so type the real name into Name on the Identity card; it commits a moment after you stop typing. A branch carries a Name field of its own in the same place. Deleting an anchor or a branch is a double-click on the red delete button in its header. Geometry on an anchor Geometry is optional and belongs to one anchor at a time. Select the anchor and tick Geometry on the Geometry card; a badge beside the checkbox names the shape currently held, and un-ticking the box removes it. Five kinds can be built here — Box3d, Cylindroid, StlFile, TransformationGeom and GeomCombination — and TransformationGeom carries its own inner geometry and inner transformer, so a shape can be offset from the anchor it hangs on. Display color, above the shape editor, is written into the mechanism file itself, so everyone who opens that file sees the same colour; until you set one the badge reads auto and the view uses a stable colour of its own, which the reset button beside the swatch returns to. The branch transformer Click the label on a branch's edge — the transformer type, or the branch's name and type — to select the branch. Its Identity card names the two anchors it joins in order, the one the branch starts from and then the one it reaches, with an arrow between them; that order is the branch's direction. Below that, the Transformer card picks between seven kinds, in the order the picker lists them: Static Translation, Static Rotation, Static Freeform, Dynamic Translation, Dynamic Rotation, General Transform and No Transform — which is what every new branch starts on. Pick a kind and its fields appear underneath; the choice takes effect at once, so the right-hand view shows the joint as you edit it. The two dynamic kinds are the ones whose value varies at runtime — a machine's moving axes are branches carrying those. At /util/mech-builder, with a branch picked. A Dynamic Rotation carries the axis it turns about and the pivot it turns around; the angle is the value a run varies, so the number shown here is the resting one. The sentence under the fields names two of those parts, the axis and the angle, and says that the angle is the one a run varies. See Also File Explorer — the server-side browser behind this page's Load and Save As dialogs, and the roots they offer Utilities — the other screens the Page menu lists beside this one Building Virtual Machine Tools — the naming keywords, branch direction and CAD practice a machine chain built here must follow, and where the saved file is attached to a project Mechanism Builder Page — the component behind this page: its cards, its file IO and how edits reach the canvas" }, "product/about.html": { "href": "product/about.html", @@ -8137,22 +8137,22 @@ "product/system-requirements.html": { "href": "product/system-requirements.html", "title": "System Requirements | HiAPI-C# 2025", - "summary": "System Requirements Operating System: Windows 10 or later Ubuntu 22.04 LTS CPU Architecture: x64 (ARM not yet supported) Browser: Chrome 115, Edge 115, Firefox 115 or Safari 16, or any later version. The web interface is built to that language level, and an older browser cannot run it. The 3D view is rendered on the server and arrives as a stream of images, so the browser itself needs no graphics capability Runtime: none to install. The web service is published self-contained, so it carries the runtime it needs. A .NET project that references the HiAPI packages directly is the one case that needs a runtime installed, and it must be .NET 10.0 — every published package targets it, and an earlier runtime cannot load them at all Memory (RAM): Minimum: 8GB RAM (suitable for low-resolution models) Recommended: 128GB RAM or higher (for large and detailed models) Graphics: OpenGL 3.3 compatible graphics card or integrated graphics Most computers manufactured within the last 15 years meet this requirement Performance Guidelines for High-Resolution Simulation Based on internal testing and practical experience: CPU Considerations High clock speed is prioritized over multiple cores Single-thread performance is more important than multi-core parallelization For small NC programs: 16GB RAM is workable Graphics and GPU GPU is used only for 3D rendering/visualization, not for computation acceleration A working OpenGL context is required even if nobody looks at the 3D view: the rendering engine is initialised at startup, and the software will not start without one Cloud deployment is supported, but choose an instance that has a GPU with its graphics driver installed. Instances with no GPU, or with a GPU whose driver is missing, are the usual cause of a failed start Storage Performance SSD (Solid State Drive) recommended for optimal simulation efficiency Traditional HDD may cause significant performance degradation." + "summary": "System Requirements Operating System: Windows 10 or later Ubuntu 22.04 LTS CPU Architecture: x64 (ARM not yet supported) Browser: Chrome 115, Edge 115, Firefox 115 or Safari 16, or any later version. The web interface is built to that language level, and an older browser cannot run it. The 3D view is rendered on the server and arrives as a stream of images, so the browser itself needs no graphics capability Runtime: none to install. The web service is published self-contained, so it carries the runtime it needs. A .NET project that references the HiAPI packages directly is the one case that needs a runtime installed, and it must be .NET 10.0 — every published package targets it, and an earlier runtime cannot load them at all Memory (RAM): Minimum: 8GB RAM (suitable for low-resolution models) Recommended: 128GB RAM or higher (for large and detailed models) Graphics: OpenGL 3.3 compatible graphics card or integrated graphics Most computers manufactured within the last 15 years meet this requirement Performance Guidelines for High-Resolution Simulation Based on internal testing and practical experience: CPU Considerations High clock speed is prioritized over multiple cores Single-thread performance is more important than multi-core parallelization For small NC programs: 16GB RAM is workable Graphics and GPU GPU is used only for 3D rendering/visualization, not for computation acceleration The rendering engine is initialised at startup even if nobody looks at the 3D view. A host with no usable OpenGL context still starts and logs one line saying so: NC play, physics and training run, the 3D view does not Cloud deployment is supported; for the 3D view choose an instance that has a GPU with its graphics driver installed. An instance with no GPU, or with a GPU whose driver is missing or mismatched, runs headless without 3D Storage Performance SSD (Solid State Drive) recommended for optimal simulation efficiency Traditional HDD may cause significant performance degradation." }, "release-note/index.html": { "href": "release-note/index.html", "title": "Release Note | HiAPI-C# 2025", - "summary": "Release Note HiNc Packages Version 3.2.24 Correctness and coverage that landed after 3.2.7. The 3.1.175 → 3.2 line jump is the 3.2.7 entry below; the long form is still Upgrading from 3.1.175 to 3.2. Important Adoption status. Verification is still in progress across most areas. Do not put 3.2 NC optimization into production. It is not finished on this line. Work that depends on optimization should stay on the 3.1 line, serviced as 3.1.175.. The Blazor front end tracks the 3.2 packages, so it is not a way to stay on the 3.1 behaviour. Do not put SoftNc canned-cycle indexing with rotary words into production. SoftNc is the default engine, and its G81–G89 family does not take A / B / C words on a repeat block: a rotary-only repeat does not fire the cycle, a mixed block drops the rotary word, and under G68.2 the hole follows the table. Programs that index a rotary axis that way should run with EnableSoftNcRunner set false — the HardNc fallback indexes those blocks the way a control does. See Brand NC language coverage. Whole-program throughput against the last 3.1 set is 2.5×–18.8× in steps per second (paired on one 32-logical-processor Linux workstation; the ratio grows with program length and mesh fineness). The six-core ceiling that used to cap the 3.1 pipeline is about 6% of that gap. Figures and conditions: Performance and footprint M02 / M30 / END PGM is a reset edge on SoftNc. Tool-length compensation (including TCP), tilt, cutter-radius compensation and canned cycles cancel on the next block; the end-of-program block itself still runs under the modal state it executed with. HardNc still carries G43.4 across M02. See Results that change on upgrade An omitted H is no longer a silent zero — it takes the equipped tool's offset row first, then warns Comp-ToolHeight--NoToolForOmittedH / --NoToolForOmittedHRtcp. A vacant table row warns Comp-ToolHeight--RowMissing Cutter-radius compensation runs in the selected G17 / G18 / G19 plane. An interference path that used to swap sides silently now reports RadiusComp--Interference Siemens ROTS / AROTS are simulated into the tilt chain in Sinumerik RPY order. SCALE / MIRROR / CROTS remain recognized, not simulated Heidenhain LN vector blocks resolve into rotary axes through HeidenhainLnOrientationSyntax Fanuc G54.1 Pn (also written G54 Pn) and G59.1–G59.9 resolve additional work offsets. A selected row nobody has entered reports Coord-WorkOffset--AdditionalZero Runner feedrate members rename to CommandedClFeedrate_mmds. Physics follows the equipped tool's tip via ActualTipFeedrate_mmds. A project-level RadiusOffsetBasis decides what a tool-house refresh writes into the D column — see Tool Offsets GetMillingEquipment → GetMachiningEquipment. CodeXyzabcMachineTool is absorbed into GeneralXyzabcMachineTool (the old XML name still loads). The equipment splits into authored SetupEquipment and runtime MachiningEquipment Close joins the ProjectFileBusyException gate. LoadProject and ReloadProject take a message sink for load-time diagnostics OmitLeadingZero is an output style the project can pin (.5 vs 0.5) HiNc Packages Version 3.2.7 At a glance 3.2 is largely one piece of work: the NC interpreter that reads a controller program is now composed from configurable parts rather than written into one class, and most of this release is the brand coverage that made possible. A Siemens or Heidenhain program that 3.1.175 could not interpret past its first computed coordinate or subprogram call now replays end to end. Control-language coverage. The figure is how far our own verification has reached on that dialect — it is not the share of the language that is implemented, and it is not a guarantee for a program we have not seen: Control language Verification reached Cutter location (NX CLSF / APT source) ~90% Fanuc ~80% Siemens SINUMERIK ~60% Heidenhain (klartext and DIN/ISO) ~40% Syntec and Mazak run on the Fanuc-family vocabulary; their brand-specific syntax has not been worked through and they are not covered by the figures above. The per-construct picture — including what is recognized and deliberately not simulated — is in the brand support matrix. Failures say what went wrong. The class of defect this release spent most effort on is the silent one: a Siemens tool offset with no table row that resolved to zero and machined a whole program one tool length low, a G68 rotation that did nothing while reporting itself active, a tilted plane the machine could not reach. Each of those is now a named, searchable diagnostic rather than a plausible-looking wrong result — see the diagnostic id table. Simulation is faster and holds a bigger program. Physics moved into the native kernel (a paired play: 59.3 s / 16.1 GB allocated → 40.6 s / 3.4 GB), building the topology of a large STL is linear rather than quadratic in triangle count, and a long program no longer degrades as it plays. Figures and their conditions are under Performance and footprint. The application product moves to the web API. The web service is the application the product line is built on, and its source is the same HiNC-2025-webservice sample we publish — what you read there is what the product runs. The WPF desktop client is retired with this line: it was a demo of the same packages rather than a product surface, it takes no feature work, and it is no longer documented here. The Blazor front end builds against the same 3.2 packages but is not published as a product. Important Adoption status. This drop is published for review. Verification is still in progress across most areas, and the coverage figures above are the honest state of it. Do not put 3.2 NC optimization into production. It is not finished on this line. Work that depends on optimization should stay on the 3.1 line, which is serviced as 3.1.175.. The Blazor front end tracks the 3.2 packages, so it is not a way to stay on the 3.1 behaviour. What changed This 3.2.7 entry covers everything since 3.1.175. The 3.1 line is closed at the 3.1.175 package set and is serviced only as 3.1.175.; master moved all ten packages onto the 3.2 line on 2026-08-24 and restarted their build counters. So a 3.2 build number starts low, the two counters are not comparable, and the gap between the last 3.1 number a feed served and the first 3.2 one is expected rather than a missing upload. The versions in between were never published as a release set, which is why they are merged here rather than listed separately. Each package's build counter advances on its own, so no single number is common to all ten; a set is named by its HiNc package version — see The package line. Everything below therefore lands at once on a caller moving a 3.1.175 reference to 3.2. See Upgrading from 3.1.175 to 3.2 for the full detail — the summary here is the shape of the upgrade, not the whole of it. Breaking changes In the order they will bite. Full table with replacements on the upgrade page. Registration: XFactory.Generators becomes a ConcurrentDictionary (a caller declaring the old type breaks at compile time), and LocalProjectService.Reg() must still be called once at startup before any project XML is deserialized Messages: MixedProgress0, MultiTagMessage and MultiTagMessageUtil are removed; every message parameter is retyped from IProgress to IProgress; Category.General is deleted and NcDiagnostic.Text renames to Notification Session lifetime: LocalProjectService.SessionShell is null outside a session and ShellProgress is recreated per session — hold no long-lived reference; MachiningSession takes an injected IMachiningService, and IMachiningService replaces PlayerCancellationToken / PausePlayer with one PacePlayer Play verbs: PlayNcFile / RunNcFile gain an NcKind kind = NcKind.Auto parameter and dispatch by extension; the old narrow verbs become PlayBrandNcFile / RunBrandNcFile. The “Control” vocabulary retires with them (IControlRunner → INcRunner, RunControlLines → RunNcLines, ControlKind → NcKind) Hard renames, no shim: runtime geom → meshed geom across WorkpieceService; IContourTray / UniformContourTray / FreeContourTray → IFluting / UniformFluting / FreeFluting and MillingCutter.FluteContourTray → Fluting; HiNc's Hi.Common.ResourceUtil → ResourceLayout (it was shadowing HiGeom's same-named type); the native topo-STL wrappers move to Hi.Geom.Topo; ITimeGetter → ITimecoded; ClStrip.DrawingRefreshing → DrawingRefreshed; SoftNcRunner.NcDependencyList → PipelineNcDependencyList Removals: CsvRunner0 and EnableSoftCsvRunner, RawCsvRunner, IndexedSentence, SimpleSessionCommand, LsStl; the GUI-layer types MachiningProjectDisplayee, IsoCoordinateEntryDisplayee, HeidenhainCoordinateEntryDisplayee, UserConfig, UserService and PlayerDivConfig; the managed physics kernel types FluteZData, MillingForceUtil.RuntimePack / LayerPack / AnglePack and MillingPhysicsBrief.YieldStressMinHeight_mm; CultureUtil.SupportedCultureNames and SetCurrentCulture(string); eight gl* P/Invoke declarations that had no backing export; and PostExecutionCommand's meshed-geometry output pair (use RecordMeshedGeomCommand / ExportMeshedGeomToStlCommand instead) Shapes: MachiningToolHouse derives from Dictionary; MachiningStep.ActualTimecode / ActualDateTime become get-only views onto the new ActualTime; PreSettingCommand becomes a legacy bundle that expands on load into five single-setting commands and is never written back; ToPresentDto wire keys change Defaults: EnableSoftNcRunner is true — SoftNc is the NC engine and HardNcRunner is the opt-out fallback; EnableNativeMillingPhysics is true and a shipping build throws if you set it false; YieldingStressRatio reports NaN instead of 0 when it cannot be evaluated, so a caller reading 0 as “no constraint” must add a NaN branch New licence feature NcComposition (id 22) gates registering a non-built-in unit into a SoftNcRunner pipeline and executing an NC-embedded C# script. Degradation is silent and functional — the unit is skipped with one Composition--NotLicensed — so an unlicensed installation produces a different simulation, not an error Packaging: x64 only; the shipped machine-tool packages are renamed and now carry the .default marker (MachineTool/Table-B1.default, MachineTool/CT-350.default), so a project that refers to one by its earlier path must be repointed; HiNcServer pins request localization to English and HiNcRcl drops the inert HiNC:DisplayEngine:FontFile key Some results change without any code change — the pivot-transform anchor, a G68 rotation that was a silent no-op, blank lines resetting G90/G91, Heidenhain absolute arc centres, five-axis IK about 1000× tighter, and MC-linear moves stepping by euclidean tip travel. They are listed with their symptoms under Results that change on upgrade. New in this release Siemens SINUMERIK programs replay end to end — real .mpf / .spf files rather than an ISO subset: modal vocabulary and T=\"name\" tool calls, an expression evaluator over R-parameters and $-system variables, programmable frames and $P_UIFR, TRAORI RTCP and CYCLE800 swivel, subprogram and MCALL cycle calls, full control flow with iteration watchdogs, the AC() / IC() / DC() per-word coordinate functions and the coded-position family Heidenhain plays both dialects on one preset — klartext motion, datums, tool calls, arcs and cycles; Q-parameter evaluation with FN 9–12 conditional jumps; the PLANE / FUNCTION TCPM / M128 tilt and RTCP stack; subprogram and CALL PGM calls; post-processed spellings written without separators; and the DIN/ISO dialect with its absolute I / J / K arc centres Fanuc Custom Macro B and polar interpolation — #var expressions, IF / GOTO / WHILE, M98 / M99 subprograms and G65 / G66 macro calls; G12.1 / G13.1 polar coordinate interpolation with G41 / G42 compensation on the hypothetical plane SoftNcRunner is the default NC pipeline. See NC Parsing Engine for its architecture and the per-brand support matrix NC optimization runs on that pipeline — not finished on this line, see Adoption status above — regenerating text as anchored token edits over the verbatim source block, so lines the optimizer does not touch round-trip byte-identically. Output follows the source's decimal digits and is written back in the source file's encoding, so a GBK or Big5 program keeps its comments Cutter-location files drive a real machine chain, not only a ClMillingDevice, and a played CL program converts to Fanuc NC through ConvertClToNcFiles Milling physics moved into the native kernel — engagement, force and the sequential thermal chain — with the tool's scalar physics frozen once per session into MillingToolPhysicsPack, which also makes force waveforms reproducible between two plays of the same program Session commands declare themselves through CommandCatalogAttribute and CommandFieldAttribute, so a generic editor renders them without a hand-written form; the HTTP surface answers a no-session or no-project call with 409 and an ApiActionResult envelope carrying the call's notifications Diagnostics carry a template and its arguments, so a front end can re-render a notification in its own language, and repeats fold into one per-run summary instead of one message per block Shipped resources carry a .default marker distinguishing system territory from user files, and HiNc-Resource ships the five brand controller presets and three coolant presets so those load browsers start populated A parser configuration is a file, and it is shareable. NcRunnerSuit bundles a runner with its per-case data as one loadable unit, and per-case data now travels as proxy placeholders that resolve against the owning project — so one controller configuration is no longer welded to the job it was first built for A long program no longer degrades as it plays. A dead equality guard made the session append an NC-optimization option entry for every played act instead of only at change points, and reading the last one walked the whole map — together, quadratic. On a 2.35-million-line Siemens program the per-100,000-line rate now stays flat instead of climbing from 73 s to about 11 minutes. It applied to every runner, including sessions doing no optimization at all Performance and footprint, measured — physics in the native kernel takes a paired play from 59.3 s / 16.1 GB allocated to 40.6 s / 3.4 GB; building the topology of a large STL is linear instead of quadratic in triangle count (18.7× at 300k triangles, and it was 99.6% of the load); re-triangulating after a cut is about 2.2× faster; and a long program no longer exhausts client memory (session retention on a 25,000-block play: 406 MB → 142 MB). Every figure with its conditions — including the two things that cost more on purpose — is under Performance and footprint Stability and data integrity — the native crashes from disposing a display or geometry object still in use, the intermittent “No cut / No data for step” on freshly-simulated steps, the project-file race between a Load and a Save, and non-reproducible milling-force waveforms are all fixed; large geometry now builds its display topology off-thread instead of freezing the UI HiNc Packages Version 3.1.175 WorkpieceService file IO now takes relative paths and resolves them against a base-directory Func injected by LocalProjectService — the runtime-geometry write/read no longer requires the caller to pre-combine an absolute path. WorkpieceService.ReadRuntimeGeom (now ReadMeshedGeom) now returns whether the source file existed (the not-found notice moves to the calling shell) Rename runtime-geometry mesh-export methods to the Export* convention (STL/OBJ/PLY are foreign interchange formats, not native writes): WriteRuntimeGeomToStl/Obj/Ply → ExportRuntimeGeomToStl / ExportRuntimeGeomToObj / ExportRuntimeGeomToPly; the session command WriteRuntimeGeomToStlCommand → ExportRuntimeGeomToStlCommand (now ExportMeshedGeomToStlCommand) keeps the old element name as a back-compat alias so existing projects still load HiNc Packages Version 3.1.173 Improve Mrr_mm3ds precision: the material-removal-rate now sums each cut contour's signed area-vector (fan triangulation, skipping non-finite triangles) projected on the feed direction, replacing the per-contour bounding-box area that over-estimated the cut cross-section Add AlignWorkpieceProgramZeroToIso script command: resolves a G54/G55/… entry from the project ISO coordinate table and places workpiece + fixture so the program zero coincides with that machine coordinate (topology math delegated to the new AlignWorkpieceProgramZeroToIso extension) Drop gRPC plumbing from the HiNc package: remove Hi.Grpcs.* ClStrip/Player service runners and protos, MachiningProjectGrpcServer, MonitoringPlayer, and UniversalNcMonitorClient; fold CsvRunnerConfig back into CsvRunner0 (gRPC services now ship in HiNcRcl and a downstream RCL package) HiNc Packages Version 3.1.172 Replace implicit XFactory registration (private static () constructors + _ = X.XName wake-up touches) with explicit public static void Reg(XFactory factory = null) methods across ~270 classes. XFactory becomes an instance class with a process-wide Default singleton; Generators is renamed from Regs and now an instance property; the delegate type is renamed XGeneratorDelegate from GenByXElementDelegate. Composite types chain X.Reg(factory) on dependents in place of the old wake-up touches; multi-name (legacy alias) registrations keep the current XName first and group aliases under a //legacy aliases comment. Entry points (web service, test fixtures) must call Reg once at startup before any project XML is deserialized — registration no longer happens by accident when the type is first touched. See XML IO. HiNc Packages Version 3.1.171 Rename RuntimeApi → SessionShell (the runtime entry point exposed to scripting); IShellCommand → ISessionCommand and RuntimeController → SessionShellController; the Hi.ShellCommands namespace moves to Hi.SessionCommands, and every command implementer's Run() parameter renames scriptApi → sessionShell Tri-state milling-physics contract: MachiningStep physics getters converge on a tri-state result, non-null MillingPhysicsBrief on no-cut steps under EnablePhysics; silently skip thermal physics on null FluteMaterial / WorkpieceMaterial; lazy first-equip warning; align relief-face null-sentinel across NoCut + producer (in NcOpt and forces) Rename IMachiningStepHost → IMachiningService (drops the ICsScriptApi seam) Fixes: rotary IK round-trip anchored to pre-FK interpolated angle; ForceAccelShot.ReadRows skips blank lines HiNc Packages Version 3.1.167 Introduce SoftNcRunner as a pluggable NC parser/runner replacing the legacy HardNcRunner, opt-in at the time via EnableSoftNcRunner. It became the default pipeline in 3.2 — see NC Parsing Engine Extend coolant model to CoolantMode Flood/Mist/Off and refactor CoolantHeatCondition / MillingTemperatureUtil for multi-mode coolant Bind session events to MachiningSession lifetime: SessionStepBuilt, SessionStepSelected, SessionSyntaxPieceRan, SessionSourcedActEntry (legacy aliases kept as [Obsolete]); add RegisterWriteSyntaxPieces / RegisterWriteSyntaxPiecesWithActs for syntax-piece debug tracing Add ProjectApiVersion carrier through XFactory deserialization for project-XML version negotiation; resolve Workpiece through a lazy Func getter in WorkpieceService HiNc Packages Version 3.1.162 Refactor message management into three independent categories: Diagnostic (IProgress), UI Notification (MessageBoardUtil), App Log (ILogger); remove MessageUtil class entirely and remove ExceptionUtil.ShowException / ExceptionUtil.OnShown (see Message Management) Thread IProgress through XFactory deserialization chain and MachiningProject loading; remove GenMode enum entirely (see XML IO) Add ActionProgress.FromLogger to bridge IProgress APIs to ILogger Rename ShowIfCatched → CatchExceptions with explicit Action handler; remove RoutineBlocker0 Extract WorkpieceService from Workpiece for runtime geometry operations Update ISO coordinate rendering for 3+2 axis machines: coordinate position now uses IsoCoordinateEntryDisplayee with full machining chain anchor instead of table-buckle-only anchor Rename SessionMessageHost → SessionProgress on both ShellProgress and ShellProgress (SessionShell.SessionMessageHost is kept as [Obsolete]) Remove obsolete HiLog logging utility and DynamicMachiningProjectDisplayee0 HiNc Packages Version 3.1.160 Fix NC optimization R-format arc interpolation with negative R values (follow-up to v158 R-format arc fix) Fix cubetree construction defect when a triangle edge passes through a wire corner Mech Builder: geometry (STL) file picker for anchored transformation now offers Project directory in addition to Resource directory. Rename XML IO utilities: XmlSourceAndFile → FileRefSource, CombineAsSubDirectory → GetResourceDirectory, MakeXmlSourceWithRebaseFile → MakeXmlSourceToFileRef HiNc Packages Version 3.1.158 Fix G53.1 tool height compensation behavior: replace NcEnv.SetToolHeightCompensationOnFeatureNormal configuration with automatic detection via NC flag state Make EnableIntegerShrinkOnPositionCommand configurable via project settings (previously hard-coded by CNC brand, now defaults to false with XML IO support) Fix NC optimization splitting R-format arcs (G02/G03 with R parameter) by converting to IJK format, since R sign meaning does not apply correctly to individual fragments Fix step.csv reading crash on null or malformed values Fix XML IO sub-base directory not applied in some project file operations Improve CSV actual time parsing to support DateTime format in addition to TimeSpan (see Workflow: Basic Machining Simulation) Fix CSV title parsing to trim surrounding quotes HiNc Packages Version 3.1.156 Fix G68 coordinate rotation transformation for non-origin rotation centers Fix NC optimization arc/circle offset when splitting arc fragments across multiple lines Fix optimization rotation code jumping at ±180° cycle boundary by applying cyclic angle comparison Fix RTCP on unmatched tool offset Fix blocking issue when time-mapping file not found Fix FlagsText always null after NC parser refactoring HiNc Packages Version 3.1.150 Add cubetree geometry defect scanning (ScanRuntimeGeomInfDefect) and clearing (ClearDefectDisplayee) for detecting and visualizing geometry anomalies in workpieces (see Workflow: Geometry Validation) Upgrade internal fraction representation to float128 precision for improved cubetree geometry accuracy and numerical stability Refactor messaging system from IMessageHost to standard IProgress pattern; ShellProgress (formerly SessionMessageHost) now implements IProgress, and all messaging methods renamed from Add* to Report* (e.g., AddProgress → MultiTagMessageUtil.ReportProgress) Fix cubetree initialization crash Improve postprocess precision by applying sin–cos parameterization instead of direct angle-based formulation for rotary axis numerical solving in XyzabcSolver Add asynchronous anchor solid preparation on project load for improved startup performance HiNc Packages Version 3.1.144 Enhance Siemens Sinumerik support: Siemens CYCLE800 coordinate transform and reset Siemens MCALL CYCLE81() drilling cycle parsing Siemens TRAORI/TRAFOOF/SUPA flag parsing Fix Siemens TRAFOOF plain rotation coordinate transform issue Fix Siemens coordinate transform for successive file running Fix relief face collision floating-point precision issue Replace MongoDB with SQLite for local step data storage (significant package size reduction) Add machining and motion resolution dynamic adjustment functions HiNc Packages Version 3.1.106 Rename mapping API for clearer naming: ReadCsvByTimeInterpolation → MapSingleByCsvFile (one-to-one mapping) MapByActualTime → MapSeriesByCsvFile (one-to-many mapping) Rename CSV column prefix Spindle to Holder for sensor data mapping Unify CSV column tags to MappingUtil for consistent data mapping Fix ChartRange manipulation to be time-based instead of step-based for more accurate time chart display Tune thread priority for machining parallel processing to improve UI responsiveness during simulation Various code cleanup and improvements HiNc Packages Version 3.1.102 Separate resource files (Resource, wwwroot, Doc) to HiNc-Resource nuget package for smaller package size Add ScaledFeedPerCycle function for scaled feed-per-cycle machining motion resolution Upgrade target framework to .NET 10.0 Various code cleanup and improvements HiNc Packages Version 3.1.100 Refactor project architecture: split runtime functions from MachiningProject to LocalProjectService for better separation of concerns Improve MillingTraining module with separate lead and result parameter templates for more accurate cutting parameter training Separate C++ library for code protection Add UTF-8 file path support for runtime geometry IO operations Improve CsvRunner0 with enhanced time mapping pattern Various architecture improvements and bug fixes HiNc Packages Version 3.1.91 Add NcOptimizationEmbeddedLogMode to control embedded log detail level (None/SimpleLog/FullLog) (see Embedded Log Comments). Fix bug of NcOptProc duplicated feedrate assignment HiNc Packages Version 3.1.90 Rename optimization log API EnableIndividualStepAdjustmentLog Fix crash from workpiece displaying with specific mechanical topology setting Improve .flatproc.log output to maintain step order during parallel computation Various stability improvements and bug fixes HiNc Packages Version 3.1.86 Re-build NcOptProc with stricter optimization logics Add optimization logging features (see Optimization Logs): .flatproc.log file output for optimization process analysis Embedded log comments in optimized NC file marking source lines with (src) suffix Fix cutting depth and width accuracy by bounding-box method with workpiece surface Fix collision check error during concurrent changing collidable object Various stability improvements and bug fixes HiNc Packages Version 3.1.84 Optimize memory usage by shrinking map-size of clStripPos Fix design pattern of cutting parameter training module (MillingTraining) Add LoadCuttingParaByFile function to load cutting parameters from file Improve CsvRunner0 actual time parsing: automatically calculate step duration from actual time when duration is not provided Enhance message handling in SessionShell by unifying ShellProgress usage Improve optimization performance with better task scheduling Various performance improvements and bug fixes HiNc Packages Version 3.1.75 Add actual time tracking functionality (ActualTimecode) Various stability improvements and bug fixes HiNc Packages Version 3.1.74 Rename class MillingCutterOptLimit to MillingCutterOptOption Add physics simulation function for relief face collision detection (ReliefFaceCollidingSpeed_mmds, IsReliefFaceCollided) and optimization (EnableLimitByReliefAngle) Add UpdateNcOptOption function to step processing Fix step ordering bug from concurrent processing Fix ClStrip shrinking to zero issue" + "summary": "Release Note HiNc Packages Version 3.2.26 Rotary-axis correctness on SoftNc, cutting forces that no longer depend on how the geometry kernel tiled the contact surface, and a process that survives a host without OpenGL. The 3.1.175 → 3.2 line jump is the 3.2.7 entry below; the long form is still Upgrading from 3.1.175 to 3.2. Important Adoption status. Verification is still in progress across most areas. Do not put 3.2 NC optimization into production. It is not finished on this line. Work that depends on optimization should stay on the 3.1 line, serviced as 3.1.175.. The Blazor front end tracks the 3.2 packages, so it is not a way to stay on the 3.1 behaviour. The 3.2.24 hold on SoftNc canned cycles that index a rotary axis is lifted — see the first entry below. SoftNc canned cycles take rotary axis words. A G81–G89 repeat block carrying an A / B / C word indexes the table and drills again — the standard bolt-circle shape — where 3.2.24 either skipped the hole or drilled it at the previous angle: a rotary-only repeat fires the cycle, a mixed block pre-positions XYZ and the table in one simultaneous move before the strokes, and under G68.2 without RTCP the feature frame stays pinned in machine space so the hole stays put while the workpiece turns. Under G91 only the words the block itself spoke are increments, so an X-pitch repeat no longer doubles Y. Hole bottoms match the HardNc replay of a customer's bolt-circle program to 0.000 mm on all twelve C-indexed blocks, and setting EnableSoftNcRunner false is no longer needed for such programs. See Brand NC language coverage and ISO core A rotary word under modal G91 is an increment on SoftNc. G91 … C20. followed by C20. leaves the table at 40, not 20; a per-word directive (C=AC(90), ACP / ACN, IC()) still wins over the modal state, and a spoken G91 B270. stays a +270° traverse instead of folding to −90°. A G91 G28 rotary intermediate anchors on the previous modal angle (G91 G28 C10. from C90 passes through 100, then returns home) instead of on zero. HardNc keeps its documented absolute reading of a rotary word under G91 and warns. The programmed deltas are recorded on the block in IncrementalWords, beside the RotaryWords the block spoke. See Results that change on upgrade Rotary IK no longer reports failure from a pole seed. Every solve attempt now runs its coarse stage and its polish, so a small tilt with a large azimuth that used to run out of iterations a few milliradians short — and was then refused by G53.1, leaving the table at A = C = 0 with the tilt still active and the whole path rotated off the part — solves to 1e-8 rad. On a Fanuc IJK grid from the pole seed, 54 / 69 failures per A/C chain become 0; on a CL program 44 dropped endpoints of 536 become 0. The happy path is unchanged bit for bit; only a failed attempt pays one extra polish Rotary travel picks the reachable IK branch. When the nearest solution lies outside an axis' configured travel, the axial solve searches the other branches (sign, half-turn and supplement combinations) and keeps the admissible one nearest the entry; G53.1, G68.2, CYCLE800, PLANE SPATIAL and the LN vector syntax pass the travel through the new admissibility overloads of IMachineKinematics and RotaryAdmissibility. The travel itself now reaches SoftNc from every project: a stroke limit declared only in the legacy machine-limits boxes is copied into the controller parameter table on load for the axes carrying no end there (explicit rows win), where 3.2.24 checked such a project against nothing. Both stroke checks apply Tolerance, so an axis parked exactly on its limit is not reported. See Per-axis tables A rapid traverse that removes stock is reported. Play-RapidCut--Detected folds the G00 steps of one NC line that touched the workpiece into one validation warning, anchored on the line's first cutting step and carrying the line's removed volume (geometry only), its touching-step count and its largest cutting depth. The line total is gated by the project-level RapidCutVolumeThreshold_mm3 (default 0: any contact reports); a step with the spindle stopped is left to collision detection while that is on. IsRapid marks the step. See New diagnostics Cutter–workpiece engagement no longer depends on how the contact surface was tiled. The scan that turns a step's contact contours into the engaged angle ranges of LayerMillingEngagement dropped its dense-step bounding-box shortcut and its winding dependence; a cylinder wall and a flat floor sector reproduce their analytic arcs to 1e-9 rad at four tessellations, and the managed and native paths stay bit-identical. Re-running an existing program moves the forces on most engaged steps — floors that used to register as empty and side ranges fragmented by phantom 1° gaps move the most — and coefficient sets trained before this build embed the old engagement. See Results that change on upgrade The cube tree folds a re-cut flat region again. A comparison in the simplification gate had been inverted since 2023, so a floor roughened by one pass and re-cut flat by a later one stayed at its finest level for the life of the tree. On a 1000-move CL replay the node count drops 17% and the peak working set 8%; the meshed-geometry writer and the fly-piece remover now tolerate a fold landing under them mid-cut instead of crashing. See Geometry, rendering and native stability A host with no usable OpenGL no longer aborts the process. Where the native display initialiser used to kill the process at startup — every service on a machine whose graphics driver and kernel module disagree — it now reports, and NC play, physics and training run without 3D. IsGlAvailable carries the verdict and HiNc logs it once at startup; a host must not obtain a DispEngine while it is false. See System requirements Packaging. The Linux licence-key native library in the HiDisp package ships stripped: the protected file no longer carries debug information Committed after the 3.2.26 pack — these ship in the next package build: BackgroundTemperature renames to AmbientTemperature. AmbientTemperature_C / AmbientTemperature_K (and the same pair on MachiningEquipment) name the shop-floor temperature the workpiece, cutter, chips and spindle start at and the spindle cools toward; the old names remain as [Obsolete] delegates. A .hincproj now writes and still reads the legacy element and the 2019 wrapper, so no project needs editing. See Coolant and Breaking changes Every NC-pipeline rewind raises one event. Suit rewiring, PowerReset and ResetRuntime share one seam that drops the runner session state and the NC diagnostics and raises OnNcPipelineReset before the next file's pieces arrive, so a consumer keyed by file / sentence index drops its stale index in step instead of merging the next file into the previous file's numbers. See Session, project and commands HiNc Packages Version 3.2.24 Correctness and coverage that landed after 3.2.7. The 3.1.175 → 3.2 line jump is the 3.2.7 entry below; the long form is still Upgrading from 3.1.175 to 3.2. Important Adoption status. Verification is still in progress across most areas. Do not put 3.2 NC optimization into production. It is not finished on this line. Work that depends on optimization should stay on the 3.1 line, serviced as 3.1.175.. The Blazor front end tracks the 3.2 packages, so it is not a way to stay on the 3.1 behaviour. Do not put SoftNc canned-cycle indexing with rotary words into production. SoftNc is the default engine, and its G81–G89 family does not take A / B / C words on a repeat block: a rotary-only repeat does not fire the cycle, a mixed block drops the rotary word, and under G68.2 the hole follows the table. Programs that index a rotary axis that way should run with EnableSoftNcRunner set false — the HardNc fallback indexes those blocks the way a control does. See Brand NC language coverage. Whole-program throughput against the last 3.1 set is 2.5×–18.8× in steps per second (paired on one 32-logical-processor Linux workstation; the ratio grows with program length and mesh fineness). The six-core ceiling that used to cap the 3.1 pipeline is about 6% of that gap. Figures and conditions: Performance and footprint M02 / M30 / END PGM is a reset edge on SoftNc. Tool-length compensation (including TCP), tilt, cutter-radius compensation and canned cycles cancel on the next block; the end-of-program block itself still runs under the modal state it executed with. HardNc still carries G43.4 across M02. See Results that change on upgrade An omitted H is no longer a silent zero — it takes the equipped tool's offset row first, then warns Comp-ToolHeight--NoToolForOmittedH / --NoToolForOmittedHRtcp. A vacant table row warns Comp-ToolHeight--RowMissing Cutter-radius compensation runs in the selected G17 / G18 / G19 plane. An interference path that used to swap sides silently now reports RadiusComp--Interference Siemens ROTS / AROTS are simulated into the tilt chain in Sinumerik RPY order. SCALE / MIRROR / CROTS remain recognized, not simulated Heidenhain LN vector blocks resolve into rotary axes through HeidenhainLnOrientationSyntax Fanuc G54.1 Pn (also written G54 Pn) and G59.1–G59.9 resolve additional work offsets. A selected row nobody has entered reports Coord-WorkOffset--AdditionalZero Runner feedrate members rename to CommandedClFeedrate_mmds. Physics follows the equipped tool's tip via ActualTipFeedrate_mmds. A project-level RadiusOffsetBasis decides what a tool-house refresh writes into the D column — see Tool Offsets GetMillingEquipment → GetMachiningEquipment. CodeXyzabcMachineTool is absorbed into GeneralXyzabcMachineTool (the old XML name still loads). The equipment splits into authored SetupEquipment and runtime MachiningEquipment Close joins the ProjectFileBusyException gate. LoadProject and ReloadProject take a message sink for load-time diagnostics OmitLeadingZero is an output style the project can pin (.5 vs 0.5) HiNc Packages Version 3.2.7 At a glance 3.2 is largely one piece of work: the NC interpreter that reads a controller program is now composed from configurable parts rather than written into one class, and most of this release is the brand coverage that made possible. A Siemens or Heidenhain program that 3.1.175 could not interpret past its first computed coordinate or subprogram call now replays end to end. Control-language coverage. The figure is how far our own verification has reached on that dialect — it is not the share of the language that is implemented, and it is not a guarantee for a program we have not seen: Control language Verification reached Cutter location (NX CLSF / APT source) ~90% Fanuc ~80% Siemens SINUMERIK ~60% Heidenhain (klartext and DIN/ISO) ~40% Syntec and Mazak run on the Fanuc-family vocabulary; their brand-specific syntax has not been worked through and they are not covered by the figures above. The per-construct picture — including what is recognized and deliberately not simulated — is in the brand support matrix. Failures say what went wrong. The class of defect this release spent most effort on is the silent one: a Siemens tool offset with no table row that resolved to zero and machined a whole program one tool length low, a G68 rotation that did nothing while reporting itself active, a tilted plane the machine could not reach. Each of those is now a named, searchable diagnostic rather than a plausible-looking wrong result — see the diagnostic id table. Simulation is faster and holds a bigger program. Physics moved into the native kernel (a paired play: 59.3 s / 16.1 GB allocated → 40.6 s / 3.4 GB), building the topology of a large STL is linear rather than quadratic in triangle count, and a long program no longer degrades as it plays. Figures and their conditions are under Performance and footprint. The application product moves to the web API. The web service is the application the product line is built on, and its source is the same HiNC-2025-webservice sample we publish — what you read there is what the product runs. The WPF desktop client is retired with this line: it was a demo of the same packages rather than a product surface, it takes no feature work, and it is no longer documented here. The Blazor front end builds against the same 3.2 packages but is not published as a product. Important Adoption status. This drop is published for review. Verification is still in progress across most areas, and the coverage figures above are the honest state of it. Do not put 3.2 NC optimization into production. It is not finished on this line. Work that depends on optimization should stay on the 3.1 line, which is serviced as 3.1.175.. The Blazor front end tracks the 3.2 packages, so it is not a way to stay on the 3.1 behaviour. What changed This 3.2.7 entry covers everything since 3.1.175. The 3.1 line is closed at the 3.1.175 package set and is serviced only as 3.1.175.; master moved all ten packages onto the 3.2 line on 2026-08-24 and restarted their build counters. So a 3.2 build number starts low, the two counters are not comparable, and the gap between the last 3.1 number a feed served and the first 3.2 one is expected rather than a missing upload. The versions in between were never published as a release set, which is why they are merged here rather than listed separately. Each package's build counter advances on its own, so no single number is common to all ten; a set is named by its HiNc package version — see The package line. Everything below therefore lands at once on a caller moving a 3.1.175 reference to 3.2. See Upgrading from 3.1.175 to 3.2 for the full detail — the summary here is the shape of the upgrade, not the whole of it. Breaking changes In the order they will bite. Full table with replacements on the upgrade page. Registration: XFactory.Generators becomes a ConcurrentDictionary (a caller declaring the old type breaks at compile time), and LocalProjectService.Reg() must still be called once at startup before any project XML is deserialized Messages: MixedProgress0, MultiTagMessage and MultiTagMessageUtil are removed; every message parameter is retyped from IProgress to IProgress; Category.General is deleted and NcDiagnostic.Text renames to Notification Session lifetime: LocalProjectService.SessionShell is null outside a session and ShellProgress is recreated per session — hold no long-lived reference; MachiningSession takes an injected IMachiningService, and IMachiningService replaces PlayerCancellationToken / PausePlayer with one PacePlayer Play verbs: PlayNcFile / RunNcFile gain an NcKind kind = NcKind.Auto parameter and dispatch by extension; the old narrow verbs become PlayBrandNcFile / RunBrandNcFile. The “Control” vocabulary retires with them (IControlRunner → INcRunner, RunControlLines → RunNcLines, ControlKind → NcKind) Hard renames, no shim: runtime geom → meshed geom across WorkpieceService; IContourTray / UniformContourTray / FreeContourTray → IFluting / UniformFluting / FreeFluting and MillingCutter.FluteContourTray → Fluting; HiNc's Hi.Common.ResourceUtil → ResourceLayout (it was shadowing HiGeom's same-named type); the native topo-STL wrappers move to Hi.Geom.Topo; ITimeGetter → ITimecoded; ClStrip.DrawingRefreshing → DrawingRefreshed; SoftNcRunner.NcDependencyList → PipelineNcDependencyList Removals: CsvRunner0 and EnableSoftCsvRunner, RawCsvRunner, IndexedSentence, SimpleSessionCommand, LsStl; the GUI-layer types MachiningProjectDisplayee, IsoCoordinateEntryDisplayee, HeidenhainCoordinateEntryDisplayee, UserConfig, UserService and PlayerDivConfig; the managed physics kernel types FluteZData, MillingForceUtil.RuntimePack / LayerPack / AnglePack and MillingPhysicsBrief.YieldStressMinHeight_mm; CultureUtil.SupportedCultureNames and SetCurrentCulture(string); eight gl* P/Invoke declarations that had no backing export; and PostExecutionCommand's meshed-geometry output pair (use RecordMeshedGeomCommand / ExportMeshedGeomToStlCommand instead) Shapes: MachiningToolHouse derives from Dictionary; MachiningStep.ActualTimecode / ActualDateTime become get-only views onto the new ActualTime; PreSettingCommand becomes a legacy bundle that expands on load into five single-setting commands and is never written back; ToPresentDto wire keys change Defaults: EnableSoftNcRunner is true — SoftNc is the NC engine and HardNcRunner is the opt-out fallback; EnableNativeMillingPhysics is true and a shipping build throws if you set it false; YieldingStressRatio reports NaN instead of 0 when it cannot be evaluated, so a caller reading 0 as “no constraint” must add a NaN branch New licence feature NcComposition (id 22) gates registering a non-built-in unit into a SoftNcRunner pipeline and executing an NC-embedded C# script. Degradation is silent and functional — the unit is skipped with one Composition--NotLicensed — so an unlicensed installation produces a different simulation, not an error Packaging: x64 only; the shipped machine-tool packages are renamed and now carry the .default marker (MachineTool/Table-B1.default, MachineTool/CT-350.default), so a project that refers to one by its earlier path must be repointed; HiNcServer pins request localization to English and HiNcRcl drops the inert HiNC:DisplayEngine:FontFile key Some results change without any code change — the pivot-transform anchor, a G68 rotation that was a silent no-op, blank lines resetting G90/G91, Heidenhain absolute arc centres, five-axis IK about 1000× tighter, and MC-linear moves stepping by euclidean tip travel. They are listed with their symptoms under Results that change on upgrade. New in this release Siemens SINUMERIK programs replay end to end — real .mpf / .spf files rather than an ISO subset: modal vocabulary and T=\"name\" tool calls, an expression evaluator over R-parameters and $-system variables, programmable frames and $P_UIFR, TRAORI RTCP and CYCLE800 swivel, subprogram and MCALL cycle calls, full control flow with iteration watchdogs, the AC() / IC() / DC() per-word coordinate functions and the coded-position family Heidenhain plays both dialects on one preset — klartext motion, datums, tool calls, arcs and cycles; Q-parameter evaluation with FN 9–12 conditional jumps; the PLANE / FUNCTION TCPM / M128 tilt and RTCP stack; subprogram and CALL PGM calls; post-processed spellings written without separators; and the DIN/ISO dialect with its absolute I / J / K arc centres Fanuc Custom Macro B and polar interpolation — #var expressions, IF / GOTO / WHILE, M98 / M99 subprograms and G65 / G66 macro calls; G12.1 / G13.1 polar coordinate interpolation with G41 / G42 compensation on the hypothetical plane SoftNcRunner is the default NC pipeline. See NC Parsing Engine for its architecture and the per-brand support matrix NC optimization runs on that pipeline — not finished on this line, see Adoption status above — regenerating text as anchored token edits over the verbatim source block, so lines the optimizer does not touch round-trip byte-identically. Output follows the source's decimal digits and is written back in the source file's encoding, so a GBK or Big5 program keeps its comments Cutter-location files drive a real machine chain, not only a ClMillingDevice, and a played CL program converts to Fanuc NC through ConvertClToNcFiles Milling physics moved into the native kernel — engagement, force and the sequential thermal chain — with the tool's scalar physics frozen once per session into MillingToolPhysicsPack, which also makes force waveforms reproducible between two plays of the same program Session commands declare themselves through CommandCatalogAttribute and CommandFieldAttribute, so a generic editor renders them without a hand-written form; the HTTP surface answers a no-session or no-project call with 409 and an ApiActionResult envelope carrying the call's notifications Diagnostics carry a template and its arguments, so a front end can re-render a notification in its own language, and repeats fold into one per-run summary instead of one message per block Shipped resources carry a .default marker distinguishing system territory from user files, and HiNc-Resource ships the five brand controller presets and three coolant presets so those load browsers start populated A parser configuration is a file, and it is shareable. NcRunnerSuit bundles a runner with its per-case data as one loadable unit, and per-case data now travels as proxy placeholders that resolve against the owning project — so one controller configuration is no longer welded to the job it was first built for A long program no longer degrades as it plays. A dead equality guard made the session append an NC-optimization option entry for every played act instead of only at change points, and reading the last one walked the whole map — together, quadratic. On a 2.35-million-line Siemens program the per-100,000-line rate now stays flat instead of climbing from 73 s to about 11 minutes. It applied to every runner, including sessions doing no optimization at all Performance and footprint, measured — physics in the native kernel takes a paired play from 59.3 s / 16.1 GB allocated to 40.6 s / 3.4 GB; building the topology of a large STL is linear instead of quadratic in triangle count (18.7× at 300k triangles, and it was 99.6% of the load); re-triangulating after a cut is about 2.2× faster; and a long program no longer exhausts client memory (session retention on a 25,000-block play: 406 MB → 142 MB). Every figure with its conditions — including the two things that cost more on purpose — is under Performance and footprint Stability and data integrity — the native crashes from disposing a display or geometry object still in use, the intermittent “No cut / No data for step” on freshly-simulated steps, the project-file race between a Load and a Save, and non-reproducible milling-force waveforms are all fixed; large geometry now builds its display topology off-thread instead of freezing the UI HiNc Packages Version 3.1.175 WorkpieceService file IO now takes relative paths and resolves them against a base-directory Func injected by LocalProjectService — the runtime-geometry write/read no longer requires the caller to pre-combine an absolute path. WorkpieceService.ReadRuntimeGeom (now ReadMeshedGeom) now returns whether the source file existed (the not-found notice moves to the calling shell) Rename runtime-geometry mesh-export methods to the Export* convention (STL/OBJ/PLY are foreign interchange formats, not native writes): WriteRuntimeGeomToStl/Obj/Ply → ExportRuntimeGeomToStl / ExportRuntimeGeomToObj / ExportRuntimeGeomToPly; the session command WriteRuntimeGeomToStlCommand → ExportRuntimeGeomToStlCommand (now ExportMeshedGeomToStlCommand) keeps the old element name as a back-compat alias so existing projects still load HiNc Packages Version 3.1.173 Improve Mrr_mm3ds precision: the material-removal-rate now sums each cut contour's signed area-vector (fan triangulation, skipping non-finite triangles) projected on the feed direction, replacing the per-contour bounding-box area that over-estimated the cut cross-section Add AlignWorkpieceProgramZeroToIso script command: resolves a G54/G55/… entry from the project ISO coordinate table and places workpiece + fixture so the program zero coincides with that machine coordinate (topology math delegated to the new AlignWorkpieceProgramZeroToIso extension) Drop gRPC plumbing from the HiNc package: remove Hi.Grpcs.* ClStrip/Player service runners and protos, MachiningProjectGrpcServer, MonitoringPlayer, and UniversalNcMonitorClient; fold CsvRunnerConfig back into CsvRunner0 (gRPC services now ship in HiNcRcl and a downstream RCL package) HiNc Packages Version 3.1.172 Replace implicit XFactory registration (private static () constructors + _ = X.XName wake-up touches) with explicit public static void Reg(XFactory factory = null) methods across ~270 classes. XFactory becomes an instance class with a process-wide Default singleton; Generators is renamed from Regs and now an instance property; the delegate type is renamed XGeneratorDelegate from GenByXElementDelegate. Composite types chain X.Reg(factory) on dependents in place of the old wake-up touches; multi-name (legacy alias) registrations keep the current XName first and group aliases under a //legacy aliases comment. Entry points (web service, test fixtures) must call Reg once at startup before any project XML is deserialized — registration no longer happens by accident when the type is first touched. See XML IO. HiNc Packages Version 3.1.171 Rename RuntimeApi → SessionShell (the runtime entry point exposed to scripting); IShellCommand → ISessionCommand and RuntimeController → SessionShellController; the Hi.ShellCommands namespace moves to Hi.SessionCommands, and every command implementer's Run() parameter renames scriptApi → sessionShell Tri-state milling-physics contract: MachiningStep physics getters converge on a tri-state result, non-null MillingPhysicsBrief on no-cut steps under EnablePhysics; silently skip thermal physics on null FluteMaterial / WorkpieceMaterial; lazy first-equip warning; align relief-face null-sentinel across NoCut + producer (in NcOpt and forces) Rename IMachiningStepHost → IMachiningService (drops the ICsScriptApi seam) Fixes: rotary IK round-trip anchored to pre-FK interpolated angle; ForceAccelShot.ReadRows skips blank lines HiNc Packages Version 3.1.167 Introduce SoftNcRunner as a pluggable NC parser/runner replacing the legacy HardNcRunner, opt-in at the time via EnableSoftNcRunner. It became the default pipeline in 3.2 — see NC Parsing Engine Extend coolant model to CoolantMode Flood/Mist/Off and refactor CoolantHeatCondition / MillingTemperatureUtil for multi-mode coolant Bind session events to MachiningSession lifetime: SessionStepBuilt, SessionStepSelected, SessionSyntaxPieceRan, SessionSourcedActEntry (legacy aliases kept as [Obsolete]); add RegisterWriteSyntaxPieces / RegisterWriteSyntaxPiecesWithActs for syntax-piece debug tracing Add ProjectApiVersion carrier through XFactory deserialization for project-XML version negotiation; resolve Workpiece through a lazy Func getter in WorkpieceService HiNc Packages Version 3.1.162 Refactor message management into three independent categories: Diagnostic (IProgress), UI Notification (MessageBoardUtil), App Log (ILogger); remove MessageUtil class entirely and remove ExceptionUtil.ShowException / ExceptionUtil.OnShown (see Message Management) Thread IProgress through XFactory deserialization chain and MachiningProject loading; remove GenMode enum entirely (see XML IO) Add ActionProgress.FromLogger to bridge IProgress APIs to ILogger Rename ShowIfCatched → CatchExceptions with explicit Action handler; remove RoutineBlocker0 Extract WorkpieceService from Workpiece for runtime geometry operations Update ISO coordinate rendering for 3+2 axis machines: coordinate position now uses IsoCoordinateEntryDisplayee with full machining chain anchor instead of table-buckle-only anchor Rename SessionMessageHost → SessionProgress on both ShellProgress and ShellProgress (SessionShell.SessionMessageHost is kept as [Obsolete]) Remove obsolete HiLog logging utility and DynamicMachiningProjectDisplayee0 HiNc Packages Version 3.1.160 Fix NC optimization R-format arc interpolation with negative R values (follow-up to v158 R-format arc fix) Fix cubetree construction defect when a triangle edge passes through a wire corner Mech Builder: geometry (STL) file picker for anchored transformation now offers Project directory in addition to Resource directory. Rename XML IO utilities: XmlSourceAndFile → FileRefSource, CombineAsSubDirectory → GetResourceDirectory, MakeXmlSourceWithRebaseFile → MakeXmlSourceToFileRef HiNc Packages Version 3.1.158 Fix G53.1 tool height compensation behavior: replace NcEnv.SetToolHeightCompensationOnFeatureNormal configuration with automatic detection via NC flag state Make EnableIntegerShrinkOnPositionCommand configurable via project settings (previously hard-coded by CNC brand, now defaults to false with XML IO support) Fix NC optimization splitting R-format arcs (G02/G03 with R parameter) by converting to IJK format, since R sign meaning does not apply correctly to individual fragments Fix step.csv reading crash on null or malformed values Fix XML IO sub-base directory not applied in some project file operations Improve CSV actual time parsing to support DateTime format in addition to TimeSpan (see Workflow: Basic Machining Simulation) Fix CSV title parsing to trim surrounding quotes HiNc Packages Version 3.1.156 Fix G68 coordinate rotation transformation for non-origin rotation centers Fix NC optimization arc/circle offset when splitting arc fragments across multiple lines Fix optimization rotation code jumping at ±180° cycle boundary by applying cyclic angle comparison Fix RTCP on unmatched tool offset Fix blocking issue when time-mapping file not found Fix FlagsText always null after NC parser refactoring HiNc Packages Version 3.1.150 Add cubetree geometry defect scanning (ScanRuntimeGeomInfDefect) and clearing (ClearDefectDisplayee) for detecting and visualizing geometry anomalies in workpieces (see Workflow: Geometry Validation) Upgrade internal fraction representation to float128 precision for improved cubetree geometry accuracy and numerical stability Refactor messaging system from IMessageHost to standard IProgress pattern; ShellProgress (formerly SessionMessageHost) now implements IProgress, and all messaging methods renamed from Add* to Report* (e.g., AddProgress → MultiTagMessageUtil.ReportProgress) Fix cubetree initialization crash Improve postprocess precision by applying sin–cos parameterization instead of direct angle-based formulation for rotary axis numerical solving in XyzabcSolver Add asynchronous anchor solid preparation on project load for improved startup performance HiNc Packages Version 3.1.144 Enhance Siemens Sinumerik support: Siemens CYCLE800 coordinate transform and reset Siemens MCALL CYCLE81() drilling cycle parsing Siemens TRAORI/TRAFOOF/SUPA flag parsing Fix Siemens TRAFOOF plain rotation coordinate transform issue Fix Siemens coordinate transform for successive file running Fix relief face collision floating-point precision issue Replace MongoDB with SQLite for local step data storage (significant package size reduction) Add machining and motion resolution dynamic adjustment functions HiNc Packages Version 3.1.106 Rename mapping API for clearer naming: ReadCsvByTimeInterpolation → MapSingleByCsvFile (one-to-one mapping) MapByActualTime → MapSeriesByCsvFile (one-to-many mapping) Rename CSV column prefix Spindle to Holder for sensor data mapping Unify CSV column tags to MappingUtil for consistent data mapping Fix ChartRange manipulation to be time-based instead of step-based for more accurate time chart display Tune thread priority for machining parallel processing to improve UI responsiveness during simulation Various code cleanup and improvements HiNc Packages Version 3.1.102 Separate resource files (Resource, wwwroot, Doc) to HiNc-Resource nuget package for smaller package size Add ScaledFeedPerCycle function for scaled feed-per-cycle machining motion resolution Upgrade target framework to .NET 10.0 Various code cleanup and improvements HiNc Packages Version 3.1.100 Refactor project architecture: split runtime functions from MachiningProject to LocalProjectService for better separation of concerns Improve MillingTraining module with separate lead and result parameter templates for more accurate cutting parameter training Separate C++ library for code protection Add UTF-8 file path support for runtime geometry IO operations Improve CsvRunner0 with enhanced time mapping pattern Various architecture improvements and bug fixes HiNc Packages Version 3.1.91 Add NcOptimizationEmbeddedLogMode to control embedded log detail level (None/SimpleLog/FullLog) (see Embedded Log Comments). Fix bug of NcOptProc duplicated feedrate assignment HiNc Packages Version 3.1.90 Rename optimization log API EnableIndividualStepAdjustmentLog Fix crash from workpiece displaying with specific mechanical topology setting Improve .flatproc.log output to maintain step order during parallel computation Various stability improvements and bug fixes HiNc Packages Version 3.1.86 Re-build NcOptProc with stricter optimization logics Add optimization logging features (see Optimization Logs): .flatproc.log file output for optimization process analysis Embedded log comments in optimized NC file marking source lines with (src) suffix Fix cutting depth and width accuracy by bounding-box method with workpiece surface Fix collision check error during concurrent changing collidable object Various stability improvements and bug fixes HiNc Packages Version 3.1.84 Optimize memory usage by shrinking map-size of clStripPos Fix design pattern of cutting parameter training module (MillingTraining) Add LoadCuttingParaByFile function to load cutting parameters from file Improve CsvRunner0 actual time parsing: automatically calculate step duration from actual time when duration is not provided Enhance message handling in SessionShell by unifying ShellProgress usage Improve optimization performance with better task scheduling Various performance improvements and bug fixes HiNc Packages Version 3.1.75 Add actual time tracking functionality (ActualTimecode) Various stability improvements and bug fixes HiNc Packages Version 3.1.74 Rename class MillingCutterOptLimit to MillingCutterOptOption Add physics simulation function for relief face collision detection (ReliefFaceCollidingSpeed_mmds, IsReliefFaceCollided) and optimization (EnableLimitByReliefAngle) Add UpdateNcOptOption function to step processing Fix step ordering bug from concurrent processing Fix ClStrip shrinking to zero issue" }, "release-note/upgrading-to-3.2/brand-nc-language-coverage.html": { "href": "release-note/upgrading-to-3.2/brand-nc-language-coverage.html", "title": "Brand NC language coverage | HiAPI-C# 2025", - "summary": "Brand NC language coverage The SoftNc pipeline is the default NC engine, and this is where most of the release went. Siemens SINUMERIK Real .mpf / .spf programs replay end to end, not an ISO subset. At 3.1.175 a program that declared its tool as T=\"NAME\", shifted with SUPA, computed with R-parameters, called L-subprograms or looped with WHILE was not interpreted past that point. Modal vocabulary — SUPA / G153 suppress all frames for one block; T=\"NAME\" string tool calls with D cutting-edge offsets resolved through SiemensToolOffsetTable ($TC_DP lengths and radius plus additive wear); G70 / G71 units; path smoothing (G60x / G64x, FNORM / SOFT / FFWON / COMP* / UPATH, CYCLE832); MSG() and STOPRE; CR= and TURN= arcs. Tail comments became quote-aware, so a ; inside MSG(\"A;B\") no longer truncates the block, and the preset stops misreading L and G74 as Fanuc-family codes. Evaluation — SiemensExpressionParser feeds the shared expression engine, so Z=R63+150 and X=SIN(R10)*20 drive motion. SiemensRParameterTable holds R0–R999 as per-case project data, DEF REAL/INT declarations lower into assignments, and $P_UIFR[n,axis,TR] binds both ways to SiemensFrameTable. Any other $-variable is recorded with an unsupported note rather than dropped. Five axis — SiemensProgrammableFrameSyntax simulates TRANS / ATRANS / ROT / AROT (with RPL=) and the solid-angle forms ROTS / AROTS into the tilt-transform chain in Sinumerik RPY order (ROTS / AROTS behave as ROT / AROT: at most two angles, first-named axis first); SiemensTraoriSyntax makes TRAORI a real RTCP mode, the sibling of ISO G43.4, with TRAFOOF handing the offset back; SiemensCycle800TiltSyntax decodes CYCLE800's MODE bits for all four swivel modes. SCALE / MIRROR / CROTS are recognized and reported (SiemensFrame--Unsupported), not simulated. Calls — L-prefixed and named subprogram calls resolve against SubProgramFolderConfig ({name}.SPF, then .MPF, then the bare name) and inline with their P repetition count; M17 / RET pop a frame; REPEAT re-runs a labelled slice; MCALL CYCLE81/82/83/85 maps onto the shared canned-cycle machinery; PROC headers and labels are claimed whole. Control flow — GOTOF / GOTOB, IF / ELSE / ENDIF, and WHILE / FOR / REPEAT-UNTIL / LOOP. Runaway programs are bounded rather than hanging the session: SiemensGotoIterationDependency caps jumps per (file, label) and SiemensLoopIterationDependency caps iterations per (file, loop-entry line); over the cap the construct warns and falls through. Per-word coordinate functions — AC() / IC() / DC() / ACP() / ACN(), including on I / J / K circle centres. G90 C=IC(360/17) is one incremental index inside an absolute program. Direction resolution lives in McAbcCyclicPathSyntax: ACP() takes the [anchor, anchor+360) window, ACN() the (anchor-360, anchor] window, DC() the shortest swing, with the exact 180° tie going negative. On a machine-coordinate block the increment is a distance in the machine frame, because MachineCoordSelectSyntax is ordered ahead of IncrementalResolveSyntax in all five brand presets — Fanuc, Mazak, Syntec, Siemens and Heidenhain — so G53 X=IC(10) and SUPA Y=IC(-10) add the raw word to the previous machine position rather than being re-based through the program frame first. That order is not something a saved-file patch can express: a project saved before 3.2.21 keeps the old order for that block shape until its pipeline is re-created from the brand preset. Coded positions — CAC / CIC / CDC / CACP / CACN take a 1-based indexing position number rather than a coordinate, resolved against IIndexingPositionConfig, implemented by SiemensMachineDataTable from the real machine data (the MD30500 axis assignment, the MD10910 / MD10930 position tables, the equidistant MD30501–30503 definition). G74 / G75 fixed-point return is claimed as a whole block, so its dummy axis values no longer mint a rapid to the coordinates written in the block and its F never reaches the modal feedrate. OEM auxiliary M-codes — the preset declares M12 / M13 / M22 / M23 and M330 / M331 note-only, so each occurrence voices DeclaredMCode--UnmodeledEffects instead of an unknown-code warning, without inventing simulated effects. A machine's own table overrides a declaration when the real effects are known. Heidenhain Both dialects play on one preset, HeidenhainNcRunner. Klartext motion and setup — the L statement and its axis words, FMAX, M91 as a one-shot machine-coordinate move, TOOL CALL wired to tool change and spindle speed with the table height and DL. Datum handling follows TNC semantics: CYCL DEF 247 sets the preset and CYCL DEF 7 is an additive shift on top of it, composing as separate transform-chain entries instead of replacing each other, resolved against HeidenhainDatumTable. Arcs (CC pole plus C statement, DR- = CW, closed arc = full circle), RL / RR / R0 radius compensation, the M126 / M127 rotary-wrap state, M140 MB retract, and CYCL DEF 32 TOLERANCE. HeidenhainLnOrientationSyntax resolves an LN vector block into rotary axes through the same RTCP machinery the rotary-word programs use: T present plus M128 / FUNCTION TCPM keeps the tool on T; T absent plus RTCP holds the tool on the surface normal N; RTCP inactive ignores T (Orientation-Vector--IgnoredNoTcpm), as the control does. A C block never states its own centre: each in-plane component comes from the CC block's own axis word, else from the previous CC section's same axis, else from the arc's own start point. A bare CC is the one spelling that states all of them at once — it takes the last programmed position, read at the CC block, and replaces the modal centre rather than inheriting it. A centre that lands on the arc's own start point leaves the block with no radius, so it warns Arc-CircleCenter--OnStartPoint and is degraded to a linear move to the endpoint. Klartext incremental axis words — the I-prefixed word (IX+20, IY-15, rotary IC+90) is the same axis word as its absolute twin, read as a distance from the last programmed position. It is per word rather than per block: L X+60 IY-10 mixes an absolute X with an incremental Y and stamps only the Y. One shared grab serves five statement heads — L, C, CC, LN and CYCL CALL POS — each writing the value under the plain axis key of its own section plus a \"PositioningOverride\": { \"Y\": \"Incremental\" } entry on the block root. That is the same per-word section the Siemens IC() wrapper writes, so the existing resolve consumers convert it and no second incremental mechanism exists. Coverage differs by head: L, C and LN take the whole axis tag list, rotary included, while CC and CYCL CALL POS take X / Y / Z only — a CC never positions a rotary axis, and the stamp is keyed by axis on the block root, where a rotary letter would read as a rotary word of the block. The sign is optional (L IX5), a Q reference resolves behind the prefix (L IZ+Q2), and the glued post-processed run LIX+20IY-15 parses. Before these words were read the plain grab could not see the X inside IX — its prefix guard demands a word boundary, a digit or whitespace before the tag, and I is a word character — so L X+60 IY-10 took the X and dropped the Y: a motion to the wrong place, not a missing one. What an incremental word is measured from depends on the statement. An L / C / LN endpoint and a CC centre are distances from the last programmed tool position, so CC IX+0 IY+11 is a stated centre resolved against that position — never against the previous centre — and it is no longer the spelling whose coordinates the parser could not read. CYCL CALL POS has its own reference: an IX / IY / IZ word there is a distance from the coordinates the previous CYCL CALL POS programmed, which is the control's own rule behind its error 1A0-0108. An axis that no earlier call programmed has no reference: the control refuses the call, and the simulation warns HeidenhainCyclCall--IncrementalNoReference and falls back to the last programmed position. A tool move between the two calls makes the two candidate references differ, and that divergence warns HeidenhainCyclCall--IncrementalAfterMove, the control's stated reference winning. With M91 on the block the increment is a machine-frame distance, per the ordering note under Siemens above. A rotary increment is a signed traverse the wrap pass keeps verbatim — IC+270 from 75° stays 345° instead of folding into the ±180° shortest-path window, while an absolute rotary word on the same block still folds. The CYCL DEF 7 datum-shift I words are a different mechanism: CYCL DEF 7.2 IY+5 shifts by the value on top of the shift last valid, stays under prefixed keys in the cycle's own record, and writes no per-word stamp at all. Q-parameters — HeidenhainExpressionParser lexes Q / QR / QL / QS, the DIV keyword of FN 4 and the prefix SQRT of FN 5, so FQ1 reaches the feedrate, L X+Q2 reaches the program XYZ and TOOL CALL SQ3 reaches the spindle speed. HeidenhainQParameterTable holds Q0–Q99 free and QR0–QR499 permanent parameters as per-case project data. Unimplemented opcodes (FN 14 / 16 / 18…) are claimed and reported rather than half-read, so an FN 18 SYSREAD target stays vacant instead of taking a fabricated value. FN 9–12 conditional jumps execute, with a (file, label)-keyed iteration cap. Tilt and RTCP — PLANE (SPATIAL fully composed with SEQ / COORD ROT / TABLE ROT and STAY / MOVE / TURN positioning; VECTOR structurally captured; EULER / POINTS / RELATIV / AXIAL / PROJECTED consumed and warned with the previous tilt retained, so a PLANE AXIAL B+45 B word can never be mistaken for a rotary axis command), FUNCTION TCPM, and real M128 / M129 tool-centre-point control. A centre-referenced FUNCTION TCPM REFPNT (TIP-CENTER / CENTER-CENTER) is recorded and reported (Orientation-RefPoint--CntNotSimulated) rather than silently read as TIP-TIP. Cycles and calls — CYCL DEF 2xx bodies with their Q parameters mirrored into the block assignments, cycles 200 / 232 / 251 / 252 / 253 mapped onto the shared G81 / G82 / G83 slots, CYCL CALL / CYCL CALL POS / M99 / M89 splitting call-once from modal firing, CALL LBL inlining up to LBL 0, CALL LBL n REP m as a section repeat, and CALL PGM resolved by file name. The multi-line tilde continuation form is joined at segmentation (JoinTildeContinuations, on by default). Post-processed spellings — some post-processors write a whole klartext body with no separators at all, which used to yield zero motion. Glued line shapes (LX-26.3Y+43.1, FMAXM03M08, …R0FMAX) and the detached feed spelling (F 20000) now parse, with M140, M128 and PLANE MOVE widening their own F capture so a retract or feed-limit value cannot leak into the modal feedrate. BLK FORM is recorded as a brand-neutral stock declaration without replacing the project workpiece setup, and the klartext STOP word joins M00 / M01. DIN/ISO dialect — % tape header, N block numbers, T + M06, absolute I / J / K arc centres with the modal pole carried forward, the ISO label family (G98 L definitions and the head-anchored L, call mapping the comma count onto REP), G247 Q339 stamping the same datum preset as CYCL DEF 247, G54 with axis words read as a datum-shift declaration, and G70 / G71. Fanuc and ISO common Polar coordinate interpolation — G12.1 / G13.1 on the SoftNc pipeline. Before this a polar section parsed silently wrong: the X word (a diameter) and the C word (a hypothetical Cartesian axis in mm) were consumed as ordinary XYZ and rotary degrees. ProgramRxczSyntax halves X from diameter, resolves G90/G91, writes the polar and derived Cartesian positions and the machine C angle, and classifies motion into polar linear and polar arc — the latter emitting ActMcPolarSpiralContour, which keeps spiral geometry in central polar coordinates and stays continuous across ±180°. G41 / G42 compensation is resolved on the hypothetical plane, a C-axis speed clamp applies, and YA / ZB axis pairs are supported. PolarGCodeCheckSyntax scans for incompatible G codes before the mode syntaxes consume them. Custom Macro B — #var assignment with range-routed stores (#1–#33 local per macro frame, #100–#499 volatile cleared on M02/M30, #500–#999 retained and persisted in the project, #3000–#3999 system-control), boolean and logical operators, IF[..]GOTO n, IF[..]THEN , WHILE[..]DO m / END m with a bounded-loop watchdog, and position and tool-offset system variables. M98 P_ L_, M198 external call, M99 return and M99 P{seq} early return; G65 one-shot macro call with A–Z → #1–#26 argument binding, and G66 / G67 modal macro. Additional work coordinate systems — G54.1 Pn, also written G54 Pn, resolves against the extended table (P1–P48). A selected row nobody has entered reports Coord-WorkOffset--AdditionalZero. G59.1–G59.9 have a provider on the Fanuc, Mazak and Syntec presets. See Work Coordinates and ISO core. Fanuc / Syntec unit codes and G05. G71 is the metric spelling of G21; G70 is the inch spelling of G20 and reports Unit--InchNotSupported rather than silently switching units. G05.1 Q1 / Q0 is AICC / Nano Smoothing (recognized). Bare G05 P{n} is a different feature (HPCC) and is consumed without changing programmed coordinates, reported under the Hpcc--* ids. Canned-cycle repeats do not take rotary words on SoftNc. The G73–G89 family expands XYZ / R / Q / F / P / K strokes. An A / B / C word on a repeat is not taken: a rotary-only repeat does not fire the cycle, a mixed block drops the rotary word, and under G68.2 the hole follows the table. Not finished on this line, see Adoption status on the release-note page. The HardNc fallback indexes those blocks the way a control does. Cross-brand A shared DwellSyntax consumes G4 and G04 with the dialect held on the instance: Fanuc-family X / U seconds, P milliseconds, S spindle revolutions; the Siemens instance reads F seconds and S revolutions. Capturing the G04 spelling fixes a real defect — the un-captured spelling fell through to the flag and axis syntaxes, where a Fanuc G04 X0.5 dwell time became a ghost X motion word. Machine-declared M-codes — IMCodeDeclarationConfig and MCodeEffects let a machine state what its own OEM codes do (composite spindle+coolant codes, a tool-change trigger, turret T-word semantics), and MCodeExpansionSyntax expands a declared code into the canonical ISO flags the shared consumers already understand. Custom spindle M-codes drive the spindle direction through a machine-level ISpindleControlConfig; ISO M03 / M04 / M05 remain the built-in fallback. An S greater than zero with no direction ever issued assumes clockwise and emits SpindleDirection--AssumedCw, so the physics gate no longer silently produces zero mechanics for a whole file. Tool changes synthesize their axis travel. ToolChangeMotionSyntax overlays the per-axis tooling position from IToolingMcConfig onto the current pose (a NaN or missing axis stays put) and stamps a one-item rapid compound motion, and ToolChangeSemantic moves behind CompoundMotionSemantic so the tooling step lands at the tooling point. Programs that retract on their own overlay to a zero-length move and emit nothing extra. Per-brand pivot gates. PivotTransformationSyntax reverts to the ISO/Fanuc vocabulary (G43.4 plus the G68.x family), SiemensPivotTransformationSyntax gates TRAORI / CYCLE800, and HeidenhainPivotTransformationSyntax gates the M128 / PLANE vocabulary. All three compose the identical entry through the shared PivotTransformUtil. Exactly one brand gate belongs in a pipeline list — never register two. Controller presets are writable and shipped. A controller resource file is one serialized SoftNcRunner — the whole pipeline that decides how a brand's NC code is interpreted. ControllerPresetWriter serializes the built-in brand presets (CreateBrandPreset, WriteBrandPresetFile, WriteAllBrandPresetFiles) under Resource/Controller/ with the .Controller extension, and HiNc-Resource ships all five so the load browser starts populated. The static brand properties remain the source of truth; the files are regenerable snapshots. Writing needs no XFactory registration — reading one back does, because the loader drops unregistered pipeline entries silently rather than failing the load. Saved pipelines back-fill their system-wired dependencies on load. A project saved before a system-wired dependency existed never self-healed by round-tripping, because re-saving stamped a fresh API version on the same incomplete list. The SoftNcRunner XML constructor now appends the missing ones after the legacy version patches. A runner rehydrated from an older file still keeps the syntax list it was saved with, though — take the regenerated preset, or a fresh NcRunnerSuit built from it, rather than expecting an old file to grow new syntaxes. Machine-coordinate and tilted-plane failures report. G53 and G53.1 record their source G-code on the parsed block and emit Coord-MachCoord--005 / --006 / --007 on paths that used to fail silently. A G68.2 tilted plane the machine cannot reach emits Coord-Tilt--001 / --002, with a tool-axis-only IK retry that avoids a spurious warning on a machine with fewer than three rotary axes. Session-global sentence indexing. SyntaxPiece.SentenceIndex used to be assigned by two independent sequences, so indices collided as soon as a call was inlined mid-stream. The new SentenceIndexCounterDependency supplies every index at one chokepoint, so values are session-globally unique and strictly increasing in execution order, including nested and repeated calls. Inline plays can loop and jump, and playing a file no longer holds it open. Inline NC-code plays stamp their pieces with the command title as a pseudo-path, and every control-flow re-segmentation re-read the host file by that path — the existence check always failed, so loops fell through without looping. RunNc now registers the raw lines on NcLineSourceDependency and LabelScanUtil reads memory first, disk second. M02 / M30 / END PGM is a reset edge. SoftNc models program-end as the edge between that block and the next, so a concatenated multi-program file does not keep TCP, tilt, CRC or a canned cycle alive into the next program. Each modal owner writes an explicit cancel section on the successor (G49 / G69 / G40 / G80); the end-of-program block itself still runs under the modal state it executed with. HardNc still carries G43.4 across M02 — see Results that change on upgrade." + "summary": "Brand NC language coverage The SoftNc pipeline is the default NC engine, and this is where most of the release went. Siemens SINUMERIK Real .mpf / .spf programs replay end to end, not an ISO subset. At 3.1.175 a program that declared its tool as T=\"NAME\", shifted with SUPA, computed with R-parameters, called L-subprograms or looped with WHILE was not interpreted past that point. Modal vocabulary — SUPA / G153 suppress all frames for one block; T=\"NAME\" string tool calls with D cutting-edge offsets resolved through SiemensToolOffsetTable ($TC_DP lengths and radius plus additive wear); G70 / G71 units; path smoothing (G60x / G64x, FNORM / SOFT / FFWON / COMP* / UPATH, CYCLE832); MSG() and STOPRE; CR= and TURN= arcs. Tail comments became quote-aware, so a ; inside MSG(\"A;B\") no longer truncates the block, and the preset stops misreading L and G74 as Fanuc-family codes. Evaluation — SiemensExpressionParser feeds the shared expression engine, so Z=R63+150 and X=SIN(R10)*20 drive motion. SiemensRParameterTable holds R0–R999 as per-case project data, DEF REAL/INT declarations lower into assignments, and $P_UIFR[n,axis,TR] binds both ways to SiemensFrameTable. Any other $-variable is recorded with an unsupported note rather than dropped. Five axis — SiemensProgrammableFrameSyntax simulates TRANS / ATRANS / ROT / AROT (with RPL=) and the solid-angle forms ROTS / AROTS into the tilt-transform chain in Sinumerik RPY order (ROTS / AROTS behave as ROT / AROT: at most two angles, first-named axis first); SiemensTraoriSyntax makes TRAORI a real RTCP mode, the sibling of ISO G43.4, with TRAFOOF handing the offset back; SiemensCycle800TiltSyntax decodes CYCLE800's MODE bits for all four swivel modes. SCALE / MIRROR / CROTS are recognized and reported (SiemensFrame--Unsupported), not simulated. Calls — L-prefixed and named subprogram calls resolve against SubProgramFolderConfig ({name}.SPF, then .MPF, then the bare name) and inline with their P repetition count; M17 / RET pop a frame; REPEAT re-runs a labelled slice; MCALL CYCLE81/82/83/85 maps onto the shared canned-cycle machinery; PROC headers and labels are claimed whole. Control flow — GOTOF / GOTOB, IF / ELSE / ENDIF, and WHILE / FOR / REPEAT-UNTIL / LOOP. Runaway programs are bounded rather than hanging the session: SiemensGotoIterationDependency caps jumps per (file, label) and SiemensLoopIterationDependency caps iterations per (file, loop-entry line); over the cap the construct warns and falls through. Per-word coordinate functions — AC() / IC() / DC() / ACP() / ACN(), including on I / J / K circle centres. G90 C=IC(360/17) is one incremental index inside an absolute program. Direction resolution lives in McAbcCyclicPathSyntax: ACP() takes the [anchor, anchor+360) window, ACN() the (anchor-360, anchor] window, DC() the shortest swing, with the exact 180° tie going negative. On a machine-coordinate block the increment is a distance in the machine frame, because MachineCoordSelectSyntax is ordered ahead of IncrementalResolveSyntax in all five brand presets — Fanuc, Mazak, Syntec, Siemens and Heidenhain — so G53 X=IC(10) and SUPA Y=IC(-10) add the raw word to the previous machine position rather than being re-based through the program frame first. That order is not something a saved-file patch can express: a project saved before 3.2.21 keeps the old order for that block shape until its pipeline is re-created from the brand preset. Coded positions — CAC / CIC / CDC / CACP / CACN take a 1-based indexing position number rather than a coordinate, resolved against IIndexingPositionConfig, implemented by SiemensMachineDataTable from the real machine data (the MD30500 axis assignment, the MD10910 / MD10930 position tables, the equidistant MD30501–30503 definition). G74 / G75 fixed-point return is claimed as a whole block, so its dummy axis values no longer mint a rapid to the coordinates written in the block and its F never reaches the modal feedrate. OEM auxiliary M-codes — the preset declares M12 / M13 / M22 / M23 and M330 / M331 note-only, so each occurrence voices DeclaredMCode--UnmodeledEffects instead of an unknown-code warning, without inventing simulated effects. A machine's own table overrides a declaration when the real effects are known. Heidenhain Both dialects play on one preset, HeidenhainNcRunner. Klartext motion and setup — the L statement and its axis words, FMAX, M91 as a one-shot machine-coordinate move, TOOL CALL wired to tool change and spindle speed with the table height and DL. Datum handling follows TNC semantics: CYCL DEF 247 sets the preset and CYCL DEF 7 is an additive shift on top of it, composing as separate transform-chain entries instead of replacing each other, resolved against HeidenhainDatumTable. Arcs (CC pole plus C statement, DR- = CW, closed arc = full circle), RL / RR / R0 radius compensation, the M126 / M127 rotary-wrap state, M140 MB retract, and CYCL DEF 32 TOLERANCE. HeidenhainLnOrientationSyntax resolves an LN vector block into rotary axes through the same RTCP machinery the rotary-word programs use: T present plus M128 / FUNCTION TCPM keeps the tool on T; T absent plus RTCP holds the tool on the surface normal N; RTCP inactive ignores T (Orientation-Vector--IgnoredNoTcpm), as the control does. A C block never states its own centre: each in-plane component comes from the CC block's own axis word, else from the previous CC section's same axis, else from the arc's own start point. A bare CC is the one spelling that states all of them at once — it takes the last programmed position, read at the CC block, and replaces the modal centre rather than inheriting it. A centre that lands on the arc's own start point leaves the block with no radius, so it warns Arc-CircleCenter--OnStartPoint and is degraded to a linear move to the endpoint. Klartext incremental axis words — the I-prefixed word (IX+20, IY-15, rotary IC+90) is the same axis word as its absolute twin, read as a distance from the last programmed position. It is per word rather than per block: L X+60 IY-10 mixes an absolute X with an incremental Y and stamps only the Y. One shared grab serves five statement heads — L, C, CC, LN and CYCL CALL POS — each writing the value under the plain axis key of its own section plus a \"PositioningOverride\": { \"Y\": \"Incremental\" } entry on the block root. That is the same per-word section the Siemens IC() wrapper writes, so the existing resolve consumers convert it and no second incremental mechanism exists. Coverage differs by head: L, C and LN take the whole axis tag list, rotary included, while CC and CYCL CALL POS take X / Y / Z only — a CC never positions a rotary axis, and the stamp is keyed by axis on the block root, where a rotary letter would read as a rotary word of the block. The sign is optional (L IX5), a Q reference resolves behind the prefix (L IZ+Q2), and the glued post-processed run LIX+20IY-15 parses. Before these words were read the plain grab could not see the X inside IX — its prefix guard demands a word boundary, a digit or whitespace before the tag, and I is a word character — so L X+60 IY-10 took the X and dropped the Y: a motion to the wrong place, not a missing one. What an incremental word is measured from depends on the statement. An L / C / LN endpoint and a CC centre are distances from the last programmed tool position, so CC IX+0 IY+11 is a stated centre resolved against that position — never against the previous centre — and it is no longer the spelling whose coordinates the parser could not read. CYCL CALL POS has its own reference: an IX / IY / IZ word there is a distance from the coordinates the previous CYCL CALL POS programmed, which is the control's own rule behind its error 1A0-0108. An axis that no earlier call programmed has no reference: the control refuses the call, and the simulation warns HeidenhainCyclCall--IncrementalNoReference and falls back to the last programmed position. A tool move between the two calls makes the two candidate references differ, and that divergence warns HeidenhainCyclCall--IncrementalAfterMove, the control's stated reference winning. With M91 on the block the increment is a machine-frame distance, per the ordering note under Siemens above. A rotary increment is a signed traverse the wrap pass keeps verbatim — IC+270 from 75° stays 345° instead of folding into the ±180° shortest-path window, while an absolute rotary word on the same block still folds. The CYCL DEF 7 datum-shift I words are a different mechanism: CYCL DEF 7.2 IY+5 shifts by the value on top of the shift last valid, stays under prefixed keys in the cycle's own record, and writes no per-word stamp at all. Q-parameters — HeidenhainExpressionParser lexes Q / QR / QL / QS, the DIV keyword of FN 4 and the prefix SQRT of FN 5, so FQ1 reaches the feedrate, L X+Q2 reaches the program XYZ and TOOL CALL SQ3 reaches the spindle speed. HeidenhainQParameterTable holds Q0–Q99 free and QR0–QR499 permanent parameters as per-case project data. Unimplemented opcodes (FN 14 / 16 / 18…) are claimed and reported rather than half-read, so an FN 18 SYSREAD target stays vacant instead of taking a fabricated value. FN 9–12 conditional jumps execute, with a (file, label)-keyed iteration cap. Tilt and RTCP — PLANE (SPATIAL fully composed with SEQ / COORD ROT / TABLE ROT and STAY / MOVE / TURN positioning; VECTOR structurally captured; EULER / POINTS / RELATIV / AXIAL / PROJECTED consumed and warned with the previous tilt retained, so a PLANE AXIAL B+45 B word can never be mistaken for a rotary axis command), FUNCTION TCPM, and real M128 / M129 tool-centre-point control. A centre-referenced FUNCTION TCPM REFPNT (TIP-CENTER / CENTER-CENTER) is recorded and reported (Orientation-RefPoint--CntNotSimulated) rather than silently read as TIP-TIP. Cycles and calls — CYCL DEF 2xx bodies with their Q parameters mirrored into the block assignments, cycles 200 / 232 / 251 / 252 / 253 mapped onto the shared G81 / G82 / G83 slots, CYCL CALL / CYCL CALL POS / M99 / M89 splitting call-once from modal firing, CALL LBL inlining up to LBL 0, CALL LBL n REP m as a section repeat, and CALL PGM resolved by file name. The multi-line tilde continuation form is joined at segmentation (JoinTildeContinuations, on by default). Post-processed spellings — some post-processors write a whole klartext body with no separators at all, which used to yield zero motion. Glued line shapes (LX-26.3Y+43.1, FMAXM03M08, …R0FMAX) and the detached feed spelling (F 20000) now parse, with M140, M128 and PLANE MOVE widening their own F capture so a retract or feed-limit value cannot leak into the modal feedrate. BLK FORM is recorded as a brand-neutral stock declaration without replacing the project workpiece setup, and the klartext STOP word joins M00 / M01. DIN/ISO dialect — % tape header, N block numbers, T + M06, absolute I / J / K arc centres with the modal pole carried forward, the ISO label family (G98 L definitions and the head-anchored L, call mapping the comma count onto REP), G247 Q339 stamping the same datum preset as CYCL DEF 247, G54 with axis words read as a datum-shift declaration, and G70 / G71. Fanuc and ISO common Polar coordinate interpolation — G12.1 / G13.1 on the SoftNc pipeline. Before this a polar section parsed silently wrong: the X word (a diameter) and the C word (a hypothetical Cartesian axis in mm) were consumed as ordinary XYZ and rotary degrees. ProgramRxczSyntax halves X from diameter, resolves G90/G91, writes the polar and derived Cartesian positions and the machine C angle, and classifies motion into polar linear and polar arc — the latter emitting ActMcPolarSpiralContour, which keeps spiral geometry in central polar coordinates and stays continuous across ±180°. G41 / G42 compensation is resolved on the hypothetical plane, a C-axis speed clamp applies, and YA / ZB axis pairs are supported. PolarGCodeCheckSyntax scans for incompatible G codes before the mode syntaxes consume them. Custom Macro B — #var assignment with range-routed stores (#1–#33 local per macro frame, #100–#499 volatile cleared on M02/M30, #500–#999 retained and persisted in the project, #3000–#3999 system-control), boolean and logical operators, IF[..]GOTO n, IF[..]THEN , WHILE[..]DO m / END m with a bounded-loop watchdog, and position and tool-offset system variables. M98 P_ L_, M198 external call, M99 return and M99 P{seq} early return; G65 one-shot macro call with A–Z → #1–#26 argument binding, and G66 / G67 modal macro. Additional work coordinate systems — G54.1 Pn, also written G54 Pn, resolves against the extended table (P1–P48). A selected row nobody has entered reports Coord-WorkOffset--AdditionalZero. G59.1–G59.9 have a provider on the Fanuc, Mazak and Syntec presets. See Work Coordinates and ISO core. Fanuc / Syntec unit codes and G05. G71 is the metric spelling of G21; G70 is the inch spelling of G20 and reports Unit--InchNotSupported rather than silently switching units. G05.1 Q1 / Q0 is AICC / Nano Smoothing (recognized). Bare G05 P{n} is a different feature (HPCC) and is consumed without changing programmed coordinates, reported under the Hpcc--* ids. Canned-cycle repeats take rotary words on SoftNc. The G73–G89 family expands XYZ / R / Q / F / P / K strokes, and a repeat block carrying an A / B / C word indexes the table and drills again, the way a control does: a rotary-only repeat fires the cycle, a mixed block pre-positions XYZ and the table in one simultaneous move before the strokes, and under G68.2 without RTCP the feature frame stays pinned in machine space so the hole stays put while the workpiece turns. Under G91 only the words the block itself spoke are increments. The hold that 3.2.24 placed on these programs is lifted; EnableSoftNcRunner = false is no longer needed for them. A rotary word under modal G91 is an increment on SoftNc. A bare A / B / C word follows the block's modal positioning onto the same anchor + delta path as Siemens IC() and klartext IC+: G91 … C20. then C20. leaves the table at 40. A per-word directive (C=AC(90), ACP / ACN, IC()) still beats the modal state, and a spoken G91 B270. stays a +270° traverse instead of folding to −90°. A G91 G28 rotary intermediate anchors on the previous modal angle, then returns home. HardNc keeps its absolute reading of a rotary word under G91 and warns. The programmed deltas are recorded in IncrementalWords, beside the RotaryWords the block spoke. Cross-brand A shared DwellSyntax consumes G4 and G04 with the dialect held on the instance: Fanuc-family X / U seconds, P milliseconds, S spindle revolutions; the Siemens instance reads F seconds and S revolutions. Capturing the G04 spelling fixes a real defect — the un-captured spelling fell through to the flag and axis syntaxes, where a Fanuc G04 X0.5 dwell time became a ghost X motion word. Machine-declared M-codes — IMCodeDeclarationConfig and MCodeEffects let a machine state what its own OEM codes do (composite spindle+coolant codes, a tool-change trigger, turret T-word semantics), and MCodeExpansionSyntax expands a declared code into the canonical ISO flags the shared consumers already understand. Custom spindle M-codes drive the spindle direction through a machine-level ISpindleControlConfig; ISO M03 / M04 / M05 remain the built-in fallback. An S greater than zero with no direction ever issued assumes clockwise and emits SpindleDirection--AssumedCw, so the physics gate no longer silently produces zero mechanics for a whole file. Tool changes synthesize their axis travel. ToolChangeMotionSyntax overlays the per-axis tooling position from IToolingMcConfig onto the current pose (a NaN or missing axis stays put) and stamps a one-item rapid compound motion, and ToolChangeSemantic moves behind CompoundMotionSemantic so the tooling step lands at the tooling point. Programs that retract on their own overlay to a zero-length move and emit nothing extra. Per-brand pivot gates. PivotTransformationSyntax reverts to the ISO/Fanuc vocabulary (G43.4 plus the G68.x family), SiemensPivotTransformationSyntax gates TRAORI / CYCLE800, and HeidenhainPivotTransformationSyntax gates the M128 / PLANE vocabulary. All three compose the identical entry through the shared PivotTransformUtil. Exactly one brand gate belongs in a pipeline list — never register two. Controller presets are writable and shipped. A controller resource file is one serialized SoftNcRunner — the whole pipeline that decides how a brand's NC code is interpreted. ControllerPresetWriter serializes the built-in brand presets (CreateBrandPreset, WriteBrandPresetFile, WriteAllBrandPresetFiles) under Resource/Controller/ with the .Controller extension, and HiNc-Resource ships all five so the load browser starts populated. The static brand properties remain the source of truth; the files are regenerable snapshots. Writing needs no XFactory registration — reading one back does, because the loader drops unregistered pipeline entries silently rather than failing the load. Saved pipelines back-fill their system-wired dependencies on load. A project saved before a system-wired dependency existed never self-healed by round-tripping, because re-saving stamped a fresh API version on the same incomplete list. The SoftNcRunner XML constructor now appends the missing ones after the legacy version patches. A runner rehydrated from an older file still keeps the syntax list it was saved with, though — take the regenerated preset, or a fresh NcRunnerSuit built from it, rather than expecting an old file to grow new syntaxes. Machine-coordinate and tilted-plane failures report. G53 and G53.1 record their source G-code on the parsed block and emit Coord-MachCoord--005 / --006 / --007 on paths that used to fail silently. A G68.2 tilted plane the machine cannot reach emits Coord-Tilt--001 / --002, with a tool-axis-only IK retry that avoids a spurious warning on a machine with fewer than three rotary axes. Session-global sentence indexing. SyntaxPiece.SentenceIndex used to be assigned by two independent sequences, so indices collided as soon as a call was inlined mid-stream. The new SentenceIndexCounterDependency supplies every index at one chokepoint, so values are session-globally unique and strictly increasing in execution order, including nested and repeated calls. Inline plays can loop and jump, and playing a file no longer holds it open. Inline NC-code plays stamp their pieces with the command title as a pseudo-path, and every control-flow re-segmentation re-read the host file by that path — the existence check always failed, so loops fell through without looping. RunNc now registers the raw lines on NcLineSourceDependency and LabelScanUtil reads memory first, disk second. M02 / M30 / END PGM is a reset edge. SoftNc models program-end as the edge between that block and the next, so a concatenated multi-program file does not keep TCP, tilt, CRC or a canned cycle alive into the next program. Each modal owner writes an explicit cancel section on the successor (G49 / G69 / G40 / G80); the end-of-program block itself still runs under the modal state it executed with. HardNc still carries G43.4 across M02 — see Results that change on upgrade." }, "release-note/upgrading-to-3.2/breaking-changes.html": { "href": "release-note/upgrading-to-3.2/breaking-changes.html", "title": "Breaking changes | HiAPI-C# 2025", - "summary": "Breaking changes In the order they will bite an upgrading host. 1. Registration, before anything else XFactory.Generators changes from a plain Dictionary to a ConcurrentDictionary, so parallel Reg() calls no longer corrupt the registration map. The property is public, so a caller that declares its type explicitly stops compiling. Carried over from 3.1.172 and still the first thing an upgrading host hits: Reg must be called once at startup, before any project XML is deserialized. Registration no longer happens by accident when a type is first touched. See XML IO. 2. The message channel Message reporting is rebuilt on a unified model. Every notification carries a Severity, a Category and a filterable id (SimpleMessage), and arrives on one of three typed sinks: ShellProgress for session-lifecycle messages, StepDiagnosticProgress for step-anchored diagnostics, and NcDiagnosticProgress for NC-parsing diagnostics. MixedProgress0, MultiTagMessage and MultiTagMessageUtil are removed. Every message parameter across the API — the XFactory deserialization chain included — is retyped from IProgress to IProgress. Category.General is deleted, MessageUtil becomes id-first {Category}{Severity}, and NcDiagnostic.Text renames to Notification. See Message Management. 3. The session surface LocalProjectService.SessionShell is created by BeginSession() and nulled at EndSession() — it is null outside a session and no longer lazily created. ShellProgress is recreated per session, so hold no long-lived reference to either: subscribe once through OnShellMessageAdded / OnShellMessageCleared, or buffer one call's messages with MessageCollector. MachiningSession takes an injected IMachiningService host in its constructor, and IMachiningService replaces PlayerCancellationToken / PausePlayer with a single PacePlayer property. 4. The play verbs Nc becomes the umbrella term for any playable control program, and BrandNc names the famous-brand controller-code group as a sibling of Cl and Csv. Was Is now PlayNcFile(file) — brand G-code only PlayNcFile(file, NcKind kind = NcKind.Auto) RunNcFile(file) RunNcFile(file, NcKind kind = NcKind.Auto) the narrow brand-only file verbs PlayBrandNcFile / RunBrandNcFile IControlRunner Hi.Numerical.INcRunner RunControlLines RunNcLines ControlKind NcKind IsRunningControlLines / BeginControlRunner IsRunningNcLines / BeginNcRunner the interim PlayControlFile / RunControlFile mirrors removed The same rename applies on LocalProjectService, SessionShellController and MachiningSession. Only .cl / .cls / .clsf / .csv arguments change meaning — DetectByPath treats those as closed extension sets and everything else falls back to brand G-code, so an exotic brand extension can never be misrouted. 5. Renames with no shim Was Is now WorkpieceService.GetRuntimeGeom / ReadRuntimeGeom / WriteRuntimeGeom / SetRuntimeGeom / ResetRuntimeGeom / IsRuntimeGeomInit / ScanRuntimeGeomInfDefect GetOrBuildMeshedGeom / ReadMeshedGeom / WriteMeshedGeom / SetMeshedGeom / ResetMeshedGeom / IsMeshedGeomInit / ScanMeshedGeomInfDefect MachiningEquipmentCollisionIndex.WorkpieceRuntimeGeomGetter WorkpieceMeshedGeomGetter IContourTray / UniformContourTray / FreeContourTray IFluting / UniformFluting / FreeFluting MillingCutter.FluteContourTray Fluting Hi.Common.ResourceUtil (the HiNc one) ResourceLayout NativeTopoStld / NativeTopoStlfr / NativeCarveTopoStl3wfr NativeTopoStl3d / NativeTopoStl3wfr / CarveStl Solid.NativeSmoothTopoStl / Sweptable.NativeTopoStl SmoothTopoStl3d / NativeTopoStl3d ITimeGetter and its Time member Hi.Physics.ITimecoded and Timecode ClStrip.DrawingRefreshing ClStrip.DrawingRefreshed CbtrPickable.CleanLinked* CbtrPickable.CleanAttached* SoftNcRunner.NcDependencyList PipelineNcDependencyList StateActRunner.Feedrate_mmds / Feedrate_mmdmin, ActFeedrate.Feedrate_mmds / Feedrate_mmdmin (and ActRapid), MachineMotionStep.Feedrate_mmds, the MachineMotionStep constructor's feedrate_mmds parameter CommandedClFeedrate_mmds / CommandedClFeedrate_mmdmin, CommandedClFeedrate_mmds / CommandedClFeedrate_mmdmin, CommandedClFeedrate_mmds, commandedClFeedrate_mmds GetMillingEquipment GetMachiningEquipment CodeXyzabcMachineTool / CodeXyzabcMachineToolUri GeneralXyzabcMachineTool (the old XML names still load) Four notes on that table. The SessionShell script names for meshed geometry keep hidden [Obsolete] aliases so existing player scripts still run; the service-level members do not. WorkpieceService.ResetRuntimeGeom also drops its ClStrip parameter. ClStrip.DrawingRefreshed was renamed because both invocations always fired after the work — the -ing name told subscribers the opposite of when they are called. A subscriber that misses the rename silently detaches. Project and cutter files written before the fluting rename keep loading: each Reg() registers the ContourTray-era XName beside the older aliases, and the cutter element reader tries Fluting, then FluteContourTray, then FluteContourTrackTray. A cutter that nevertheless fails to resolve its fluting machines as a plain bounding shape rather than failing loudly, so verify the load rather than assuming it. The feedrate members were renamed because the value is the controller's commanded feedrate of the CL point – the F word after G94/G95/G93 conversion, or for a rapid the CL path over the act duration – and not the equipped tool's tip feedrate; under RTCP with a tool-length offset that does not describe the equipped tool the two differ. The step now also carries ActualTipFeedrate_mmds (client key ActualTipFeedrate_mmdmin), which the physics reads. The client key Feedrate_mmdmin keeps its historical name. SoftNcRunner.PipelineNcDependencyList is the raw list; machine-config consumers read the resolved view through GetEffectiveNcDependencyList. Legacy XML still loads and migrates. 6. Removals CSV — CsvRunner0, LocalProjectService.EnableSoftCsvRunner, and the earlier RawCsvRunner and CsvRowSemantic. CSV playback has one path, GeneralCsvRunner, and CsvRunner returns the CSV suit's SoftNcRunner directly. Carriers — IndexedSentence (wrap a bare Sentence in your own ISentenceCarrier if you passed one as a sourceCommand), SimpleSessionCommand, HiCbtr's [Obsolete] LsStl. The packed MixedIndex file-line key is replaced by typed FileLineIndex comparison, so file and line positions compare by type rather than through a packed integer. GUI-layer composition — MachiningProjectDisplayee, IsoCoordinateEntryDisplayee, HeidenhainCoordinateEntryDisplayee, UserConfig, UserService, PlayerDivConfig. Construct LocalProjectService with the ILogger-only constructor and copy the displayees from any app project — Hi.Sample.Wpf/Disp/ ships them. They compose only public API (IDisplayee over LocalProjectService), so tailoring them is the point. Managed physics kernel types — the class FluteZData, MillingForceUtil.RuntimePack / LayerPack / AnglePack, the LayerMillingEngagement constructor that built an engagement from a z-to-dz list (the default and BinaryReader constructors stay), and MillingPhysicsBrief.YieldStressMinHeight_mm. Culture declaration — CultureUtil.SupportedCultureNames and CultureUtil.SetCurrentCulture(string), deleted outright with no [Obsolete] shim. What remains is English and SetCurrentCultureEn. A host that enumerated supported cultures must enumerate its own manual or resource folders instead. Dead P/Invoke declarations — eight gl* methods on HiDisp's public GL class (glFenceSync, glGetDoublev, glGetDoublei_v, glGetDoubleIndexedvEXT, glIglooInterfaceSGIX, glPNTrianglesfATI, glPNTrianglesiATI, and the already-commented glDebugMessageCallbackAMD). They had no backing export and threw EntryPointNotFoundException when called. NcFileListCommand — a list of NC files is just a List of Program File commands, so the dedicated type is gone. Loading a project that contains one converts it in place: each entry becomes a single-file NcFileCommand (kind Auto, the same per-file extension dispatch) inside a ListCommand, and re-saving persists the converted form. Post-Execution meshed-geometry output — PostExecutionCommand loses EnableWriteMeshedGeom and MeshedGeomFileTemplate (and their pre-rename …RuntimeGeom… spellings) together with the enable-write-meshed-geom and meshed-geom-file-path routes. A geometry snapshot can be taken at any time-spot, unlike the run-derived outputs that command manages, so the carriers are now the placeable RecordMeshedGeomCommand and ExportMeshedGeomToStlCommand. Loading an old project with the pair enabled emits PostExecution--MeshedGeomOutputRetired, and re-saving drops the elements. Cutter tessellation resolution — mesh resolution is runtime data, not authored cutter data, so the seam that let a live object be “the resolution” is gone: MillingCutter no longer implements IPolarResolution2d and loses LinearResolution_mm / AngleResolution_rad / AngleResolution_deg and UpperBeamPolarResolution2dSource; the Func-based IPolarResolution2dSourceProperty interface is deleted together with the PolarResolution2dSource properties on Solid, AptProfile and CustomSpinningProfile. A Solid now holds the immutable resolution it was built with — pass it to the Solid(IGetStl, PolarResolution2d) constructor — and changing resolution means building a new solid: play paths go through SetShaperStlResolution and SetStrutStlResolution (the runner calls both for you, so the strut/upper-beam mesh follows the runtime value during a play too), holders re-mesh when you assign their PolarResolution2d property, and a fresh cutter's shaper solid is born with DefaultShaperStlResolution while the strut solid is born on the geometry's own default. Cutter files keep loading whether or not they carry the old / elements; the values in them were only ever the residue of the last play and are ignored, and 3.2 no longer writes them — a 3.1 install needs a support-line build carrying the guarded cutter reader (HiMech 3.1.157.2 / HiNc 3.1.175.5, shipped 2026-08-29) to open a 3.2-saved cutter file. Parameterless profile meshing — IShaperProfile no longer extends IGetStl, and the GetStl() convenience methods on AptProfile, ConstRatioProfile, FluteDependentRatioProfile and CustomSpinningProfile are gone. Profile mesh access is resolution-explicit: pass your value through GenStl(resolution), or state the profile's own default with GenStl(null). Geometry types that serialize as an STL source (Cylindroid, GeomCombination, TransformationGeom, ExtendedCylinder) keep GetStl() as their IGetStl contract; it is documented as, and equivalent to, GenStl(null). Bounds queries never mesh — expanding a bounding box is a rough, quick operation (view fitting), so it no longer triggers STL generation anywhere. TransformationGeom.ExpandToBox3d transforms the geometry's own box corner-wise — a conservative superset of the transformed geometry's true bounds — instead of meshing, and GeomCombination now implements IExpandToBox3d by folding its sources' boxes. A geometry without IExpandToBox3d support contributes nothing to a bounds query; generate the mesh yourself if you need its true extent. MillingCutter's cutter-height bookkeeping likewise reads the profile's ZR contour and the upper beam's box instead of meshing both on every cache clear. The web application's Legacy-Controller page — HiNC-2025-webservice removes the page the Page menu's third group opened, at /controller/, on 2026-09-11 (the 3.2 line). It edited HardNcEnv — the project's NcEnv, the HardNc controller model that is deprecating now that EnableSoftNcRunner defaults to true. Controller settings are edited on the General Setup page's Controller branch (/general-setup?tree=equipment/controller), the SoftNc runner's own face — see Controller. Of the settings only that page could edit, three were HardNcEnv's alone and retire with it: EnableShortestRotary (the runner honours the program's own M126 / M127 modal codes), MaxRotarySpeedABC (the runner's rotary ceiling is the rotary rate on the branch's Rapid Feedrates leaf) and HeidenhainMasterAxisChar (a HardNc parser setting with no SoftNc counterpart). The fourth, Align P0 — moving the part so that program zero lands on a work-coordinate row — is not offered on the runner path: the Work Coordinates leaf carries only P0 and M0, which write the row from the machine position; the part is placed by hand instead — see Program Zero Alignment. Old links keep working: /controller and anything below it redirects to the Controller branch. Nothing on the C# side moves — MachiningProject.NcEnv still loads and the /api/Controller/* endpoints stay mounted, so a host that drives HardNcEnv through the API or a script is unaffected. 7. Signature and shape changes MachiningToolHouse derives from Dictionary: SetToolId takes an int and CreateStickMillingTool returns KeyValuePair. Any (int)entry.Key cast stops compiling. Siemens T=\"name\" string tool calls are unaffected — they still resolve to an int at the semantic layer. ActualTimecode and ActualDateTime become get-only views onto the new optional ActualTime (StepActualTime) — their setters are gone. AccumulatedTime is superseded by EndTimecode, kept as an [Obsolete] alias; step CSVs write the new header and still read the old. PreSettingCommand becomes a legacy bundle. A saved bundle expands on load into MachiningResolutionCommand, MachiningMotionResolutionCommand, CollisionDetectionCommand, PauseOnFailureCommand and PhysicsCommand (plus a Read-mode RecordMeshedGeomCommand), and is never written back. Anything that located the bundle element in a saved .hincproj must look for the split commands. ToPresentDto wire keys change with the obfuscation fix: geometry DTOs use Type / Min / Max / PairZrs / Z / R / SourceFile / FileIndex / LineIndex (Vec3d keeps lowercase x / y / z), transformer DTOs use Trans, Angle_deg, CosTheta / SinTheta, Axis, Pivot, Scale, Rotation, Translation, Step, Stack, Matrix. A front-end reading those payloads must be updated in lockstep. defaultFontFile changes value from \"Font/WCL06.ttf\" to \"(embedded)\". It is a public const, so an assembly compiled against 3.1.175 already carries the old literal and keeps passing it — Init still accepts it — but a rebuild changes what it passes, and no font file is extracted to the working directory any more. The equipment splits into two faces. SetupEquipment is the authored one — the only face a project file persists, reached as SetupEquipment. MachiningEquipment is the runtime face the runner, physics, collision and execution display read; it is rebuilt from the authored face at project assignment and at session boundaries, so a value written onto it is discarded rather than saved. See Getting started. 8. Defaults and gates that changed EnableSoftNcRunner defaults to true. The SoftNc pipeline is the NC engine; HardNcRunner is the opt-out fallback for the shrinking set of features still bound to it. EnableNativeMillingPhysics defaults to true, and in a shipping build setting it to false throws InvalidOperationException at the setter — the managed reference implementation lives only in a non-shipping assembly. Code that flipped it off for an A/B comparison now fails at configuration time. YieldingStressRatio and YieldingStressRatio report NaN instead of 0 when no beam section qualifies. A caller treating 0 as “no yielding constraint” — as both feed solvers did — must add a NaN branch or it will pass NaN into downstream queries. New licence feature NcComposition (id 22). Registering any non-built-in processing unit into a SoftNcRunner pipeline, or executing an NC-embedded C# script, requires it. Degradation is silent and functional: external units are skipped for the session with one Composition--NotLicensed naming them, an external segmenter falls back to SingleLineSegmenter, and scripts are skipped with Script--NotLicensed. An unlicensed installation therefore produces a different simulation, not an error. Calling the public API from your own application or session script needs no extra licence; composing the interpretation pipeline does. See NC Parsing Engine. RadiusOffsetBasis decides what a tool-house refresh writes into the D column: CutterRadius (default — geometry plus wear, the only behaviour before the basis existed) or ZeroBased (wear only, for a tool-centre CAM path). An older project refreshes exactly as before until the basis is changed. See Tool Offsets. The four SnapshotSyntax entries in the Fanuc preset default to IsEnabled = false, so projects stop serializing enabled debug snapshots. A project saved by an earlier build keeps what it serialized until its pipeline list is refreshed from the current preset. Server side: HiNcServer pins request localization to English, so an Accept-Language: zh-Hant request falls back to en. HiNcRcl removes the HiNC:DisplayEngine:FontFile configuration key, which never had any effect — delete it from appsettings. FontFile remains for a custom font. Localization: HiMech's MachiningStep.zh-Hant / .zh-Hans resx are deleted. Step presentation strings now come from the HiNc-Resource present catalog (catalog.en.json, catalog.zh-Hant.json, catalog.zh-Hans.json) that a host overlays; a host that ships neither loses the localized step labels it used to get for free. Packaging is x64-only: HiDisp drops the win-x86 runtime identifier and its Sentinel payload, HiNc-Resource drops the x86 platform. The shipped machine-tool packages are renamed. They now carry the .default marker and neutral names: MachineTool/Table-B1.default and MachineTool/CT-350.default. The table-type package was renamed outright — its .mt, its .general-mech and its STL headers travel with it — and the duplicated nested STL set inside the CT-350 package is deleted. A project, script or .mt that refers to a shipped machine-tool package by its earlier path must be repointed at the name above. The shipped mechanism file takes the canonical extension. MachineTool/Table-B1.default/Table-B1.general-mech is now Table-B1.GeneralMechanism — the spelling GeneralMechanism.XName gives and every Save As has written since the type-name extensions arrived — and the package's Table-B1.mt is repointed at it. .general-mech stays readable everywhere: the loader dispatches on the XML root element and never reads the extension, so a hand-authored file keeps its name and loads as before. Only something that refers to the shipped mechanism by its old file name must be repointed. The rename ships from HiNc-Resource 3.2.21; 3.2.20 still carries .general-mech, and an admin folder already seeded by it is re-mirrored — old name deleted, new name copied, Table-B1.mt refreshed — on the first start with the newer package." + "summary": "Breaking changes In the order they will bite an upgrading host. 1. Registration, before anything else XFactory.Generators changes from a plain Dictionary to a ConcurrentDictionary, so parallel Reg() calls no longer corrupt the registration map. The property is public, so a caller that declares its type explicitly stops compiling. Carried over from 3.1.172 and still the first thing an upgrading host hits: Reg must be called once at startup, before any project XML is deserialized. Registration no longer happens by accident when a type is first touched. See XML IO. 2. The message channel Message reporting is rebuilt on a unified model. Every notification carries a Severity, a Category and a filterable id (SimpleMessage), and arrives on one of three typed sinks: ShellProgress for session-lifecycle messages, StepDiagnosticProgress for step-anchored diagnostics, and NcDiagnosticProgress for NC-parsing diagnostics. MixedProgress0, MultiTagMessage and MultiTagMessageUtil are removed. Every message parameter across the API — the XFactory deserialization chain included — is retyped from IProgress to IProgress. Category.General is deleted, MessageUtil becomes id-first {Category}{Severity}, and NcDiagnostic.Text renames to Notification. See Message Management. 3. The session surface LocalProjectService.SessionShell is created by BeginSession() and nulled at EndSession() — it is null outside a session and no longer lazily created. ShellProgress is recreated per session, so hold no long-lived reference to either: subscribe once through OnShellMessageAdded / OnShellMessageCleared, or buffer one call's messages with MessageCollector. MachiningSession takes an injected IMachiningService host in its constructor, and IMachiningService replaces PlayerCancellationToken / PausePlayer with a single PacePlayer property. 4. The play verbs Nc becomes the umbrella term for any playable control program, and BrandNc names the famous-brand controller-code group as a sibling of Cl and Csv. Was Is now PlayNcFile(file) — brand G-code only PlayNcFile(file, NcKind kind = NcKind.Auto) RunNcFile(file) RunNcFile(file, NcKind kind = NcKind.Auto) the narrow brand-only file verbs PlayBrandNcFile / RunBrandNcFile IControlRunner Hi.Numerical.INcRunner RunControlLines RunNcLines ControlKind NcKind IsRunningControlLines / BeginControlRunner IsRunningNcLines / BeginNcRunner the interim PlayControlFile / RunControlFile mirrors removed The same rename applies on LocalProjectService, SessionShellController and MachiningSession. Only .cl / .cls / .clsf / .csv arguments change meaning — DetectByPath treats those as closed extension sets and everything else falls back to brand G-code, so an exotic brand extension can never be misrouted. 5. Renames with no shim Was Is now WorkpieceService.GetRuntimeGeom / ReadRuntimeGeom / WriteRuntimeGeom / SetRuntimeGeom / ResetRuntimeGeom / IsRuntimeGeomInit / ScanRuntimeGeomInfDefect GetOrBuildMeshedGeom / ReadMeshedGeom / WriteMeshedGeom / SetMeshedGeom / ResetMeshedGeom / IsMeshedGeomInit / ScanMeshedGeomInfDefect MachiningEquipmentCollisionIndex.WorkpieceRuntimeGeomGetter WorkpieceMeshedGeomGetter IContourTray / UniformContourTray / FreeContourTray IFluting / UniformFluting / FreeFluting MillingCutter.FluteContourTray Fluting Hi.Common.ResourceUtil (the HiNc one) ResourceLayout NativeTopoStld / NativeTopoStlfr / NativeCarveTopoStl3wfr NativeTopoStl3d / NativeTopoStl3wfr / CarveStl Solid.NativeSmoothTopoStl / Sweptable.NativeTopoStl SmoothTopoStl3d / NativeTopoStl3d ITimeGetter and its Time member Hi.Physics.ITimecoded and Timecode ClStrip.DrawingRefreshing ClStrip.DrawingRefreshed CbtrPickable.CleanLinked* CbtrPickable.CleanAttached* SoftNcRunner.NcDependencyList PipelineNcDependencyList StateActRunner.Feedrate_mmds / Feedrate_mmdmin, ActFeedrate.Feedrate_mmds / Feedrate_mmdmin (and ActRapid), MachineMotionStep.Feedrate_mmds, the MachineMotionStep constructor's feedrate_mmds parameter CommandedClFeedrate_mmds / CommandedClFeedrate_mmdmin, CommandedClFeedrate_mmds / CommandedClFeedrate_mmdmin, CommandedClFeedrate_mmds, commandedClFeedrate_mmds GetMillingEquipment GetMachiningEquipment CodeXyzabcMachineTool / CodeXyzabcMachineToolUri GeneralXyzabcMachineTool (the old XML names still load) Four notes on that table. The SessionShell script names for meshed geometry keep hidden [Obsolete] aliases so existing player scripts still run; the service-level members do not. WorkpieceService.ResetRuntimeGeom also drops its ClStrip parameter. ClStrip.DrawingRefreshed was renamed because both invocations always fired after the work — the -ing name told subscribers the opposite of when they are called. A subscriber that misses the rename silently detaches. Project and cutter files written before the fluting rename keep loading: each Reg() registers the ContourTray-era XName beside the older aliases, and the cutter element reader tries Fluting, then FluteContourTray, then FluteContourTrackTray. A cutter that nevertheless fails to resolve its fluting machines as a plain bounding shape rather than failing loudly, so verify the load rather than assuming it. The feedrate members were renamed because the value is the controller's commanded feedrate of the CL point – the F word after G94/G95/G93 conversion, or for a rapid the CL path over the act duration – and not the equipped tool's tip feedrate; under RTCP with a tool-length offset that does not describe the equipped tool the two differ. The step now also carries ActualTipFeedrate_mmds (client key ActualTipFeedrate_mmdmin), which the physics reads. The client key Feedrate_mmdmin keeps its historical name. SoftNcRunner.PipelineNcDependencyList is the raw list; machine-config consumers read the resolved view through GetEffectiveNcDependencyList. Legacy XML still loads and migrates. 6. Removals CSV — CsvRunner0, LocalProjectService.EnableSoftCsvRunner, and the earlier RawCsvRunner and CsvRowSemantic. CSV playback has one path, GeneralCsvRunner, and CsvRunner returns the CSV suit's SoftNcRunner directly. Carriers — IndexedSentence (wrap a bare Sentence in your own ISentenceCarrier if you passed one as a sourceCommand), SimpleSessionCommand, HiCbtr's [Obsolete] LsStl. The packed MixedIndex file-line key is replaced by typed FileLineIndex comparison, so file and line positions compare by type rather than through a packed integer. GUI-layer composition — MachiningProjectDisplayee, IsoCoordinateEntryDisplayee, HeidenhainCoordinateEntryDisplayee, UserConfig, UserService, PlayerDivConfig. Construct LocalProjectService with the ILogger-only constructor and copy the displayees from any app project — Hi.Sample.Wpf/Disp/ ships them. They compose only public API (IDisplayee over LocalProjectService), so tailoring them is the point. Managed physics kernel types — the class FluteZData, MillingForceUtil.RuntimePack / LayerPack / AnglePack, the LayerMillingEngagement constructor that built an engagement from a z-to-dz list (the default and BinaryReader constructors stay), and MillingPhysicsBrief.YieldStressMinHeight_mm. Culture declaration — CultureUtil.SupportedCultureNames and CultureUtil.SetCurrentCulture(string), deleted outright with no [Obsolete] shim. What remains is English and SetCurrentCultureEn. A host that enumerated supported cultures must enumerate its own manual or resource folders instead. Dead P/Invoke declarations — eight gl* methods on HiDisp's public GL class (glFenceSync, glGetDoublev, glGetDoublei_v, glGetDoubleIndexedvEXT, glIglooInterfaceSGIX, glPNTrianglesfATI, glPNTrianglesiATI, and the already-commented glDebugMessageCallbackAMD). They had no backing export and threw EntryPointNotFoundException when called. NcFileListCommand — a list of NC files is just a List of Program File commands, so the dedicated type is gone. Loading a project that contains one converts it in place: each entry becomes a single-file NcFileCommand (kind Auto, the same per-file extension dispatch) inside a ListCommand, and re-saving persists the converted form. Post-Execution meshed-geometry output — PostExecutionCommand loses EnableWriteMeshedGeom and MeshedGeomFileTemplate (and their pre-rename …RuntimeGeom… spellings) together with the enable-write-meshed-geom and meshed-geom-file-path routes. A geometry snapshot can be taken at any time-spot, unlike the run-derived outputs that command manages, so the carriers are now the placeable RecordMeshedGeomCommand and ExportMeshedGeomToStlCommand. Loading an old project with the pair enabled emits PostExecution--MeshedGeomOutputRetired, and re-saving drops the elements. Cutter tessellation resolution — mesh resolution is runtime data, not authored cutter data, so the seam that let a live object be “the resolution” is gone: MillingCutter no longer implements IPolarResolution2d and loses LinearResolution_mm / AngleResolution_rad / AngleResolution_deg and UpperBeamPolarResolution2dSource; the Func-based IPolarResolution2dSourceProperty interface is deleted together with the PolarResolution2dSource properties on Solid, AptProfile and CustomSpinningProfile. A Solid now holds the immutable resolution it was built with — pass it to the Solid(IGetStl, PolarResolution2d) constructor — and changing resolution means building a new solid: play paths go through SetShaperStlResolution and SetStrutStlResolution (the runner calls both for you, so the strut/upper-beam mesh follows the runtime value during a play too), holders re-mesh when you assign their PolarResolution2d property, and a fresh cutter's shaper solid is born with DefaultShaperStlResolution while the strut solid is born on the geometry's own default. Cutter files keep loading whether or not they carry the old / elements; the values in them were only ever the residue of the last play and are ignored, and 3.2 no longer writes them — a 3.1 install needs a support-line build carrying the guarded cutter reader (HiMech 3.1.157.2 / HiNc 3.1.175.5, shipped 2026-08-29) to open a 3.2-saved cutter file. Parameterless profile meshing — IShaperProfile no longer extends IGetStl, and the GetStl() convenience methods on AptProfile, ConstRatioProfile, FluteDependentRatioProfile and CustomSpinningProfile are gone. Profile mesh access is resolution-explicit: pass your value through GenStl(resolution), or state the profile's own default with GenStl(null). Geometry types that serialize as an STL source (Cylindroid, GeomCombination, TransformationGeom, ExtendedCylinder) keep GetStl() as their IGetStl contract; it is documented as, and equivalent to, GenStl(null). Bounds queries never mesh — expanding a bounding box is a rough, quick operation (view fitting), so it no longer triggers STL generation anywhere. TransformationGeom.ExpandToBox3d transforms the geometry's own box corner-wise — a conservative superset of the transformed geometry's true bounds — instead of meshing, and GeomCombination now implements IExpandToBox3d by folding its sources' boxes. A geometry without IExpandToBox3d support contributes nothing to a bounds query; generate the mesh yourself if you need its true extent. MillingCutter's cutter-height bookkeeping likewise reads the profile's ZR contour and the upper beam's box instead of meshing both on every cache clear. The web application's Legacy-Controller page — HiNC-2025-webservice removes the page the Page menu's third group opened, at /controller/, on 2026-09-11 (the 3.2 line). It edited HardNcEnv — the project's NcEnv, the HardNc controller model that is deprecating now that EnableSoftNcRunner defaults to true. Controller settings are edited on the General Setup page's Controller branch (/general-setup?tree=equipment/controller), the SoftNc runner's own face — see Controller. Of the settings only that page could edit, three were HardNcEnv's alone and retire with it: EnableShortestRotary (the runner honours the program's own M126 / M127 modal codes), MaxRotarySpeedABC (the runner's rotary ceiling is the rotary rate on the branch's Rapid Feedrates leaf) and HeidenhainMasterAxisChar (a HardNc parser setting with no SoftNc counterpart). The fourth, Align P0 — moving the part so that program zero lands on a work-coordinate row — is not offered on the runner path: the Work Coordinates leaf carries only P0 and M0, which write the row from the machine position; the part is placed by hand instead — see Program Zero Alignment. Old links keep working: /controller and anything below it redirects to the Controller branch. Nothing on the C# side moves — MachiningProject.NcEnv still loads and the /api/Controller/* endpoints stay mounted, so a host that drives HardNcEnv through the API or a script is unaffected. 7. Signature and shape changes MachiningToolHouse derives from Dictionary: SetToolId takes an int and CreateStickMillingTool returns KeyValuePair. Any (int)entry.Key cast stops compiling. Siemens T=\"name\" string tool calls are unaffected — they still resolve to an int at the semantic layer. ActualTimecode and ActualDateTime become get-only views onto the new optional ActualTime (StepActualTime) — their setters are gone. AccumulatedTime is superseded by EndTimecode, kept as an [Obsolete] alias; step CSVs write the new header and still read the old. PreSettingCommand becomes a legacy bundle. A saved bundle expands on load into MachiningResolutionCommand, MachiningMotionResolutionCommand, CollisionDetectionCommand, PauseOnFailureCommand and PhysicsCommand (plus a Read-mode RecordMeshedGeomCommand), and is never written back. Anything that located the bundle element in a saved .hincproj must look for the split commands. ToPresentDto wire keys change with the obfuscation fix: geometry DTOs use Type / Min / Max / PairZrs / Z / R / SourceFile / FileIndex / LineIndex (Vec3d keeps lowercase x / y / z), transformer DTOs use Trans, Angle_deg, CosTheta / SinTheta, Axis, Pivot, Scale, Rotation, Translation, Step, Stack, Matrix. A front-end reading those payloads must be updated in lockstep. defaultFontFile changes value from \"Font/WCL06.ttf\" to \"(embedded)\". It is a public const, so an assembly compiled against 3.1.175 already carries the old literal and keeps passing it — Init still accepts it — but a rebuild changes what it passes, and no font file is extracted to the working directory any more. The equipment splits into two faces. SetupEquipment is the authored one — the only face a project file persists, reached as SetupEquipment. MachiningEquipment is the runtime face the runner, physics, collision and execution display read; it is rebuilt from the authored face at project assignment and at session boundaries, so a value written onto it is discarded rather than saved. See Getting started. BackgroundTemperature_C / _K on both equipment faces rename to AmbientTemperature_C / AmbientTemperature_K (and the same pair on MachiningEquipment): the shop-floor temperature the workpiece, cutter, chips and spindle start at and the spindle cools toward. The old names remain as [Obsolete] delegates, so nothing stops compiling. A .hincproj now writes ; the reader still accepts the legacy element and the 2019 wrapper. 8. Defaults and gates that changed EnableSoftNcRunner defaults to true. The SoftNc pipeline is the NC engine; HardNcRunner is the opt-out fallback for the shrinking set of features still bound to it. EnableNativeMillingPhysics defaults to true, and in a shipping build setting it to false throws InvalidOperationException at the setter — the managed reference implementation lives only in a non-shipping assembly. Code that flipped it off for an A/B comparison now fails at configuration time. YieldingStressRatio and YieldingStressRatio report NaN instead of 0 when no beam section qualifies. A caller treating 0 as “no yielding constraint” — as both feed solvers did — must add a NaN branch or it will pass NaN into downstream queries. New licence feature NcComposition (id 22). Registering any non-built-in processing unit into a SoftNcRunner pipeline, or executing an NC-embedded C# script, requires it. Degradation is silent and functional: external units are skipped for the session with one Composition--NotLicensed naming them, an external segmenter falls back to SingleLineSegmenter, and scripts are skipped with Script--NotLicensed. An unlicensed installation therefore produces a different simulation, not an error. Calling the public API from your own application or session script needs no extra licence; composing the interpretation pipeline does. See NC Parsing Engine. RadiusOffsetBasis decides what a tool-house refresh writes into the D column: CutterRadius (default — geometry plus wear, the only behaviour before the basis existed) or ZeroBased (wear only, for a tool-centre CAM path). An older project refreshes exactly as before until the basis is changed. See Tool Offsets. The four SnapshotSyntax entries in the Fanuc preset default to IsEnabled = false, so projects stop serializing enabled debug snapshots. A project saved by an earlier build keeps what it serialized until its pipeline list is refreshed from the current preset. Server side: HiNcServer pins request localization to English, so an Accept-Language: zh-Hant request falls back to en. HiNcRcl removes the HiNC:DisplayEngine:FontFile configuration key, which never had any effect — delete it from appsettings. FontFile remains for a custom font. Localization: HiMech's MachiningStep.zh-Hant / .zh-Hans resx are deleted. Step presentation strings now come from the HiNc-Resource present catalog (catalog.en.json, catalog.zh-Hant.json, catalog.zh-Hans.json) that a host overlays; a host that ships neither loses the localized step labels it used to get for free. Packaging is x64-only: HiDisp drops the win-x86 runtime identifier and its Sentinel payload, HiNc-Resource drops the x86 platform. The shipped machine-tool packages are renamed. They now carry the .default marker and neutral names: MachineTool/Table-B1.default and MachineTool/CT-350.default. The table-type package was renamed outright — its .mt, its .general-mech and its STL headers travel with it — and the duplicated nested STL set inside the CT-350 package is deleted. A project, script or .mt that refers to a shipped machine-tool package by its earlier path must be repointed at the name above. The shipped mechanism file takes the canonical extension. MachineTool/Table-B1.default/Table-B1.general-mech is now Table-B1.GeneralMechanism — the spelling GeneralMechanism.XName gives and every Save As has written since the type-name extensions arrived — and the package's Table-B1.mt is repointed at it. .general-mech stays readable everywhere: the loader dispatches on the XML root element and never reads the extension, so a hand-authored file keeps its name and loads as before. Only something that refers to the shipped mechanism by its old file name must be repointed. The rename ships from HiNc-Resource 3.2.21; 3.2.20 still carries .general-mech, and an admin folder already seeded by it is re-mirrored — old name deleted, new name copied, Table-B1.mt refreshed — on the first start with the newer package." }, "release-note/upgrading-to-3.2/cl-playback.html": { "href": "release-note/upgrading-to-3.2/cl-playback.html", @@ -8162,17 +8162,17 @@ "release-note/upgrading-to-3.2/geometry-rendering-and-stability.html": { "href": "release-note/upgrading-to-3.2/geometry-rendering-and-stability.html", "title": "Geometry, rendering and native stability | HiAPI-C# 2025", - "summary": "Geometry, rendering and native stability Disposing a display or geometry object still in use no longer crashes the process. A client disconnect, a meshed-geometry reset or an app shutdown could take the process down with an access violation. DispEngine and CubeTree native calls are now gated against a concurrent dispose, and disposals run serialized on a single background chain — IsDisposed reports the state and DisposeBackground enqueues a tree, or a collection of its attachments, onto that chain. Large geometry no longer freezes the UI. Solid builds its display topology off-thread and draws a wire bounding box with a “Loading” mark until it is ready. ClStrip raises a Cleared event after Clear, pairing with the existing PosAdded. A P/Invoke correctness sweep reconciled the managed declarations against the real export table. It fixed a non-existent export (substraction_ExpandToBox3d), two void natives declared as struct returns (a garbage register read), two ToString marshals that made the CLR free foreign memory, and a log-callback delegate nothing rooted against GC — native could call a dead thunk long after the P/Invoke returned. These are the crashes a user reports as “it crashes randomly”. Milled step colours no longer go stale at random. Step colours are baked into the native cube-tree attachment, but the refresh only flagged the strip while the display cache was freed immediately, so a frame landing in that window rebuilt the cache from stale colours and nothing cleaned it again. The service now cleans the cache once more after the re-stamp. A paired fix stops an empty strip display window swallowing a pending recolor indefinitely. The dimension bar reads on any background. It was a single hard-coded near-black stroke left over from the light-host era, invisible once the front end went dark. It is now drawn as a wider dark halo under a white main stroke, with the halo pushed back whole depth steps rather than the white pass nudged forward by half a depth LSB — which intermittently lost the depth test. New geometry API. CarveStl is the managed face of the native exact triangle-CSG container. Add is the boolean-union counterpart of Substract, returning UnmanagedAddition, and AddBySweepingVolume mirrors RemoveBySweepingVolume — the geometry-layer symmetric point for additive processes. There is no deposition step in the machining runner yet, so this is a geometry-level API only. FreeformBottomContour is the user-editable point-list bottom contour, mirroring the side contour with the key axis switched to radius." + "summary": "Geometry, rendering and native stability Disposing a display or geometry object still in use no longer crashes the process. A client disconnect, a meshed-geometry reset or an app shutdown could take the process down with an access violation. DispEngine and CubeTree native calls are now gated against a concurrent dispose, and disposals run serialized on a single background chain — IsDisposed reports the state and DisposeBackground enqueues a tree, or a collection of its attachments, onto that chain. Large geometry no longer freezes the UI. Solid builds its display topology off-thread and draws a wire bounding box with a “Loading” mark until it is ready. ClStrip raises a Cleared event after Clear, pairing with the existing PosAdded. A P/Invoke correctness sweep reconciled the managed declarations against the real export table. It fixed a non-existent export (substraction_ExpandToBox3d), two void natives declared as struct returns (a garbage register read), two ToString marshals that made the CLR free foreign memory, and a log-callback delegate nothing rooted against GC — native could call a dead thunk long after the P/Invoke returned. These are the crashes a user reports as “it crashes randomly”. Milled step colours no longer go stale at random. Step colours are baked into the native cube-tree attachment, but the refresh only flagged the strip while the display cache was freed immediately, so a frame landing in that window rebuilt the cache from stale colours and nothing cleaned it again. The service now cleans the cache once more after the re-stamp. A paired fix stops an empty strip display window swallowing a pending recolor indefinitely. The dimension bar reads on any background. It was a single hard-coded near-black stroke left over from the light-host era, invisible once the front end went dark. It is now drawn as a wider dark halo under a white main stroke, with the halo pushed back whole depth steps rather than the white pass nudged forward by half a depth LSB — which intermittently lost the depth test. New geometry API. CarveStl is the managed face of the native exact triangle-CSG container. Add is the boolean-union counterpart of Substract, returning UnmanagedAddition, and AddBySweepingVolume mirrors RemoveBySweepingVolume — the geometry-layer symmetric point for additive processes. There is no deposition step in the machining runner yet, so this is a geometry-level API only. FreeformBottomContour is the user-editable point-list bottom contour, mirroring the side contour with the key axis switched to radius. A host with no usable OpenGL no longer aborts the process. The native display initialiser used to end the whole process when the GL loader failed — before any NC play, physics or training, none of which need GL — which is what made every service on a machine whose graphics driver and kernel module disagree unstartable, and kept it dead until the driver was fixed. It now reports and returns; IsGlAvailable carries the verdict, ContextProjDepth reads 0 in that state, and HiNc logs one line at startup saying so. The contract is that a host must not obtain a DispEngine while IsGlAvailable is false, rather than guard individual draw calls. The cube tree folds a re-cut flat region again. A comparison in the simplification gate had been inverted since 2023: it demanded the marching-cubes ambiguous face pattern instead of forbidding it, so almost no cell reached the reproduction test and a floor roughened by one pass and re-cut flat by a later one stayed at its finest level for the life of the tree. 128 of the 256 corner masks now pass, the 1e-9 reproduction test behind the gate is unchanged. On a 1000-move CL replay the node count drops 17% and the peak working set 8%. Because folds are now routine, the meshed-geometry writer and the fly-piece remover tolerate a child array folded away under them while a cut runs on another thread — a snapshot taken mid-cut stays torn, but no longer crashes." }, "release-note/upgrading-to-3.2/index.html": { "href": "release-note/upgrading-to-3.2/index.html", "title": "Upgrading from 3.1.175 to 3.2 | HiAPI-C# 2025", - "summary": "Upgrading from 3.1.175 to 3.2 These pages are the long form of the 3.1.175 → 3.2 line — the 3.2.7 entry and the 3.2.24 incremental drop. They exist because 3.2 is not an increment on the last release most callers hold — it is the accumulation of everything that landed after the 3.1.175 package set, delivered in one step. Read them in order the first time. The two sections that decide whether an upgrade is a recompile or an afternoon are Breaking changes and Results that change on upgrade; everything after them is new capability you can adopt when you need it. Important Read the Adoption status note on the release-note page before planning around this. The short version: 3.2 is published for review, verification is still in progress across most areas, NC optimization is not finished on this line, and SoftNc canned-cycle indexing with rotary A/B/C words is not finished — work that depends on either should stay on 3.1, serviced as 3.1.175., or run with SoftNc off for the rotary-cycle case. Pages Ordered the way to read them: what the package numbers mean, then the two sections that decide whether the upgrade is a recompile or an afternoon, then the new capability, adopted when needed. The package line — Why a 3.2 build number starts low, which ten packages moved together, and what that means for a mixed reference set Breaking changes — The eight groups that stop a build, in the order they bite — registration, messages, the session surface, the play verbs, renames with no shim, removals, signature changes, changed defaults Results that change on upgrade — What a simulation produces differently afterwards — usually because 3.1.175 was wrong — and why a byte-for-byte comparison will differ Brand NC language coverage — Where most of the release went: Siemens, Heidenhain, Fanuc and ISO common, and the cross-brand work behind them NC optimization and writeback — The optimization leg as it stands on this line — published for review, not for production Milling physics, training and measured data — Physics in the native kernel, and what changed in training and in the handling of measured signals Cutter-location (CL) playback and CL-to-NC — Replaying an NX CLSF / APT-source toolpath directly, and writing one out as NC Session, project and command model — Runner suits, the three the project holds, and the command model a script and the app share Geometry, rendering and native stability — Disposal crashes that no longer take the process down, and the geometry and rendering changes behind them Performance and footprint — Every figure with its conditions stated, including the places the release spent time on purpose to buy correctness Packaging, resources and hosting — The .default ownership marker, resource seeding, and what a host has to change New diagnostics you may now see — The searchable ids for failure modes that used to be silent" + "summary": "Upgrading from 3.1.175 to 3.2 These pages are the long form of the 3.1.175 → 3.2 line — the 3.2.7 entry and the 3.2.24 and 3.2.26 incremental drops. They exist because 3.2 is not an increment on the last release most callers hold — it is the accumulation of everything that landed after the 3.1.175 package set, delivered in one step. Read them in order the first time. The two sections that decide whether an upgrade is a recompile or an afternoon are Breaking changes and Results that change on upgrade; everything after them is new capability you can adopt when you need it. Important Read the Adoption status note on the release-note page before planning around this. The short version: 3.2 is published for review, verification is still in progress across most areas and NC optimization is not finished on this line — work that depends on it should stay on 3.1, serviced as 3.1.175.. The 3.2.24 hold on SoftNc canned cycles that index a rotary axis is lifted in 3.2.26. Pages Ordered the way to read them: what the package numbers mean, then the two sections that decide whether the upgrade is a recompile or an afternoon, then the new capability, adopted when needed. The package line — Why a 3.2 build number starts low, which ten packages moved together, and what that means for a mixed reference set Breaking changes — The eight groups that stop a build, in the order they bite — registration, messages, the session surface, the play verbs, renames with no shim, removals, signature changes, changed defaults Results that change on upgrade — What a simulation produces differently afterwards — usually because 3.1.175 was wrong — and why a byte-for-byte comparison will differ Brand NC language coverage — Where most of the release went: Siemens, Heidenhain, Fanuc and ISO common, and the cross-brand work behind them NC optimization and writeback — The optimization leg as it stands on this line — published for review, not for production Milling physics, training and measured data — Physics in the native kernel, and what changed in training and in the handling of measured signals Cutter-location (CL) playback and CL-to-NC — Replaying an NX CLSF / APT-source toolpath directly, and writing one out as NC Session, project and command model — Runner suits, the three the project holds, and the command model a script and the app share Geometry, rendering and native stability — Disposal crashes that no longer take the process down, and the geometry and rendering changes behind them Performance and footprint — Every figure with its conditions stated, including the places the release spent time on purpose to buy correctness Packaging, resources and hosting — The .default ownership marker, resource seeding, and what a host has to change New diagnostics you may now see — The searchable ids for failure modes that used to be silent" }, "release-note/upgrading-to-3.2/milling-physics-and-training.html": { "href": "release-note/upgrading-to-3.2/milling-physics-and-training.html", "title": "Milling physics, training and measured data | HiAPI-C# 2025", - "summary": "Milling physics, training and measured data Physics runs in the native kernel. The per-step milling physics migrated into core.dll in stages: the engagement is scan-converted natively at the substraction completion point, the force kernel is reached through the same handle with no managed marshal, and the sequential cutting-temperature and wear chain runs from a native thermal session held per (tool, cutting parameter) pack. The switch is EnableNativeMillingPhysics, surfaced runtime-only (not persisted to project XML) as EnableNativeMillingPhysics and EnableNativeMillingPhysics, and it now defaults to true. Public entry points that used to reach the managed kernel still work: without a session pack they build an ad-hoc physics pack per live (cutting parameter, tool) pair and run natively. MillingToolPhysicsPack is an immutable record holding one tool's scalar derivations for one cutting-parameter set — spindle-buckle-to-tip length, observation height, effective cutting diameter, the bending/Z-deflection pair, the simplified rake angle, the minimum uncut chip thickness. MachiningSession owns the packs keyed by tool id (GetToolPhysicsPack) and invalidation is explicit at the points that know the state changed: every run-op start and the tool-change act, plus InvalidateToolPhysicsPacks. The corresponding MillingTool / MillingCutter members are now deliberately uncached pure computations. Milling-force waveforms are reproducible again. The parallel per-step force build read lazily built scalar caches on the shared tool objects; a thread could pass a cache guard and then read a value a concurrent writer had stored in between, so two plays of the same NC exported different forces in the thin-chip window of each tooth pass. The caches were first republished as single immutable references and then removed in favour of the frozen session pack. Thermal gating and seeding. The sequential cutting-temperature and wear build now checks EnablePhysics (spindle temperature deliberately keeps running), and the tool-change thermal seeding re-arms whenever the incoming chain state has no flute temperature list — which covers fault and cancel re-seeds, stop-then-replay residue, and EnablePhysics being switched on mid-session. The shank temperature list is seeded to the exact node count the thermal FEM builds, so trailing shank nodes no longer sit at 0 K after a tool change. Cutter geometry is validated up front. GetUpperBeamGeometryIssues collects upper-beam and shank configuration problems as keyed messages — for example an extended-cylinder beam whose full length sits below the flute height (Cutter-UpperBeam--ExtendedCylinderFullLengthTooShort), which inverts the shank solid and makes the shank thermal model unbuildable. They are reported once per tool at BeginSession and at each tool change, instead of surfacing later as a null-reference cascade inside the thermal physics with nothing naming the beam. RakeFaceCuttingPara3d no longer throws on a six-field parameter string (the guard read the seventh element behind a >= 6 check), and the published coefficient index mappings are corrected: the LocalProfileMillingPara(Vec3d, Vec3d) constructor maps (x,y,z) to (Ksr, Kst, Ksa) / (Kpr, Kpt, Kpa), and the 2d element index range is 0–3 with 0=Ksc, 1=Ksn, 2=Kpc, 3=Kpn. Training diagnostics name their cause. The per-step warnings split into Train-StepLuggage--Unreadable (the step luggage row could not be read back) and Train-StepEngagement--Missing (the row is present but the engagement was never built because physics was inactive at simulation time). The gather pass counts both against the eligible steps: silent at zero, one summary warning at or below MissingEngagementAbortRatio (default 0.25), and a configuration error above it. The breakdown in that summary is the diagnosis: misses sitting on the engagement level mean the play itself ran with physics inactive, while a scattered few on the luggage level are the read-back path, where a segment that covers a step but lacks its row is dropped and answers null once before the next read rebuilds it. Above the ratio the training aborts instead of continuing on what is left, because a parameter file built from a fraction of the play is indistinguishable from a sound one once it has been written — its coefficients are read back later as a real effect. Set the ratio to 1 to never abort. A gather pass that produces no samples at all now reports immediately rather than throwing inside the SVD solve, separating “not one step touched the workpiece” from “touched steps whose mapped force data yielded no usable shots”. New training knobs. EnableDesignMatrixSolver (default false) solves the least squares on a thin QR of the design matrix instead of forming the normal equations, which square the condition number; DesignMatrixSvdRelativeTol is its truncation cutoff. EnableCwePhasePairing (default false) determines each step's rotation phase with a cutter-workpiece-engagement block-pairing detector instead of the self-bootstrapped lead parameter, for one-flute and symmetric two-flute cutters in light radial side cuts. ReTrainAnchorOutputScale exposes the virtual anchor weight. LastMillingParaTrainResult captures the outcome — kind, sample flags, outlier ratio, success, output file, parameter name and note, correlation R, filtered sample count, parameter XML, timestamp — so a caller reads it without re-opening the .mp file. Time mapping is reworked around absolute wall-clock time. AddTimeDataByFile accepts DateTime windows, stored as IFileTimeSection forms, and the project-scoped MappingAnchorDateTime — seeded set-once from the date of the first controller instant seen — converts controller timestamps onto one run-relative axis. EndTimecode replaces AccumulatedTime as the canonical end-of-step time. CSV timing survives midnight. Step durations derive from full date-bearing instants, so a multi-day recording no longer produces negative durations and a negative chart time axis, and a non-physical duration from a spliced recording is clamped with a validation warning instead of stalling physics evaluation. Wall-clock time is dense. The trio moved into one optional sub-object, StepActualTime (Timecode / Instant / IsInterpolated), reached through ActualTime. On CSV plays every built step is stamped: steps built from a controller row re-anchor, and the steps between extrapolate along the machine timeline and are marked interpolated, which makes the actual-time mapper window per-step exact instead of sparse-anchor scaled. Pure NC plays keep null stamps. An empty step-shot pairing window is a data gap, not something to interpolate across. The window builder used to expand outward to the rows bracketing the gap, silently pairing such steps with force values that were never measured — a training run over a file whose transients had been carved out produced a plausible correlation and a full set of coefficients derived entirely from fabricated rows. Such a window now skips its step and one Map-ShotGap--StepsSkipped warning per mapping call carries the count; a window-edge row is interpolated only when its bracketing rows span at most two spindle revolutions. “No cut / No data for step” on freshly-simulated steps is fixed. The bulk step-data readers cached the absence of rows the writer had not committed yet, so a step that had just been simulated could report no data until the program was re-run. A covered-but-missing index now drops the stale segment and re-reads. New end-of-play warnings, each once per session: Play-Touch--None (the play finished without any step touching the workpiece), Tool-FluteCount--Zero (physics is on and a milling cutter resolves to zero flutes, so feed per tooth is undefined), and Play-Physics--None (physics is on and at least one step touched the workpiece but no touched step carries a physics brief — naming the three things that gate it: a tool bound to the spindle, the spindle actually rotating, and the workpiece cutting parameter). That last state previously surfaced one process later, as a training run gathering zero samples. Performance is collected in its own section below." + "summary": "Milling physics, training and measured data Physics runs in the native kernel. The per-step milling physics migrated into core.dll in stages: the engagement is scan-converted natively at the substraction completion point, the force kernel is reached through the same handle with no managed marshal, and the sequential cutting-temperature and wear chain runs from a native thermal session held per (tool, cutting parameter) pack. The switch is EnableNativeMillingPhysics, surfaced runtime-only (not persisted to project XML) as EnableNativeMillingPhysics and EnableNativeMillingPhysics, and it now defaults to true. Public entry points that used to reach the managed kernel still work: without a session pack they build an ad-hoc physics pack per live (cutting parameter, tool) pair and run natively. MillingToolPhysicsPack is an immutable record holding one tool's scalar derivations for one cutting-parameter set — spindle-buckle-to-tip length, observation height, effective cutting diameter, the bending/Z-deflection pair, the simplified rake angle, the minimum uncut chip thickness. MachiningSession owns the packs keyed by tool id (GetToolPhysicsPack) and invalidation is explicit at the points that know the state changed: every run-op start and the tool-change act, plus InvalidateToolPhysicsPacks. The corresponding MillingTool / MillingCutter members are now deliberately uncached pure computations. Milling-force waveforms are reproducible again. The parallel per-step force build read lazily built scalar caches on the shared tool objects; a thread could pass a cache guard and then read a value a concurrent writer had stored in between, so two plays of the same NC exported different forces in the thin-chip window of each tooth pass. The caches were first republished as single immutable references and then removed in favour of the frozen session pack. Thermal gating and seeding. The sequential cutting-temperature and wear build now checks EnablePhysics (spindle temperature deliberately keeps running), and the tool-change thermal seeding re-arms whenever the incoming chain state has no flute temperature list — which covers fault and cancel re-seeds, stop-then-replay residue, and EnablePhysics being switched on mid-session. The shank temperature list is seeded to the exact node count the thermal FEM builds, so trailing shank nodes no longer sit at 0 K after a tool change. Cutter geometry is validated up front. GetUpperBeamGeometryIssues collects upper-beam and shank configuration problems as keyed messages — for example an extended-cylinder beam whose full length sits below the flute height (Cutter-UpperBeam--ExtendedCylinderFullLengthTooShort), which inverts the shank solid and makes the shank thermal model unbuildable. They are reported once per tool at BeginSession and at each tool change, instead of surfacing later as a null-reference cascade inside the thermal physics with nothing naming the beam. RakeFaceCuttingPara3d no longer throws on a six-field parameter string (the guard read the seventh element behind a >= 6 check), and the published coefficient index mappings are corrected: the LocalProfileMillingPara(Vec3d, Vec3d) constructor maps (x,y,z) to (Ksr, Kst, Ksa) / (Kpr, Kpt, Kpa), and the 2d element index range is 0–3 with 0=Ksc, 1=Ksn, 2=Kpc, 3=Kpn. Training diagnostics name their cause. The per-step warnings split into Train-StepLuggage--Unreadable (the step luggage row could not be read back) and Train-StepEngagement--Missing (the row is present but the engagement was never built because physics was inactive at simulation time). The gather pass counts both against the eligible steps: silent at zero, one summary warning at or below MissingEngagementAbortRatio (default 0.25), and a configuration error above it. The breakdown in that summary is the diagnosis: misses sitting on the engagement level mean the play itself ran with physics inactive, while a scattered few on the luggage level are the read-back path, where a segment that covers a step but lacks its row is dropped and answers null once before the next read rebuilds it. Above the ratio the training aborts instead of continuing on what is left, because a parameter file built from a fraction of the play is indistinguishable from a sound one once it has been written — its coefficients are read back later as a real effect. Set the ratio to 1 to never abort. A gather pass that produces no samples at all now reports immediately rather than throwing inside the SVD solve, separating “not one step touched the workpiece” from “touched steps whose mapped force data yielded no usable shots”. New training knobs. EnableDesignMatrixSolver (default false) solves the least squares on a thin QR of the design matrix instead of forming the normal equations, which square the condition number; DesignMatrixSvdRelativeTol is its truncation cutoff. EnableCwePhasePairing (default false) determines each step's rotation phase with a cutter-workpiece-engagement block-pairing detector instead of the self-bootstrapped lead parameter, for one-flute and symmetric two-flute cutters in light radial side cuts. ReTrainAnchorOutputScale exposes the virtual anchor weight. LastMillingParaTrainResult captures the outcome — kind, sample flags, outlier ratio, success, output file, parameter name and note, correlation R, filtered sample count, parameter XML, timestamp — so a caller reads it without re-opening the .mp file. Time mapping is reworked around absolute wall-clock time. AddTimeDataByFile accepts DateTime windows, stored as IFileTimeSection forms, and the project-scoped MappingAnchorDateTime — seeded set-once from the date of the first controller instant seen — converts controller timestamps onto one run-relative axis. EndTimecode replaces AccumulatedTime as the canonical end-of-step time. CSV timing survives midnight. Step durations derive from full date-bearing instants, so a multi-day recording no longer produces negative durations and a negative chart time axis, and a non-physical duration from a spliced recording is clamped with a validation warning instead of stalling physics evaluation. Wall-clock time is dense. The trio moved into one optional sub-object, StepActualTime (Timecode / Instant / IsInterpolated), reached through ActualTime. On CSV plays every built step is stamped: steps built from a controller row re-anchor, and the steps between extrapolate along the machine timeline and are marked interpolated, which makes the actual-time mapper window per-step exact instead of sparse-anchor scaled. Pure NC plays keep null stamps. An empty step-shot pairing window is a data gap, not something to interpolate across. The window builder used to expand outward to the rows bracketing the gap, silently pairing such steps with force values that were never measured — a training run over a file whose transients had been carved out produced a plausible correlation and a full set of coefficients derived entirely from fabricated rows. Such a window now skips its step and one Map-ShotGap--StepsSkipped warning per mapping call carries the count; a window-edge row is interpolated only when its bracketing rows span at most two spindle revolutions. “No cut / No data for step” on freshly-simulated steps is fixed. The bulk step-data readers cached the absence of rows the writer had not committed yet, so a step that had just been simulated could report no data until the program was re-run. A covered-but-missing index now drops the stale segment and re-reads. New end-of-play warnings, each once per session: Play-Touch--None (the play finished without any step touching the workpiece), Tool-FluteCount--Zero (physics is on and a milling cutter resolves to zero flutes, so feed per tooth is undefined), and Play-Physics--None (physics is on and at least one step touched the workpiece but no touched step carries a physics brief — naming the three things that gate it: a tool bound to the spindle, the spindle actually rotating, and the workpiece cutting parameter). That last state previously surfaced one process later, as a training run gathering zero samples. Engagement is tessellation-invariant. The scan that turns a step's contact contours into the engaged angle ranges no longer depends on how many polygons the geometry kernel cut the contact surface into; forces on existing programs move accordingly — see Results that change on upgrade. Performance is collected in its own section below." }, "release-note/upgrading-to-3.2/nc-optimization-and-writeback.html": { "href": "release-note/upgrading-to-3.2/nc-optimization-and-writeback.html", @@ -8197,12 +8197,12 @@ "release-note/upgrading-to-3.2/results-that-change-on-upgrade.html": { "href": "release-note/upgrading-to-3.2/results-that-change-on-upgrade.html", "title": "Results that change on upgrade | HiAPI-C# 2025", - "summary": "Results that change on upgrade None of the following breaks a build. All of them change what a simulation produces, so a byte-for-byte comparison against 3.1.175 output will differ — usually because 3.1.175 was wrong. Silent wrong geometry, now fixed. Each of these produced a plausible-looking simulation of the wrong thing. The kinematic pivot anchor. The pivot-transform chain entry was built as K(0)·K(abc)⁻¹, folding the whole machine-zero forward kinematic — its linear part included — into the pre-pivot anchor. That linear part encodes each axis' motion sense and tool/workpiece-side ownership, so it mirrored the program components of every workpiece-side linear axis before the IK ran. On a table-side chain whose machine-zero linear part is diag(1,1,-1), every program Z was mirrored and a near-180° swing amplified it into metres of machine-Z error, floating the toolpath above the workpiece. The anchor is now the translation alone, matching what HardNc has always kept. Machines whose linear axes all ride the tool side are unaffected. G68 2D coordinate rotation was a silent no-op. TiltTransformUtil judged the active mode from the current block but always took the matrix from the previous one, so every G68 activation past the first block had its freshly authored rotation overwritten with an identity that then propagated. G68 rotation did nothing at all while the block's term still read G68, and the simulation machined the unrotated pattern. Re-running an existing G68 program now gives different — correct — geometry. A blank line reset G90/G91. A piece with no parsing section — a blank line, a comment-only line, %, an O-number — left the next block's single-step lookback empty, and it fell back to the G90 default. A program that was incremental throughout silently flipped to absolute mid-file. Such pieces now carry the positioning section forward like every other modal syntax. A Siemens D offset with no $TC_DP row resolved to zero length, in silence. A whole TRAORI program machined one tool length low. The read point now falls back to the generic tool-number-keyed height and emits SiemensToolOffset--TcdpRowMissing. G43.4 with an unresolvable H word activated RTCP with a zero-length tool. It now reports Comp-ToolHeight--001 as a warning and keeps processing the block. An omitted H is no longer a silent zero: it takes the equipped tool's own offset row first (HardNc parity), then a non-zero modal id, and only then warns Comp-ToolHeight--NoToolForOmittedH (plain G43) or Comp-ToolHeight--NoToolForOmittedHRtcp (G43.4). A vacant table row warns Comp-ToolHeight--RowMissing instead of compensating a zero length. G43.4 survived M02 / M30 and a rotary-only G53 still coupled through RTCP. A sequence that ended one program with M02 and started the next with a rotary rapid — without a G49 — kept tool-centre-point control on, pinned the tip, and dragged machine XYZ through the stock. On SoftNc the program-end block is a reset edge: tool-length compensation (G43 / G44 / G43.4, Siemens TRAORI, Heidenhain M128), tilt (G68 / G68.2 / CYCLE800 / PLANE / TRANS), G41/G42 and G81–G89 cancel on the next block, written as explicit cancel sections so modal carry cannot copy the previous state. The M02 block itself still runs under the modal state it executed with, so a retract on the same line as M30 still carries tool length. A rotary-only G53 under active RTCP now holds the linear axes at the previous machine position and stays McLinear, which is what G53 does on a control (no compensation). HardNc still carries G43.4 across M02 — the two engines are deliberately divergent on that edge; 3.2's default is SoftNc. A tool change that leaves G43.4 Hm alive for a different tool warns Comp-ToolHeight--RtcpOutlivesToolChange on the change block. Fanuc G54.1 Pn (also written G54 Pn) was not resolved. Additional work coordinate systems now resolve against the extended table; a selected row nobody has entered reports Coord-WorkOffset--AdditionalZero and runs on the machine origin. G59.1–G59.9 have a provider on the ISO presets. See Work Coordinates. Heidenhain DIN/ISO arc centres. I / J / K are absolute circle centres on Heidenhain — the ISO face of the klartext CC pole — not start-to-centre offsets. Reading them incrementally turned arcs into near-full phantom circles. Fixed in all three engines: the HardNc reader (IsIjkAbsolute), the SoftNc reader (IsIjkAbsolute) and the optimizer's write-back. G91 is the exception: an incremental block switches the words back to start-to-centre offsets, so an arc programmed under G91 is unaffected by this change. Also delivered on the 3.1.175.x service line. Feed per tooth, MRR and cutting forces follow the equipped tool's tip, not the controller's F word. The physics used to read the commanded CL feedrate. It now reads the step's real tip feedrate (ActualTipFeedrate_mmds, client key ActualTipFeedrate_mmdmin): the tip's displacement relative to the workpiece over the step duration. On XYZ moves, CL files and RTCP with the equipped tool's own offset the two agree (the recomputation moves forces by at most about 1e-4 relative, from the TimeSpan-quantised step duration); they part under RTCP with a tool-length offset that does not describe the equipped tool, on rotary-axis-limited simultaneous five-axis blocks (the tip is slower than F, up to a few percent), and wherever the commanded value was stale. A feed block that does not move lost its F word. A block that repeats the current position (X.. Y.. Z.. F1600. right after the same point at F800., a common CAM habit) returned on zero distance before emitting anything, so every following block showed and cut at the old feed. Its ActFeedrate now lands on a zero-length linear, arc or polar block alike. The same stale commanded value is one of the cases the tip-feedrate split above parts on. A rotary-bearing act mixed tip travel with the commanded CL feed resolution. On a pure RTCP rapid swing the CL point stands still, the commanded feed is ~0, and dividing the equipped tool's tip sweep by that resolution saturated the step count (the play appeared to hang on one line). A rotary-bearing act now splits by posture change (each rotary-axis delta over the rotary resolution) and by spindle cycles when the spindle turns — never by tip travel over the CL-feed resolution. Step counts of existing five-axis projects therefore shift on non-RTCP rotary blocks; XYZ-only programs are unaffected. A K0 word on a HardNc G02/G03 saturated the turn count. Under the default G17 plane a written-but-zero plane-normal word divided the axial travel by zero, the additional-turn count saturated to int.MaxValue, and one arc block became a spiral act of roughly 302 simulated years — the play appeared to hang on a single NC line. The reading now falls back to the closed-circle rule for a zero pace, matching the guard the SoftNc side already had. Indexed-rotary programs folded the pivot into plain moves. A block with no active G68.2 or G43.4 no longer folds the kinematic pivot transform into a plain XYZ move, which is what a real controller does with a table-side rotary program. The radius-compensation arc transient cache landed on the wrong block. Any non-motion line between the corner and the arc orphaned the cache, so the arc lost its leading linear bridge and began at the corner intersection instead of on the offset arc. Cutter radius compensation on G18 / G19 ran out of the plane. Both engines built the perpendicular as Z × axis whatever plane was selected, so under G18 or G19 the whole offset went one radius along the plane normal (a G41 region in the ZX plane was displaced in Y), every arc of the region reported Arc-EndpointOffRadius, and the RadiusComp--Interference gate could not fire there. Both engines now take the perpendicular, the in-plane test for blocks without movement and the interference gate from the selected plane: the offset lies in the plane, left/right is judged looking down the plane's positive normal (the same convention that orients G02/G03), and the diagnostics behave as on G17. G17 programs are unaffected. The G68.2 tool-axis IK fallback probed the mirrored tool axis. Both normal-only fallbacks in IsoG68p2TiltSyntax read the transposed third column instead of the third row. On the no-hint path this only skewed a warning gate, but the explicit A/B/C path seeds its hint blend from that solve, so a machine with fewer than three rotary axes composed a mirrored tilted plane. A Fanuc WHILE forward jump bound to the wrong END. Sequential loops idiomatically reuse DO 1, so a second WHILE's falsy-condition exit bound to the first loop's END 1 and redirected execution to a point before the second WHILE — an unbounded loop the iteration watchdog cannot see, because it only ticks on END reverse jumps. The jump now uses the anchored label scan the Siemens loop family already used. Heidenhain G28 is MIRROR IMAGE, not a reference-point return. On the Heidenhain preset the shared pipeline had been reading it as the Fanuc reference return, so a G28 X block minted a phantom rapid to home while the mirror silently vanished. It is now simulated as a program-to-MC transform, ReferenceReturnSyntax leaves the Heidenhain logic list, and klartext CYCL DEF 8 records the same mirror statement so one program mirrors identically in either dialect. HardNc keeps the Fanuc reading, so the two engines are deliberately divergent on Heidenhain G28 files and any parity comparison must account for it. MathUtil.Convert_inchdmin_To_mmds returned mm/min, not mm/s. The body multiplied by 25.4 and never divided by 60, so a caller trusting the name got a 60× feedrate; the sibling Convert_mmdmin_To_mmds divides as its name demands. No shipped path called it — the CL/APT feedrate route converts inches-per-minute to mm/min itself — so this changes nothing inside the product, but a caller who had compensated for the old behaviour must remove that compensation. GetRByZ(List) never interpolated. The list overload looked up its ceiling node with the floor lookup, so floor equalled ceiling and the method degenerated into a step function. For a sharp cone whose inner-beam Z–R list has no node between apex and rim, that pinned the inner radius to 0 across the whole cone face and produced NaN flute vertices — the root cause of the transparent cone-tip flute that 3.1.180 addressed at the display layer. It affects every consumer of radius-by-Z interpolation, force geometry included. Numerical results move even where nothing was renamed. Five-axis IK is roughly 1000× tighter. The rotary solver behind XyzabcSolver now runs coarse→polish: the coarse stage keeps the original dot residual so solve success and failure semantics are unchanged, then a [dot, cross, rr-per-axis] system polishes. The dot criterion is quadratically blind to angle error — an envelope of about 1.4e-3 rad, and the resulting tip error is that envelope times the tool length — so adding the cross term restores quadratic convergence and drops the envelope to about 1e-6 rad. Failed solves no longer pollute the implicit seed, and the measure-zero perfect-saddle case is escaped by a deterministic retry offset instead of by leftover seed pollution. ActMcXyzLinearContour steps by euclidean tip travel instead of the largest per-axis component, so LinearResolution_mm now caps actual tool-tip travel per step and a diagonal move produces up to √3× more steps at the same setting. Cutter–workpiece engagement no longer depends on how the contact surface was tiled. The scan that turns a step's contact contours into the engaged angle ranges of LayerMillingEngagement switched to a bounding-box approximation on dense steps, could pull a merged range back when a shorter slice nested inside it, started bottom rings the floor never reached, and read the winding of each triangle — so the same cut produced a different engagement, and therefore different cutting forces and temperatures, depending on how many polygons the geometry kernel happened to cut the contact surface into. Every triangle is now scanned exactly and orientation-free; a cylinder wall and a flat floor sector with known engagement arcs reproduce them to 1e-9 rad at four tessellations, and the managed and native paths stay bit-identical. Re-running an existing program moves the forces on most engaged steps (58–95% of them on the bench fixtures); the largest moves are floors that used to register as empty — the whole bottom disc dropped out — and side ranges that were fragmented into pieces separated by phantom 1° gaps. Coefficient sets trained before this change embed the old engagement of their training program; retrain on a replay if that fit matters. The SoftNc pipeline is the default engine. Executed SyntaxPieces freeze to UTF-8 (below), so their JsonObject is a fresh read-only snapshot per call rather than a retained live graph. SyntaxPiece.SentenceIndex becomes a session-global execution-order counter and is no longer contiguous per file. Repeated NC diagnostics fold into per-run summaries at the run boundaries. HardNc tool changes fire on M06 / Heidenhain TOOL CALL rather than on a changed T word — a bare T is magazine pre-selection, and a same-tool M06 still runs the changer cycle — and unset HardNcEnv tooling defaults become the three-axis shape (XYZ = NaN, NaN, 0; ABC all NaN). The old defaults swung all three rotary axes home on every M06, which no post expects." + "summary": "Results that change on upgrade None of the following breaks a build. All of them change what a simulation produces, so a byte-for-byte comparison against 3.1.175 output will differ — usually because 3.1.175 was wrong. Silent wrong geometry, now fixed. Each of these produced a plausible-looking simulation of the wrong thing. The kinematic pivot anchor. The pivot-transform chain entry was built as K(0)·K(abc)⁻¹, folding the whole machine-zero forward kinematic — its linear part included — into the pre-pivot anchor. That linear part encodes each axis' motion sense and tool/workpiece-side ownership, so it mirrored the program components of every workpiece-side linear axis before the IK ran. On a table-side chain whose machine-zero linear part is diag(1,1,-1), every program Z was mirrored and a near-180° swing amplified it into metres of machine-Z error, floating the toolpath above the workpiece. The anchor is now the translation alone, matching what HardNc has always kept. Machines whose linear axes all ride the tool side are unaffected. G68 2D coordinate rotation was a silent no-op. TiltTransformUtil judged the active mode from the current block but always took the matrix from the previous one, so every G68 activation past the first block had its freshly authored rotation overwritten with an identity that then propagated. G68 rotation did nothing at all while the block's term still read G68, and the simulation machined the unrotated pattern. Re-running an existing G68 program now gives different — correct — geometry. A blank line reset G90/G91. A piece with no parsing section — a blank line, a comment-only line, %, an O-number — left the next block's single-step lookback empty, and it fell back to the G90 default. A program that was incremental throughout silently flipped to absolute mid-file. Such pieces now carry the positioning section forward like every other modal syntax. A Siemens D offset with no $TC_DP row resolved to zero length, in silence. A whole TRAORI program machined one tool length low. The read point now falls back to the generic tool-number-keyed height and emits SiemensToolOffset--TcdpRowMissing. G43.4 with an unresolvable H word activated RTCP with a zero-length tool. It now reports Comp-ToolHeight--001 as a warning and keeps processing the block. An omitted H is no longer a silent zero: it takes the equipped tool's own offset row first (HardNc parity), then a non-zero modal id, and only then warns Comp-ToolHeight--NoToolForOmittedH (plain G43) or Comp-ToolHeight--NoToolForOmittedHRtcp (G43.4). A vacant table row warns Comp-ToolHeight--RowMissing instead of compensating a zero length. G43.4 survived M02 / M30 and a rotary-only G53 still coupled through RTCP. A sequence that ended one program with M02 and started the next with a rotary rapid — without a G49 — kept tool-centre-point control on, pinned the tip, and dragged machine XYZ through the stock. On SoftNc the program-end block is a reset edge: tool-length compensation (G43 / G44 / G43.4, Siemens TRAORI, Heidenhain M128), tilt (G68 / G68.2 / CYCLE800 / PLANE / TRANS), G41/G42 and G81–G89 cancel on the next block, written as explicit cancel sections so modal carry cannot copy the previous state. The M02 block itself still runs under the modal state it executed with, so a retract on the same line as M30 still carries tool length. A rotary-only G53 under active RTCP now holds the linear axes at the previous machine position and stays McLinear, which is what G53 does on a control (no compensation). HardNc still carries G43.4 across M02 — the two engines are deliberately divergent on that edge; 3.2's default is SoftNc. A tool change that leaves G43.4 Hm alive for a different tool warns Comp-ToolHeight--RtcpOutlivesToolChange on the change block. Fanuc G54.1 Pn (also written G54 Pn) was not resolved. Additional work coordinate systems now resolve against the extended table; a selected row nobody has entered reports Coord-WorkOffset--AdditionalZero and runs on the machine origin. G59.1–G59.9 have a provider on the ISO presets. See Work Coordinates. Heidenhain DIN/ISO arc centres. I / J / K are absolute circle centres on Heidenhain — the ISO face of the klartext CC pole — not start-to-centre offsets. Reading them incrementally turned arcs into near-full phantom circles. Fixed in all three engines: the HardNc reader (IsIjkAbsolute), the SoftNc reader (IsIjkAbsolute) and the optimizer's write-back. G91 is the exception: an incremental block switches the words back to start-to-centre offsets, so an arc programmed under G91 is unaffected by this change. Also delivered on the 3.1.175.x service line. Feed per tooth, MRR and cutting forces follow the equipped tool's tip, not the controller's F word. The physics used to read the commanded CL feedrate. It now reads the step's real tip feedrate (ActualTipFeedrate_mmds, client key ActualTipFeedrate_mmdmin): the tip's displacement relative to the workpiece over the step duration. On XYZ moves, CL files and RTCP with the equipped tool's own offset the two agree (the recomputation moves forces by at most about 1e-4 relative, from the TimeSpan-quantised step duration); they part under RTCP with a tool-length offset that does not describe the equipped tool, on rotary-axis-limited simultaneous five-axis blocks (the tip is slower than F, up to a few percent), and wherever the commanded value was stale. A feed block that does not move lost its F word. A block that repeats the current position (X.. Y.. Z.. F1600. right after the same point at F800., a common CAM habit) returned on zero distance before emitting anything, so every following block showed and cut at the old feed. Its ActFeedrate now lands on a zero-length linear, arc or polar block alike. The same stale commanded value is one of the cases the tip-feedrate split above parts on. A rotary-bearing act mixed tip travel with the commanded CL feed resolution. On a pure RTCP rapid swing the CL point stands still, the commanded feed is ~0, and dividing the equipped tool's tip sweep by that resolution saturated the step count (the play appeared to hang on one line). A rotary-bearing act now splits by posture change (each rotary-axis delta over the rotary resolution) and by spindle cycles when the spindle turns — never by tip travel over the CL-feed resolution. Step counts of existing five-axis projects therefore shift on non-RTCP rotary blocks; XYZ-only programs are unaffected. A K0 word on a HardNc G02/G03 saturated the turn count. Under the default G17 plane a written-but-zero plane-normal word divided the axial travel by zero, the additional-turn count saturated to int.MaxValue, and one arc block became a spiral act of roughly 302 simulated years — the play appeared to hang on a single NC line. The reading now falls back to the closed-circle rule for a zero pace, matching the guard the SoftNc side already had. Indexed-rotary programs folded the pivot into plain moves. A block with no active G68.2 or G43.4 no longer folds the kinematic pivot transform into a plain XYZ move, which is what a real controller does with a table-side rotary program. The radius-compensation arc transient cache landed on the wrong block. Any non-motion line between the corner and the arc orphaned the cache, so the arc lost its leading linear bridge and began at the corner intersection instead of on the offset arc. Cutter radius compensation on G18 / G19 ran out of the plane. Both engines built the perpendicular as Z × axis whatever plane was selected, so under G18 or G19 the whole offset went one radius along the plane normal (a G41 region in the ZX plane was displaced in Y), every arc of the region reported Arc-EndpointOffRadius, and the RadiusComp--Interference gate could not fire there. Both engines now take the perpendicular, the in-plane test for blocks without movement and the interference gate from the selected plane: the offset lies in the plane, left/right is judged looking down the plane's positive normal (the same convention that orients G02/G03), and the diagnostics behave as on G17. G17 programs are unaffected. The G68.2 tool-axis IK fallback probed the mirrored tool axis. Both normal-only fallbacks in IsoG68p2TiltSyntax read the transposed third column instead of the third row. On the no-hint path this only skewed a warning gate, but the explicit A/B/C path seeds its hint blend from that solve, so a machine with fewer than three rotary axes composed a mirrored tilted plane. A Fanuc WHILE forward jump bound to the wrong END. Sequential loops idiomatically reuse DO 1, so a second WHILE's falsy-condition exit bound to the first loop's END 1 and redirected execution to a point before the second WHILE — an unbounded loop the iteration watchdog cannot see, because it only ticks on END reverse jumps. The jump now uses the anchored label scan the Siemens loop family already used. Heidenhain G28 is MIRROR IMAGE, not a reference-point return. On the Heidenhain preset the shared pipeline had been reading it as the Fanuc reference return, so a G28 X block minted a phantom rapid to home while the mirror silently vanished. It is now simulated as a program-to-MC transform, ReferenceReturnSyntax leaves the Heidenhain logic list, and klartext CYCL DEF 8 records the same mirror statement so one program mirrors identically in either dialect. HardNc keeps the Fanuc reading, so the two engines are deliberately divergent on Heidenhain G28 files and any parity comparison must account for it. MathUtil.Convert_inchdmin_To_mmds returned mm/min, not mm/s. The body multiplied by 25.4 and never divided by 60, so a caller trusting the name got a 60× feedrate; the sibling Convert_mmdmin_To_mmds divides as its name demands. No shipped path called it — the CL/APT feedrate route converts inches-per-minute to mm/min itself — so this changes nothing inside the product, but a caller who had compensated for the old behaviour must remove that compensation. GetRByZ(List) never interpolated. The list overload looked up its ceiling node with the floor lookup, so floor equalled ceiling and the method degenerated into a step function. For a sharp cone whose inner-beam Z–R list has no node between apex and rim, that pinned the inner radius to 0 across the whole cone face and produced NaN flute vertices — the root cause of the transparent cone-tip flute that 3.1.180 addressed at the display layer. It affects every consumer of radius-by-Z interpolation, force geometry included. Numerical results move even where nothing was renamed. Five-axis IK is roughly 1000× tighter. The rotary solver behind XyzabcSolver now runs coarse→polish: the coarse stage keeps the original dot residual so solve success and failure semantics are unchanged, then a [dot, cross, rr-per-axis] system polishes. The dot criterion is quadratically blind to angle error — an envelope of about 1.4e-3 rad, and the resulting tip error is that envelope times the tool length — so adding the cross term restores quadratic convergence and drops the envelope to about 1e-6 rad. Failed solves no longer pollute the implicit seed, and the measure-zero perfect-saddle case is escaped by a deterministic retry offset instead of by leftover seed pollution. ActMcXyzLinearContour steps by euclidean tip travel instead of the largest per-axis component, so LinearResolution_mm now caps actual tool-tip travel per step and a diagonal move produces up to √3× more steps at the same setting. Cutter–workpiece engagement no longer depends on how the contact surface was tiled. The scan that turns a step's contact contours into the engaged angle ranges of LayerMillingEngagement switched to a bounding-box approximation on dense steps, could pull a merged range back when a shorter slice nested inside it, started bottom rings the floor never reached, and read the winding of each triangle — so the same cut produced a different engagement, and therefore different cutting forces and temperatures, depending on how many polygons the geometry kernel happened to cut the contact surface into. Every triangle is now scanned exactly and orientation-free; a cylinder wall and a flat floor sector with known engagement arcs reproduce them to 1e-9 rad at four tessellations, and the managed and native paths stay bit-identical. Re-running an existing program moves the forces on most engaged steps (58–95% of them on the bench fixtures); the largest moves are floors that used to register as empty — the whole bottom disc dropped out — and side ranges that were fragmented into pieces separated by phantom 1° gaps. Coefficient sets trained before this change embed the old engagement of their training program; retrain on a replay if that fit matters. SoftNc canned cycles index a rotary axis. A G81–G89 repeat block carrying an A / B / C word used to skip the hole (rotary-only repeat), drill it at the previous angle (mixed block) or let it follow the table under G68.2. It now indexes the table and drills again, pre-positioning XYZ and the table in one move, and under G68.2 without RTCP the feature frame stays pinned in machine space. Under G91 only the words the block itself spoke are increments — an X-pitch repeat used to add the previous cycle's Y a second time and drill upward. A bolt-circle program that ran short of holes, or drilled them in the wrong place, now matches the HardNc replay. A rotary word under modal G91 is an increment. G91 … C20. then C20. left the table at 20; it is 40 now. A spoken G91 B270. stays a +270° traverse instead of folding to −90°, and a G91 G28 rotary intermediate anchors on the previous modal angle instead of on zero (G91 G28 C0 from C90 now holds the table and returns home instead of swinging to 0 first). Per-word directives (C=AC(90), ACP / ACN, IC()) are unchanged. HardNc keeps its absolute reading and warns. Rotary IK from a pole seed. Every solve attempt now runs coarse then polish, so a small tilt with a large azimuth that ran out of iterations a few milliradians short — and was refused by G53.1, leaving the table at A = C = 0 with the tilt active and the path rotated off the part — now solves to 1e-8 rad. On a Fanuc IJK grid from the pole seed 54 / 69 failures per A/C chain become 0; a CL program goes from 44 dropped endpoints of 536 to 0. The rotary branch inside the travel wins. When the nearest IK solution lies outside an axis' configured travel, G53.1, G68.2, CYCLE800, PLANE SPATIAL and LN now take the admissible branch nearest the entry (sign, half-turn and supplement combinations are searched); a posture the cradle cannot take is no longer commanded silently. This needs the travel to be known, and it now is on every project: stroke limits declared only in the legacy machine-limits boxes are copied into the controller parameter table on load for the axes carrying no end there, where they used to be checked against nothing on SoftNc. An axis parked exactly on its limit is no longer reported (Tolerance). The SoftNc pipeline is the default engine. Executed SyntaxPieces freeze to UTF-8 (below), so their JsonObject is a fresh read-only snapshot per call rather than a retained live graph. SyntaxPiece.SentenceIndex becomes a session-global execution-order counter and is no longer contiguous per file. Repeated NC diagnostics fold into per-run summaries at the run boundaries. HardNc tool changes fire on M06 / Heidenhain TOOL CALL rather than on a changed T word — a bare T is magazine pre-selection, and a same-tool M06 still runs the changer cycle — and unset HardNcEnv tooling defaults become the three-axis shape (XYZ = NaN, NaN, 0; ABC all NaN). The old defaults swung all three rotary axes home on every M06, which no post expects." }, "release-note/upgrading-to-3.2/session-project-and-commands.html": { "href": "release-note/upgrading-to-3.2/session-project-and-commands.html", "title": "Session, project and command model | HiAPI-C# 2025", - "summary": "Session, project and command model A parser and its per-case data travel as one file. NcRunnerSuit bundles a runner with the dependency data a particular job needs, as a single file-loadable unit. The project holds three suits — NcRunnerSuit, CsvRunnerSuit and ClsfRunnerSuit — and ReadNcRunnerSuit / WriteNcRunnerSuit switch the active parser mid-project from a suit file. A switch attempted while a program is playing is refused with ReadNcRunnerSuit--Refused. One NC runner configuration is shareable across projects. Per-case data — tool offsets, work-coordinate offsets, Siemens frames, Heidenhain datums, retained macro variables, seeded brand parameter tables — travels as proxy placeholders inside SoftNcRunner and resolves against the owning project's per-case list, so a controller configuration is no longer welded to the job it was first built for. Machine-config consumers read the resolved view through GetEffectiveNcDependencyList; legacy XML and NcEnv-based projects still load and migrate automatically. HTTP guards and one envelope. RequireActiveSessionAttribute answers a session-scoped action with HTTP 409 and an ApiActionResult.NoActiveSession() body when no session is active, instead of the previous null-reference 500; RequireLoadedProjectAttribute does the same for the project-level controller. Both are applied at the controller level and honour opt-out markers (AllowNoActiveSessionAttribute, AllowNoLoadedProjectAttribute). Mutating actions inject a fresh MessageCollector and return the collected notifications inline in the shared ApiActionResult envelope, so a REST or AI caller sees progress, success and error messages in the response instead of only out of band. LocalProjectServiceController exposes the project-level (session-independent) surface parallel to SessionShellController. Session commands declare themselves. CommandCatalogAttribute marks an ISessionCommand as user-addable and places it in a CommandCategory (Setup / Program / Optimization / Output / Flow, declaration order = display order) with an Order sort key and an optional wire kind (default: the class name minus the Command suffix, lower-cased). CommandFieldAttribute marks a bool / int / double / string property as a directly editable scalar with an optional label, unit and physics-licence flag, so a generic editor renders and updates it without a hand-written form. A command without the catalog attribute stays loadable from project files but is not offered for creation. Program File dispatches by kind. NcFileCommand gains an NcKind property (XML element NcKind, absent = Auto for legacy projects) and its mission label becomes “Program File”; each command resolves its own file, so a List of Program Files can mix brand NC, CL and CSV. Two session commands saved but could never be read back. ListCommand.Reg chained every type except NcOptOptionCommand and RecordMeshedGeomCommand, so any XML round-trip of an entry holding one threw KeyNotFoundException out of the XFactory generator lookup — reloading a saved project containing an NC Optimization Config command failed. Both are now chained. Naming. Title is an optional name shown in place of the type name, so nested command lists can be named in the mission tree. PreSettingCommand displays as “General Config” and NcOptOptionCommand as “NC Optimization Config” — display strings only, so serialization and endpoints are untouched. A bare non-list PlayerCommand root is normalized on read into a single enabled entry of the default ListCommand. Command titles, catalog categories and field labels are now localized, and a zh-Hans resource set was created (none existed before). Default-script template keys stay untranslated on purpose — they compose the C# comments and script title written into the user's .hincproj, which travels to other machines. Script faults are keyed errors. A CompilationErrorException or a faulted script task used to surface as an anonymous warning; ScriptCommand now reports ScriptCommand-Compile--Failed with the full diagnostic list and ScriptCommand-Run--Fault with the exception, both at Error severity. A fresh session re-homes the machining chain. ResetRuntime wrote the configured XYZ home but hard-coded ABC to 0, and it only ran on project switch or pace-player reset — never before a plain Play. A freshly loaded project therefore started from whatever pose the .mt happened to serialize, while the act stream interpolated from the home seed, so the first contour swept from a pose the machine was never at and cut along the way. The re-home now reads the rotary homes from the same home configuration and also runs at BeginSession; a mid-session replay is untouched. What a reset actually resets. ResetRuntime now also rewinds the NC-runner session state, so the next play restarts file and line indexing from scratch the way PowerReset does, and it resets the CL device pose to identity. It no longer clobbers MachiningResolution_mm: the runtime resolution is seeded from the workpiece's initial resolution only when a project loads, so an explicit override survives a runtime reset and a workpiece swap. Mixed runner kinds in one session are refused. NcRunnerSessionState remembers the runner that initialised it and RunNcLines refuses a different one with RunNcLines--RunnerMismatch — reachable now that NcKind.Auto makes mixed-kind missions a first-class flow. Stale state on a chain or project switch. Building the coordinate converter nulls the rotary solver when the chain is not an IXyzabcChain, so a solver built for the old machine no longer keeps converting after a switch to a CL device; and ClearCache now also calls ClearIdealGeomCache, so loading another project stops rendering the previous project's target geometry. Project-file operations are serialized through a zero-wait gate. A New / Load / Save / Reload / Close arriving while another is in progress throws ProjectFileBusyException immediately instead of racing into a file-in-use IOException. Close was the one operation left outside the gate, so a Close arriving during a Save could let the Save finish without writing and still return 200; it now refuses with the same 409 the other five ops already used. LoadProject and ReloadProject take a message sink for load-time diagnostics (a referenced STL missing on disk, a child XML that will not deserialize). A load-time diagnostic does not fail the load; passing no sink leaves the application log as the only witness. See Message Management. AlignWorkpieceProgramZeroToIso computes in the machine-zero state. It reflects the assembly and zeroes every dynamic axis before querying displacements, so the alignment is correct even when the live machine's axes are displaced. RunCount counts runs started, incremented synchronously before the run's task launches and never reset. Pairing it with IsFinished in one snapshot lets a polling client distinguish “the run I started has finished” from a stale Finished left by a previous run." + "summary": "Session, project and command model A parser and its per-case data travel as one file. NcRunnerSuit bundles a runner with the dependency data a particular job needs, as a single file-loadable unit. The project holds three suits — NcRunnerSuit, CsvRunnerSuit and ClsfRunnerSuit — and ReadNcRunnerSuit / WriteNcRunnerSuit switch the active parser mid-project from a suit file. A switch attempted while a program is playing is refused with ReadNcRunnerSuit--Refused. One NC runner configuration is shareable across projects. Per-case data — tool offsets, work-coordinate offsets, Siemens frames, Heidenhain datums, retained macro variables, seeded brand parameter tables — travels as proxy placeholders inside SoftNcRunner and resolves against the owning project's per-case list, so a controller configuration is no longer welded to the job it was first built for. Machine-config consumers read the resolved view through GetEffectiveNcDependencyList; legacy XML and NcEnv-based projects still load and migrate automatically. HTTP guards and one envelope. RequireActiveSessionAttribute answers a session-scoped action with HTTP 409 and an ApiActionResult.NoActiveSession() body when no session is active, instead of the previous null-reference 500; RequireLoadedProjectAttribute does the same for the project-level controller. Both are applied at the controller level and honour opt-out markers (AllowNoActiveSessionAttribute, AllowNoLoadedProjectAttribute). Mutating actions inject a fresh MessageCollector and return the collected notifications inline in the shared ApiActionResult envelope, so a REST or AI caller sees progress, success and error messages in the response instead of only out of band. LocalProjectServiceController exposes the project-level (session-independent) surface parallel to SessionShellController. Session commands declare themselves. CommandCatalogAttribute marks an ISessionCommand as user-addable and places it in a CommandCategory (Setup / Program / Optimization / Output / Flow, declaration order = display order) with an Order sort key and an optional wire kind (default: the class name minus the Command suffix, lower-cased). CommandFieldAttribute marks a bool / int / double / string property as a directly editable scalar with an optional label, unit and physics-licence flag, so a generic editor renders and updates it without a hand-written form. A command without the catalog attribute stays loadable from project files but is not offered for creation. Program File dispatches by kind. NcFileCommand gains an NcKind property (XML element NcKind, absent = Auto for legacy projects) and its mission label becomes “Program File”; each command resolves its own file, so a List of Program Files can mix brand NC, CL and CSV. Two session commands saved but could never be read back. ListCommand.Reg chained every type except NcOptOptionCommand and RecordMeshedGeomCommand, so any XML round-trip of an entry holding one threw KeyNotFoundException out of the XFactory generator lookup — reloading a saved project containing an NC Optimization Config command failed. Both are now chained. Naming. Title is an optional name shown in place of the type name, so nested command lists can be named in the mission tree. PreSettingCommand displays as “General Config” and NcOptOptionCommand as “NC Optimization Config” — display strings only, so serialization and endpoints are untouched. A bare non-list PlayerCommand root is normalized on read into a single enabled entry of the default ListCommand. Command titles, catalog categories and field labels are now localized, and a zh-Hans resource set was created (none existed before). Default-script template keys stay untranslated on purpose — they compose the C# comments and script title written into the user's .hincproj, which travels to other machines. Script faults are keyed errors. A CompilationErrorException or a faulted script task used to surface as an anonymous warning; ScriptCommand now reports ScriptCommand-Compile--Failed with the full diagnostic list and ScriptCommand-Run--Fault with the exception, both at Error severity. A fresh session re-homes the machining chain. ResetRuntime wrote the configured XYZ home but hard-coded ABC to 0, and it only ran on project switch or pace-player reset — never before a plain Play. A freshly loaded project therefore started from whatever pose the .mt happened to serialize, while the act stream interpolated from the home seed, so the first contour swept from a pose the machine was never at and cut along the way. The re-home now reads the rotary homes from the same home configuration and also runs at BeginSession; a mid-session replay is untouched. What a reset actually resets. ResetRuntime now also rewinds the NC-runner session state, so the next play restarts file and line indexing from scratch the way PowerReset does, and it resets the CL device pose to identity. It no longer clobbers MachiningResolution_mm: the runtime resolution is seeded from the workpiece's initial resolution only when a project loads, so an explicit override survives a runtime reset and a workpiece swap. Every NC-pipeline rewind raises one event. Suit rewiring, PowerReset and ResetRuntime each dropped the runner session state on their own with no notification, so the file / sentence counters restarted at 0 on the next play while the session and its subscribers lived on — a consumer keyed by file index merged the next NC file into the previous file's numbers. One seam now performs the reset (session state and the NC diagnostics) and raises OnNcPipelineReset, an app-lifetime event, before the next file's pieces arrive. Mixed runner kinds in one session are refused. NcRunnerSessionState remembers the runner that initialised it and RunNcLines refuses a different one with RunNcLines--RunnerMismatch — reachable now that NcKind.Auto makes mixed-kind missions a first-class flow. Stale state on a chain or project switch. Building the coordinate converter nulls the rotary solver when the chain is not an IXyzabcChain, so a solver built for the old machine no longer keeps converting after a switch to a CL device; and ClearCache now also calls ClearIdealGeomCache, so loading another project stops rendering the previous project's target geometry. Project-file operations are serialized through a zero-wait gate. A New / Load / Save / Reload / Close arriving while another is in progress throws ProjectFileBusyException immediately instead of racing into a file-in-use IOException. Close was the one operation left outside the gate, so a Close arriving during a Save could let the Save finish without writing and still return 200; it now refuses with the same 409 the other five ops already used. LoadProject and ReloadProject take a message sink for load-time diagnostics (a referenced STL missing on disk, a child XML that will not deserialize). A load-time diagnostic does not fail the load; passing no sink leaves the application log as the only witness. See Message Management. AlignWorkpieceProgramZeroToIso computes in the machine-zero state. It reflects the assembly and zeroes every dynamic axis before querying displacements, so the alignment is correct even when the live machine's axes are displaced. RunCount counts runs started, incremented synchronously before the run's task launches and never reset. Pairing it with IsFinished in one snapshot lets a polling client distinguish “the run I started has finished” from a stale Finished left by a previous run." }, "release-note/upgrading-to-3.2/the-package-line.html": { "href": "release-note/upgrading-to-3.2/the-package-line.html", @@ -8217,7 +8217,7 @@ "technique/api-foundations/getting-started.html": { "href": "technique/api-foundations/getting-started.html", "title": "Getting Started with HiAPI | HiAPI-C# 2025", - "summary": "Getting Started with HiAPI What a first HiAPI application needs: where the packages come from, what the program has to initialise, and the shape every HiNC program follows once it runs. Installation Create a dotnet project. A console or service project targets net10.0. A project that also takes one of the Windows UI packages targets net10.0-windows — that is what Hi.WinForm and Hi.WpfPlus are built for, and a plain net10.0 project cannot reference them. An earlier target framework cannot reference any of the packages. Register the HiAPI package source on the machine. The feed requires authentication, and the same account that gives you the sample repositories gives you the packages. One command registers the source and its credentials, which is the whole of what a restore needs: dotnet nuget add source https://superhightech-gitea.webredirect.org/api/packages/HiAPI/nuget/index.json --name HiAPI --username --password --store-password-in-clear-text Run it once per machine. Customers served by the mainland mirror register the feed address issued with their account in place of the URL above; nothing else changes. Prefer this to a project-local nuget.config, and never declare the feed in both places. NuGet resolves credentials by source name, and the match is case-sensitive, so a file that declares the same URL under a name the machine holds no credentials for adds a second, credential-less source. NuGet asks every source about every package, and one 401 fails the whole restore instead of falling through — so the packages it then reports as missing are the public nuget.org ones, and the cause is nowhere near the symptom. A credential-free file cannot stand in for the command either: the feed rejects anonymous requests, so it carries a fresh clone no further than having no source at all. Where a per-machine source is genuinely unavailable — an ephemeral build agent, say — a nuget.config beside the project file does the job, provided it is the only declaration of that URL and carries its own credentials under exactly the key it gave the source: That file holds a password in clear text: keep it out of version control. In the dotnet project file, add the package reference. In the program file, setting the HiNC application initialization and finalization. using Hi.HiNcKits; using Microsoft.Extensions.Logging; using System; namespace Sample { /// /// A sample class demonstrating initialization and usage of the HiAPI framework. /// Shows the basic setup of display engine, MongoDB server, licensing, and other core functionality. /// /// /// This example serves as an entry point for those getting started with HiAPI. /// It demonstrates proper initialization and teardown of key components. /// ### Source Code /// [!code-csharp[SampleCode](~/../Hi.Sample/HelloHiAPI.cs)] /// public static class HelloHiAPI { static int Main(string[] args) { Console.WriteLine(\"HiAPI starting.\"); using var loggerFactory = Microsoft.Extensions.Logging.LoggerFactory.Create(b => b.AddConsole()); LocalApp.AppBegin(loggerFactory.CreateLogger(\"Hi.Sample\")); Console.WriteLine(\"Hello World! HiAPI.\"); LocalApp.AppEnd(); Console.WriteLine(\"HiAPI exited.\"); return 0; } } } The Shape of a HiNC Program Every HiNC program, whether it is the shipped application or twenty lines in a console project, runs the same five steps. DemoBuildMachiningProject in the Hi.Sample repository is the complete worked example. graph TD A[\"Create MachiningProject\"] --> B[\"Setting Environment\"] B --> C[\"Setting Project Tasks\"] C --> D[\"Run Tasks\"] D --> E[\"View Analysis Results\"] 1. Create MachiningProject Creating a machining project is the first step in the HiNC workflow, accomplished by initializing a MachiningProject object. 2. Setting Environment In MachiningProject The equipment has two faces. SetupEquipment is the authored one — the only face a project file persists, and the one every setting below is written to. MachiningEquipment is the runtime face the runner, physics, collision and execution display read; it is rebuilt from the authored face at project assignment and at session boundaries, so a value written onto it is discarded rather than saved. Set SetupEquipment: Usually one-time settings: MachiningChain - Configure the complete machine tool including geometry, kinematic chain, and coordinate transformations SpindleCapability - Configure SpindleCapability CoolantHeatCondition - Configure coolant heat conditions BackgroundTemperature_C - Configure the environment background temperature in Celsius; BackgroundTemperature_K holds the same value in Kelvin Variable settings: Fixture - Configure fixture Workpiece - Configure workpiece Set MachiningToolHouse - Configure tool house Set HardNcEnv (Controller) - Configure NC system environment parameters 3. Setting Project Tasks Set sequential tasks using PlayerCommand: Set NC Files - Set the file path and customize simulation and optimization settings for each NC file Configure NC optimization - Configure NC code optimization parameters Set GeomDiffCommand - Configure geometry comparison functionality to compare target workpiece shape with simulated shape Set MillingTraining - Configure milling parameter training to calibrate simulation parameters based on actual machining data Other task configurations… The PlayerCommand is typically a ListCommand that contains a sequence of command entries to be executed during the simulation. 4. Run the Tasks (Simulation and Optimization) Run PlayerCommand through PacePlayer. At this stage, the simulation process is similar to video playback, which can be: Started Stopped Paused Run one line Run one step Reset The PacePlayer controls the execution pace of the simulation, allowing you to observe the machining process in detail or run it at full speed. View the Analysis During Process or Result ShellProgress contains a sequence of simulation messages and step data, which can be used to monitor and analyze the simulation process and results. Sample Code to Start a MachiningProject See the following sample code to start a HiAPI application. DemoBuildMachiningProject Build a MachiningProject. DemoUseMachiningProject Load a MachiningProject and run NC simulation. DemoRenderingMachiningProcessAndStripPosSelection Apply MachiningProject to 3D canvas with user-interaction in windows platform. See Also HiAPI Packages and Sample Code — the NuGet feed and the sample repositories the demos named here live in Geometry Objects — the geometry types the environment in step 2 is assembled from" + "summary": "Getting Started with HiAPI What a first HiAPI application needs: where the packages come from, what the program has to initialise, and the shape every HiNC program follows once it runs. Installation Create a dotnet project. A console or service project targets net10.0. A project that also takes one of the Windows UI packages targets net10.0-windows — that is what Hi.WinForm and Hi.WpfPlus are built for, and a plain net10.0 project cannot reference them. An earlier target framework cannot reference any of the packages. Register the HiAPI package source on the machine. The feed requires authentication, and the same account that gives you the sample repositories gives you the packages. One command registers the source and its credentials, which is the whole of what a restore needs: dotnet nuget add source https://superhightech-gitea.webredirect.org/api/packages/HiAPI/nuget/index.json --name HiAPI --username --password --store-password-in-clear-text Run it once per machine. Customers served by the mainland mirror register the feed address issued with their account in place of the URL above; nothing else changes. Prefer this to a project-local nuget.config, and never declare the feed in both places. NuGet resolves credentials by source name, and the match is case-sensitive, so a file that declares the same URL under a name the machine holds no credentials for adds a second, credential-less source. NuGet asks every source about every package, and one 401 fails the whole restore instead of falling through — so the packages it then reports as missing are the public nuget.org ones, and the cause is nowhere near the symptom. A credential-free file cannot stand in for the command either: the feed rejects anonymous requests, so it carries a fresh clone no further than having no source at all. Where a per-machine source is genuinely unavailable — an ephemeral build agent, say — a nuget.config beside the project file does the job, provided it is the only declaration of that URL and carries its own credentials under exactly the key it gave the source: That file holds a password in clear text: keep it out of version control. In the dotnet project file, add the package reference. In the program file, setting the HiNC application initialization and finalization. using Hi.HiNcKits; using Microsoft.Extensions.Logging; using System; namespace Sample { /// /// A sample class demonstrating initialization and usage of the HiAPI framework. /// Shows the basic setup of display engine, MongoDB server, licensing, and other core functionality. /// /// /// This example serves as an entry point for those getting started with HiAPI. /// It demonstrates proper initialization and teardown of key components. /// ### Source Code /// [!code-csharp[SampleCode](~/../Hi.Sample/HelloHiAPI.cs)] /// public static class HelloHiAPI { static int Main(string[] args) { Console.WriteLine(\"HiAPI starting.\"); using var loggerFactory = Microsoft.Extensions.Logging.LoggerFactory.Create(b => b.AddConsole()); LocalApp.AppBegin(loggerFactory.CreateLogger(\"Hi.Sample\")); Console.WriteLine(\"Hello World! HiAPI.\"); LocalApp.AppEnd(); Console.WriteLine(\"HiAPI exited.\"); return 0; } } } The Shape of a HiNC Program Every HiNC program, whether it is the shipped application or twenty lines in a console project, runs the same five steps. DemoBuildMachiningProject in the Hi.Sample repository is the complete worked example. graph TD A[\"Create MachiningProject\"] --> B[\"Setting Environment\"] B --> C[\"Setting Project Tasks\"] C --> D[\"Run Tasks\"] D --> E[\"View Analysis Results\"] 1. Create MachiningProject Creating a machining project is the first step in the HiNC workflow, accomplished by initializing a MachiningProject object. 2. Setting Environment In MachiningProject The equipment has two faces. SetupEquipment is the authored one — the only face a project file persists, and the one every setting below is written to. MachiningEquipment is the runtime face the runner, physics, collision and execution display read; it is rebuilt from the authored face at project assignment and at session boundaries, so a value written onto it is discarded rather than saved. Set SetupEquipment: Usually one-time settings: MachiningChain - Configure the complete machine tool including geometry, kinematic chain, and coordinate transformations SpindleCapability - Configure SpindleCapability CoolantHeatCondition - Configure coolant heat conditions AmbientTemperature_C - Configure the ambient (shop-floor) temperature in Celsius, the temperature the thermal model starts from; AmbientTemperature_K holds the same value in Kelvin Variable settings: Fixture - Configure fixture Workpiece - Configure workpiece Set MachiningToolHouse - Configure tool house Set HardNcEnv (Controller) - Configure NC system environment parameters 3. Setting Project Tasks Set sequential tasks using PlayerCommand: Set NC Files - Set the file path and customize simulation and optimization settings for each NC file Configure NC optimization - Configure NC code optimization parameters Set GeomDiffCommand - Configure geometry comparison functionality to compare target workpiece shape with simulated shape Set MillingTraining - Configure milling parameter training to calibrate simulation parameters based on actual machining data Other task configurations… The PlayerCommand is typically a ListCommand that contains a sequence of command entries to be executed during the simulation. 4. Run the Tasks (Simulation and Optimization) Run PlayerCommand through PacePlayer. At this stage, the simulation process is similar to video playback, which can be: Started Stopped Paused Run one line Run one step Reset The PacePlayer controls the execution pace of the simulation, allowing you to observe the machining process in detail or run it at full speed. View the Analysis During Process or Result ShellProgress contains a sequence of simulation messages and step data, which can be used to monitor and analyze the simulation process and results. Sample Code to Start a MachiningProject See the following sample code to start a HiAPI application. DemoBuildMachiningProject Build a MachiningProject. DemoUseMachiningProject Load a MachiningProject and run NC simulation. DemoRenderingMachiningProcessAndStripPosSelection Apply MachiningProject to 3D canvas with user-interaction in windows platform. See Also HiAPI Packages and Sample Code — the NuGet feed and the sample repositories the demos named here live in Geometry Objects — the geometry types the environment in step 2 is assembled from" }, "technique/api-foundations/index.html": { "href": "technique/api-foundations/index.html", @@ -8332,7 +8332,7 @@ "technique/milling-physics/coolant-model.html": { "href": "technique/milling-physics/coolant-model.html", "title": "Coolant Model | HiAPI-C# 2025", - "summary": "Coolant Model What the cutting-zone cooling actually does to the simulation. The chosen condition lives on CoolantHeatCondition(API) and is consumed by MillingTemperatureUtil(API) every simulation step, which is why the NC program's own coolant M-codes, not a single setting, decide the coefficient in force at any moment. Ordered from what selects a coefficient, through what the shipped presets set and what each field means, to how the condition is stored. NC program drives the mode The parser reads M07/M08/M09 into CoolantMode(API) and carries it on every MachineMotionStep(API). The FEM picks the effective convection coefficient at run time from that mode. M-code CoolantMode Coefficient source M08 Flood CoolantConvectionCoefficient_Wdm2K (baseline of the chosen type) M07 Mist baseline × MistFloodConvectionRatio M09 Off OffConvectionCoefficient_Wdm2K Before the first M07/M08/M09 the mode is UnDefined; the FEM treats it as Off. For StandardForcedAir (dry cutting) the machine has no liquid circuit, so even M08 only means “air blast on” — its flood baseline is an air-blast coefficient, not a liquid one. What each shipped file sets Each shipped cooling type is also a static preset on CoolantHeatCondition(API) (StandardForcedAir, StandardWaterSolubleCoolant, StandardOilBasedCoolant) — the same pattern as WorkpieceMaterial.Al6061T6; the resource files are generated from them: Preset / file Flood baseline W/(m²·K) Mist ratio Off W/(m²·K) Temperature °C StandardForcedAir 100 0.5 50 25 StandardWaterSolubleCoolant 1 000 0.5 50 25 StandardOilBasedCoolant 300 0.5 50 25 The baselines are engineering defaults from the literature ranges below; when you have dynamometer / thermocouple data for your own system, tune the fields and save your own file instead. API side: ApplyPreset copies a preset in place; MatchStandardPreset maps values back to a preset name. Properties These are the fields shown under Name / Note in the Coolant panel: Property Default Notes CoolantTemperature_C 25 Room temperature inside the enclosure. CoolantConvectionCoefficient_Wdm2K 1 000 Flood baseline. Water-based emulsion ≈ 1 000–3 000, oil ≈ 100–500, forced air ≈ 10–500. MistFloodConvectionRatio 0.5 MQL is roughly half the heat removal of flood. See below. OffConvectionCoefficient_Wdm2K 50 Forced air inside a running enclosure. Natural air ≈ 5–25. Name / Note — From the loaded file / preset; Save As… renames the condition after the file. Legacy projects without a name still work. Why the mist ratio defaults to 0.5 MQL removes much less heat than flood because a thin oil aerosol has a tiny thermal mass; its main value is lubrication plus evaporative cooling, not convection. Industry handbooks place it at roughly half of flood, which gives the conservative default 0.5. Override it when you have dynamometer / thermocouple data for your own MQL system. Note Further reading: UNIST MQL Handbook (source of the “about half” rule), ANEBON mist-vs-flood AISI 1045 tests, Mukesh et al. IEJ May 2023 review on sustainable machining. Use these only to dig deeper — the 0.5 default is already calibrated from them. Coolant files (WorkpieceMaterial pattern) MachiningEquipment.CoolantHeatConditionFile tracks an optional .CoolantHeatCondition side-file, exactly like Workpiece.WorkpieceMaterialFile tracks a material file: No file (default): the condition serializes inline in the .hincproj, byte-compatible with pre-pattern readers. File tracked: the project save externalizes the condition as relPath and (re)writes the side-file. Loading a file installs it in place of the current condition and records the reference (XFactory.GenByFile); a file loaded from the resource folder is copied into the project on the next save (self-contained project root). XML StandardOilBasedCoolant Oil-based cutting fluid (neat oil). 25 300 0.5 50 Name/Note are optional (pre-preset files omit them); omit the last two elements to accept the defaults. The same element saved standalone is the .CoolantHeatCondition file format; inside a .hincproj it may instead appear as the reference shown above. See Also Coolant — picking a cooling type in the application, which is the whole of the end-user setup Background / Coolant Page — the Control-Tree editor for these values, field by field Process Machinability — the thermal-yield ratio this model's temperatures feed" + "summary": "Coolant Model What the cutting-zone cooling actually does to the simulation. The chosen condition lives on CoolantHeatCondition(API) and is consumed by MillingTemperatureUtil(API) every simulation step, which is why the NC program's own coolant M-codes, not a single setting, decide the coefficient in force at any moment. Ordered from what selects a coefficient, through what the shipped presets set and what each field means, to how the condition is stored. NC program drives the mode The parser reads M07/M08/M09 into CoolantMode(API) and carries it on every MachineMotionStep(API). The FEM picks the effective convection coefficient at run time from that mode. M-code CoolantMode Coefficient source M08 Flood CoolantConvectionCoefficient_Wdm2K (baseline of the chosen type) M07 Mist baseline × MistFloodConvectionRatio M09 Off OffConvectionCoefficient_Wdm2K Before the first M07/M08/M09 the mode is UnDefined; the FEM treats it as Off. For StandardForcedAir (dry cutting) the machine has no liquid circuit, so even M08 only means “air blast on” — its flood baseline is an air-blast coefficient, not a liquid one. What each shipped file sets Each shipped cooling type is also a static preset on CoolantHeatCondition(API) (StandardForcedAir, StandardWaterSolubleCoolant, StandardOilBasedCoolant) — the same pattern as WorkpieceMaterial.Al6061T6; the resource files are generated from them: Preset / file Flood baseline W/(m²·K) Mist ratio Off W/(m²·K) Temperature °C StandardForcedAir 100 0.5 50 25 StandardWaterSolubleCoolant 1 000 0.5 50 25 StandardOilBasedCoolant 300 0.5 50 25 The baselines are engineering defaults from the literature ranges below; when you have dynamometer / thermocouple data for your own system, tune the fields and save your own file instead. API side: ApplyPreset copies a preset in place; MatchStandardPreset maps values back to a preset name. Properties These are the fields shown under Name / Note in the Coolant panel: Property Default Notes CoolantTemperature_C 25 Room temperature inside the enclosure. CoolantConvectionCoefficient_Wdm2K 1 000 Flood baseline. Water-based emulsion ≈ 1 000–3 000, oil ≈ 100–500, forced air ≈ 10–500. MistFloodConvectionRatio 0.5 MQL is roughly half the heat removal of flood. See below. OffConvectionCoefficient_Wdm2K 50 Forced air inside a running enclosure. Natural air ≈ 5–25. Name / Note — From the loaded file / preset; Save As… renames the condition after the file. Legacy projects without a name still work. Why the mist ratio defaults to 0.5 MQL removes much less heat than flood because a thin oil aerosol has a tiny thermal mass; its main value is lubrication plus evaporative cooling, not convection. Industry handbooks place it at roughly half of flood, which gives the conservative default 0.5. Override it when you have dynamometer / thermocouple data for your own MQL system. Note Further reading: UNIST MQL Handbook (source of the “about half” rule), ANEBON mist-vs-flood AISI 1045 tests, Mukesh et al. IEJ May 2023 review on sustainable machining. Use these only to dig deeper — the 0.5 default is already calibrated from them. Coolant files (WorkpieceMaterial pattern) MachiningEquipment.CoolantHeatConditionFile tracks an optional .CoolantHeatCondition side-file, exactly like Workpiece.WorkpieceMaterialFile tracks a material file: No file (default): the condition serializes inline in the .hincproj, byte-compatible with pre-pattern readers. File tracked: the project save externalizes the condition as relPath and (re)writes the side-file. Loading a file installs it in place of the current condition and records the reference (XFactory.GenByFile); a file loaded from the resource folder is copied into the project on the next save (self-contained project root). XML StandardOilBasedCoolant Oil-based cutting fluid (neat oil). 25 300 0.5 50 Name/Note are optional (pre-preset files omit them); omit the last two elements to accept the defaults. The same element saved standalone is the .CoolantHeatCondition file format; inside a .hincproj it may instead appear as the reference shown above. See Also Coolant — picking a cooling type in the application, which is the whole of the end-user setup Environment: Ambient Temperature / Coolant Page — the Control-Tree editor for these values, field by field Process Machinability — the thermal-yield ratio this model's temperatures feed" }, "technique/milling-physics/cutter-adjustment-levers.html": { "href": "technique/milling-physics/cutter-adjustment-levers.html", @@ -8382,7 +8382,7 @@ "technique/nc-dialects/controller-iso.html": { "href": "technique/nc-dialects/controller-iso.html", "title": "General NC Code Support | HiAPI-C# 2025", - "summary": "General NC Code Support The vocabulary HiNC interprets is decided by the controller brand selected for the project. This page covers the ISO-family presets — Fanuc, Syntec and Mazak — and Siemens SINUMERIK. Heidenhain is a different language and has its own page: Heidenhain Support. How to read this page Coverage is stated in three states. State What happens when the construct appears in your program Supported interpreted, and its effect is simulated. Recognized, not simulated consumed on purpose and reported under its own message id. The block keeps running and the construct's effect does not apply — but it can never be silently misread as something else. Not supported the words are left over, and the block reports Parsing--Unconsumed naming them. Tip The message list a run produces is the coverage report for your program. Every word the interpreter could not use is named on the block that carried it, so you never have to infer coverage from the simulated result. An unknown code does not stop the run — it is reported and skipped. ISO core Fanuc, Syntec and Mazak share the vocabulary below. Siemens spells most of it the same way and adds its own for the rest — see Siemens SINUMERIK. Motion Code Meaning G00 Rapid positioning. G01 Linear interpolation at the programmed feedrate. G02 / G03 Circular interpolation, clockwise / counter-clockwise. The centre may be given as I / J / K offsets or as a radius R. G04 Dwell. X / U are seconds, P is milliseconds, S is spindle revolutions. Both the G4 and G04 spellings are read. G28 Reference-point (home) return through an intermediate point. G53 One-shot machine-coordinate move — work offsets are bypassed for that block only. Plane, units and positioning mode Code Meaning G17 / G18 / G19 Plane selection — XY / ZX / YZ. Arcs and canned cycles follow the active plane. G21 Metric. This is the HiNC default. G71 Metric — the RS-274-D / Fanuc G-code system C / Syntec spelling of G21, accepted the same way on the Fanuc and Syntec presets. Mazak EIA stays G20 / G21 only. G20 Inch — not supported. The block reports Unit--InchNotSupported; post the program in metric. G70 Inch — the RS-274-D / Fanuc G-code system C / Syntec spelling of G20, read on the Fanuc and Syntec presets. Not supported; the block reports Unit--InchNotSupported; post the program in metric. G90 / G91 Absolute / incremental positioning. G94 / G95 Feed per minute / feed per revolution. Work coordinates Code Meaning G54–G59 Standard work coordinate systems. G59.1–G59.9 Extended work coordinate systems, backed by the brand-neutral table the Fanuc, Mazak and Syntec presets carry behind their brand table. Like G54–G59, a row left at zero is read as an authoring convention and stays silent. G54.1 P1–P48 Fanuc additional work coordinate systems, backed by the extended work offset table. Also read in the manual's second spelling G54 P1–P48, with or without the space; a G54 with no P word is the plain G54 above. A selected row nobody has entered reports Coord-WorkOffset--AdditionalZero. G52 Local coordinate offset, applied on top of the active work coordinate system. Tool compensation Code Meaning G43 / G44 / G49 Tool length compensation, positive / negative / cancel. H selects the offset row. G41 / G42 / G40 Cutter radius compensation, left / right / cancel. D selects the offset row. Radius compensation is resolved against the blocks that actually travel in the compensation plane. A block whose own words command no movement in that plane — a bare G41 / G42, a comment, an empty line, a plunge along the plane normal (Z under G17) — takes no offset of its own and no part in a corner: Start-up waits for motion. A G41 or G42 block that does not move in the plane does not start the offset; the first block that travels in the plane is the start-up block and takes the perpendicular (type A) offset. The blocks between them carry the previous block's offset vector, so nothing moves on their account. Corners are resolved between travelling blocks. Wordless blocks sitting between two moves are passed over, and the corner is the intersection of the two real segments. Running axes are the in-plane part of each displacement, so a ramping move keeps its full offset and a plunge along the plane normal stays on the offset line. The plane cannot change inside a region. G17 / G18 / G19 selects the compensation plane, and it may only be selected while compensation is cancelled. A plane code that resolves to a different plane while G41 / G42 is active — including one sharing its block with the G40 that cancels the region — is reported as RadiusComp--PlaneChangeInRegion, because the corner spanning the change would be built from one running axis per plane. A control alarms there (Fanuc PS0037 CAN NOT CHANGE PLANE IN CRC). Re-selecting the plane already in force is not a change and is accepted. A bare G40 closes the region. The last compensated block ends on its own perpendicular offset rather than turning toward the first uncompensated move after the cancel. A G40 that carries motion is the last corner's partner instead, and the compensated path meets the cancel line at their intersection (Fanuc type B); the legacy interpreter (EnableSoftNcRunner set false) ends that case perpendicular. The D row must match the program's strategy. A zero-based program (the CAM path is the tool-centre path, G41 D.. kept for wear only) needs a D row whose geometry radius is 0; a cutter-radius program (the NC is the part contour) needs the tool radius there. An offset larger than an inner arc or groove of the contour makes the compensated path run against the programmed direction — a control stops with an interference alarm (Fanuc PS0041), HiNC reports RadiusComp--Interference and keeps playing the swapped-side path. The radius basis of the tool-house refresh is chosen on Tool Offsets. Rotation, tilted planes and five-axis Code Meaning G68 Coordinate rotation in the active plane, around a centre point by angle R. G68.2 Tilted work plane — Euler angles I / J / K with origin X / Y / Z. G69 Cancels G68 and G68.2. G53.1 Tool-axis direction — swings the rotary axes into line with the active G68.2 plane. G43.4 RTCP / tool centre point management. The Siemens equivalent is TRAORI, the Heidenhain equivalent M128. Canned cycles Code Cycle G73 High-speed peck drilling — Q increments with a partial retract. G74 Left-hand tapping. G76 Fine boring — oriented spindle stop, Q shift, rapid out. G81 Drilling. G82 Drilling with a dwell at the bottom. G83 Peck drilling — Q increments with a full retract to the R point. G84 Right-hand tapping. G85 Boring, feed out. G86 Boring, spindle stop then rapid out. G87 Back boring. G89 Boring with a dwell at the bottom. G80 Cancel. G98 / G99 Retract to the initial level / to the R level. A cycle is expanded into the individual strokes it performs — approach, peck, dwell, retract — each with its own feedrate, so material removal and cycle time come out of the real motion rather than an approximation. Modal repetition and G91 incremental cycle data are resolved before the strokes are built. On SoftNc (the 3.2 default) a repeat block is the XYZ / R / Q / F / P / K family. An A / B / C word on a repeat is not taken: a rotary-only repeat does not fire the cycle, a mixed block drops the rotary word, and under G68.2 the hole follows the table. Programs that index a rotary axis that way should run with SoftNc off — the HardNc fallback indexes those blocks the way a control does. See the Adoption status note. Polar interpolation G12.1 turns polar coordinate interpolation on and G13.1 turns it off. Inside a polar section the X word is a diameter and the C word is a hypothetical Cartesian axis in millimetres, not rotary degrees. HiNC halves X, resolves G90 / G91, writes both the polar and the derived Cartesian positions along with the machine C angle, and simulates polar linear and polar arc motion — the arc as real spiral geometry that stays continuous across ±180°. G41 / G42 compensation is resolved on the hypothetical plane, and YA / ZB axis pairs work the same way. G codes that conflict with polar mode are checked before the mode is entered. Path smoothing G05.1 Q1 enables high-precision contour control (AICC / Nano Smoothing) and Q0 disables it. The optional R precision level is preserved. Bare G05 (or G5) is a different feature under a confusingly similar name, and the two are tracked separately so they cannot cancel one another. It selects a function through its P word, on the Fanuc, Syntec and Mazak presets: P Reading P10000 HPCC — RISC-based high-precision contour control. Recognized, deliberately not simulated: it changes the machine's look-ahead, acceleration and servo behaviour, never the programmed coordinates. Reports Hpcc--NoOp. P0 Cancels HPCC. Consumed silently — cancelling a no-op needs no message. P10001–P10999 High-speed cycle machining. The real machine executes cycle data pre-registered in its variable area, which is actual axis motion HiNC cannot see, so the simulated result misses that machining. Reports Hpcc--HighSpeedCycleIgnored as a warning. anything else Not supported offline and ignored, reported as Hpcc--UnsupportedFunction. Small P values select the high-speed remote buffer modes. no P at all Not supported offline and ignored, reported as Hpcc--MissingFunctionWord. An unevaluated macro variable or expression in P is tolerated — it reports Hpcc--UnevaluatedFunction rather than failing the block. M codes Code Meaning M00 / M01 Program stop / optional stop. M02 / M30 Program end. On SoftNc the next block starts with tool-length compensation (including TCP), tilt, cutter-radius compensation and canned cycles cancelled; the M02 / M30 block itself still runs under the modal state it executed with. The HardNc fallback does not apply that reset. M03 / M04 / M05 Spindle clockwise / counter-clockwise / stop. M06 Tool change. The axis travel the change requires is synthesized rather than teleported. M07 / M08 / M09 Mist coolant on / flood coolant on / coolant off. M98 / M99 Subprogram call (M98 P{program} L{repeat}) and return, including M99 P{sequence} early return. M198 Subprogram call from external storage — same shape as M98, different lookup folder. Note Composite and OEM M-codes are not built in — they are declared on the machine. An M13 that means “spindle CW plus flood coolant”, an M-code that triggers a tool change, or turret T-word semantics are stated once in the machine's own M-code table and expanded into the ISO effects the rest of the pipeline already understands. A code declared with no modelled effect is voiced once as DeclaredMCode--UnmodeledEffects instead of raising an unknown-code warning on every occurrence. Note If a program states a spindle speed greater than zero but never issues a direction, HiNC assumes clockwise and reports SpindleDirection--AssumedCw. Without that assumption the cutting-force model would silently produce zero mechanics for the whole file. Fanuc Everything in the ISO core, plus: Custom Macro B. # variable assignment and arithmetic, with each range routed to the store it belongs to — #1–#33 local to the macro frame, #100–#499 volatile and cleared on M02 / M30, #500–#999 retained and saved with the project, #3000–#3999 system control. Boolean and logical operators, IF [..] GOTO n, IF [..] THEN , and WHILE [..] DO m / END m with a bounded-loop watchdog. Position and tool-offset system variables read back into expressions. Macro and subprogram calls. G65 one-shot macro call, binding arguments A–Z onto #1–#26; G66 / G67 modal macro, firing at every positioning block until cancelled; M98 / M198 / M99. A callee's blocks are spliced into the program at the call site, so the rest of the run treats them exactly as if they had been written in the main file. Not supported. G10 programmable data setting, G50 spindle speed clamp, G31 skip. Syntec Syntec runs the ISO core plus the Fanuc-family macro and subprogram vocabulary and polar interpolation. Not supported. Custom G macros defined on the controller, Pr parameter mapping, and twin-head / twin-turret program syntax. Mazak Mazak reads EIA/ISO with the Fanuc-family macro and subprogram vocabulary and polar interpolation. Not supported. MAZATROL conversational sections, and switching between MAZATROL and EIA/ISO inside one program. Export the EIA/ISO program from the controller. Siemens SINUMERIK Real .mpf / .spf programs replay end to end — this is not an ISO subset with a Siemens label on it. Modal vocabulary. SUPA / G153 suppress all frames for one block; G70 / G71 units; the path-smoothing family (G60x / G64x, FNORM / SOFT / FFWON / COMP* / UPATH, CYCLE832); MSG() and STOPRE; CR= and TURN= arcs. Tail comments are quote-aware, so a ; inside MSG(\"A;B\") does not truncate the block. G74 / G75 fixed-point return is claimed as a whole block, so the dummy axis values it carries never mint a rapid to those coordinates and its F never reaches the modal feedrate. Tools. T=\"NAME\" string tool calls with D cutting-edge offsets, resolved through the $TC_DP tool table — lengths and radius plus additive wear. Variables and expressions. R parameters R0–R999 are held as per-project data, DEF REAL / DEF INT declarations lower into assignments, and a full expression evaluator means Z=R63+150 and X=SIN(R10)*20 drive real motion. $P_UIFR[n,axis,TR] binds both ways to the frame table. Any other $ variable is recorded with an unsupported note rather than silently dropped. Frames and five-axis. TRANS / ATRANS / ROT / AROT (with RPL=) and the solid-angle forms ROTS / AROTS compose into the tilt chain in Sinumerik RPY order (ROTS / AROTS behave as ROT / AROT: at most two angles, first-named axis first); TRAORI is a real RTCP mode, the sibling of ISO G43.4, with TRAFOOF handing the offset back; CYCLE800 is decoded from its MODE bits across all four swivel modes. Calls and control flow. L-prefixed and named subprogram calls, inlined with their P repetition count; M17 / RET; REPEAT over a labelled slice; MCALL CYCLE81 / 82 / 83 / 85 mapped onto the shared canned-cycle machinery; PROC headers and labels. GOTOF / GOTOB, IF / ELSE / ENDIF, and WHILE / FOR / REPEAT-UNTIL / LOOP. Jumps and loop iterations are capped rather than hanging the session — over the cap the construct warns and falls through. Per-word coordinate functions. AC() / IC() / DC() / ACP() / ACN(), including on I / J / K circle centres, so G90 C=IC(360/17) is one incremental index inside an absolute program. ACP() takes the forward window, ACN() the backward one, and DC() the shortest swing. Coded positions. CAC / CIC / CDC / CACP / CACN take a 1-based indexing position number instead of a coordinate, resolved against the machine's own indexing-position tables. OEM auxiliary M-codes. The preset declares M12 / M13 / M22 / M23 and M330 / M331 as note-only, so each occurrence voices DeclaredMCode--UnmodeledEffects rather than an unknown-code warning. A machine's own table overrides the declaration once the real effects are known. Recognized, not simulated. SCALE / ASCALE, MIRROR / AMIRROR and CROTS — each reported as SiemensFrame--Unsupported. Not supported. SETAL. See Also Heidenhain Support — klartext and Heidenhain DIN/ISO. NC Parsing Engine — the pipeline behind these codes, the brand-by-brand support matrix in one table, and how a machine's own vocabulary is added without changing HiNC." + "summary": "General NC Code Support The vocabulary HiNC interprets is decided by the controller brand selected for the project. This page covers the ISO-family presets — Fanuc, Syntec and Mazak — and Siemens SINUMERIK. Heidenhain is a different language and has its own page: Heidenhain Support. How to read this page Coverage is stated in three states. State What happens when the construct appears in your program Supported interpreted, and its effect is simulated. Recognized, not simulated consumed on purpose and reported under its own message id. The block keeps running and the construct's effect does not apply — but it can never be silently misread as something else. Not supported the words are left over, and the block reports Parsing--Unconsumed naming them. Tip The message list a run produces is the coverage report for your program. Every word the interpreter could not use is named on the block that carried it, so you never have to infer coverage from the simulated result. An unknown code does not stop the run — it is reported and skipped. ISO core Fanuc, Syntec and Mazak share the vocabulary below. Siemens spells most of it the same way and adds its own for the rest — see Siemens SINUMERIK. Motion Code Meaning G00 Rapid positioning. G01 Linear interpolation at the programmed feedrate. G02 / G03 Circular interpolation, clockwise / counter-clockwise. The centre may be given as I / J / K offsets or as a radius R. G04 Dwell. X / U are seconds, P is milliseconds, S is spindle revolutions. Both the G4 and G04 spellings are read. G28 Reference-point (home) return through an intermediate point. Under G91 a rotary word gives the intermediate as an increment on the previous modal angle. G53 One-shot machine-coordinate move — work offsets are bypassed for that block only. Plane, units and positioning mode Code Meaning G17 / G18 / G19 Plane selection — XY / ZX / YZ. Arcs and canned cycles follow the active plane. G21 Metric. This is the HiNC default. G71 Metric — the RS-274-D / Fanuc G-code system C / Syntec spelling of G21, accepted the same way on the Fanuc and Syntec presets. Mazak EIA stays G20 / G21 only. G20 Inch — not supported. The block reports Unit--InchNotSupported; post the program in metric. G70 Inch — the RS-274-D / Fanuc G-code system C / Syntec spelling of G20, read on the Fanuc and Syntec presets. Not supported; the block reports Unit--InchNotSupported; post the program in metric. G90 / G91 Absolute / incremental positioning. Under G91 a bare rotary word is an increment too; a per-word directive (C=AC(90), ACP / ACN, IC()) overrides the modal state. G94 / G95 Feed per minute / feed per revolution. Work coordinates Code Meaning G54–G59 Standard work coordinate systems. G59.1–G59.9 Extended work coordinate systems, backed by the brand-neutral table the Fanuc, Mazak and Syntec presets carry behind their brand table. Like G54–G59, a row left at zero is read as an authoring convention and stays silent. G54.1 P1–P48 Fanuc additional work coordinate systems, backed by the extended work offset table. Also read in the manual's second spelling G54 P1–P48, with or without the space; a G54 with no P word is the plain G54 above. A selected row nobody has entered reports Coord-WorkOffset--AdditionalZero. G52 Local coordinate offset, applied on top of the active work coordinate system. Tool compensation Code Meaning G43 / G44 / G49 Tool length compensation, positive / negative / cancel. H selects the offset row. G41 / G42 / G40 Cutter radius compensation, left / right / cancel. D selects the offset row. Radius compensation is resolved against the blocks that actually travel in the compensation plane. A block whose own words command no movement in that plane — a bare G41 / G42, a comment, an empty line, a plunge along the plane normal (Z under G17) — takes no offset of its own and no part in a corner: Start-up waits for motion. A G41 or G42 block that does not move in the plane does not start the offset; the first block that travels in the plane is the start-up block and takes the perpendicular (type A) offset. The blocks between them carry the previous block's offset vector, so nothing moves on their account. Corners are resolved between travelling blocks. Wordless blocks sitting between two moves are passed over, and the corner is the intersection of the two real segments. Running axes are the in-plane part of each displacement, so a ramping move keeps its full offset and a plunge along the plane normal stays on the offset line. The plane cannot change inside a region. G17 / G18 / G19 selects the compensation plane, and it may only be selected while compensation is cancelled. A plane code that resolves to a different plane while G41 / G42 is active — including one sharing its block with the G40 that cancels the region — is reported as RadiusComp--PlaneChangeInRegion, because the corner spanning the change would be built from one running axis per plane. A control alarms there (Fanuc PS0037 CAN NOT CHANGE PLANE IN CRC). Re-selecting the plane already in force is not a change and is accepted. A bare G40 closes the region. The last compensated block ends on its own perpendicular offset rather than turning toward the first uncompensated move after the cancel. A G40 that carries motion is the last corner's partner instead, and the compensated path meets the cancel line at their intersection (Fanuc type B); the legacy interpreter (EnableSoftNcRunner set false) ends that case perpendicular. The D row must match the program's strategy. A zero-based program (the CAM path is the tool-centre path, G41 D.. kept for wear only) needs a D row whose geometry radius is 0; a cutter-radius program (the NC is the part contour) needs the tool radius there. An offset larger than an inner arc or groove of the contour makes the compensated path run against the programmed direction — a control stops with an interference alarm (Fanuc PS0041), HiNC reports RadiusComp--Interference and keeps playing the swapped-side path. The radius basis of the tool-house refresh is chosen on Tool Offsets. Rotation, tilted planes and five-axis Code Meaning G68 Coordinate rotation in the active plane, around a centre point by angle R. G68.2 Tilted work plane — Euler angles I / J / K with origin X / Y / Z. G69 Cancels G68 and G68.2. G53.1 Tool-axis direction — swings the rotary axes into line with the active G68.2 plane. G43.4 RTCP / tool centre point management. The Siemens equivalent is TRAORI, the Heidenhain equivalent M128. Canned cycles Code Cycle G73 High-speed peck drilling — Q increments with a partial retract. G74 Left-hand tapping. G76 Fine boring — oriented spindle stop, Q shift, rapid out. G81 Drilling. G82 Drilling with a dwell at the bottom. G83 Peck drilling — Q increments with a full retract to the R point. G84 Right-hand tapping. G85 Boring, feed out. G86 Boring, spindle stop then rapid out. G87 Back boring. G89 Boring with a dwell at the bottom. G80 Cancel. G98 / G99 Retract to the initial level / to the R level. A cycle is expanded into the individual strokes it performs — approach, peck, dwell, retract — each with its own feedrate, so material removal and cycle time come out of the real motion rather than an approximation. Modal repetition and G91 incremental cycle data are resolved before the strokes are built. A repeat block carrying an A / B / C word indexes the table and drills again, the standard way to drill a bolt circle: a rotary-only repeat fires the cycle (any axis word repeats it), a mixed block pre-positions XYZ and the table in one simultaneous move before the strokes, and under G68.2 without RTCP the feature frame stays pinned in machine space so the hole stays put while the workpiece turns. Under G91 only the words the block itself spoke are increments — an X-pitch repeat does not move Y again. Polar interpolation G12.1 turns polar coordinate interpolation on and G13.1 turns it off. Inside a polar section the X word is a diameter and the C word is a hypothetical Cartesian axis in millimetres, not rotary degrees. HiNC halves X, resolves G90 / G91, writes both the polar and the derived Cartesian positions along with the machine C angle, and simulates polar linear and polar arc motion — the arc as real spiral geometry that stays continuous across ±180°. G41 / G42 compensation is resolved on the hypothetical plane, and YA / ZB axis pairs work the same way. G codes that conflict with polar mode are checked before the mode is entered. Path smoothing G05.1 Q1 enables high-precision contour control (AICC / Nano Smoothing) and Q0 disables it. The optional R precision level is preserved. Bare G05 (or G5) is a different feature under a confusingly similar name, and the two are tracked separately so they cannot cancel one another. It selects a function through its P word, on the Fanuc, Syntec and Mazak presets: P Reading P10000 HPCC — RISC-based high-precision contour control. Recognized, deliberately not simulated: it changes the machine's look-ahead, acceleration and servo behaviour, never the programmed coordinates. Reports Hpcc--NoOp. P0 Cancels HPCC. Consumed silently — cancelling a no-op needs no message. P10001–P10999 High-speed cycle machining. The real machine executes cycle data pre-registered in its variable area, which is actual axis motion HiNC cannot see, so the simulated result misses that machining. Reports Hpcc--HighSpeedCycleIgnored as a warning. anything else Not supported offline and ignored, reported as Hpcc--UnsupportedFunction. Small P values select the high-speed remote buffer modes. no P at all Not supported offline and ignored, reported as Hpcc--MissingFunctionWord. An unevaluated macro variable or expression in P is tolerated — it reports Hpcc--UnevaluatedFunction rather than failing the block. M codes Code Meaning M00 / M01 Program stop / optional stop. M02 / M30 Program end. On SoftNc the next block starts with tool-length compensation (including TCP), tilt, cutter-radius compensation and canned cycles cancelled; the M02 / M30 block itself still runs under the modal state it executed with. The HardNc fallback does not apply that reset. M03 / M04 / M05 Spindle clockwise / counter-clockwise / stop. M06 Tool change. The axis travel the change requires is synthesized rather than teleported. M07 / M08 / M09 Mist coolant on / flood coolant on / coolant off. M98 / M99 Subprogram call (M98 P{program} L{repeat}) and return, including M99 P{sequence} early return. M198 Subprogram call from external storage — same shape as M98, different lookup folder. Note Composite and OEM M-codes are not built in — they are declared on the machine. An M13 that means “spindle CW plus flood coolant”, an M-code that triggers a tool change, or turret T-word semantics are stated once in the machine's own M-code table and expanded into the ISO effects the rest of the pipeline already understands. A code declared with no modelled effect is voiced once as DeclaredMCode--UnmodeledEffects instead of raising an unknown-code warning on every occurrence. Note If a program states a spindle speed greater than zero but never issues a direction, HiNC assumes clockwise and reports SpindleDirection--AssumedCw. Without that assumption the cutting-force model would silently produce zero mechanics for the whole file. Fanuc Everything in the ISO core, plus: Custom Macro B. # variable assignment and arithmetic, with each range routed to the store it belongs to — #1–#33 local to the macro frame, #100–#499 volatile and cleared on M02 / M30, #500–#999 retained and saved with the project, #3000–#3999 system control. Boolean and logical operators, IF [..] GOTO n, IF [..] THEN , and WHILE [..] DO m / END m with a bounded-loop watchdog. Position and tool-offset system variables read back into expressions. Macro and subprogram calls. G65 one-shot macro call, binding arguments A–Z onto #1–#26; G66 / G67 modal macro, firing at every positioning block until cancelled; M98 / M198 / M99. A callee's blocks are spliced into the program at the call site, so the rest of the run treats them exactly as if they had been written in the main file. Not supported. G10 programmable data setting, G50 spindle speed clamp, G31 skip. Syntec Syntec runs the ISO core plus the Fanuc-family macro and subprogram vocabulary and polar interpolation. Not supported. Custom G macros defined on the controller, Pr parameter mapping, and twin-head / twin-turret program syntax. Mazak Mazak reads EIA/ISO with the Fanuc-family macro and subprogram vocabulary and polar interpolation. Not supported. MAZATROL conversational sections, and switching between MAZATROL and EIA/ISO inside one program. Export the EIA/ISO program from the controller. Siemens SINUMERIK Real .mpf / .spf programs replay end to end — this is not an ISO subset with a Siemens label on it. Modal vocabulary. SUPA / G153 suppress all frames for one block; G70 / G71 units; the path-smoothing family (G60x / G64x, FNORM / SOFT / FFWON / COMP* / UPATH, CYCLE832); MSG() and STOPRE; CR= and TURN= arcs. Tail comments are quote-aware, so a ; inside MSG(\"A;B\") does not truncate the block. G74 / G75 fixed-point return is claimed as a whole block, so the dummy axis values it carries never mint a rapid to those coordinates and its F never reaches the modal feedrate. Tools. T=\"NAME\" string tool calls with D cutting-edge offsets, resolved through the $TC_DP tool table — lengths and radius plus additive wear. Variables and expressions. R parameters R0–R999 are held as per-project data, DEF REAL / DEF INT declarations lower into assignments, and a full expression evaluator means Z=R63+150 and X=SIN(R10)*20 drive real motion. $P_UIFR[n,axis,TR] binds both ways to the frame table. Any other $ variable is recorded with an unsupported note rather than silently dropped. Frames and five-axis. TRANS / ATRANS / ROT / AROT (with RPL=) and the solid-angle forms ROTS / AROTS compose into the tilt chain in Sinumerik RPY order (ROTS / AROTS behave as ROT / AROT: at most two angles, first-named axis first); TRAORI is a real RTCP mode, the sibling of ISO G43.4, with TRAFOOF handing the offset back; CYCLE800 is decoded from its MODE bits across all four swivel modes. Calls and control flow. L-prefixed and named subprogram calls, inlined with their P repetition count; M17 / RET; REPEAT over a labelled slice; MCALL CYCLE81 / 82 / 83 / 85 mapped onto the shared canned-cycle machinery; PROC headers and labels. GOTOF / GOTOB, IF / ELSE / ENDIF, and WHILE / FOR / REPEAT-UNTIL / LOOP. Jumps and loop iterations are capped rather than hanging the session — over the cap the construct warns and falls through. Per-word coordinate functions. AC() / IC() / DC() / ACP() / ACN(), including on I / J / K circle centres, so G90 C=IC(360/17) is one incremental index inside an absolute program. ACP() takes the forward window, ACN() the backward one, and DC() the shortest swing. Coded positions. CAC / CIC / CDC / CACP / CACN take a 1-based indexing position number instead of a coordinate, resolved against the machine's own indexing-position tables. OEM auxiliary M-codes. The preset declares M12 / M13 / M22 / M23 and M330 / M331 as note-only, so each occurrence voices DeclaredMCode--UnmodeledEffects rather than an unknown-code warning. A machine's own table overrides the declaration once the real effects are known. Recognized, not simulated. SCALE / ASCALE, MIRROR / AMIRROR and CROTS — each reported as SiemensFrame--Unsupported. Not supported. SETAL. See Also Heidenhain Support — klartext and Heidenhain DIN/ISO. NC Parsing Engine — the pipeline behind these codes, the brand-by-brand support matrix in one table, and how a machine's own vocabulary is added without changing HiNC." }, "technique/nc-dialects/index.html": { "href": "technique/nc-dialects/index.html", @@ -8437,7 +8437,7 @@ "technique/rendering/rendering-canvas.html": { "href": "technique/rendering/rendering-canvas.html", "title": "Using RenderingCanvas with DispEngine | HiAPI-C# 2025", - "summary": "Using RenderingCanvas with DispEngine The RenderingCanvas is the primary UI component for displaying and interacting with 3D content across different platforms. This section explains how to use it with the DispEngine to create cross-platform applications. Overview The RenderingCanvas class is available in frameworks: Hi.WinForm for Windows Forms applications Hi.WpfPlus for WPF applications All implementations share a common architecture centered around the DispEngine class, enabling consistent rendering and interaction across platforms. Core Concept: DispEngine and IDisplayee At the heart of the rendering system is the relationship between DispEngine and IDisplayee: DispEngine: The rendering engine that manages the OpenGL context and handles user interaction IDisplayee: The interface that defines objects that can be rendered by the DispEngine This relationship is fundamental - the purpose of DispEngine is to render IDisplayee objects. graph TD A[IDisplayee Objects] -->|Rendered by| B B[DispEngine] <--> C[RenderingCanvas UI Component] Working with IDisplayee Objects implementing IDisplayee define what gets rendered. Typically, you'll use Drawing objects or compose multiple IDisplayee objects together: // Create a composite displayee public class MyCompositeDisplayee : IDisplayee { private List _displayees = new List(); public MyCompositeDisplayee() { // Add various displayees _displayees.Add(new AxesDisplayee()); _displayees.Add(new ModelDisplayee()); } public void Display(Bind bind) { // Render all contained displayees foreach (var displayee in _displayees) { displayee.Display(bind); } } public void ExpandToBox3d(Box3d box) { // Update bounding box based on all displayees foreach (var displayee in _displayees) { displayee.ExpandToBox3d(box); } } } For more detailed information on creating displayees with Drawing, see the Drawing section. Basic Usage Apply Hi.WinForm // Create a new instance with displayee objects using Hi.WinForm.Disp; // Create displayee object var displayee = new MyCompositeDisplayee(); // Initialize canvas with the displayee var canvas = new RenderingCanvas(displayee); // Access the DispEngine for direct manipulation DispEngine engine = canvas.DispEngine; // Add to a form myForm.Controls.Add(canvas); Apply Hi.WPF // Create a new instance using Hi.WpfPlus.Disp; // Create displayee object var displayee = new MyCompositeDisplayee(); // Initialize the canvas var canvas = new RenderingCanvas(); // Set displayee objects through the DispEngine canvas.DispEngine.Displayee = displayee; // Add to a container myGrid.Children.Add(canvas); Switching Displayees at Runtime You can dynamically change what's being displayed: // Switch to a different displayee renderingCanvas.DispEngine.Displayee = alternativeDisplayee; // Or update a DispList var displayList = new DispList(); if (showModel) displayList.Add(modelDisplayee); if (showGrid) displayList.Add(gridDisplayee); renderingCanvas.DispEngine.Displayee = displayList; Key Features of DispEngine The DispEngine provides cross-platform support for: Handles buffer swapping and image generation Mouse/pointer events Keyboard navigation Touch gestures Zoom, pan, and rotate operations Resize and Visibility changed. Camera positioning and orientation Standard views (front, top, isometric, etc.) Renders IDisplayee implementations Touch and Gesture Support The DispEngine centralizes touch handling across all platforms with a unified API that supports: Single-finger pan Two-finger rotate and scale Multi-finger specialized operations The touch API is designed to be simple for UI implementations to use. Platform-specific UI components only need to capture touch events and forward them to the DispEngine. Common Operations // Accessing DispEngine (works on all platforms) var engine = renderingCanvas.DispEngine; // Set to standard views engine.SetViewToHomeView(); engine.SetViewToFrontView(); // Manual camera manipulation engine.Translate(dx, dy); engine.Rotate(deltaX, deltaY); // Resize handling engine.Resize(width, height); Implementation Details For detailed implementation information, including: Full source code examples Implementation details for each platform Advanced touch handling Custom implementation guidance See the Building Your Own Rendering Canvas guide. See Also DispEngine IDisplayee DispList Building Your Own Rendering Canvas — what a canvas has to implement to host the engine itself Drawing — producing the displayees this canvas renders" + "summary": "Using RenderingCanvas with DispEngine The RenderingCanvas is the primary UI component for displaying and interacting with 3D content across different platforms. This section explains how to use it with the DispEngine to create cross-platform applications. Overview The RenderingCanvas class is available in frameworks: Hi.WinForm for Windows Forms applications Hi.WpfPlus for WPF applications All implementations share a common architecture centered around the DispEngine class, enabling consistent rendering and interaction across platforms. Core Concept: DispEngine and IDisplayee At the heart of the rendering system is the relationship between DispEngine and IDisplayee: DispEngine: The rendering engine that manages the OpenGL context and handles user interaction. IsGlAvailable reports whether the process obtained a usable context; a host must not obtain a DispEngine while it is false — NC play, physics and training still run in that state, rendering does not IDisplayee: The interface that defines objects that can be rendered by the DispEngine This relationship is fundamental - the purpose of DispEngine is to render IDisplayee objects. graph TD A[IDisplayee Objects] -->|Rendered by| B B[DispEngine] <--> C[RenderingCanvas UI Component] Working with IDisplayee Objects implementing IDisplayee define what gets rendered. Typically, you'll use Drawing objects or compose multiple IDisplayee objects together: // Create a composite displayee public class MyCompositeDisplayee : IDisplayee { private List _displayees = new List(); public MyCompositeDisplayee() { // Add various displayees _displayees.Add(new AxesDisplayee()); _displayees.Add(new ModelDisplayee()); } public void Display(Bind bind) { // Render all contained displayees foreach (var displayee in _displayees) { displayee.Display(bind); } } public void ExpandToBox3d(Box3d box) { // Update bounding box based on all displayees foreach (var displayee in _displayees) { displayee.ExpandToBox3d(box); } } } For more detailed information on creating displayees with Drawing, see the Drawing section. Basic Usage Apply Hi.WinForm // Create a new instance with displayee objects using Hi.WinForm.Disp; // Create displayee object var displayee = new MyCompositeDisplayee(); // Initialize canvas with the displayee var canvas = new RenderingCanvas(displayee); // Access the DispEngine for direct manipulation DispEngine engine = canvas.DispEngine; // Add to a form myForm.Controls.Add(canvas); Apply Hi.WPF // Create a new instance using Hi.WpfPlus.Disp; // Create displayee object var displayee = new MyCompositeDisplayee(); // Initialize the canvas var canvas = new RenderingCanvas(); // Set displayee objects through the DispEngine canvas.DispEngine.Displayee = displayee; // Add to a container myGrid.Children.Add(canvas); Switching Displayees at Runtime You can dynamically change what's being displayed: // Switch to a different displayee renderingCanvas.DispEngine.Displayee = alternativeDisplayee; // Or update a DispList var displayList = new DispList(); if (showModel) displayList.Add(modelDisplayee); if (showGrid) displayList.Add(gridDisplayee); renderingCanvas.DispEngine.Displayee = displayList; Key Features of DispEngine The DispEngine provides cross-platform support for: Handles buffer swapping and image generation Mouse/pointer events Keyboard navigation Touch gestures Zoom, pan, and rotate operations Resize and Visibility changed. Camera positioning and orientation Standard views (front, top, isometric, etc.) Renders IDisplayee implementations Touch and Gesture Support The DispEngine centralizes touch handling across all platforms with a unified API that supports: Single-finger pan Two-finger rotate and scale Multi-finger specialized operations The touch API is designed to be simple for UI implementations to use. Platform-specific UI components only need to capture touch events and forward them to the DispEngine. Common Operations // Accessing DispEngine (works on all platforms) var engine = renderingCanvas.DispEngine; // Set to standard views engine.SetViewToHomeView(); engine.SetViewToFrontView(); // Manual camera manipulation engine.Translate(dx, dy); engine.Rotate(deltaX, deltaY); // Resize handling engine.Resize(width, height); Implementation Details For detailed implementation information, including: Full source code examples Implementation details for each platform Advanced touch handling Custom implementation guidance See the Building Your Own Rendering Canvas guide. See Also DispEngine IDisplayee DispList Building Your Own Rendering Canvas — what a canvas has to implement to host the engine itself Drawing — producing the displayees this canvas renders" }, "technique/scripting/cutter-location-playback.html": { "href": "technique/scripting/cutter-location-playback.html", @@ -8567,7 +8567,7 @@ "workflows/project-data-checklist.html": { "href": "workflows/project-data-checklist.html", "title": "Project Data Checklist | HiAPI-C# 2025", - "summary": "Project Data Checklist A HiNC project (.hincproj) is a digital twin of a real machining setup: machine, spindle, workpiece, fixture, tooling, controller, and the NC program. To build one, you must first collect the data that describes the physical setup. This page is the single, canonical list of that data. Hand it to the machine owner / customer as a data-collection checklist before a project is built. The product site shows the same grouping in short form for orientation; the formats, tolerances and worked examples below are here and only here. You do not need a strict form — write the items here up as a short free-text note and hand it over with the CAD and NC files; that is what a HiNC engineer needs to build the .hincproj (see the worked examples below). This page is the list to collect before a project is built. For what the engineer then does with it — build order, mission structure, and how completeness is verified — see Project Construction. Important Identifiers beat half-remembered numbers. Customers rarely have every detail. Where a value is missing, give an identifier — cutter brand + product ID, spindle/machine make + model — and the HiNC engineer sources the rest (cutter geometry from the catalog, the power–torque chart from the spindle datasheet). Capture what you can; the engineer fills the gaps. graph TD subgraph Equipment[\"Equipment (one-time, fixed)\"] M[\"Machine Configuration\"] S[\"Spindle Capability\"] E[\"Environment\"] end subgraph Job[\"Job (per part)\"] W[\"Workpiece\"] F[\"Fixture\"] T[\"Tooling\"] C[\"Controller + NC Program\"] end Equipment --> P[\".hincproj\"] Job --> P At a Glance Each item is marked: Required — a project cannot be built without it. Optional — improves realism but the project still runs without it. Conditional — only needed for a specific check beyond the core cutting-force simulation (e.g. collision detection, geometry validation, spindle-overload analysis), noted in Used for. Category Item Required? Used for Detail Machine Kinematic model & axis configuration (3-/5-axis, motion methods) Required Toolpath, collision Machine Tool Machine Simplified component CAD/STL (table, column, spindle housing…) Conditional Collision detection Machine Tool Machine Travel/stroke limits Conditional Stroke-overrun check — Machine Rapid feedrate, max spindle & rotary speeds Optional Feedrate precision → tighter optimization & physics/timing estimates — Spindle Brand/model + product description (so the chart can be sourced) Conditional Power/torque & overload analysis — a default spindle capability is applied if omitted (fine for light cuts in small/soft stock) — Spindle Speed–power–torque diagram (kW & Nm vs RPM, duty ratings) Conditional (sourced from the brand/model above) Power/torque & overload analysis Spindle Capability Environment Coolant type (other thermal values keep their defaults) Optional Thermal / wear analysis — a default is applied if omitted Coolant Workpiece Material (named or property set) Required Force, thermal — Workpiece Initial (stock) CAD + Finished CAD (STL or parametric) Required (stock) Cut simulation; finished = geometry check Geometry Validation Workpiece Program-zero position in plain words (e.g. “G54 = top centre”) Required Correct engagement Program Zero Alignment Fixture Fixture CAD/STL Optional Collision detection — Tooling Per tool: geometry + cutter & coating material (ideally via cutter brand + product ID) Required Force, deflection, geometry Cutter, Cutter Geometry Tooling Per tool: holder brand+ID (or rough height/radius) Conditional Collision check; how deep the tool reaches — Controller CNC brand/type (Fanuc, Heidenhain, Siemens…) Required NC interpretation Controllers Controller NC / CL program(s) Required The process to simulate ISO / General NC Controller Work offsets (G54…) and tool offset table Optional Estimated/relative values work for evaluation; HiNC can set an assumed offset Program Zero Alignment Controller Cutter-compensation strategy: zero-based (NC is the tool-centre path, D rows hold wear only) or cutter-radius (NC is the part contour, D rows hold the tool radius) Required when the NC uses G41/G42 The refresh from the tool house writes the radius column by this choice; the wrong basis is an overcut of one tool radius Tool Offsets 1. Machine Configuration The machine is one-time, fixed data: collected once, reused across every job on that machine. Kinematic model & axis configuration — number of axes and how each axis moves (the motion chain from ground → table and ground → spindle). Required. On a multi-axis machine the rotary configuration matters most: name each rotary axis and its pivot location (e.g. table-C / spindle-B). The pivot defines the entire kinematic chain, rotary swings are the most collision-prone motions, and the rotary bodies' geometry makes that motion intelligible — so describe it carefully. Simplified component CAD/STL — table, column, spindle housing, and other bodies, exported from a single coordinate system. Only needed for collision detection — though on a multi-axis machine the rotary bodies (table, cradle, tilt head) are especially worth including, as their geometry also makes the machine's motion intelligible. Keep the mesh simplified; too many triangles slow loading and collision checks. Travel/stroke limits — from the machine spec sheet. Conditional. Only matters when a stroke-overrun check is the goal — and the operator has usually already confirmed the program fits the machine, so it is not needed unless that is the specific thing you want to test. Rapid feedrate, max spindle & rotary speeds — from the machine spec sheet. Optional. Real values let the simulation use a more accurate achievable feedrate, which tightens the optimization and the physics / timing estimates. Helpful but not essential — defaults still produce a valid run. See Machine Tool for how the kinematic chain and anchors are built, and Anchor for coordinate anchors. 2. Spindle Capability Spindle brand / model + product description — name the spindle (or the machine) make and model, with a short description or catalog link, so the chart can be sourced and verified by whoever builds the project. Conditional — needed only when spindle power/torque/overload could matter. Omit it and a default spindle capability is applied; light cuts in small or soft stock rarely stress the spindle, so the default is fine. Speed–power–torque diagram — the spindle's power (kW) and torque (Nm) against RPM, including duty ratings (e.g. S1 continuous / S6 / 15-minute). From the machine or spindle spec sheet. Required for power, torque, and spindle-overload analysis. This is the kind of chart needed — power and torque vs spindle speed, with the continuous (S1) and short-duration (S3) ratings: Tip Easier than transcribing: photograph the spindle motor nameplate. The same ratings are printed on the spindle motor's spec nameplate, usually attached to the machine (on the spindle or motor body). A clear photo of it is enough — the model, type, and the S1/S2/S3 rating table (kW and speeds) recover the power–torque behaviour. Example (a FANUC αiI 6/12000 plate, unit serial removed): See Spindle Capability. 3. Environment Coolant type — which coolant is used. Optional — if omitted, a default coolant setting is applied. The remaining coolant/thermal values (temperature, convection, background temperature) keep their defaults too; they only affect thermal and wear results. See Coolant. 4. Workpiece Material — a named material from the database, or its mechanical/thermal properties. Required. Raw (stock) geometry — STL or simple parametric dimensions (e.g. block 120 x 80 x 40 or round billet Ø65 x 50). Used for the starting shape and size. Required. For a casting or forging, give the as-cast shape as an STL and note its casting tolerance (the stock scatters part-to-part). Finished/design CAD is optional, used to compare the simulated shape against the target (geometry validation). Program-zero position, in plain words — where each work offset (G54, G55…) sits on the part, e.g. “G54 = top centre of the stock; Z0 at the top face, X0/Y0 on the axis”. Required. Note Describe the program zero by position on the part, not the machine-coordinate offset numbers — for evaluation/planning a relative or assumed alignment is fine and HiNC aligns it for you. See Program Zero Alignment. 5. Fixture Fixture CAD/STL — optional, only needed when the fixture participates in collision detection. 6. Tooling For each tool used by the program, collect: Cutter brand + product ID — the maker and catalog number (with datasheet/link if handy). The single most useful field, when the cutter has one: from it the engineer looks up the geometry, flute count, helix, and grade, so give it even if the geometry below is incomplete. Off-brand cutters with no brand, manual, or traceable vendor are common (it depends on the shop) — then skip this and provide the geometry below directly, measured if needed. Cutter geometry — Required (or derivable from the brand + product ID above): type (flat-end / ball / corner-radius / insert), diameter D, corner radius R flute (cuttable) length — the cutting portion overall tool length / stick-out — how far the cutter reaches from the holder to the flute tip; this sets where the holder grips and affects deflection and reach. A plain cylindrical cutter can use a small default exposed length (~5 mm); a cutter that is not a simple cylinder — a stepped or necked shank, or a body wider than the cutting diameter — needs a longer stick-out so the wider non-cutting part clears the workpiece. flute count, helix angle, rake angle (relief angle if known) Cutter & coating material — body material and coating layers. Required. Holder — give the brand + product ID, or at least a rough height + radius (e.g. Ø40 x 60 mm). Full CAD is optional and only needed for collision detection; the rough size is enough to see whether the holder would hit the workpiece and how deep the tool can reach. Where the holder grips the tool comes from the cutter's stick-out above, so the tool can be placed even without holder geometry. Tip The cutter brand + product ID (or a datasheet image) is usually faster and more reliable than transcribing every dimension — the engineer reads the geometry off the catalog. See Cutter, Cutter Geometry and Smart Tool Holder. 7. Controller CNC brand/type — determines how the NC code is interpreted. Required. NC / CL program(s) — the actual programs that run on the machine. Required. Cutter-compensation strategy — when the NC uses G41/G42, say whether the shop programs zero-based (the CAM path is already the tool-centre path and the D register holds the wear only) or by cutter radius (the NC is the part contour and the D register holds the tool radius). Required with G41/G42. The program itself usually tells: a zero-based program has lead-in / lead-out arcs smaller than the tool radius and a finishing contour one tool radius inside the wall it makes. Set the matching radius basis in Tool Offsets before refreshing the offset table from the tool house — the wrong basis compensates by a full tool radius and simulates an overcut (RadiusComp--Interference). Work offsets (G54…) and tool offset table — not required for evaluation/planning. Relative or estimated values work; HiNC can set a workable assumed tool offset for you. Provide the real values only when a high-fidelity match is needed. Stroke limits and machine-specific configuration parameters — optional. See ISO / General NC and Heidenhain Support. Delivery Formats Data Preferred format Machine / fixture geometry STL, all exported from the same coordinate system (see Machine Tool best practices) Workpiece geometry STL (stock + finished) or parametric dimensions Cutter Brand + product ID (best), or geometry parameters / datasheet image Holder Brand + product ID, or rough height + radius Spindle capability Brand + model, plus spec-sheet table or chart image (power & torque vs RPM) NC program The original .nc / .cl files Examples The examples below show how to write it. Provide the item values together with the CAD and NC files; mark estimates, and give the spindle model and cutter brand + product ID where you can, so the engineer can fill any gap. These files include spindle chart photos, cutter catalog pages (e.g. cmtec-CEXCRSH3120005.pdf), CAD (STL/STEP), and NC programs; note the filename next to the matching item. Example 1 — Pocketed plate, 3-axis, steel # Cover plate — TMV-720A 3-axis Pocketed S50C cover plate roughed and finished on a 3-axis vertical machining center (VMC). Goal: verify spindle load on the deep pocket and trim cycle time. ## Machine Model: TongTai TMV-720A, 3-axis VMC Tool mount: (0, 0, 0) mm (where the tool is equipped; taken as the reference point) Table mount: (-450, -340, -630) mm (fixture & workpiece, relative to the tool mount) Controller: Fanuc Strokes: X720 Y420 Z460 mm ; rapid 20000 mm/min ; max spindle 8000 rpm ## Spindle Brand/model: TongTai TMV-720A standard 8000 rpm spindle (BT40) Source: TMV-720A catalog power–torque chart — attachment fanuc-at12-12000i.png (15-min rating below; with the image you need not transcribe these) Power (kW vs rpm): 0@0, 7.5@1500, 7.5@4500, 4@8000 Torque (Nm vs rpm): 50@1500, 37@2000, 30@2600, 19@4000, 12@6000, 8@8000 ## Workpiece Raw stock: block 140 x 90 x 50 mm Design: cover-plate.stl Material: S50C ## Program zero G54 = top centre of the block — Z0 at the top face, X0/Y0 at the block centre. ## Fixture Machine vise — vise.stl, clamps below the part top (collision only). ## Coolant Water-soluble emulsion (flood) ## Tools T1 face mill brand NTM, product TXE1000 (D50, exact P/N missing) D50 6 inserts flute 6 tool length 60 holder Ø60 x 50 mm stick-out 80 T2 flat end brand cmtec, product CEXCRSH3120005 (catalog: cmtec-CEXCRSH3120005.pdf) D12 R0 4 flutes helix 30° rake 10° flute 30 tool length 90 holder Ø40 x 63 stick-out 95 T3 flat end brand cmtec (no exact P/N) D6 R0 4 flutes helix 30° flute 20 tool length 70 holder Ø25 x 60 stick-out 75 ## NC Files (folder `NC/`) O0010.NC face + rough the pocket with T1/T2 — watch spindle load near the deep pocket O0020.NC profile + floor finish with T3 Example 2 — Relief part, 5-axis, aluminum # Airplane relief — 5-axis VMC Airplane + logo lettering milled from a round Al6061T6 billet on a 5-axis vertical machining center (VMC). Goal: check the 5-axis toolpath for collisions/gouges, then optimize feed. ## Machine Model: 5-axis VMC (example machine) (machine file: MachineTool/Vmc5x/Vmc5x.mt) Config: table-C / spindle-B (C rotary on the table, B tilt on the spindle head) Pivots: C at (0, 0, 0), B at (-70, -180, 220) mm (relative to the C pivot) Tool mount: (-70, 70, 175) mm (where the tool is equipped) Controller: Fanuc Strokes: unbounded for this study ; rapid 20000 mm/min ; max spindle 8000 rpm ## Spindle Brand/model: built-in 8000 rpm spindle, ~5.5 kW (BT30 class) Source: machine builder spindle datasheet (power–torque chart; attachment b1-spindle-chart.png) Power (kW vs rpm): 0@0, 5.5@1500, 5.5@4500, 3@8000 Torque (Nm vs rpm): 50@1500, 30@2000, 20@3000, 15@4000, 8@6000, 5@8000 ## Workpiece Raw stock: round billet Ø65 x 50 mm Design: airplane.stl Material: Al6061T6 ## Program zero G54 = top centre of the billet — Z0 at the top face, X0/Y0 on the axis. (G55+ unused.) ## Fixture Round fixture Ø100 x 10 mm under the billet (collision only). ## Coolant Air blast (dry) ## Tools (all: brand cmtec, aluminum grade — product ID not given; carbide, 3 flutes, helix 37°, rake 15°, relief 5° [helix/rake estimated]; holder Ø25 x 60 mm, 8 mm flute-to-nose clearance) T1 flat end D6 R0 flute 20 tool length 75 T2 ball end D6 flute 20 tool length 75 T3 ball end D3 flute 20 tool length 75 T4 ball end D2 flute 8 tool length 75 ## NC Files (34 programs in folder `NC/`; actual filenames below) 01-ED6L20.NC, 02-ED6L20.NC … 10-ED6L28.NC roughing with T1 (flat D6) 11-R3L25.NC … 22-R3L25.NC semi-finish with T2 (ball D6) 23-R2L25.NC … 30-R2L25.NC finishing airplane-R1L12.NC, logo1-R1L12.NC, logo2-R1L12.NC, logo3-R1L12.NC detail airplane + logo with T4 (ball D2) (filename = seq-toolcode+cutlength; ED6 = flat end mill D6, R3/R2/R1 = ball, digit = nose radius) Note Example 2 mirrors a real .hincproj (machine name anonymized); Example 1 is representative with estimated values. The spindle model and the cutter brand + product ID are the anchors from which the engineer recovers the geometry and the power–torque chart. See Also Workflow: Basic Machining Simulation — set up and run a simulation once the data is collected Cutter — create the tools this list collects data for Machine Tool — build the kinematic model from CAD Program Zero Alignment — how HiNC aligns the program zero Spindle Capability — the speed–power–torque model" + "summary": "Project Data Checklist A HiNC project (.hincproj) is a digital twin of a real machining setup: machine, spindle, workpiece, fixture, tooling, controller, and the NC program. To build one, you must first collect the data that describes the physical setup. This page is the single, canonical list of that data. Hand it to the machine owner / customer as a data-collection checklist before a project is built. The product site shows the same grouping in short form for orientation; the formats, tolerances and worked examples below are here and only here. You do not need a strict form — write the items here up as a short free-text note and hand it over with the CAD and NC files; that is what a HiNC engineer needs to build the .hincproj (see the worked examples below). This page is the list to collect before a project is built. For what the engineer then does with it — build order, mission structure, and how completeness is verified — see Project Construction. Important Identifiers beat half-remembered numbers. Customers rarely have every detail. Where a value is missing, give an identifier — cutter brand + product ID, spindle/machine make + model — and the HiNC engineer sources the rest (cutter geometry from the catalog, the power–torque chart from the spindle datasheet). Capture what you can; the engineer fills the gaps. graph TD subgraph Equipment[\"Equipment (one-time, fixed)\"] M[\"Machine Configuration\"] S[\"Spindle Capability\"] E[\"Environment\"] end subgraph Job[\"Job (per part)\"] W[\"Workpiece\"] F[\"Fixture\"] T[\"Tooling\"] C[\"Controller + NC Program\"] end Equipment --> P[\".hincproj\"] Job --> P At a Glance Each item is marked: Required — a project cannot be built without it. Optional — improves realism but the project still runs without it. Conditional — only needed for a specific check beyond the core cutting-force simulation (e.g. collision detection, geometry validation, spindle-overload analysis), noted in Used for. Category Item Required? Used for Detail Machine Kinematic model & axis configuration (3-/5-axis, motion methods) Required Toolpath, collision Machine Tool Machine Simplified component CAD/STL (table, column, spindle housing…) Conditional Collision detection Machine Tool Machine Travel/stroke limits Conditional Stroke-overrun check — Machine Rapid feedrate, max spindle & rotary speeds Optional Feedrate precision → tighter optimization & physics/timing estimates — Spindle Brand/model + product description (so the chart can be sourced) Conditional Power/torque & overload analysis — a default spindle capability is applied if omitted (fine for light cuts in small/soft stock) — Spindle Speed–power–torque diagram (kW & Nm vs RPM, duty ratings) Conditional (sourced from the brand/model above) Power/torque & overload analysis Spindle Capability Environment Coolant type (other thermal values keep their defaults) Optional Thermal / wear analysis — a default is applied if omitted Coolant Workpiece Material (named or property set) Required Force, thermal — Workpiece Initial (stock) CAD + Finished CAD (STL or parametric) Required (stock) Cut simulation; finished = geometry check Geometry Validation Workpiece Program-zero position in plain words (e.g. “G54 = top centre”) Required Correct engagement Program Zero Alignment Fixture Fixture CAD/STL Optional Collision detection — Tooling Per tool: geometry + cutter & coating material (ideally via cutter brand + product ID) Required Force, deflection, geometry Cutter, Cutter Geometry Tooling Per tool: holder brand+ID (or rough height/radius) Conditional Collision check; how deep the tool reaches — Controller CNC brand/type (Fanuc, Heidenhain, Siemens…) Required NC interpretation Controllers Controller NC / CL program(s) Required The process to simulate ISO / General NC Controller Work offsets (G54…) and tool offset table Optional Estimated/relative values work for evaluation; HiNC can set an assumed offset Program Zero Alignment Controller Cutter-compensation strategy: zero-based (NC is the tool-centre path, D rows hold wear only) or cutter-radius (NC is the part contour, D rows hold the tool radius) Required when the NC uses G41/G42 The refresh from the tool house writes the radius column by this choice; the wrong basis is an overcut of one tool radius Tool Offsets 1. Machine Configuration The machine is one-time, fixed data: collected once, reused across every job on that machine. Kinematic model & axis configuration — number of axes and how each axis moves (the motion chain from ground → table and ground → spindle). Required. On a multi-axis machine the rotary configuration matters most: name each rotary axis and its pivot location (e.g. table-C / spindle-B). The pivot defines the entire kinematic chain, rotary swings are the most collision-prone motions, and the rotary bodies' geometry makes that motion intelligible — so describe it carefully. Simplified component CAD/STL — table, column, spindle housing, and other bodies, exported from a single coordinate system. Only needed for collision detection — though on a multi-axis machine the rotary bodies (table, cradle, tilt head) are especially worth including, as their geometry also makes the machine's motion intelligible. Keep the mesh simplified; too many triangles slow loading and collision checks. Travel/stroke limits — from the machine spec sheet. Conditional. Only matters when a stroke-overrun check is the goal — and the operator has usually already confirmed the program fits the machine, so it is not needed unless that is the specific thing you want to test. Rapid feedrate, max spindle & rotary speeds — from the machine spec sheet. Optional. Real values let the simulation use a more accurate achievable feedrate, which tightens the optimization and the physics / timing estimates. Helpful but not essential — defaults still produce a valid run. See Machine Tool for how the kinematic chain and anchors are built, and Anchor for coordinate anchors. 2. Spindle Capability Spindle brand / model + product description — name the spindle (or the machine) make and model, with a short description or catalog link, so the chart can be sourced and verified by whoever builds the project. Conditional — needed only when spindle power/torque/overload could matter. Omit it and a default spindle capability is applied; light cuts in small or soft stock rarely stress the spindle, so the default is fine. Speed–power–torque diagram — the spindle's power (kW) and torque (Nm) against RPM, including duty ratings (e.g. S1 continuous / S6 / 15-minute). From the machine or spindle spec sheet. Required for power, torque, and spindle-overload analysis. This is the kind of chart needed — power and torque vs spindle speed, with the continuous (S1) and short-duration (S3) ratings: Tip Easier than transcribing: photograph the spindle motor nameplate. The same ratings are printed on the spindle motor's spec nameplate, usually attached to the machine (on the spindle or motor body). A clear photo of it is enough — the model, type, and the S1/S2/S3 rating table (kW and speeds) recover the power–torque behaviour. Example (a FANUC αiI 6/12000 plate, unit serial removed): See Spindle Capability. 3. Environment Coolant type — which coolant is used. Optional — if omitted, a default coolant setting is applied. The remaining coolant/thermal values (temperature, convection, ambient temperature) keep their defaults too; they only affect thermal and wear results. See Coolant. 4. Workpiece Material — a named material from the database, or its mechanical/thermal properties. Required. Raw (stock) geometry — STL or simple parametric dimensions (e.g. block 120 x 80 x 40 or round billet Ø65 x 50). Used for the starting shape and size. Required. For a casting or forging, give the as-cast shape as an STL and note its casting tolerance (the stock scatters part-to-part). Finished/design CAD is optional, used to compare the simulated shape against the target (geometry validation). Program-zero position, in plain words — where each work offset (G54, G55…) sits on the part, e.g. “G54 = top centre of the stock; Z0 at the top face, X0/Y0 on the axis”. Required. Note Describe the program zero by position on the part, not the machine-coordinate offset numbers — for evaluation/planning a relative or assumed alignment is fine and HiNC aligns it for you. See Program Zero Alignment. 5. Fixture Fixture CAD/STL — optional, only needed when the fixture participates in collision detection. 6. Tooling For each tool used by the program, collect: Cutter brand + product ID — the maker and catalog number (with datasheet/link if handy). The single most useful field, when the cutter has one: from it the engineer looks up the geometry, flute count, helix, and grade, so give it even if the geometry below is incomplete. Off-brand cutters with no brand, manual, or traceable vendor are common (it depends on the shop) — then skip this and provide the geometry below directly, measured if needed. Cutter geometry — Required (or derivable from the brand + product ID above): type (flat-end / ball / corner-radius / insert), diameter D, corner radius R flute (cuttable) length — the cutting portion overall tool length / stick-out — how far the cutter reaches from the holder to the flute tip; this sets where the holder grips and affects deflection and reach. A plain cylindrical cutter can use a small default exposed length (~5 mm); a cutter that is not a simple cylinder — a stepped or necked shank, or a body wider than the cutting diameter — needs a longer stick-out so the wider non-cutting part clears the workpiece. flute count, helix angle, rake angle (relief angle if known) Cutter & coating material — body material and coating layers. Required. Holder — give the brand + product ID, or at least a rough height + radius (e.g. Ø40 x 60 mm). Full CAD is optional and only needed for collision detection; the rough size is enough to see whether the holder would hit the workpiece and how deep the tool can reach. Where the holder grips the tool comes from the cutter's stick-out above, so the tool can be placed even without holder geometry. Tip The cutter brand + product ID (or a datasheet image) is usually faster and more reliable than transcribing every dimension — the engineer reads the geometry off the catalog. See Cutter, Cutter Geometry and Smart Tool Holder. 7. Controller CNC brand/type — determines how the NC code is interpreted. Required. NC / CL program(s) — the actual programs that run on the machine. Required. Cutter-compensation strategy — when the NC uses G41/G42, say whether the shop programs zero-based (the CAM path is already the tool-centre path and the D register holds the wear only) or by cutter radius (the NC is the part contour and the D register holds the tool radius). Required with G41/G42. The program itself usually tells: a zero-based program has lead-in / lead-out arcs smaller than the tool radius and a finishing contour one tool radius inside the wall it makes. Set the matching radius basis in Tool Offsets before refreshing the offset table from the tool house — the wrong basis compensates by a full tool radius and simulates an overcut (RadiusComp--Interference). Work offsets (G54…) and tool offset table — not required for evaluation/planning. Relative or estimated values work; HiNC can set a workable assumed tool offset for you. Provide the real values only when a high-fidelity match is needed. Stroke limits and machine-specific configuration parameters — optional. See ISO / General NC and Heidenhain Support. Delivery Formats Data Preferred format Machine / fixture geometry STL, all exported from the same coordinate system (see Machine Tool best practices) Workpiece geometry STL (stock + finished) or parametric dimensions Cutter Brand + product ID (best), or geometry parameters / datasheet image Holder Brand + product ID, or rough height + radius Spindle capability Brand + model, plus spec-sheet table or chart image (power & torque vs RPM) NC program The original .nc / .cl files Examples The examples below show how to write it. Provide the item values together with the CAD and NC files; mark estimates, and give the spindle model and cutter brand + product ID where you can, so the engineer can fill any gap. These files include spindle chart photos, cutter catalog pages (e.g. cmtec-CEXCRSH3120005.pdf), CAD (STL/STEP), and NC programs; note the filename next to the matching item. Example 1 — Pocketed plate, 3-axis, steel # Cover plate — TMV-720A 3-axis Pocketed S50C cover plate roughed and finished on a 3-axis vertical machining center (VMC). Goal: verify spindle load on the deep pocket and trim cycle time. ## Machine Model: TongTai TMV-720A, 3-axis VMC Tool mount: (0, 0, 0) mm (where the tool is equipped; taken as the reference point) Table mount: (-450, -340, -630) mm (fixture & workpiece, relative to the tool mount) Controller: Fanuc Strokes: X720 Y420 Z460 mm ; rapid 20000 mm/min ; max spindle 8000 rpm ## Spindle Brand/model: TongTai TMV-720A standard 8000 rpm spindle (BT40) Source: TMV-720A catalog power–torque chart — attachment fanuc-at12-12000i.png (15-min rating below; with the image you need not transcribe these) Power (kW vs rpm): 0@0, 7.5@1500, 7.5@4500, 4@8000 Torque (Nm vs rpm): 50@1500, 37@2000, 30@2600, 19@4000, 12@6000, 8@8000 ## Workpiece Raw stock: block 140 x 90 x 50 mm Design: cover-plate.stl Material: S50C ## Program zero G54 = top centre of the block — Z0 at the top face, X0/Y0 at the block centre. ## Fixture Machine vise — vise.stl, clamps below the part top (collision only). ## Coolant Water-soluble emulsion (flood) ## Tools T1 face mill brand NTM, product TXE1000 (D50, exact P/N missing) D50 6 inserts flute 6 tool length 60 holder Ø60 x 50 mm stick-out 80 T2 flat end brand cmtec, product CEXCRSH3120005 (catalog: cmtec-CEXCRSH3120005.pdf) D12 R0 4 flutes helix 30° rake 10° flute 30 tool length 90 holder Ø40 x 63 stick-out 95 T3 flat end brand cmtec (no exact P/N) D6 R0 4 flutes helix 30° flute 20 tool length 70 holder Ø25 x 60 stick-out 75 ## NC Files (folder `NC/`) O0010.NC face + rough the pocket with T1/T2 — watch spindle load near the deep pocket O0020.NC profile + floor finish with T3 Example 2 — Relief part, 5-axis, aluminum # Airplane relief — 5-axis VMC Airplane + logo lettering milled from a round Al6061T6 billet on a 5-axis vertical machining center (VMC). Goal: check the 5-axis toolpath for collisions/gouges, then optimize feed. ## Machine Model: 5-axis VMC (example machine) (machine file: MachineTool/Vmc5x/Vmc5x.mt) Config: table-C / spindle-B (C rotary on the table, B tilt on the spindle head) Pivots: C at (0, 0, 0), B at (-70, -180, 220) mm (relative to the C pivot) Tool mount: (-70, 70, 175) mm (where the tool is equipped) Controller: Fanuc Strokes: unbounded for this study ; rapid 20000 mm/min ; max spindle 8000 rpm ## Spindle Brand/model: built-in 8000 rpm spindle, ~5.5 kW (BT30 class) Source: machine builder spindle datasheet (power–torque chart; attachment b1-spindle-chart.png) Power (kW vs rpm): 0@0, 5.5@1500, 5.5@4500, 3@8000 Torque (Nm vs rpm): 50@1500, 30@2000, 20@3000, 15@4000, 8@6000, 5@8000 ## Workpiece Raw stock: round billet Ø65 x 50 mm Design: airplane.stl Material: Al6061T6 ## Program zero G54 = top centre of the billet — Z0 at the top face, X0/Y0 on the axis. (G55+ unused.) ## Fixture Round fixture Ø100 x 10 mm under the billet (collision only). ## Coolant Air blast (dry) ## Tools (all: brand cmtec, aluminum grade — product ID not given; carbide, 3 flutes, helix 37°, rake 15°, relief 5° [helix/rake estimated]; holder Ø25 x 60 mm, 8 mm flute-to-nose clearance) T1 flat end D6 R0 flute 20 tool length 75 T2 ball end D6 flute 20 tool length 75 T3 ball end D3 flute 20 tool length 75 T4 ball end D2 flute 8 tool length 75 ## NC Files (34 programs in folder `NC/`; actual filenames below) 01-ED6L20.NC, 02-ED6L20.NC … 10-ED6L28.NC roughing with T1 (flat D6) 11-R3L25.NC … 22-R3L25.NC semi-finish with T2 (ball D6) 23-R2L25.NC … 30-R2L25.NC finishing airplane-R1L12.NC, logo1-R1L12.NC, logo2-R1L12.NC, logo3-R1L12.NC detail airplane + logo with T4 (ball D2) (filename = seq-toolcode+cutlength; ED6 = flat end mill D6, R3/R2/R1 = ball, digit = nose radius) Note Example 2 mirrors a real .hincproj (machine name anonymized); Example 1 is representative with estimated values. The spindle model and the cutter brand + product ID are the anchors from which the engineer recovers the geometry and the power–torque chart. See Also Workflow: Basic Machining Simulation — set up and run a simulation once the data is collected Cutter — create the tools this list collects data for Machine Tool — build the kinematic model from CAD Program Zero Alignment — how HiNC aligns the program zero Spindle Capability — the speed–power–torque model" }, "workflows/sensor-mapping.html": { "href": "workflows/sensor-mapping.html", diff --git a/App/wwwroot/HiAPI-docsite/manual/basics/finding-your-way.html b/App/wwwroot/HiAPI-docsite/manual/basics/finding-your-way.html index 016bb754..3801d672 100644 --- a/App/wwwroot/HiAPI-docsite/manual/basics/finding-your-way.html +++ b/App/wwwroot/HiAPI-docsite/manual/basics/finding-your-way.html @@ -96,7 +96,7 @@ described.

job, in the order a job uses it:

  • Tool House — the tools, one editor per tool
  • -
  • General Setup — the equipment: the machine tool, the spindle capability, the background and +
  • General Setup — the equipment: the machine tool, the spindle capability, the ambient and coolant conditions, the fixture, the workpiece and the controller
  • Execution — the run: the mission that is executed, the program as it was played, and what the run reports
  • @@ -124,9 +124,9 @@ address is /preference/log. path of the selection — General Setup / Workpiece / Anchor / Geom To Fixture — which is also how these pages name a place in prose; the header shows as much of it as the dock is wide, so a deep path arrives truncated.

    -

    General Setup's tree has one root, General Setup, holding Machine Tool, Spindle -Capability, Background, Coolant, Fixture, Workpiece and Controller, in that -order. With a project open, a CSV Controller and a CL Controller node follow, each behind +

    General Setup's tree has four roots — Mechanism (holding Machine Tool, Fixture and +Workpiece), Spindle Capability, Environment (holding Ambient Temperature and +Coolant) and Controller — in that order. With a project open, a CSV Controller and a CL Controller node follow, each behind its own Preference checkbox — as siblings of Controller at the same level, not as children of it. With no project open neither node is built, whatever the preferences say. Execution's tree has one root, Execution, holding Mission above Program.

    @@ -253,7 +253,7 @@ page's node instead:

    /equipment/background-coolant -General Setup, the Background item +General Setup, the Environment root (Ambient Temperature / Coolant) /mission diff --git a/App/wwwroot/HiAPI-docsite/manual/basics/projects.html b/App/wwwroot/HiAPI-docsite/manual/basics/projects.html index 9e4690e9..2e1bce3e 100644 --- a/App/wwwroot/HiAPI-docsite/manual/basics/projects.html +++ b/App/wwwroot/HiAPI-docsite/manual/basics/projects.html @@ -88,7 +88,7 @@

    Projects

    A project is the whole of what a simulation runs against: the machine tool, the spindle capability, -the background and coolant conditions, the fixture, the workpiece, the tool house, the controller and +the ambient and coolant conditions, the fixture, the workpiece, the tool house, the controller and the NC programs a mission plays. It is a project file together with the folder that file sits in, and the Project dropdown on the menu bar is where one is created, opened, saved and closed. The equipment and mission screens are editors on whichever project is open, so a change of project diff --git a/App/wwwroot/HiAPI-docsite/manual/setup/coolant.html b/App/wwwroot/HiAPI-docsite/manual/setup/coolant.html index 3cdc41f9..0184d224 100644 --- a/App/wwwroot/HiAPI-docsite/manual/setup/coolant.html +++ b/App/wwwroot/HiAPI-docsite/manual/setup/coolant.html @@ -93,10 +93,11 @@ temperatures and everything downstream of them — and setting them needs no hea all, because the cooling types ship as ready-made files.

    Where it is

    The General Setup page, at /general-setup, reached from the menu bar's Page dropdown. -Background (/general-setup?tree=equipment/background) and Coolant -(/general-setup?tree=equipment/coolant) are two leaves of the Control Tree, sitting together -between Spindle Capability and Fixture. Both are inert until a project is open: the fields are -disabled and the panel says so.

    +Ambient Temperature (/general-setup?tree=equipment/background/environment-temperature) and +Coolant (/general-setup?tree=equipment/background/coolant) are the two leaves of the Control +Tree's Environment root, between Spindle Capability and Controller (the ids keep the legacy +background spelling). Both are inert until a project is +open: the fields are disabled and the panel says so.

    The Coolant leaf selected on a demo project. The panel under the tree opens with the file row — the Select dropdown, the path field reading No coolant file (saved inline), and Save As… — then the read-only Name and Note of whatever file is loaded, and then the condition's own @@ -190,17 +191,19 @@ loses its .default marker on the way, because that marker means

    The result is loadable into the next project through the same Select dropdown — which is the point of saving one: a shop with its own measured coolant performance describes it once.

    -

    Background temperature

    -

    The Background leaf carries a single field, Background Temperature in °C: the surrounding -temperature the thermal model works against. It defaults to 25 °C, it belongs to the project exactly -as the coolant condition does, and it is read by the same milling-temperature model and by the feed -optimizer, so it is not a display setting.

    -

    Set it to the shop's real ambient. There is no file to load and nothing else to configure: one -number, applied to the whole project.

    +

    Ambient temperature

    +

    The Ambient Temperature leaf carries a single field of the same name, in °C: the shop-floor ambient +temperature — the temperature the workpiece, the cutter, the chips and the spindle start at, and the +one the spindle cools toward. The cutting zone itself convects to the Coolant leaf's coolant +temperature, not to this one. It defaults to 25 °C, it belongs to the project exactly as the coolant +condition does, and it is read by the same milling-temperature model and by the feed optimizer, so +it is not a display setting.

    +

    Set it to the shop's real ambient temperature. There is no file to load and nothing else to +configure: one number, applied to the whole project.

    See Also

    diff --git a/App/wwwroot/HiAPI-docsite/manual/setup/index.html b/App/wwwroot/HiAPI-docsite/manual/setup/index.html index c836a78f..aa9f177b 100644 --- a/App/wwwroot/HiAPI-docsite/manual/setup/index.html +++ b/App/wwwroot/HiAPI-docsite/manual/setup/index.html @@ -112,7 +112,7 @@

Environment

    -
  • Coolant — Pick how the cutting zone is cooled, and set the ambient temperature it works against
  • +
  • Coolant — Pick how the cutting zone is cooled, and set the shop's ambient temperature the thermal model starts from

Which NC vocabulary a controller brand honours is not a setup task and no longer lives here — it is NC Dialects. Neither is what a cutter's quantities mean: the diff --git a/App/wwwroot/HiAPI-docsite/manual/utilities/mech-builder.html b/App/wwwroot/HiAPI-docsite/manual/utilities/mech-builder.html index be8d6623..f10de435 100644 --- a/App/wwwroot/HiAPI-docsite/manual/utilities/mech-builder.html +++ b/App/wwwroot/HiAPI-docsite/manual/utilities/mech-builder.html @@ -195,7 +195,8 @@ runtime — a machine's moving axes are branches carrying those.

The same mechanism with a branch picked instead: the graph edge is stroked green, the Identity card names the two anchors it joins with an arrow between them, and the Transformer card reads Dynamic Rotation over a rotation axis, an angle and a pivot

At /util/mech-builder, with a branch picked. A Dynamic Rotation carries the axis it turns about and the pivot it turns around; the angle is the value a run varies, so the number shown here -is the resting one. The sentence under the fields names the same three parts.

+is the resting one. The sentence under the fields names two of those parts, the axis and the +angle, and says that the angle is the one a run varies.

See Also

  • File Explorer — the server-side browser behind this page's Load and Save As dialogs, and the roots they offer
  • diff --git a/App/wwwroot/HiAPI-docsite/product/system-requirements.html b/App/wwwroot/HiAPI-docsite/product/system-requirements.html index 832b7754..5fe6584c 100644 --- a/App/wwwroot/HiAPI-docsite/product/system-requirements.html +++ b/App/wwwroot/HiAPI-docsite/product/system-requirements.html @@ -127,8 +127,8 @@ an earlier runtime cannot load them at all

    Graphics and GPU

    • GPU is used only for 3D rendering/visualization, not for computation acceleration
    • -
    • A working OpenGL context is required even if nobody looks at the 3D view: the rendering engine is initialised at startup, and the software will not start without one
    • -
    • Cloud deployment is supported, but choose an instance that has a GPU with its graphics driver installed. Instances with no GPU, or with a GPU whose driver is missing, are the usual cause of a failed start
    • +
    • The rendering engine is initialised at startup even if nobody looks at the 3D view. A host with no usable OpenGL context still starts and logs one line saying so: NC play, physics and training run, the 3D view does not
    • +
    • Cloud deployment is supported; for the 3D view choose an instance that has a GPU with its graphics driver installed. An instance with no GPU, or with a GPU whose driver is missing or mismatched, runs headless without 3D

    Storage Performance

      diff --git a/App/wwwroot/HiAPI-docsite/release-note/index.html b/App/wwwroot/HiAPI-docsite/release-note/index.html index 16c12bdf..ec91950f 100644 --- a/App/wwwroot/HiAPI-docsite/release-note/index.html +++ b/App/wwwroot/HiAPI-docsite/release-note/index.html @@ -87,6 +87,113 @@

      Release Note

      +

      HiNc Packages Version 3.2.26

      +

      Rotary-axis correctness on SoftNc, cutting forces that no longer depend on how the geometry kernel +tiled the contact surface, and a process that survives a host without OpenGL. The 3.1.175 → 3.2 line +jump is the 3.2.7 entry below; the long form is still +Upgrading from 3.1.175 to 3.2.

      +
      +
      Important
      +

      Adoption status. Verification is still in progress across most areas.

      +

      Do not put 3.2 NC optimization into production. It is not finished on this line. +Work that depends on optimization should stay on the 3.1 line, serviced as +3.1.175.<patch>. The Blazor front end tracks the 3.2 packages, so it is not a way +to stay on the 3.1 behaviour.

      +

      The 3.2.24 hold on SoftNc canned cycles that index a rotary axis is lifted — see the +first entry below.

      +
      +
        +
      • SoftNc canned cycles take rotary axis words. A G81–G89 repeat block carrying an A / B / C +word indexes the table and drills again — the standard bolt-circle shape — where 3.2.24 either +skipped the hole or drilled it at the previous angle: a rotary-only repeat fires the cycle, a +mixed block pre-positions XYZ and the table in one simultaneous move before the strokes, and +under G68.2 without RTCP the feature frame stays pinned in machine space so the hole stays put +while the workpiece turns. Under G91 only the words the block itself spoke are increments, so +an X-pitch repeat no longer doubles Y. Hole bottoms match the HardNc replay of a customer's +bolt-circle program to 0.000 mm on all twelve C-indexed blocks, and setting +EnableSoftNcRunner false is no longer needed for +such programs. See +Brand NC language coverage +and ISO core
      • +
      • A rotary word under modal G91 is an increment on SoftNc. G91 … C20. followed by C20. +leaves the table at 40, not 20; a per-word directive (C=AC(90), ACP / ACN, IC()) still +wins over the modal state, and a spoken G91 B270. stays a +270° traverse instead of folding to +−90°. A G91 G28 rotary intermediate anchors on the previous modal angle (G91 G28 C10. from +C90 passes through 100, then returns home) instead of on zero. HardNc keeps its documented +absolute reading of a rotary word under G91 and warns. The programmed deltas are recorded on +the block in IncrementalWords, beside the +RotaryWords the block spoke. See +Results that change on upgrade
      • +
      • Rotary IK no longer reports failure from a pole seed. Every solve attempt now runs its +coarse stage and its polish, so a small tilt with a large azimuth that used to run out of +iterations a few milliradians short — and was then refused by G53.1, leaving the table at +A = C = 0 with the tilt still active and the whole path rotated off the part — solves to +1e-8 rad. On a Fanuc IJK grid from the pole seed, 54 / 69 failures per A/C chain become 0; on a +CL program 44 dropped endpoints of 536 become 0. The happy path is unchanged bit for bit; only a +failed attempt pays one extra polish
      • +
      • Rotary travel picks the reachable IK branch. When the nearest solution lies outside an axis' +configured travel, the axial solve searches the other branches (sign, half-turn and supplement +combinations) and keeps the admissible one nearest the entry; G53.1, G68.2, CYCLE800, +PLANE SPATIAL and the LN vector syntax pass the travel through the new admissibility overloads +of IMachineKinematics and +RotaryAdmissibility. The travel itself now +reaches SoftNc from every project: a stroke limit declared only in the legacy machine-limits +boxes is copied into the controller parameter table on load for the axes carrying no end there +(explicit rows win), where 3.2.24 checked such a project against nothing. Both stroke checks +apply Tolerance, so an axis parked exactly on its +limit is not reported. See +Per-axis tables
      • +
      • A rapid traverse that removes stock is reported. Play-RapidCut--Detected folds the G00 +steps of one NC line that touched the workpiece into one validation warning, anchored on the +line's first cutting step and carrying the line's removed volume (geometry only), its +touching-step count and its largest cutting depth. The line total is gated by the project-level +RapidCutVolumeThreshold_mm3 (default 0: any +contact reports); a step with the spindle stopped is left to collision detection while that is +on. IsRapid marks the step. See +New diagnostics
      • +
      • Cutter–workpiece engagement no longer depends on how the contact surface was tiled. The scan +that turns a step's contact contours into the engaged angle ranges of +LayerMillingEngagement dropped its dense-step bounding-box shortcut +and its winding dependence; a cylinder wall and a flat floor sector reproduce their analytic arcs +to 1e-9 rad at four tessellations, and the managed and native paths stay bit-identical. +Re-running an existing program moves the forces on most engaged steps — floors that used to +register as empty and side ranges fragmented by phantom 1° gaps move the most — and coefficient +sets trained before this build embed the old engagement. See +Results that change on upgrade
      • +
      • The cube tree folds a re-cut flat region again. A comparison in the simplification gate had +been inverted since 2023, so a floor roughened by one pass and re-cut flat by a later one stayed +at its finest level for the life of the tree. On a 1000-move CL replay the node count drops 17% +and the peak working set 8%; the meshed-geometry writer and the fly-piece remover now tolerate a +fold landing under them mid-cut instead of crashing. See +Geometry, rendering and native stability
      • +
      • A host with no usable OpenGL no longer aborts the process. Where the native display +initialiser used to kill the process at startup — every service on a machine whose graphics +driver and kernel module disagree — it now reports, and NC play, physics and training run +without 3D. IsGlAvailable carries the verdict and HiNc logs it once at +startup; a host must not obtain a DispEngine while it is false. See +System requirements
      • +
      • Packaging. The Linux licence-key native library in the HiDisp package ships stripped: the +protected file no longer carries debug information
      • +
      +

      Committed after the 3.2.26 pack — these ship in the next package build:

      +
        +
      • BackgroundTemperature renames to AmbientTemperature. +AmbientTemperature_C / +AmbientTemperature_K (and the same +pair on MachiningEquipment) name the shop-floor +temperature the workpiece, cutter, chips and spindle start at and the spindle cools toward; the +old names remain as [Obsolete] delegates. A .hincproj now writes <AmbientTemperature_C> and +still reads the legacy element and the 2019 wrapper, so no project needs editing. See +Coolant and +Breaking changes
      • +
      • Every NC-pipeline rewind raises one event. Suit rewiring, PowerReset and +ResetRuntime share one seam that drops the runner session +state and the NC diagnostics and raises +OnNcPipelineReset before the next file's pieces +arrive, so a consumer keyed by file / sentence index drops its stale index in step instead of +merging the next file into the previous file's numbers. See +Session, project and commands
      • +

      HiNc Packages Version 3.2.24

      Correctness and coverage that landed after 3.2.7. The 3.1.175 → 3.2 line jump is the 3.2.7 entry below; the long form is still diff --git a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/brand-nc-language-coverage.html b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/brand-nc-language-coverage.html index 12e00669..5a6d6301 100644 --- a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/brand-nc-language-coverage.html +++ b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/brand-nc-language-coverage.html @@ -258,11 +258,21 @@ extended table (P1–P48). A selected row nobody has entered reports Coord spelling of G20 and reports Unit--InchNotSupported rather than silently switching units. G05.1 Q1 / Q0 is AICC / Nano Smoothing (recognized). Bare G05 P{n} is a different feature (HPCC) and is consumed without changing programmed coordinates, reported under the Hpcc--* ids. -

    • Canned-cycle repeats do not take rotary words on SoftNc. The G73–G89 family expands XYZ / R / -Q / F / P / K strokes. An A / B / C word on a repeat is not taken: a rotary-only repeat does not -fire the cycle, a mixed block drops the rotary word, and under G68.2 the hole follows the table. -Not finished on this line, see Adoption status on the release-note page. The -HardNc fallback indexes those blocks the way a control does.
    • +
    • Canned-cycle repeats take rotary words on SoftNc. The G73–G89 family expands XYZ / R / Q / +F / P / K strokes, and a repeat block carrying an A / B / C word indexes the table and drills +again, the way a control does: a rotary-only repeat fires the cycle, a mixed block pre-positions +XYZ and the table in one simultaneous move before the strokes, and under G68.2 without RTCP the +feature frame stays pinned in machine space so the hole stays put while the workpiece turns. Under +G91 only the words the block itself spoke are increments. The hold that 3.2.24 placed on these +programs is lifted; EnableSoftNcRunner = false is no longer needed for them.
    • +
    • A rotary word under modal G91 is an increment on SoftNc. A bare A / B / C word follows the +block's modal positioning onto the same anchor + delta path as Siemens IC() and klartext IC+: +G91 … C20. then C20. leaves the table at 40. A per-word directive (C=AC(90), ACP / ACN, +IC()) still beats the modal state, and a spoken G91 B270. stays a +270° traverse instead of +folding to −90°. A G91 G28 rotary intermediate anchors on the previous modal angle, then +returns home. HardNc keeps its absolute reading of a rotary word under G91 and warns. The +programmed deltas are recorded in IncrementalWords, beside the +RotaryWords the block spoke.

    Cross-brand

      diff --git a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/breaking-changes.html b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/breaking-changes.html index cd691522..6cb4ce56 100644 --- a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/breaking-changes.html +++ b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/breaking-changes.html @@ -386,6 +386,13 @@ the authored one — the only face a project file persists, reached as physics, collision and execution display read; it is rebuilt from the authored face at project assignment and at session boundaries, so a value written onto it is discarded rather than saved. See Getting started. +
    • BackgroundTemperature_C / _K on both equipment faces rename to +AmbientTemperature_C / +AmbientTemperature_K (and the same pair +on MachiningEquipment): the shop-floor temperature the +workpiece, cutter, chips and spindle start at and the spindle cools toward. The old names remain +as [Obsolete] delegates, so nothing stops compiling. A .hincproj now writes +<AmbientTemperature_C>; the reader still accepts the legacy element and the 2019 wrapper.

    8. Defaults and gates that changed

      diff --git a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/geometry-rendering-and-stability.html b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/geometry-rendering-and-stability.html index 51d36d49..240fc256 100644 --- a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/geometry-rendering-and-stability.html +++ b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/geometry-rendering-and-stability.html @@ -120,6 +120,22 @@ mirrors RemoveBySweepingVolume — the geometry-layer symmetric poi no deposition step in the machining runner yet, so this is a geometry-level API only.
    • FreeformBottomContour is the user-editable point-list bottom contour, mirroring the side contour with the key axis switched to radius.
    • +
    • A host with no usable OpenGL no longer aborts the process. The native display initialiser +used to end the whole process when the GL loader failed — before any NC play, physics or training, +none of which need GL — which is what made every service on a machine whose graphics driver and +kernel module disagree unstartable, and kept it dead until the driver was fixed. It now reports +and returns; IsGlAvailable carries the verdict, ContextProjDepth reads +0 in that state, and HiNc logs one line at startup saying so. The contract is that a host must +not obtain a DispEngine while IsGlAvailable is false, rather than guard +individual draw calls.
    • +
    • The cube tree folds a re-cut flat region again. A comparison in the simplification gate had +been inverted since 2023: it demanded the marching-cubes ambiguous face pattern instead of +forbidding it, so almost no cell reached the reproduction test and a floor roughened by one pass +and re-cut flat by a later one stayed at its finest level for the life of the tree. 128 of the 256 +corner masks now pass, the 1e-9 reproduction test behind the gate is unchanged. On a 1000-move CL +replay the node count drops 17% and the peak working set 8%. Because folds are now routine, the +meshed-geometry writer and the fly-piece remover tolerate a child array folded away under them +while a cut runs on another thread — a snapshot taken mid-cut stays torn, but no longer crashes.
    diff --git a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/index.html b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/index.html index 89231368..f292627a 100644 --- a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/index.html +++ b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/index.html @@ -88,7 +88,7 @@

    Upgrading from 3.1.175 to 3.2

    These pages are the long form of the 3.1.175 → 3.2 line — the 3.2.7 entry and the -3.2.24 incremental drop. They exist because 3.2 is not +3.2.24 and 3.2.26 incremental drops. They exist because 3.2 is not an increment on the last release most callers hold — it is the accumulation of everything that landed after the 3.1.175 package set, delivered in one step.

    Read them in order the first time. The two sections that decide whether an upgrade is a recompile or @@ -99,9 +99,9 @@ capability you can adopt when you need it.

    Important

    Read the Adoption status note on the release-note page before planning around this. The short version: 3.2 is published for review, verification is still in progress across most -areas, NC optimization is not finished on this line, and SoftNc canned-cycle indexing -with rotary A/B/C words is not finished — work that depends on either should stay on 3.1, -serviced as 3.1.175.<patch>, or run with SoftNc off for the rotary-cycle case.

    +areas and NC optimization is not finished on this line — work that depends on it should stay +on 3.1, serviced as 3.1.175.<patch>. The 3.2.24 hold on SoftNc canned cycles that index a +rotary axis is lifted in 3.2.26.

    Pages

    Ordered the way to read them: what the package numbers mean, then the two sections that decide whether the upgrade is a recompile or an afternoon, then the new capability, adopted when needed.

    diff --git a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/milling-physics-and-training.html b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/milling-physics-and-training.html index ed277f12..197883bd 100644 --- a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/milling-physics-and-training.html +++ b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/milling-physics-and-training.html @@ -191,6 +191,10 @@ step touched the workpiece but no touched step carries a physics brief — namin gate it: a tool bound to the spindle, the spindle actually rotating, and the workpiece cutting parameter). That last state previously surfaced one process later, as a training run gathering zero samples. +
  • Engagement is tessellation-invariant. The scan that turns a step's contact contours into +the engaged angle ranges no longer depends on how many polygons the geometry kernel cut the +contact surface into; forces on existing programs move accordingly — see +Results that change on upgrade.
  • Performance is collected in its own section below.
diff --git a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/results-that-change-on-upgrade.html b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/results-that-change-on-upgrade.html index 909c2296..95f9d26e 100644 --- a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/results-that-change-on-upgrade.html +++ b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/results-that-change-on-upgrade.html @@ -242,6 +242,31 @@ them on the bench fixtures); the largest moves are floors that used to register whole bottom disc dropped out — and side ranges that were fragmented into pieces separated by phantom 1° gaps. Coefficient sets trained before this change embed the old engagement of their training program; retrain on a replay if that fit matters. +
  • SoftNc canned cycles index a rotary axis. A G81–G89 repeat block carrying an A / B / C word +used to skip the hole (rotary-only repeat), drill it at the previous angle (mixed block) or let it +follow the table under G68.2. It now indexes the table and drills again, pre-positioning XYZ and +the table in one move, and under G68.2 without RTCP the feature frame stays pinned in machine +space. Under G91 only the words the block itself spoke are increments — an X-pitch repeat used +to add the previous cycle's Y a second time and drill upward. A bolt-circle program that ran +short of holes, or drilled them in the wrong place, now matches the HardNc replay.
  • +
  • A rotary word under modal G91 is an increment. G91 … C20. then C20. left the table at +20; it is 40 now. A spoken G91 B270. stays a +270° traverse instead of folding to −90°, and a +G91 G28 rotary intermediate anchors on the previous modal angle instead of on zero (G91 G28 C0 from C90 now holds the table and returns home instead of swinging to 0 first). Per-word +directives (C=AC(90), ACP / ACN, IC()) are unchanged. HardNc keeps its absolute reading +and warns.
  • +
  • Rotary IK from a pole seed. Every solve attempt now runs coarse then polish, so a small tilt +with a large azimuth that ran out of iterations a few milliradians short — and was refused by +G53.1, leaving the table at A = C = 0 with the tilt active and the path rotated off the part — +now solves to 1e-8 rad. On a Fanuc IJK grid from the pole seed 54 / 69 failures per A/C chain +become 0; a CL program goes from 44 dropped endpoints of 536 to 0.
  • +
  • The rotary branch inside the travel wins. When the nearest IK solution lies outside an axis' +configured travel, G53.1, G68.2, CYCLE800, PLANE SPATIAL and LN now take the admissible +branch nearest the entry (sign, half-turn and supplement combinations are searched); a posture +the cradle cannot take is no longer commanded silently. This needs the travel to be known, and +it now is on every project: stroke limits declared only in the legacy machine-limits boxes are +copied into the controller parameter table on load for the axes carrying no end there, where they +used to be checked against nothing on SoftNc. An axis parked exactly on its limit is no longer +reported (Tolerance).
  • The SoftNc pipeline is the default engine.
  • Executed SyntaxPieces freeze to UTF-8 (below), so their JsonObject is a fresh read-only snapshot per call rather than a retained live graph.
  • diff --git a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/session-project-and-commands.html b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/session-project-and-commands.html index b46cf91e..2817ba47 100644 --- a/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/session-project-and-commands.html +++ b/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/session-project-and-commands.html @@ -158,6 +158,13 @@ rewinds the NC-runner session state, so the next play restarts file and line ind the way PowerReset does, and it resets the CL device pose to identity. It no longer clobbers MachiningResolution_mm: the runtime resolution is seeded from the workpiece's initial resolution only when a project loads, so an explicit override survives a runtime reset and a workpiece swap. +
  • Every NC-pipeline rewind raises one event. Suit rewiring, PowerReset and +ResetRuntime each dropped the runner session state on their +own with no notification, so the file / sentence counters restarted at 0 on the next play while +the session and its subscribers lived on — a consumer keyed by file index merged the next NC file +into the previous file's numbers. One seam now performs the reset (session state and the NC +diagnostics) and raises OnNcPipelineReset, an +app-lifetime event, before the next file's pieces arrive.
  • Mixed runner kinds in one session are refused. NcRunnerSessionState remembers the runner that initialised it and RunNcLines refuses a different one with RunNcLines--RunnerMismatch — reachable now that NcKind.Auto makes mixed-kind missions a diff --git a/App/wwwroot/HiAPI-docsite/technique/api-foundations/getting-started.html b/App/wwwroot/HiAPI-docsite/technique/api-foundations/getting-started.html index b17ec72d..8557bce4 100644 --- a/App/wwwroot/HiAPI-docsite/technique/api-foundations/getting-started.html +++ b/App/wwwroot/HiAPI-docsite/technique/api-foundations/getting-started.html @@ -201,7 +201,7 @@ assignment and at session boundaries, so a value written onto it is discarded ra
  • MachiningChain - Configure the complete machine tool including geometry, kinematic chain, and coordinate transformations
  • SpindleCapability - Configure SpindleCapability
  • CoolantHeatCondition - Configure coolant heat conditions
  • -
  • BackgroundTemperature_C - Configure the environment background temperature in Celsius; BackgroundTemperature_K holds the same value in Kelvin
  • +
  • AmbientTemperature_C - Configure the ambient (shop-floor) temperature in Celsius, the temperature the thermal model starts from; AmbientTemperature_K holds the same value in Kelvin
  • Variable settings: diff --git a/App/wwwroot/HiAPI-docsite/technique/milling-physics/coolant-model.html b/App/wwwroot/HiAPI-docsite/technique/milling-physics/coolant-model.html index ed98d088..c5d52421 100644 --- a/App/wwwroot/HiAPI-docsite/technique/milling-physics/coolant-model.html +++ b/App/wwwroot/HiAPI-docsite/technique/milling-physics/coolant-model.html @@ -225,7 +225,7 @@ means, to how the condition is stored.

    See Also

    diff --git a/App/wwwroot/HiAPI-docsite/technique/nc-dialects/controller-iso.html b/App/wwwroot/HiAPI-docsite/technique/nc-dialects/controller-iso.html index e745a978..99405580 100644 --- a/App/wwwroot/HiAPI-docsite/technique/nc-dialects/controller-iso.html +++ b/App/wwwroot/HiAPI-docsite/technique/nc-dialects/controller-iso.html @@ -151,7 +151,7 @@ its own for the rest — see Siemens SINUMERIK. G28 -Reference-point (home) return through an intermediate point. +Reference-point (home) return through an intermediate point. Under G91 a rotary word gives the intermediate as an increment on the previous modal angle. G53 @@ -190,7 +190,7 @@ its own for the rest — see Siemens SINUMERIK. G90 / G91 -Absolute / incremental positioning. +Absolute / incremental positioning. Under G91 a bare rotary word is an increment too; a per-word directive (C=AC(90), ACP / ACN, IC()) overrides the modal state. G94 / G95 @@ -376,11 +376,12 @@ tool-house refresh is chosen on Adoption status note.

    +

    A repeat block carrying an A / B / C word indexes the table and drills again, the standard way to +drill a bolt circle: a rotary-only repeat fires the cycle (any axis word repeats it), a mixed block +pre-positions XYZ and the table in one simultaneous move before the strokes, and under G68.2 +without RTCP the feature frame stays pinned in machine space so the hole stays put while the +workpiece turns. Under G91 only the words the block itself spoke are increments — an X-pitch +repeat does not move Y again.

    Polar interpolation

    G12.1 turns polar coordinate interpolation on and G13.1 turns it off. Inside a polar section the X word is a diameter and the C word is a hypothetical Cartesian axis in millimetres, not diff --git a/App/wwwroot/HiAPI-docsite/technique/rendering/rendering-canvas.html b/App/wwwroot/HiAPI-docsite/technique/rendering/rendering-canvas.html index 69e21eac..c8c3d1d2 100644 --- a/App/wwwroot/HiAPI-docsite/technique/rendering/rendering-canvas.html +++ b/App/wwwroot/HiAPI-docsite/technique/rendering/rendering-canvas.html @@ -98,7 +98,7 @@

    Core Concept: DispEngine and IDisplayee

    At the heart of the rendering system is the relationship between DispEngine and IDisplayee:

      -
    • DispEngine: The rendering engine that manages the OpenGL context and handles user interaction
    • +
    • DispEngine: The rendering engine that manages the OpenGL context and handles user interaction. IsGlAvailable reports whether the process obtained a usable context; a host must not obtain a DispEngine while it is false — NC play, physics and training still run in that state, rendering does not
    • IDisplayee: The interface that defines objects that can be rendered by the DispEngine

    This relationship is fundamental - the purpose of DispEngine is to render IDisplayee objects.

    diff --git a/App/wwwroot/HiAPI-docsite/workflows/project-data-checklist.html b/App/wwwroot/HiAPI-docsite/workflows/project-data-checklist.html index 3a63451c..f0a3828c 100644 --- a/App/wwwroot/HiAPI-docsite/workflows/project-data-checklist.html +++ b/App/wwwroot/HiAPI-docsite/workflows/project-data-checklist.html @@ -274,7 +274,7 @@

    See Spindle Capability.

    3. Environment

      -
    • Coolant type — which coolant is used. Optional — if omitted, a default coolant setting is applied. The remaining coolant/thermal values (temperature, convection, background temperature) keep their defaults too; they only affect thermal and wear results.
    • +
    • Coolant type — which coolant is used. Optional — if omitted, a default coolant setting is applied. The remaining coolant/thermal values (temperature, convection, ambient temperature) keep their defaults too; they only affect thermal and wear results.

    See Coolant.

    4. Workpiece

    diff --git a/App/wwwroot/HiAPI-docsite/xrefmap.yml b/App/wwwroot/HiAPI-docsite/xrefmap.yml index f9984aea..805f4844 100644 --- a/App/wwwroot/HiAPI-docsite/xrefmap.yml +++ b/App/wwwroot/HiAPI-docsite/xrefmap.yml @@ -8,7 +8,7 @@ references: name: APT Profile Panel href: anatomy/tool-house/cutter/apt-profile-panel.html - uid: Anatomy-BackgroundCoolant - name: Background / Coolant + name: 'Environment: Ambient Temperature / Coolant' href: anatomy/general-setup/background-coolant.html - uid: Anatomy-Box3dControl name: Box3d Editor @@ -69657,6 +69657,32 @@ references: fullName.vb: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.New nameWithType: MachiningEquipment.MachiningEquipment nameWithType.vb: MachiningEquipment.New +- uid: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_C + name: AmbientTemperature_C + href: api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_AmbientTemperature_C + commentId: P:Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_C + fullName: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_C + nameWithType: MachiningEquipment.AmbientTemperature_C +- uid: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_C* + name: AmbientTemperature_C + href: api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_AmbientTemperature_C_ + commentId: Overload:Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_C + isSpec: "True" + fullName: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_C + nameWithType: MachiningEquipment.AmbientTemperature_C +- uid: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_K + name: AmbientTemperature_K + href: api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_AmbientTemperature_K + commentId: P:Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_K + fullName: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_K + nameWithType: MachiningEquipment.AmbientTemperature_K +- uid: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_K* + name: AmbientTemperature_K + href: api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_AmbientTemperature_K_ + commentId: Overload:Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_K + isSpec: "True" + fullName: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.AmbientTemperature_K + nameWithType: MachiningEquipment.AmbientTemperature_K - uid: Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.Asmb name: Asmb href: api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_Asmb @@ -70385,6 +70411,32 @@ references: fullName.vb: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.New nameWithType: SetupEquipment.SetupEquipment nameWithType.vb: SetupEquipment.New +- uid: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_C + name: AmbientTemperature_C + href: api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_AmbientTemperature_C + commentId: P:Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_C + fullName: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_C + nameWithType: SetupEquipment.AmbientTemperature_C +- uid: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_C* + name: AmbientTemperature_C + href: api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_AmbientTemperature_C_ + commentId: Overload:Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_C + isSpec: "True" + fullName: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_C + nameWithType: SetupEquipment.AmbientTemperature_C +- uid: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_K + name: AmbientTemperature_K + href: api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_AmbientTemperature_K + commentId: P:Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_K + fullName: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_K + nameWithType: SetupEquipment.AmbientTemperature_K +- uid: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_K* + name: AmbientTemperature_K + href: api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_AmbientTemperature_K_ + commentId: Overload:Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_K + isSpec: "True" + fullName: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.AmbientTemperature_K + nameWithType: SetupEquipment.AmbientTemperature_K - uid: Hi.Machining.MachiningEquipmentUtils.SetupEquipment.Asmb name: Asmb href: api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_Asmb @@ -70974,6 +71026,19 @@ references: fullName.vb: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.New nameWithType: MachiningVolumeRemovalProc.StepMotionSnapshot.StepMotionSnapshot nameWithType.vb: MachiningVolumeRemovalProc.StepMotionSnapshot.New +- uid: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.AmbientTemperature_K + name: AmbientTemperature_K + href: api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html#Hi_Machining_MachiningVolumeRemovalProc_StepMotionSnapshot_AmbientTemperature_K + commentId: P:Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.AmbientTemperature_K + fullName: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.AmbientTemperature_K + nameWithType: MachiningVolumeRemovalProc.StepMotionSnapshot.AmbientTemperature_K +- uid: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.AmbientTemperature_K* + name: AmbientTemperature_K + href: api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html#Hi_Machining_MachiningVolumeRemovalProc_StepMotionSnapshot_AmbientTemperature_K_ + commentId: Overload:Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.AmbientTemperature_K + isSpec: "True" + fullName: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.AmbientTemperature_K + nameWithType: MachiningVolumeRemovalProc.StepMotionSnapshot.AmbientTemperature_K - uid: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.AnchorTransformDictionary name: AnchorTransformDictionary href: api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html#Hi_Machining_MachiningVolumeRemovalProc_StepMotionSnapshot_AnchorTransformDictionary @@ -70987,19 +71052,6 @@ references: isSpec: "True" fullName: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.AnchorTransformDictionary nameWithType: MachiningVolumeRemovalProc.StepMotionSnapshot.AnchorTransformDictionary -- uid: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.BackgroundTemperature_K - name: BackgroundTemperature_K - href: api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html#Hi_Machining_MachiningVolumeRemovalProc_StepMotionSnapshot_BackgroundTemperature_K - commentId: P:Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.BackgroundTemperature_K - fullName: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.BackgroundTemperature_K - nameWithType: MachiningVolumeRemovalProc.StepMotionSnapshot.BackgroundTemperature_K -- uid: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.BackgroundTemperature_K* - name: BackgroundTemperature_K - href: api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html#Hi_Machining_MachiningVolumeRemovalProc_StepMotionSnapshot_BackgroundTemperature_K_ - commentId: Overload:Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.BackgroundTemperature_K - isSpec: "True" - fullName: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.BackgroundTemperature_K - nameWithType: MachiningVolumeRemovalProc.StepMotionSnapshot.BackgroundTemperature_K - uid: Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.CoolantHeatCondition name: CoolantHeatCondition href: api/Hi.Machining.MachiningVolumeRemovalProc.StepMotionSnapshot.html#Hi_Machining_MachiningVolumeRemovalProc_StepMotionSnapshot_CoolantHeatCondition @@ -72466,6 +72518,12 @@ references: commentId: E:Hi.MachiningProcs.LocalProjectService.OnNcFileRan fullName: Hi.MachiningProcs.LocalProjectService.OnNcFileRan nameWithType: LocalProjectService.OnNcFileRan +- uid: Hi.MachiningProcs.LocalProjectService.OnNcPipelineReset + name: OnNcPipelineReset + href: api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_OnNcPipelineReset + commentId: E:Hi.MachiningProcs.LocalProjectService.OnNcPipelineReset + fullName: Hi.MachiningProcs.LocalProjectService.OnNcPipelineReset + nameWithType: LocalProjectService.OnNcPipelineReset - uid: Hi.MachiningProcs.LocalProjectService.OnShellMessageAdded name: OnShellMessageAdded href: api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_OnShellMessageAdded diff --git a/App/zh-Hans/HiNc.resources.dll b/App/zh-Hans/HiNc.resources.dll index 1c205fc219413be792828145f20b3779692f146e..53ba9c52fc01d26710ecfa6ec9fe50dfdc4b17d9 100644 GIT binary patch delta 231 zcmZoLXfT-2!LsCD&i;)(PRxwbo6j?gG6|G@{}sDPN6dFmj_>oo=kG91{=&M$!d%aQ zfx(24LEl)InB}})!5A3G||i?$uP~t(k$7+ zaPt$kRh*pC3``8n3=9m?o2LsjGcuZQmKG{z3^r%bX0QOlBnEQ^LxyA^%M1uDfb3Kt zFPXuV!H6M^A(6oZ$WCLh1k$Mt#y}P3K$%1!Z35J32$V4a%9(-n8%};GY|3iRpvPda OSy1d5<7P&&|BL_}G&q0& delta 231 zcmW-Zy=p>16ohBJF<_?&THHLsh3o$1uw_V^^g>$M`?D_~SPOz!SOhErAx~hXY~wqm z$TI|zXlIjNj}`+n-v#Sh$0Rc6WD-MSRH2^LE OFtZU5N&&M05dQ%!4;{4t diff --git a/App/zh-Hant/HiNc.resources.dll b/App/zh-Hant/HiNc.resources.dll index e3cabade48e14b6db2332fa1d0ea548ec5c4a45d..321498788874910000ea237ba91480a6512e71b5 100644 GIT binary patch delta 231 zcmW-Yu}%U(6h-f_3Lzm;8v@AE31$5e*3xnk}~V7sxak zdt1N3hA*(PffsU%dtT1F>&bfZy1n}9{_PI?X&^%X6FfI=JD5G%}_jX^qxKme!`R%awJRDicjb?GOzF0774P zpM)SE_Eus}7{PD~5F{*<<{0LZFN+j09C9dThm5;K!XLyY=T^LwY!o|v*~{v;pI#Fp NjQ!o