This commit is contained in:
2026-09-17 10:22:49 +08:00
parent bfa3106a69
commit 8f2d00155b
41 changed files with 4244 additions and 698 deletions
+58 -3
View File
@@ -1,8 +1,8 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"engineVersion": "3.2.30.0", "engineVersion": "3.2.31.0",
"filesParsed": 1282, "filesParsed": 1284,
"siteCount": 366, "siteCount": 377,
"sites": [ "sites": [
{ {
"id": "AddTimeDataByFile--Start", "id": "AddTimeDataByFile--Start",
@@ -494,6 +494,26 @@
"template": "{0} dwell of {1} spindle revolution(s) is recorded but not time-simulated: no modal spindle speed is known on this block.", "template": "{0} dwell of {1} spindle revolution(s) is recorded but not time-simulated: no modal spindle speed is known on this block.",
"file": "HiMech/NcParsers/LogicSyntaxs/DwellSyntax.cs" "file": "HiMech/NcParsers/LogicSyntaxs/DwellSyntax.cs"
}, },
{
"id": "EstimateSetupAngle--Applied",
"template": "Tool {0}: setup angle {1} deg -> {2} deg (estimate {3} deg, period {4} deg). Call ResetRuntime before replaying.",
"file": "HiNc/MachiningProcs/SessionShell.cs"
},
{
"id": "EstimateSetupAngle--AppliedFree",
"template": "Tool {0}: every flute's setup angle advanced by {1} deg (estimate {2} deg, period {3} deg). Call ResetRuntime before replaying.",
"file": "HiNc/MachiningProcs/SessionShell.cs"
},
{
"id": "EstimateSetupAngle-Apply--NoCutter",
"template": "Tool {0}: no milling cutter to apply the setup angle to.",
"file": "HiNc/MachiningProcs/SessionShell.cs"
},
{
"id": "EstimateSetupAngle-Apply--UnsupportedFluting",
"template": "Tool {0}: fluting type {1} has no setup angle to apply the estimate to.",
"file": "HiNc/MachiningProcs/SessionShell.cs"
},
{ {
"id": "ExportMeshedGeomToObj--Done", "id": "ExportMeshedGeomToObj--Done",
"template": "{0}({1}) done.", "template": "{0}({1}) done.",
@@ -1209,6 +1229,41 @@
"template": "{0} has not been set.", "template": "{0} has not been set.",
"file": "HiNc/MachiningProcs/LocalProjectService.cs" "file": "HiNc/MachiningProcs/LocalProjectService.cs"
}, },
{
"id": "SetupAngle--Estimated",
"template": "Setup angle estimated: {0} deg (period {1} deg, {2} flutes); scale {3}; fixed-scale angle {4} deg; contrast {5}; model ripple {6}; scatter {7} deg; R {8}; steps {9}/{10}; mirror ratio {11}.",
"file": "HiNc/MillingForces/Training/SetupAngleEstimation.cs"
},
{
"id": "SetupAngle-Contrast--Low",
"template": "The objective barely depends on the angle (contrast {0}); the cut does not modulate the transverse moment within a revolution (full slot?). The estimate is unreliable.",
"file": "HiNc/MillingForces/Training/SetupAngleEstimation.cs"
},
{
"id": "SetupAngle-Frame--MirrorSuspected",
"template": "A mirrored sensor frame (My negated) fits {0} better than a plain rotation; check the holder axis mapping before applying the angle.",
"file": "HiNc/MillingForces/Training/SetupAngleEstimation.cs"
},
{
"id": "SetupAngle-Sample--NoneNoShots",
"template": "No samples for the setup-angle estimate gathered from {0} touched steps. Check that the mapped holder data overlaps the play time range and contains valid moment shots.",
"file": "HiNc/MillingForces/Training/MillingTraining.cs"
},
{
"id": "SetupAngle-Sample--NoneUntouched",
"template": "No samples for the setup-angle estimate: none of the {0} played steps touched the workpiece. Check positioning modality (e.g. a G91 G28 header without a following G90), the work offset / program zero, the workpiece stock and the tool geometry, then re-play before estimating.",
"file": "HiNc/MillingForces/Training/MillingTraining.cs"
},
{
"id": "SetupAngle-Step--CcwSkipped",
"template": "Skipped {0} counter-clockwise (M04) steps: the setup-angle estimate needs the model's clockwise spindle sense.",
"file": "HiNc/MillingForces/Training/MillingTraining.cs"
},
{
"id": "SetupAngle-Tool--Estimating",
"template": "Estimating setup angle of tool {0} ({1} flutes, {2} steps)..",
"file": "HiNc/MillingForces/Training/MillingTraining.cs"
},
{ {
"id": "ShotFile-Create--Done", "id": "ShotFile-Create--Done",
"template": "File[{0}] created. Building..", "template": "File[{0}] created. Building..",
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+75 -75
View File
@@ -11,9 +11,9 @@
"dependencies": { "dependencies": {
"AvalonEdit": "6.3.0.90", "AvalonEdit": "6.3.0.90",
"FontAwesome.Sharp": "6.3.0", "FontAwesome.Sharp": "6.3.0",
"Hi.WpfPlus": "3.2.26", "Hi.WpfPlus": "3.2.27",
"HiNc": "3.2.27", "HiNc": "3.2.28",
"HiNc-Resource": "3.2.24", "HiNc-Resource": "3.2.25",
"Serilog.Extensions.Hosting": "10.0.0", "Serilog.Extensions.Hosting": "10.0.0",
"Serilog.Sinks.Console": "6.1.1", "Serilog.Sinks.Console": "6.1.1",
"Serilog.Sinks.File": "7.0.0", "Serilog.Sinks.File": "7.0.0",
@@ -1598,36 +1598,36 @@
} }
} }
}, },
"Hi.WpfPlus/3.2.26": { "Hi.WpfPlus/3.2.27": {
"dependencies": { "dependencies": {
"HiDisp": "3.2.33" "HiDisp": "3.2.34"
}, },
"runtime": { "runtime": {
"lib/net10.0-windows7.0/Hi.WpfPlus.dll": { "lib/net10.0-windows7.0/Hi.WpfPlus.dll": {
"assemblyVersion": "3.2.26.0", "assemblyVersion": "3.2.27.0",
"fileVersion": "3.2.26.0" "fileVersion": "3.2.27.0"
} }
} }
}, },
"HiCbtr/3.2.29": { "HiCbtr/3.2.30": {
"dependencies": { "dependencies": {
"HiDisp": "3.2.33" "HiDisp": "3.2.34"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiCbtr.dll": { "lib/net10.0/HiCbtr.dll": {
"assemblyVersion": "3.2.29.0", "assemblyVersion": "3.2.30.0",
"fileVersion": "3.2.29.0" "fileVersion": "3.2.30.0"
} }
} }
}, },
"HiDisp/3.2.33": { "HiDisp/3.2.34": {
"dependencies": { "dependencies": {
"HiGeom": "3.2.26" "HiGeom": "3.2.27"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiDisp.dll": { "lib/net10.0/HiDisp.dll": {
"assemblyVersion": "3.2.33.0", "assemblyVersion": "3.2.34.0",
"fileVersion": "3.2.33.0" "fileVersion": "3.2.34.0"
} }
}, },
"native": { "native": {
@@ -1645,15 +1645,15 @@
} }
} }
}, },
"HiGeom/3.2.26": { "HiGeom/3.2.27": {
"dependencies": { "dependencies": {
"MathNet.Numerics": "5.0.0", "MathNet.Numerics": "5.0.0",
"Microsoft.CodeAnalysis.Scripting.Common": "5.9.0" "Microsoft.CodeAnalysis.Scripting.Common": "5.9.0"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiGeom.dll": { "lib/net10.0/HiGeom.dll": {
"assemblyVersion": "3.2.26.0", "assemblyVersion": "3.2.27.0",
"fileVersion": "3.2.26.0" "fileVersion": "3.2.27.0"
} }
}, },
"resources": { "resources": {
@@ -1665,27 +1665,27 @@
} }
} }
}, },
"HiLicense/3.2.26": { "HiLicense/3.2.27": {
"dependencies": { "dependencies": {
"HiGeom": "3.2.26" "HiGeom": "3.2.27"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiLicense.dll": { "lib/net10.0/HiLicense.dll": {
"assemblyVersion": "3.2.26.0", "assemblyVersion": "3.2.27.0",
"fileVersion": "3.2.26.0" "fileVersion": "3.2.27.0"
} }
} }
}, },
"HiMech/3.2.30": { "HiMech/3.2.31": {
"dependencies": { "dependencies": {
"CommandLineParser": "2.9.1", "CommandLineParser": "2.9.1",
"HiCbtr": "3.2.29", "HiCbtr": "3.2.30",
"Microsoft.CodeAnalysis.CSharp.Scripting": "5.9.0" "Microsoft.CodeAnalysis.CSharp.Scripting": "5.9.0"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiMech.dll": { "lib/net10.0/HiMech.dll": {
"assemblyVersion": "3.2.30.0", "assemblyVersion": "3.2.31.0",
"fileVersion": "3.2.30.0" "fileVersion": "3.2.31.0"
} }
}, },
"resources": { "resources": {
@@ -1694,19 +1694,19 @@
} }
} }
}, },
"HiNc/3.2.27": { "HiNc/3.2.28": {
"dependencies": { "dependencies": {
"Dapper": "2.1.79", "Dapper": "2.1.79",
"HiLicense": "3.2.26", "HiLicense": "3.2.27",
"HiMech": "3.2.30", "HiMech": "3.2.31",
"HiUniNc": "3.2.28", "HiUniNc": "3.2.29",
"Microsoft.Data.Sqlite": "10.0.9", "Microsoft.Data.Sqlite": "10.0.9",
"SQLitePCLRaw.bundle_e_sqlite3": "3.0.3" "SQLitePCLRaw.bundle_e_sqlite3": "3.0.3"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiNc.dll": { "lib/net10.0/HiNc.dll": {
"assemblyVersion": "3.2.27.0", "assemblyVersion": "3.2.28.0",
"fileVersion": "3.2.27.0" "fileVersion": "3.2.28.0"
} }
}, },
"resources": { "resources": {
@@ -1718,22 +1718,22 @@
} }
} }
}, },
"HiNc-Resource/3.2.24": { "HiNc-Resource/3.2.25": {
"runtime": { "runtime": {
"lib/net10.0/HiNc-Resource.dll": { "lib/net10.0/HiNc-Resource.dll": {
"assemblyVersion": "3.2.24.0", "assemblyVersion": "3.2.25.0",
"fileVersion": "3.2.24.0" "fileVersion": "3.2.25.0"
} }
} }
}, },
"HiUniNc/3.2.28": { "HiUniNc/3.2.29": {
"dependencies": { "dependencies": {
"HiMech": "3.2.30" "HiMech": "3.2.31"
}, },
"runtime": { "runtime": {
"lib/net10.0/HiUniNc.dll": { "lib/net10.0/HiUniNc.dll": {
"assemblyVersion": "3.2.28.0", "assemblyVersion": "3.2.29.0",
"fileVersion": "3.2.28.0" "fileVersion": "3.2.29.0"
} }
} }
}, },
@@ -2117,68 +2117,68 @@
"path": "fontawesome.sharp/6.3.0", "path": "fontawesome.sharp/6.3.0",
"hashPath": "fontawesome.sharp.6.3.0.nupkg.sha512" "hashPath": "fontawesome.sharp.6.3.0.nupkg.sha512"
}, },
"Hi.WpfPlus/3.2.26": { "Hi.WpfPlus/3.2.27": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-UwzqRPG1Yza6rbhJ+G0OTYI/TUlJ0iIEkJGtT9Wl9OMs5nyYfwrOcGklAiXDru+J1pbitsTwnAhy1RR70Y5OUQ==", "sha512": "sha512-/MOzSNFBzp+XFa7eYb5yyqNPFT5rPJYdGN7L1u0rucabLdVrKk2gYgUc/aVH7hK/WIZtdZvUtMuKaYlppV8XRA==",
"path": "hi.wpfplus/3.2.26", "path": "hi.wpfplus/3.2.27",
"hashPath": "hi.wpfplus.3.2.26.nupkg.sha512" "hashPath": "hi.wpfplus.3.2.27.nupkg.sha512"
}, },
"HiCbtr/3.2.29": { "HiCbtr/3.2.30": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-YsC5P885nSlcZ3ThgLcJR3G21xMcqyEFRhofGyHrRMxUN/SwVX1xfYAtsJlIAr3bPKKpn3f+BlW6VjVPmVadqQ==", "sha512": "sha512-dUTPErFOrPUWBM4hEUzRf6QKw+nQ143rZNNMDjcyK4IRvxgNqrL9xHUTidXl5y1dXieP+Qs7LFScdWwT7sg2fg==",
"path": "hicbtr/3.2.29", "path": "hicbtr/3.2.30",
"hashPath": "hicbtr.3.2.29.nupkg.sha512" "hashPath": "hicbtr.3.2.30.nupkg.sha512"
}, },
"HiDisp/3.2.33": { "HiDisp/3.2.34": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-Si0hT2CuJ2tA4NoFdtDqT0mnpXZR+zFzL0hFz4zsTnqJ+4olYCNQUfYKxfrK5xZfaRzBgdmoYvera/62oABwvA==", "sha512": "sha512-0hwRr40lzBxHdjpGNmruWLHx2g7dV5g74D4tVyZJaAunI1ehvo6nehApfjiclEz/vlR9QVFCVXCnXGC2SNqZoA==",
"path": "hidisp/3.2.33", "path": "hidisp/3.2.34",
"hashPath": "hidisp.3.2.33.nupkg.sha512" "hashPath": "hidisp.3.2.34.nupkg.sha512"
}, },
"HiGeom/3.2.26": { "HiGeom/3.2.27": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-+7MT5Z+0e/Du678GIk1xPc4jjSole+k1Yctbg513QuiNRxtPBq8p9t6LDS37nVo/qf5Ca0ksKaJCkKEZzCjWsw==", "sha512": "sha512-bkswoILpgOoUtsl503IwOqjHX//+ue3AJBqhCGDQaaF+s2f5HsoaUc/+Ln7msvbsfLuWXGkAHdZSEz7wW4khdA==",
"path": "higeom/3.2.26", "path": "higeom/3.2.27",
"hashPath": "higeom.3.2.26.nupkg.sha512" "hashPath": "higeom.3.2.27.nupkg.sha512"
}, },
"HiLicense/3.2.26": { "HiLicense/3.2.27": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-zb49GEXjRVThRul2QzViSb4f82DstbA9AdQKskR/AUVftg1lLvyG8/kxVUt2+iPLWdT/xhqdKt9kRNFkYUKWTg==", "sha512": "sha512-hQoY7wTsjMM1x/oeAsCbr20DjUe7OQJ7gXbrmRcZHsFDzUCWepJc/M/GlsEkydWUmjbqtOO8CRYICveP93yQjg==",
"path": "hilicense/3.2.26", "path": "hilicense/3.2.27",
"hashPath": "hilicense.3.2.26.nupkg.sha512" "hashPath": "hilicense.3.2.27.nupkg.sha512"
}, },
"HiMech/3.2.30": { "HiMech/3.2.31": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-n4cByu9ZEQ2XTgfD7ZgEh6veJYPZusByguxkPWAmsq9PhwxeWPfWwFQxqa6r5DBOdBVBBPQy4k48ojD4LFKdzA==", "sha512": "sha512-F6a+UgxO00MB+o+KIkXu+D+z+uqdFxkWqrE6/wPqH5mqmFUeCMpI4tZKsVGYLGJWg1QYFDlW0kRy7UdB/nBMug==",
"path": "himech/3.2.30", "path": "himech/3.2.31",
"hashPath": "himech.3.2.30.nupkg.sha512" "hashPath": "himech.3.2.31.nupkg.sha512"
}, },
"HiNc/3.2.27": { "HiNc/3.2.28": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-+40aJqFhcJa7tvyWdvayzR60hX8WlwglnRpPsCBsOTpZ3CKAfNS6ZdtzHOEOg8HigiZjlAXbkcr9yhDg9VcLKA==", "sha512": "sha512-JsRnZA4JrgeqUH8lidQDzerzyNyFdDzQP5ukcQUpe3Dw30iKS4WGB3k7V8+C/lSjZI0YTSMmsa3b3d5BEckDdA==",
"path": "hinc/3.2.27", "path": "hinc/3.2.28",
"hashPath": "hinc.3.2.27.nupkg.sha512" "hashPath": "hinc.3.2.28.nupkg.sha512"
}, },
"HiNc-Resource/3.2.24": { "HiNc-Resource/3.2.25": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-XQ0d+FperlaIYGEa1ZmORgQMKlbgSNsghfBnK2WUejRECQNxEF0VX5gRQ4b3cbjYdHmv2+7qAJg2nhjnBYWcGw==", "sha512": "sha512-pXSPEaoqcFHFX1mzfq7bH1qP2DHcsoYqzbG3jXbrbH2q1YF5ULkqWYFpk2w30cSuvtkrAet4sCtXt46rHwwgGw==",
"path": "hinc-resource/3.2.24", "path": "hinc-resource/3.2.25",
"hashPath": "hinc-resource.3.2.24.nupkg.sha512" "hashPath": "hinc-resource.3.2.25.nupkg.sha512"
}, },
"HiUniNc/3.2.28": { "HiUniNc/3.2.29": {
"type": "package", "type": "package",
"serviceable": true, "serviceable": true,
"sha512": "sha512-X4QqJS/qOkuR+DLzTY9BuPrC6+YIGhvPba0aWJAsjY1ZwfAe7oDIAdCECc4DxjCDPxnVSDDluivWmz6iy+0THg==", "sha512": "sha512-AM80H0tq9LRGW+n2H7dz1DVqdTX7vvqDXGx3hkbVUHD0kCHu5O3GUaJ8evnAVd/aM1ETwzXVudzLnsKveBq7bg==",
"path": "hiuninc/3.2.28", "path": "hiuninc/3.2.29",
"hashPath": "hiuninc.3.2.28.nupkg.sha512" "hashPath": "hiuninc.3.2.29.nupkg.sha512"
}, },
"MathNet.Numerics/5.0.0": { "MathNet.Numerics/5.0.0": {
"type": "package", "type": "package",
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"engineVersion": "3.2.30.0", "engineVersion": "3.2.31.0",
"recordCount": 98, "recordCount": 98,
"records": [ "records": [
{ {
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1074,7 +1074,8 @@ task representing this disposal (see <a class="xref" href="Hi.Cbtr.CubeTree.html
<div class="markdown level1 summary"><p>Enqueues disposal of objects retired alongside a tree (typically its attachments) on <div class="markdown level1 summary"><p>Enqueues disposal of objects retired alongside a tree (typically its attachments) on
the SAME serialized chain as <a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DisposeBackground">DisposeBackground()</a>, so there is a single the SAME serialized chain as <a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DisposeBackground">DisposeBackground()</a>, so there is a single
drain point (<a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_WaitForPendingDisposals">WaitForPendingDisposals()</a>). Disposing a <a class="xref" href="Hi.Cbtr.CbtrPickable.html">CbtrPickable</a> drain point (<a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DrainAndCloseBackgroundDisposals">DrainAndCloseBackgroundDisposals()</a> at application end,
<a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_WaitForPendingDisposals">WaitForPendingDisposals()</a> for a snapshot). Disposing a <a class="xref" href="Hi.Cbtr.CbtrPickable.html">CbtrPickable</a>
now clears its (possibly huge) attached node map — O(nodes) — which must not run on the now clears its (possibly huge) attached node map — O(nodes) — which must not run on the
hot path. Enqueue the owning tree's <a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DisposeBackground">DisposeBackground()</a> <em>first</em> so the hot path. Enqueue the owning tree's <a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DisposeBackground">DisposeBackground()</a> <em>first</em> so the
gated tree teardown (which waits out in-flight renders) runs before its attachments are freed.</p> gated tree teardown (which waits out in-flight renders) runs before its attachments are freed.</p>
@@ -1107,6 +1108,67 @@ gated tree teardown (which waits out in-flight renders) runs before its attachme
<a id="Hi_Cbtr_CubeTree_DrainAndCloseBackgroundDisposals_" data-uid="Hi.Cbtr.CubeTree.DrainAndCloseBackgroundDisposals*"></a>
<h3 id="Hi_Cbtr_CubeTree_DrainAndCloseBackgroundDisposals" data-uid="Hi.Cbtr.CubeTree.DrainAndCloseBackgroundDisposals">
DrainAndCloseBackgroundDisposals()
</h3>
<div class="markdown level1 summary"><p><a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DrainBackgroundDisposals">DrainBackgroundDisposals()</a>, then closes the chain: every
<a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DisposeBackground">DisposeBackground()</a> from here on frees inline on its caller.
Call it once at application end, before the native library is torn down &ndash;
after it, no disposal can be left running on a thread nobody waits for.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static void DrainAndCloseBackgroundDisposals()</code></pre>
</div>
<a id="Hi_Cbtr_CubeTree_DrainBackgroundDisposals_" data-uid="Hi.Cbtr.CubeTree.DrainBackgroundDisposals*"></a>
<h3 id="Hi_Cbtr_CubeTree_DrainBackgroundDisposals" data-uid="Hi.Cbtr.CubeTree.DrainBackgroundDisposals">
DrainBackgroundDisposals()
</h3>
<div class="markdown level1 summary"><p>Blocks until the background disposal chain is empty &ndash; including entries queued
by other threads while it was waiting, which a single
<a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_WaitForPendingDisposals">WaitForPendingDisposals()</a> snapshot does not cover. A drain that can
return with work still queued is not a drain; the callers that queue at shutdown
are stopped by the host before this runs (see <a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DrainAndCloseBackgroundDisposals">DrainAndCloseBackgroundDisposals()</a>).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static void DrainBackgroundDisposals()</code></pre>
</div>
<a id="Hi_Cbtr_CubeTree_ExpandToBox3d_" data-uid="Hi.Cbtr.CubeTree.ExpandToBox3d*"></a> <a id="Hi_Cbtr_CubeTree_ExpandToBox3d_" data-uid="Hi.Cbtr.CubeTree.ExpandToBox3d*"></a>
<h3 id="Hi_Cbtr_CubeTree_ExpandToBox3d_Hi_Geom_Box3d_" data-uid="Hi.Cbtr.CubeTree.ExpandToBox3d(Hi.Geom.Box3d)"> <h3 id="Hi_Cbtr_CubeTree_ExpandToBox3d_Hi_Geom_Box3d_" data-uid="Hi.Cbtr.CubeTree.ExpandToBox3d(Hi.Geom.Box3d)">
@@ -1829,8 +1891,9 @@ This function put <code class="paramref">src</code> to the nodes that contain nu
</h3> </h3>
<div class="markdown level1 summary"><p>A task that completes when all queued background disposals have finished. <div class="markdown level1 summary"><p>A task that completes when every background disposal queued SO FAR has finished -
Await this at application shutdown before the native dll is unloaded.</p> a snapshot: anything queued after the call is not covered. Application end must
use <a class="xref" href="Hi.Cbtr.CubeTree.html#Hi_Cbtr_CubeTree_DrainAndCloseBackgroundDisposals">DrainAndCloseBackgroundDisposals()</a> instead.</p>
</div> </div>
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
@@ -1415,8 +1415,9 @@ when API users drag a picked object via <a class="xref" href="Hi.Disp.Pickable.h
</h3> </h3>
<div class="markdown level1 summary"><p>Elegantly end the rendering core. <div class="markdown level1 summary"><p>Ends the rendering core for the rest of the process: disposes every live
Probably not essential.</p> engine, raises <a class="xref" href="Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_FinishingDisp">FinishingDisp</a>, stops the display thread.
Call it once, after everything that renders has been stopped.</p>
</div> </div>
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
@@ -339,7 +339,14 @@ Class LocalApp
</h3> </h3>
<div class="markdown level1 summary"><p>Cleans up the application by stopping services and logging out licenses.</p> <div class="markdown level1 summary"><p>Cleans up the application by stopping services and logging out licenses.
Call it LAST &ndash; after the host has stopped serving and disposed everything
that drives the native core (display engines, the project service with its
play and workpiece trees). On Linux, exit() runs the native library's static
destructors while any thread still inside it keeps running, so every native
caller has to be finished before Main returns; hooking this at the START of
a host's shutdown (ASP.NET Core's ApplicationStopping) is what crashed
HiNC-1 on four deploy stops in 2026-09.</p>
</div> </div>
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
@@ -762,6 +762,41 @@ post-run reset.</p>
<a id="Hi_MachiningProcs_LocalProjectService_LastSetupAngleEstimates_" data-uid="Hi.MachiningProcs.LocalProjectService.LastSetupAngleEstimates*"></a>
<h3 id="Hi_MachiningProcs_LocalProjectService_LastSetupAngleEstimates" data-uid="Hi.MachiningProcs.LocalProjectService.LastSetupAngleEstimates">
LastSetupAngleEstimates
</h3>
<div class="markdown level1 summary"><p>Snapshot of the most recent <a class="xref" href="Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_EstimateSetupAngle_Hi_MillingForces_Fittings_SampleFlag_System_Double_System_String_System_Threading_CancellationToken_System_IProgress_Hi_Common_Messages_IMessage__Hi_MillingForces_Fittings_ICuttingPara_">EstimateSetupAngle(SampleFlag, double, string, CancellationToken, IProgress&lt;IMessage&gt;, ICuttingPara)</a> outcome —
one estimate per tool the mapped data covered. Service lifetime,
last-wins; null until the first estimation completes. Like
<a class="xref" href="Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_LastMillingParaTrainResult">LastMillingParaTrainResult</a> it survives <a class="xref" href="Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_ResetRuntime_System_IProgress_Hi_Common_Messages_IMessage__">ResetRuntime(IProgress&lt;IMessage&gt;)</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public List&lt;SetupAngleEstimate&gt; LastSetupAngleEstimates { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html">SetupAngleEstimate</a>&gt;</dt>
<dd></dd>
</dl>
<a id="Hi_MachiningProcs_LocalProjectService_Logger_" data-uid="Hi.MachiningProcs.LocalProjectService.Logger*"></a> <a id="Hi_MachiningProcs_LocalProjectService_Logger_" data-uid="Hi.MachiningProcs.LocalProjectService.Logger*"></a>
<h3 id="Hi_MachiningProcs_LocalProjectService_Logger" data-uid="Hi.MachiningProcs.LocalProjectService.Logger"> <h3 id="Hi_MachiningProcs_LocalProjectService_Logger" data-uid="Hi.MachiningProcs.LocalProjectService.Logger">
@@ -2173,6 +2208,63 @@ no-op, for hosts without a setup face (e.g. test stubs).</p>
<a id="Hi_MachiningProcs_LocalProjectService_EstimateSetupAngle_" data-uid="Hi.MachiningProcs.LocalProjectService.EstimateSetupAngle*"></a>
<h3 id="Hi_MachiningProcs_LocalProjectService_EstimateSetupAngle_Hi_MillingForces_Fittings_SampleFlag_System_Double_System_String_System_Threading_CancellationToken_System_IProgress_Hi_Common_Messages_IMessage__Hi_MillingForces_Fittings_ICuttingPara_" data-uid="Hi.MachiningProcs.LocalProjectService.EstimateSetupAngle(Hi.MillingForces.Fittings.SampleFlag,System.Double,System.String,System.Threading.CancellationToken,System.IProgress{Hi.Common.Messages.IMessage},Hi.MillingForces.Fittings.ICuttingPara)">
EstimateSetupAngle(SampleFlag, double, string, CancellationToken, IProgress&lt;IMessage&gt;, ICuttingPara)
</h3>
<div class="markdown level1 summary"><p>Estimates the cutter setup angle from the mapped smart-holder data and a
known cutting parameter (<code class="paramref">knownPara</code>, default
<code>Workpiece.CuttingPara</code> — the same seed <a class="xref" href="Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_ReTrainMillingPara_Hi_MillingForces_Fittings_SampleFlag_System_Double_System_String_System_Threading_CancellationToken_System_IProgress_Hi_Common_Messages_IMessage__">ReTrainMillingPara(SampleFlag, double, string, CancellationToken, IProgress&lt;IMessage&gt;)</a>
uses). Nothing is trained; see <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimation.html">SetupAngleEstimation</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public List&lt;SetupAngleEstimate&gt; EstimateSetupAngle(SampleFlag sampleFlags, double outlierRatio, string dstRelFile, CancellationToken cancellationToken, IProgress&lt;IMessage&gt; messageProgress = null, ICuttingPara knownPara = null)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>sampleFlags</code> <a class="xref" href="Hi.MillingForces.Fittings.SampleFlag.html">SampleFlag</a></dt>
<dd><p>Channels to use; must include Mx and My.</p>
</dd>
<dt><code>outlierRatio</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd><p>Fraction of the worst-fitting steps trimmed before the final estimate.</p>
</dd>
<dt><code>dstRelFile</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p>Optional report file (relative to the project base directory); JSON.</p>
</dd>
<dt><code>cancellationToken</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken">CancellationToken</a></dt>
<dd><p>Cancellation token.</p>
</dd>
<dt><code>messageProgress</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress</a>&lt;<a class="xref" href="Hi.Common.Messages.IMessage.html">IMessage</a>&gt;</dt>
<dd><p>Message sink.</p>
</dd>
<dt><code>knownPara</code> <a class="xref" href="Hi.MillingForces.Fittings.ICuttingPara.html">ICuttingPara</a></dt>
<dd><p>The known cutting parameter; null uses <code>Workpiece.CuttingPara</code>.</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html">SetupAngleEstimate</a>&gt;</dt>
<dd><p>The estimates (possibly empty).</p>
</dd>
</dl>
<a id="Hi_MachiningProcs_LocalProjectService_FixedPace_" data-uid="Hi.MachiningProcs.LocalProjectService.FixedPace*"></a> <a id="Hi_MachiningProcs_LocalProjectService_FixedPace_" data-uid="Hi.MachiningProcs.LocalProjectService.FixedPace*"></a>
<h3 id="Hi_MachiningProcs_LocalProjectService_FixedPace_System_Double_System_Double_" data-uid="Hi.MachiningProcs.LocalProjectService.FixedPace(System.Double,System.Double)"> <h3 id="Hi_MachiningProcs_LocalProjectService_FixedPace_System_Double_System_Double_" data-uid="Hi.MachiningProcs.LocalProjectService.FixedPace(System.Double,System.Double)">
@@ -2854,6 +2854,66 @@ public void ErrorMessage(string message)</code></pre>
<a id="Hi_MachiningProcs_SessionShell_EstimateSetupAngle_" data-uid="Hi.MachiningProcs.SessionShell.EstimateSetupAngle*"></a>
<h3 id="Hi_MachiningProcs_SessionShell_EstimateSetupAngle_Hi_MillingForces_Fittings_SampleFlag_System_String_System_Boolean_System_Double_System_String_" data-uid="Hi.MachiningProcs.SessionShell.EstimateSetupAngle(Hi.MillingForces.Fittings.SampleFlag,System.String,System.Boolean,System.Double,System.String)">
EstimateSetupAngle(SampleFlag, string, bool, double, string)
</h3>
<div class="markdown level1 summary"><p>Estimates the cutter setup angle from the mapped smart-holder data and
the workpiece's cutting parameter (the seed <a class="xref" href="Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ReTrainMillingPara_Hi_MillingForces_Fittings_SampleFlag_System_String_System_Double_">ReTrainMillingPara(SampleFlag, string, double)</a>
uses), one estimate per tool. The estimate is the rotation of the
measured (Mx, My) against the model's, folded into the flute period;
with <code class="paramref">applyToTool</code> the tool's uniform-fluting setup
angle is advanced by it (<a class="xref" href="Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SetUniformFlutingShiftAngle_deg_System_Int32_System_Double_">SetUniformFlutingShiftAngle_deg(int, double)</a>).
Read the diagnostics before trusting it: a low contrast means the cut
does not constrain the angle, a preferred mirror means the sensor axes
are swapped rather than rotated.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">[JsAce(&quot;EstimateSetupAngle(Mx|My, $1dstFile, false)&quot;)]
public List&lt;SetupAngleEstimate&gt; EstimateSetupAngle(SampleFlag sampleFlag, string dstRelFile = null, bool applyToTool = false, double outlierRatio = 0.1, string knownParaRelFile = null)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>sampleFlag</code> <a class="xref" href="Hi.MillingForces.Fittings.SampleFlag.html">SampleFlag</a></dt>
<dd><p>Channels to use; must include Mx and My (Mz only sharpens the phase alignment).</p>
</dd>
<dt><code>dstRelFile</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p>Optional JSON report (relative to the project base directory).</p>
</dd>
<dt><code>applyToTool</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd><p>Advance each estimated tool's setup angle by its estimate. Call <a class="xref" href="Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ResetRuntime">ResetRuntime()</a> before replaying: the physics session snapshots the flute geometry.</p>
</dd>
<dt><code>outlierRatio</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd><p>Fraction of the worst-fitting steps trimmed before the final estimate.</p>
</dd>
<dt><code>knownParaRelFile</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p>Optional cutting-parameter file (relative to the project base directory) to use instead of the workpiece's.</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html">SetupAngleEstimate</a>&gt;</dt>
<dd><p>The estimates, one per tool.</p>
</dd>
</dl>
<a id="Hi_MachiningProcs_SessionShell_ExportMeshedGeomToObj_" data-uid="Hi.MachiningProcs.SessionShell.ExportMeshedGeomToObj*"></a> <a id="Hi_MachiningProcs_SessionShell_ExportMeshedGeomToObj_" data-uid="Hi.MachiningProcs.SessionShell.ExportMeshedGeomToObj*"></a>
<h3 id="Hi_MachiningProcs_SessionShell_ExportMeshedGeomToObj_System_String_System_Double_" data-uid="Hi.MachiningProcs.SessionShell.ExportMeshedGeomToObj(System.String,System.Double)"> <h3 id="Hi_MachiningProcs_SessionShell_ExportMeshedGeomToObj_System_String_System_Double_" data-uid="Hi.MachiningProcs.SessionShell.ExportMeshedGeomToObj(System.String,System.Double)">
@@ -239,7 +239,7 @@ Class Anchor
<h4 class="section">Parameters</h4> <h4 class="section">Parameters</h4>
<dl class="parameters"> <dl class="parameters">
<dt><code>asmb</code> <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a></dt> <dt><code>asmb</code> <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a></dt>
<dd><p>add this to <code class="paramref">asmb</code>.<a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_ChildAncs">ChildAncs</a></p> <dd><p>add this to <code class="paramref">asmb</code> by <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_Add_Hi_Mech_Topo_Anchor_">Add(Anchor)</a></p>
</dd> </dd>
</dl> </dl>
@@ -272,7 +272,7 @@ Class Anchor
<h4 class="section">Parameters</h4> <h4 class="section">Parameters</h4>
<dl class="parameters"> <dl class="parameters">
<dt><code>asmb</code> <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a></dt> <dt><code>asmb</code> <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a></dt>
<dd><p>add this to <code class="paramref">asmb</code>.<a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_ChildAncs">ChildAncs</a></p> <dd><p>add this to <code class="paramref">asmb</code> by <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_Add_Hi_Mech_Topo_Anchor_">Add(Anchor)</a></p>
</dd> </dd>
<dt><code>name</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt> <dt><code>name</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p><a class="xref" href="Hi.Mech.Topo.Anchor.html#Hi_Mech_Topo_Anchor_Name">Name</a></p> <dd><p><a class="xref" href="Hi.Mech.Topo.Anchor.html#Hi_Mech_Topo_Anchor_Name">Name</a></p>
@@ -301,7 +301,8 @@ Class Anchor
</h3> </h3>
<div class="markdown level1 summary"><p>Gets the branch map. &lsquo;this&rsquo; anchor locates on <a class="xref" href="Hi.Mech.Topo.Branch.html#Hi_Mech_Topo_Branch_Fletch">Fletch</a> .</p> <div class="markdown level1 summary"><p>Gets a snapshot of the branches departing from this anchor, keyed by their
<a class="xref" href="Hi.Mech.Topo.Branch.html#Hi_Mech_Topo_Branch_Arrow">Arrow</a>. &lsquo;this&rsquo; anchor locates on <a class="xref" href="Hi.Mech.Topo.Branch.html#Hi_Mech_Topo_Branch_Fletch">Fletch</a>.</p>
</div> </div>
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
@@ -316,8 +317,7 @@ Class Anchor
<h4 class="section">Property Value</h4> <h4 class="section">Property Value</h4>
<dl class="parameters"> <dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>, <a class="xref" href="Hi.Mech.Topo.Branch.html">Branch</a>&gt;</dt> <dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>, <a class="xref" href="Hi.Mech.Topo.Branch.html">Branch</a>&gt;</dt>
<dd><p>The branch map.</p> <dd></dd>
</dd>
</dl> </dl>
@@ -334,7 +334,8 @@ Class Anchor
</h3> </h3>
<div class="markdown level1 summary"><p>Gets the branch map. &lsquo;this&rsquo; anchor locates on <a class="xref" href="Hi.Mech.Topo.Branch.html#Hi_Mech_Topo_Branch_Arrow">Arrow</a> .</p> <div class="markdown level1 summary"><p>Gets a snapshot of the branches arriving at this anchor, keyed by their
<a class="xref" href="Hi.Mech.Topo.Branch.html#Hi_Mech_Topo_Branch_Fletch">Fletch</a>. &lsquo;this&rsquo; anchor locates on <a class="xref" href="Hi.Mech.Topo.Branch.html#Hi_Mech_Topo_Branch_Arrow">Arrow</a>.</p>
</div> </div>
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
@@ -349,8 +350,7 @@ Class Anchor
<h4 class="section">Property Value</h4> <h4 class="section">Property Value</h4>
<dl class="parameters"> <dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>, <a class="xref" href="Hi.Mech.Topo.Branch.html">Branch</a>&gt;</dt> <dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>, <a class="xref" href="Hi.Mech.Topo.Branch.html">Branch</a>&gt;</dt>
<dd><p>The branch map.</p> <dd></dd>
</dd>
</dl> </dl>
@@ -490,10 +490,109 @@ Only the Guid takes effect when reading.</p>
<a id="Hi_Mech_Topo_Anchor_Parent_" data-uid="Hi.Mech.Topo.Anchor.Parent*"></a>
<h3 id="Hi_Mech_Topo_Anchor_Parent" data-uid="Hi.Mech.Topo.Anchor.Parent">
Parent
</h3>
<div class="markdown level1 summary"><p>The assembly this anchor belongs to; null while it belongs to none.
An anchor belongs to at most one assembly at a time.
Maintained by <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_Add_Hi_Mech_Topo_Anchor_">Add(Anchor)</a> and <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_Remove_Hi_Mech_Topo_Anchor_">Remove(Anchor)</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Asmb Parent { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods <h2 class="section" id="methods">Methods
</h2> </h2>
<a id="Hi_Mech_Topo_Anchor_Ancestors_" data-uid="Hi.Mech.Topo.Anchor.Ancestors*"></a>
<h3 id="Hi_Mech_Topo_Anchor_Ancestors" data-uid="Hi.Mech.Topo.Anchor.Ancestors">
Ancestors()
</h3>
<div class="markdown level1 summary"><p>The assemblies enclosing this anchor, nearest first.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public IEnumerable&lt;Asmb&gt; Ancestors()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1">IEnumerable</a>&lt;<a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a>&gt;</dt>
<dd></dd>
</dl>
<a id="Hi_Mech_Topo_Anchor_ConnectedAnchors_" data-uid="Hi.Mech.Topo.Anchor.ConnectedAnchors*"></a>
<h3 id="Hi_Mech_Topo_Anchor_ConnectedAnchors" data-uid="Hi.Mech.Topo.Anchor.ConnectedAnchors">
ConnectedAnchors()
</h3>
<div class="markdown level1 summary"><p>Every anchor reachable from this one over branches, this one included,
regardless of which assemblies they belong to.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public HashSet&lt;Anchor&gt; ConnectedAnchors()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.hashset-1">HashSet</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>&gt;</dt>
<dd></dd>
</dl>
<a id="Hi_Mech_Topo_Anchor_Detach_" data-uid="Hi.Mech.Topo.Anchor.Detach*"></a> <a id="Hi_Mech_Topo_Anchor_Detach_" data-uid="Hi.Mech.Topo.Anchor.Detach*"></a>
<h3 id="Hi_Mech_Topo_Anchor_Detach" data-uid="Hi.Mech.Topo.Anchor.Detach"> <h3 id="Hi_Mech_Topo_Anchor_Detach" data-uid="Hi.Mech.Topo.Anchor.Detach">
@@ -663,38 +762,6 @@ This function is usually used to compute the bounding box of elements.</p>
<a id="Hi_Mech_Topo_Anchor_GetClusterAnchors_" data-uid="Hi.Mech.Topo.Anchor.GetClusterAnchors*"></a>
<h3 id="Hi_Mech_Topo_Anchor_GetClusterAnchors" data-uid="Hi.Mech.Topo.Anchor.GetClusterAnchors">
GetClusterAnchors()
</h3>
<div class="markdown level1 summary"><p>Gets all the linked anchors by <a class="xref" href="Hi.Mech.Topo.Branch.html">Branch</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public HashSet&lt;Anchor&gt; GetClusterAnchors()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.hashset-1">HashSet</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>&gt;</dt>
<dd></dd>
</dl>
<a id="Hi_Mech_Topo_Anchor_GetMat4d_" data-uid="Hi.Mech.Topo.Anchor.GetMat4d*"></a> <a id="Hi_Mech_Topo_Anchor_GetMat4d_" data-uid="Hi.Mech.Topo.Anchor.GetMat4d*"></a>
<h3 id="Hi_Mech_Topo_Anchor_GetMat4d_Hi_Mech_Topo_IGetAnchor_" data-uid="Hi.Mech.Topo.Anchor.GetMat4d(Hi.Mech.Topo.IGetAnchor)"> <h3 id="Hi_Mech_Topo_Anchor_GetMat4d_Hi_Mech_Topo_IGetAnchor_" data-uid="Hi.Mech.Topo.Anchor.GetMat4d(Hi.Mech.Topo.IGetAnchor)">
@@ -720,7 +787,7 @@ This function is usually used to compute the bounding box of elements.</p>
<h4 class="section">Returns</h4> <h4 class="section">Returns</h4>
<dl class="parameters"> <dl class="parameters">
<dt><a class="xref" href="Hi.Geom.Mat4d.html">Mat4d</a></dt> <dt><a class="xref" href="Hi.Geom.Mat4d.html">Mat4d</a></dt>
<dd><p>transform matrix</p> <dd><p>transform matrix; null when no branch chain connects the two</p>
</dd> </dd>
</dl> </dl>
@@ -741,7 +808,8 @@ This function is usually used to compute the bounding box of elements.</p>
</h3> </h3>
<div class="markdown level1 summary"><p>Gets the mat4d map in <a class="xref" href="Hi.Mech.Topo.Anchor.html#Hi_Mech_Topo_Anchor_GetClusterAnchors">GetClusterAnchors()</a></p> <div class="markdown level1 summary"><p>Gets the transform of every anchor in <a class="xref" href="Hi.Mech.Topo.Anchor.html#Hi_Mech_Topo_Anchor_ConnectedAnchors">ConnectedAnchors()</a>,
expressed in this anchor's coordinate.</p>
</div> </div>
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
@@ -766,60 +834,26 @@ This function is usually used to compute the bounding box of elements.</p>
<a id="Hi_Mech_Topo_Anchor_GetNeighborAnchorList_" data-uid="Hi.Mech.Topo.Anchor.GetNeighborAnchorList*"></a> <a id="Hi_Mech_Topo_Anchor_NeighborAnchors_" data-uid="Hi.Mech.Topo.Anchor.NeighborAnchors*"></a>
<h3 id="Hi_Mech_Topo_Anchor_GetNeighborAnchorList" data-uid="Hi.Mech.Topo.Anchor.GetNeighborAnchorList"> <h3 id="Hi_Mech_Topo_Anchor_NeighborAnchors" data-uid="Hi.Mech.Topo.Anchor.NeighborAnchors">
GetNeighborAnchorList() NeighborAnchors()
</h3> </h3>
<div class="markdown level1 summary"><p>Get neighbor anchors.</p> <div class="markdown level1 summary"><p>The anchors one branch away, in either direction; each once.</p>
</div> </div>
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
<div class="codewrapper"> <div class="codewrapper">
<pre><code class="lang-csharp hljs">public List&lt;Anchor&gt; GetNeighborAnchorList()</code></pre> <pre><code class="lang-csharp hljs">public IEnumerable&lt;Anchor&gt; NeighborAnchors()</code></pre>
</div> </div>
<h4 class="section">Returns</h4> <h4 class="section">Returns</h4>
<dl class="parameters"> <dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>&gt;</dt> <dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1">IEnumerable</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>&gt;</dt>
<dd><p>neighbor anchors</p> <dd></dd>
</dd>
</dl>
<a id="Hi_Mech_Topo_Anchor_GetNeighborAnchorSet_" data-uid="Hi.Mech.Topo.Anchor.GetNeighborAnchorSet*"></a>
<h3 id="Hi_Mech_Topo_Anchor_GetNeighborAnchorSet" data-uid="Hi.Mech.Topo.Anchor.GetNeighborAnchorSet">
GetNeighborAnchorSet()
</h3>
<div class="markdown level1 summary"><p>Get neighbor anchors.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public HashSet&lt;Anchor&gt; GetNeighborAnchorSet()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.hashset-1">HashSet</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>&gt;</dt>
<dd><p>neighbor anchors</p>
</dd>
</dl> </dl>
File diff suppressed because it is too large Load Diff
@@ -277,10 +277,79 @@ Class DirectionBranchEntry
<h2 class="section" id="properties">Properties
</h2>
<a id="Hi_Mech_Topo_DirectionBranchEntry_Next_" data-uid="Hi.Mech.Topo.DirectionBranchEntry.Next*"></a>
<h3 id="Hi_Mech_Topo_DirectionBranchEntry_Next" data-uid="Hi.Mech.Topo.DirectionBranchEntry.Next">
Next
</h3>
<div class="markdown level1 summary"><p>The anchor this entry leads to: the arrow when forward, the fletch otherwise.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Anchor Next { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods <h2 class="section" id="methods">Methods
</h2> </h2>
<a id="Hi_Mech_Topo_DirectionBranchEntry_GetMat_" data-uid="Hi.Mech.Topo.DirectionBranchEntry.GetMat*"></a>
<h3 id="Hi_Mech_Topo_DirectionBranchEntry_GetMat" data-uid="Hi.Mech.Topo.DirectionBranchEntry.GetMat">
GetMat()
</h3>
<div class="markdown level1 summary"><p>The transform of crossing the branch in this direction.
A branch without a transformer counts as identity.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Mat4d GetMat()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.Geom.Mat4d.html">Mat4d</a></dt>
<dd></dd>
</dl>
<a id="Hi_Mech_Topo_DirectionBranchEntry_ToString_" data-uid="Hi.Mech.Topo.DirectionBranchEntry.ToString*"></a> <a id="Hi_Mech_Topo_DirectionBranchEntry_ToString_" data-uid="Hi.Mech.Topo.DirectionBranchEntry.ToString*"></a>
<h3 id="Hi_Mech_Topo_DirectionBranchEntry_ToString" data-uid="Hi.Mech.Topo.DirectionBranchEntry.ToString"> <h3 id="Hi_Mech_Topo_DirectionBranchEntry_ToString" data-uid="Hi.Mech.Topo.DirectionBranchEntry.ToString">
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class TopoReflection | HiAPI-C# 2025 "> <meta name="title" content="Class TopoReflection | HiAPI-C# 2025 ">
<meta name="description" content="Clone and provide map between source topology and cloned topology."> <meta name="description" content="Clone and provide map between source topology and cloned topology. The source is read under , so the clone is one consistent state.">
<link rel="icon" href="../img/HiAPI.favicon.ico"> <link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css"> <link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css"> <link rel="stylesheet" href="../public/main.css">
@@ -97,7 +97,8 @@ Class TopoReflection
<dl><dt>Assembly</dt><dd>HiMech.dll</dd></dl> <dl><dt>Assembly</dt><dd>HiMech.dll</dd></dl>
</div> </div>
<div class="markdown summary"><p>Clone <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a> and provide map between source topology and cloned topology.</p> <div class="markdown summary"><p>Clone <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a> and provide map between source topology and cloned topology.
The source is read under <span class="xref">Hi.Mech.Topo.Asmb.ReadLockAll()</span>, so the clone is one consistent state.</p>
</div> </div>
<div class="markdown conceptual"></div> <div class="markdown conceptual"></div>
@@ -354,8 +355,8 @@ Class TopoReflection
</h3> </h3>
<div class="markdown level1 summary"><p><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.keyvaluepair-2.key">Key</a> is source branch. <div class="markdown level1 summary"><p><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.keyvaluepair-2.key">Key</a> is source transformer.
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.keyvaluepair-2.value">Value</a> is cloned branch.</p> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.keyvaluepair-2.value">Value</a> is cloned transformer.</p>
</div> </div>
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
@@ -117,6 +117,20 @@ Classes
<dl class="jumplist"> <dl class="jumplist">
<dt><a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a></dt> <dt><a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a></dt>
<dd><p>Collection of <a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a> and <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a>.</p> <dd><p>Collection of <a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a> and <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a>.</p>
<p>
Membership is a tree: every anchor and every assembly belongs to at most one parent,
recorded on <a class="xref" href="Hi.Mech.Topo.Anchor.html#Hi_Mech_Topo_Anchor_Parent">Parent</a> and <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_Parent">Parent</a>. Change membership only
through <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_Add_Hi_Mech_Topo_Anchor_">Add(Anchor)</a>, <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_Add_Hi_Mech_Topo_Asmb_">Add(Asmb)</a>, <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_Remove_Hi_Mech_Topo_Anchor_">Remove(Anchor)</a>
and <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_Remove_Hi_Mech_Topo_Asmb_">Remove(Asmb)</a>; the child collections are snapshots.
</p>
<p>
A member is addressed by a path of names relative to the assembly asked, joined by
<a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_PathSeparator">PathSeparator</a>, one segment per assembly on the way down:
<code>"MillingTool.MillingCutter.CutterTip"</code> asked of the equipment names the same anchor as
<code>"MillingCutter.CutterTip"</code> asked of the tool. Any segment may give the member's GUID
in braces instead, <code>"MillingTool.{12345678}"</code>, which is how <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_GetPath_Hi_Mech_Topo_Anchor_">GetPath(Anchor)</a>
spells a member whose name cannot stand on its own. See <a class="xref" href="Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_GetAnchorByPath_System_String_">GetAnchorByPath(string)</a>.
</p>
</dd> </dd>
</dl> </dl>
<dl class="jumplist"> <dl class="jumplist">
@@ -197,7 +211,8 @@ in form of <a class="xref" href="Hi.Disp.Flag.CoordinateDrawing.html">Coordinate
</dl> </dl>
<dl class="jumplist"> <dl class="jumplist">
<dt><a class="xref" href="Hi.Mech.Topo.TopoReflection.html">TopoReflection</a></dt> <dt><a class="xref" href="Hi.Mech.Topo.TopoReflection.html">TopoReflection</a></dt>
<dd><p>Clone <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a> and provide map between source topology and cloned topology.</p> <dd><p>Clone <a class="xref" href="Hi.Mech.Topo.Asmb.html">Asmb</a> and provide map between source topology and cloned topology.
The source is read under <span class="xref">Hi.Mech.Topo.Asmb.ReadLockAll()</span>, so the clone is one consistent state.</p>
</dd> </dd>
</dl> </dl>
<dl class="jumplist"> <dl class="jumplist">
@@ -689,6 +689,67 @@ default 0.1 keeps the historical seed-anchored ridge behaviour.
<a id="Hi_MillingForces_Training_MillingTraining_GatherAndEstimateSetupAngle_" data-uid="Hi.MillingForces.Training.MillingTraining.GatherAndEstimateSetupAngle*"></a>
<h3 id="Hi_MillingForces_Training_MillingTraining_GatherAndEstimateSetupAngle_System_Collections_Concurrent_ConcurrentDictionary_System_Int32_System_Collections_Generic_List_Hi_Mapping_ITimeShot___Hi_CutterLocations_ClStrips_ClStrip_Hi_MillingForces_Fittings_ICuttingPara_Hi_MillingForces_Fittings_SampleFlag_System_Double_System_IProgress_Hi_Common_Messages_IMessage__System_Threading_CancellationToken_" data-uid="Hi.MillingForces.Training.MillingTraining.GatherAndEstimateSetupAngle(System.Collections.Concurrent.ConcurrentDictionary{System.Int32,System.Collections.Generic.List{Hi.Mapping.ITimeShot}},Hi.CutterLocations.ClStrips.ClStrip,Hi.MillingForces.Fittings.ICuttingPara,Hi.MillingForces.Fittings.SampleFlag,System.Double,System.IProgress{Hi.Common.Messages.IMessage},System.Threading.CancellationToken)">
GatherAndEstimateSetupAngle(ConcurrentDictionary&lt;int, List&lt;ITimeShot&gt;&gt;, ClStrip, ICuttingPara, SampleFlag, double, IProgress&lt;IMessage&gt;, CancellationToken)
</h3>
<div class="markdown level1 summary"><p>Gathers samples against a known cutting parameter and estimates, per
tool, the cutter setup angle the model is missing — the constant
rotation of the measured spindle-rotation-frame (Mx, My) against the
model's (see <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimation.html">SetupAngleEstimation</a>). The parameter is used
as the gather template exactly like the ReTrain seed; nothing is trained.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static List&lt;SetupAngleEstimate&gt; GatherAndEstimateSetupAngle(ConcurrentDictionary&lt;int, List&lt;ITimeShot&gt;&gt; stepToTimeShotListDictionary, ClStrip clStrip, ICuttingPara knownPara, SampleFlag sampleFlags, double outlierRatio, IProgress&lt;IMessage&gt; messageProgress, CancellationToken cancellationToken)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>stepToTimeShotListDictionary</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.concurrent.concurrentdictionary-2">ConcurrentDictionary</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a>, <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.Mapping.ITimeShot.html">ITimeShot</a>&gt;&gt;</dt>
<dd><p>Dictionary mapping step indices to time shot lists.</p>
</dd>
<dt><code>clStrip</code> <a class="xref" href="Hi.CutterLocations.ClStrips.ClStrip.html">ClStrip</a></dt>
<dd><p>The cutter location strip.</p>
</dd>
<dt><code>knownPara</code> <a class="xref" href="Hi.MillingForces.Fittings.ICuttingPara.html">ICuttingPara</a></dt>
<dd><p>The known (already built) cutting parameter.</p>
</dd>
<dt><code>sampleFlags</code> <a class="xref" href="Hi.MillingForces.Fittings.SampleFlag.html">SampleFlag</a></dt>
<dd><p>Channels to use; must include Mx and My.</p>
</dd>
<dt><code>outlierRatio</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd><p>Fraction of the worst-fitting steps trimmed before the final estimate.</p>
</dd>
<dt><code>messageProgress</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress</a>&lt;<a class="xref" href="Hi.Common.Messages.IMessage.html">IMessage</a>&gt;</dt>
<dd><p>Message sink.</p>
</dd>
<dt><code>cancellationToken</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken">CancellationToken</a></dt>
<dd><p>Cancellation token.</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html">SetupAngleEstimate</a>&gt;</dt>
<dd><p>One estimate per tool that produced samples; empty when nothing could be estimated.</p>
</dd>
</dl>
<a id="Hi_MillingForces_Training_MillingTraining_GatherAndGetUpdate_" data-uid="Hi.MillingForces.Training.MillingTraining.GatherAndGetUpdate*"></a> <a id="Hi_MillingForces_Training_MillingTraining_GatherAndGetUpdate_" data-uid="Hi.MillingForces.Training.MillingTraining.GatherAndGetUpdate*"></a>
<h3 id="Hi_MillingForces_Training_MillingTraining_GatherAndGetUpdate_System_Collections_Concurrent_ConcurrentDictionary_System_Int32_System_Collections_Generic_List_Hi_Mapping_ITimeShot___Hi_CutterLocations_ClStrips_ClStrip_Hi_MillingForces_Fittings_ICuttingPara_Hi_MillingForces_Fittings_SampleFlag_System_Double_System_IProgress_Hi_Common_Messages_IMessage__System_Threading_CancellationToken_" data-uid="Hi.MillingForces.Training.MillingTraining.GatherAndGetUpdate(System.Collections.Concurrent.ConcurrentDictionary{System.Int32,System.Collections.Generic.List{Hi.Mapping.ITimeShot}},Hi.CutterLocations.ClStrips.ClStrip,Hi.MillingForces.Fittings.ICuttingPara,Hi.MillingForces.Fittings.SampleFlag,System.Double,System.IProgress{Hi.Common.Messages.IMessage},System.Threading.CancellationToken)"> <h3 id="Hi_MillingForces_Training_MillingTraining_GatherAndGetUpdate_System_Collections_Concurrent_ConcurrentDictionary_System_Int32_System_Collections_Generic_List_Hi_Mapping_ITimeShot___Hi_CutterLocations_ClStrips_ClStrip_Hi_MillingForces_Fittings_ICuttingPara_Hi_MillingForces_Fittings_SampleFlag_System_Double_System_IProgress_Hi_Common_Messages_IMessage__System_Threading_CancellationToken_" data-uid="Hi.MillingForces.Training.MillingTraining.GatherAndGetUpdate(System.Collections.Concurrent.ConcurrentDictionary{System.Int32,System.Collections.Generic.List{Hi.Mapping.ITimeShot}},Hi.CutterLocations.ClStrips.ClStrip,Hi.MillingForces.Fittings.ICuttingPara,Hi.MillingForces.Fittings.SampleFlag,System.Double,System.IProgress{Hi.Common.Messages.IMessage},System.Threading.CancellationToken)">
@@ -0,0 +1,860 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class SetupAngleEstimate | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class SetupAngleEstimate | HiAPI-C# 2025 ">
<meta name="description" content="Result of : the rotation of the measured spindle-rotation-frame transverse moment (Mx, My) relative to the model built from a known cutting parameter, i.e. the cutter setup angle the model is missing, plus the diagnostics that say how much to trust it.">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
<meta name="docfx:navrel" content="../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Hi.MillingForces.Training.SetupAngleEstimate">
<h1 id="Hi_MillingForces_Training_SetupAngleEstimate" data-uid="Hi.MillingForces.Training.SetupAngleEstimate" class="text-break">
Class SetupAngleEstimate
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="Hi.html">Hi</a>.<a class="xref" href="Hi.MillingForces.html">MillingForces</a>.<a class="xref" href="Hi.MillingForces.Training.html">Training</a></dd></dl>
<dl><dt>Assembly</dt><dd>HiNc.dll</dd></dl>
</div>
<div class="markdown summary"><p>Result of <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimation.html#Hi_MillingForces_Training_SetupAngleEstimation_Estimate_System_Collections_Generic_IEnumerable_System_Collections_Generic_KeyValuePair_System_Int32_System_Collections_Generic_List_System_Collections_Generic_List_Hi_MillingForces_Fittings_TrainingSample_____System_Double___Hi_MillingForces_Fittings_SampleFlag_System_Int32_System_Double_System_Double_System_IProgress_Hi_Common_Messages_IMessage__System_Threading_CancellationToken_">Estimate(IEnumerable&lt;KeyValuePair&lt;int, List&lt;List&lt;TrainingSample&gt;&gt;&gt;&gt;, double[], SampleFlag, int, double, double, IProgress&lt;IMessage&gt;, CancellationToken)</a>: the rotation of the
measured spindle-rotation-frame transverse moment (Mx, My) relative to the
model built from a known cutting parameter, i.e. the cutter setup angle
the model is missing, plus the diagnostics that say how much to trust it.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public sealed class SetupAngleEstimate</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">SetupAngleEstimate</span></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
</dd></dl>
<dl class="typelist extensionMethods">
<dt>Extension Methods</dt>
<dd>
<div>
<a class="xref" href="Hi.Common.DuplicateUtil.html#Hi_Common_DuplicateUtil_TryDuplicate__1___0_System_Object___">DuplicateUtil.TryDuplicate&lt;TSelf&gt;(TSelf, params object[])</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__1___0_System_Action___0__">InvokeUtil.SelfInvoke&lt;TSrc&gt;(TSrc, Action&lt;TSrc&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__2___0_System_Func___0___1__">InvokeUtil.SelfInvoke&lt;TSrc, TDst&gt;(TSrc, Func&lt;TSrc, TDst&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Coloring.ColorUtil.html#Hi_Coloring_ColorUtil_GetGloomyColor_System_Object_System_Double_System_Double_">ColorUtil.GetGloomyColor(object, double, double)</a>
</div>
<div>
<a class="xref" href="Hi.Common.NameUtil.html#Hi_Common_NameUtil_GetSelectionName_System_Object_">NameUtil.GetSelectionName(object)</a>
</div>
<div>
<a class="xref" href="Hi.Common.StringUtil.html#Hi_Common_StringUtil_GetPropertyStringIfToStringNotOverloaded_System_Object_System_Boolean_System_Boolean_">StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool)</a>
</div>
<div>
<a class="xref" href="Hi.Parallels.LockUtil.html#Hi_Parallels_LockUtil_Lock_System_Object_">LockUtil.Lock(object)</a>
</div>
</dd></dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_Angle_deg_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Angle_deg*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_Angle_deg" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Angle_deg">
Angle_deg
</h3>
<div class="markdown level1 summary"><p>Estimated rotation (deg) that carries the model's (Mx, My) onto the
measured (Mx, My), folded into <code>[0, <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html#Hi_MillingForces_Training_SetupAngleEstimate_Period_deg">Period_deg</a>)</code>.
Positive = the Mx→My sense of the spindle-rotation frame.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double Angle_deg { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_Contrast_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Contrast*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_Contrast" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Contrast">
Contrast
</h3>
<div class="markdown level1 summary"><p>Contrast of the objective over the angle grid, <code>(Jmax − Jmin)</code>
divided by the measured energy of the used steps: how much the fit
worsens at the worst angle of the period. A property of the cut
geometry rather than of the noise; near 0 means the data does not
constrain the angle (a cut whose running-frame moment is constant over
the turn, e.g. a full slot with all flutes engaged).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double Contrast { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_CorrelationR_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.CorrelationR*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_CorrelationR" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.CorrelationR">
CorrelationR
</h3>
<div class="markdown level1 summary"><p>Pearson correlation R between the measured Mx/My samples and the rotated, scaled model.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double CorrelationR { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_Curve_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Curve*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_Curve" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Curve">
Curve
</h3>
<div class="markdown level1 summary"><p>Grid samples of the objective: angle (deg) and objective value.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public List&lt;(double Angle_deg, double Objective)&gt; Curve { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;(<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.valuetuple-system.double,system.double-.angle_deg">Angle_deg</a>, <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.valuetuple-system.double,system.double-.objective">Objective</a>)&gt;</dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_FixedScaleAngle_deg_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.FixedScaleAngle_deg*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_FixedScaleAngle_deg" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.FixedScaleAngle_deg">
FixedScaleAngle_deg
</h3>
<div class="markdown level1 summary"><p>The angle (deg) re-estimated with the scale pinned to 1 — agrees with
<a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html#Hi_MillingForces_Training_SetupAngleEstimate_Angle_deg">Angle_deg</a> when the parameter magnitude is right.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double FixedScaleAngle_deg { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_FluteNum_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.FluteNum*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_FluteNum" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.FluteNum">
FluteNum
</h3>
<div class="markdown level1 summary"><p>Flute count of the cutter the samples came from.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int FluteNum { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_MeanModelRipple_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.MeanModelRipple*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_MeanModelRipple" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.MeanModelRipple">
MeanModelRipple
</h3>
<div class="markdown level1 summary"><p>Energy-weighted mean of the used steps' <a class="xref" href="Hi.MillingForces.Training.SetupAngleStepEstimate.html#Hi_MillingForces_Training_SetupAngleStepEstimate_ModelRipple">ModelRipple</a>:
how strongly the cut modulates the transverse moment within a turn, the
model-side identifiability measure.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double MeanModelRipple { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_MirrorAngle_deg_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.MirrorAngle_deg*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_MirrorAngle_deg" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.MirrorAngle_deg">
MirrorAngle_deg
</h3>
<div class="markdown level1 summary"><p>Best angle (deg) under the mirrored-frame hypothesis.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double MirrorAngle_deg { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_MirrorObjectiveRatio_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.MirrorObjectiveRatio*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_MirrorObjectiveRatio" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.MirrorObjectiveRatio">
MirrorObjectiveRatio
</h3>
<div class="markdown level1 summary"><p>Objective of the mirrored hypothesis over the plain one (&lt; 1 favours the mirror).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double MirrorObjectiveRatio { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_MirrorPreferred_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.MirrorPreferred*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_MirrorPreferred" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.MirrorPreferred">
MirrorPreferred
</h3>
<div class="markdown level1 summary"><p>True when a mirrored measurement frame (My negated) fits markedly better
than the plain rotation — the sensor axes are likely swapped/negated
rather than rotated; <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html#Hi_MillingForces_Training_SetupAngleEstimate_MirrorAngle_deg">MirrorAngle_deg</a> is the angle under
that hypothesis.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool MirrorPreferred { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_Note_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Note*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_Note" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Note">
Note
</h3>
<div class="markdown level1 summary"><p>Human-readable summary.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public string Note { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_Objective_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Objective*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_Objective" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Objective">
Objective
</h3>
<div class="markdown level1 summary"><p>Objective value at the estimate (residual energy of the used steps).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double Objective { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_Period_deg_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Period_deg*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_Period_deg" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Period_deg">
Period_deg
</h3>
<div class="markdown level1 summary"><p>Ambiguity period of the estimate (deg): 360/N for an N-flute uniform
fluting (the flute pitch), 360 otherwise.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double Period_deg { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_ScaleRatio_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.ScaleRatio*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_ScaleRatio" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.ScaleRatio">
ScaleRatio
</h3>
<div class="markdown level1 summary"><p>Measured-over-model magnitude ratio of the fit (a free scale absorbs
coefficient magnitude and moment-arm errors so they cannot bias the angle).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double ScaleRatio { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_Scatter_deg_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Scatter_deg*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_Scatter_deg" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Scatter_deg">
Scatter_deg
</h3>
<div class="markdown level1 summary"><p>Energy-weighted circular standard deviation (deg) of the per-step angles around the estimate.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double Scatter_deg { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_StepNum_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.StepNum*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_StepNum" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.StepNum">
StepNum
</h3>
<div class="markdown level1 summary"><p>Steps that carried Mx/My samples.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int StepNum { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_Steps_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Steps*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_Steps" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Steps">
Steps
</h3>
<div class="markdown level1 summary"><p>Per-step diagnostics.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public List&lt;SetupAngleStepEstimate&gt; Steps { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.MillingForces.Training.SetupAngleStepEstimate.html">SetupAngleStepEstimate</a>&gt;</dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_Succeeded_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Succeeded*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_Succeeded" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.Succeeded">
Succeeded
</h3>
<div class="markdown level1 summary"><p>False when no estimate could be formed; <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html#Hi_MillingForces_Training_SetupAngleEstimate_Note">Note</a> says why.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool Succeeded { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_ToolId_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.ToolId*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_ToolId" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.ToolId">
ToolId
</h3>
<div class="markdown level1 summary"><p>Tool id of the cutter the samples came from; -1 when unknown.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int ToolId { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimate_UsedStepNum_" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.UsedStepNum*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimate_UsedStepNum" data-uid="Hi.MillingForces.Training.SetupAngleEstimate.UsedStepNum">
UsedStepNum
</h3>
<div class="markdown level1 summary"><p>Steps that survived the signal and outlier gates.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int UsedStepNum { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,496 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class SetupAngleEstimation | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class SetupAngleEstimation | HiAPI-C# 2025 ">
<meta name="description" content="Estimates the cutter setup angle from smart-holder moment samples and a known cutting parameter. Physics: for a cutter whose flutes are all alike, mounting it turned by φ inside the holder changes the spindle-rotation-frame transverse moment series in two ways only — every (Mx, My) vector rotates by φ and the series shifts by φ along the rotation angle. The per-step begin-angle alignment the training pipeline already performs absorbs the shift, so φ survives solely as a constant planar rotation of the model&#39;s (Mx, My) against the measured (Mx, My); Mz, Fz and the workpiece-frame forces carry no information about it. The estimate is therefore a rotation-plus-scale (complex gain) Procrustes fit shared by all steps, with the begin-angle hypothesis chosen per step by brute force. Identifiability: the angle is determined only modulo the flute pitch (360/N for N uniform flutes) and only when the transverse envelope is modulated within a revolution — light side cuts or intermittent contact; a full slot with several flutes engaged at once leaves the objective flat, which exposes.">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
<meta name="docfx:navrel" content="../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Hi.MillingForces.Training.SetupAngleEstimation">
<h1 id="Hi_MillingForces_Training_SetupAngleEstimation" data-uid="Hi.MillingForces.Training.SetupAngleEstimation" class="text-break">
Class SetupAngleEstimation
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="Hi.html">Hi</a>.<a class="xref" href="Hi.MillingForces.html">MillingForces</a>.<a class="xref" href="Hi.MillingForces.Training.html">Training</a></dd></dl>
<dl><dt>Assembly</dt><dd>HiNc.dll</dd></dl>
</div>
<div class="markdown summary"><p>Estimates the cutter setup angle from smart-holder moment samples and a
known cutting parameter.</p>
<p>
Physics: for a cutter whose flutes are all alike, mounting it turned by
φ inside the holder changes the spindle-rotation-frame transverse moment
series in two ways only — every (Mx, My) vector rotates by φ and the
series shifts by φ along the rotation angle. The per-step begin-angle
alignment the training pipeline already performs absorbs the shift, so
φ survives solely as a constant planar rotation of the model's (Mx, My)
against the measured (Mx, My); Mz, Fz and the workpiece-frame forces
carry no information about it. The estimate is therefore a
rotation-plus-scale (complex gain) Procrustes fit shared by all steps,
with the begin-angle hypothesis chosen per step by brute force.
</p>
<p>
Identifiability: the angle is determined only modulo the flute pitch
(360/N for N uniform flutes) and only when the transverse envelope is
modulated within a revolution — light side cuts or intermittent contact;
a full slot with several flutes engaged at once leaves the objective
flat, which <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html#Hi_MillingForces_Training_SetupAngleEstimate_Contrast">Contrast</a> exposes.
</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static class SetupAngleEstimation</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">SetupAngleEstimation</span></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone">object.MemberwiseClone()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
</dd></dl>
<h2 class="section" id="fields">Fields
</h2>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimation_MaxAlternations" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.MaxAlternations">
MaxAlternations
</h3>
<div class="markdown level1 summary"><p>Upper bound on begin-angle / gain alternations per pass.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public const int MaxAlternations = 30</code></pre>
</div>
<h4 class="section">Field Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimation_MaxTrimRounds" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.MaxTrimRounds">
MaxTrimRounds
</h3>
<div class="markdown level1 summary"><p>Upper bound on outlier-trim rounds (trim, re-solve, re-score).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public const int MaxTrimRounds = 4</code></pre>
</div>
<h4 class="section">Field Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="Hi_MillingForces_Training_SetupAngleEstimation_EnergyCapOverMedian_" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.EnergyCapOverMedian*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimation_EnergyCapOverMedian" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.EnergyCapOverMedian">
EnergyCapOverMedian
</h3>
<div class="markdown level1 summary"><p>A step whose measured energy exceeds this multiple of the median is weighted down to it.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static double EnergyCapOverMedian { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimation_GridStep_deg_" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.GridStep_deg*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimation_GridStep_deg" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.GridStep_deg">
GridStep_deg
</h3>
<div class="markdown level1 summary"><p>Angle grid step (deg) of the global search; the closed-form refinement makes the estimate sub-grid.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static double GridStep_deg { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimation_LowContrastThreshold_" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.LowContrastThreshold*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimation_LowContrastThreshold" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.LowContrastThreshold">
LowContrastThreshold
</h3>
<div class="markdown level1 summary"><p>Objective contrast (see <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html#Hi_MillingForces_Training_SetupAngleEstimate_Contrast">Contrast</a>) below which the estimate is reported as unconstrained.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static double LowContrastThreshold { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimation_MirrorPreferenceRatio_" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.MirrorPreferenceRatio*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimation_MirrorPreferenceRatio" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.MirrorPreferenceRatio">
MirrorPreferenceRatio
</h3>
<div class="markdown level1 summary"><p>The mirrored-frame hypothesis is reported as preferred when its objective
falls below this fraction of the plain hypothesis' objective.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static double MirrorPreferenceRatio { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleEstimation_RotationSignConvention_" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.RotationSignConvention*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimation_RotationSignConvention" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.RotationSignConvention">
RotationSignConvention
</h3>
<div class="markdown level1 summary"><p>Sign relating the estimate to the cutter's <code>SetupAngle_deg</code>:
the setup angle to enter is <code>current + RotationSignConvention · Angle_deg</code>.
Pinned by the sim replay test (a cutter exported at a known setup angle
must be recovered with this sign).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static int RotationSignConvention { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="Hi_MillingForces_Training_SetupAngleEstimation_Estimate_" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.Estimate*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleEstimation_Estimate_System_Collections_Generic_IEnumerable_System_Collections_Generic_KeyValuePair_System_Int32_System_Collections_Generic_List_System_Collections_Generic_List_Hi_MillingForces_Fittings_TrainingSample_____System_Double___Hi_MillingForces_Fittings_SampleFlag_System_Int32_System_Double_System_Double_System_IProgress_Hi_Common_Messages_IMessage__System_Threading_CancellationToken_" data-uid="Hi.MillingForces.Training.SetupAngleEstimation.Estimate(System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{System.Int32,System.Collections.Generic.List{System.Collections.Generic.List{Hi.MillingForces.Fittings.TrainingSample}}}},System.Double[],Hi.MillingForces.Fittings.SampleFlag,System.Int32,System.Double,System.Double,System.IProgress{Hi.Common.Messages.IMessage},System.Threading.CancellationToken)">
Estimate(IEnumerable&lt;KeyValuePair&lt;int, List&lt;List&lt;TrainingSample&gt;&gt;&gt;&gt;, double[], SampleFlag, int, double, double, IProgress&lt;IMessage&gt;, CancellationToken)
</h3>
<div class="markdown level1 summary"><p>Estimates the setup angle from gathered angle-hypothesis samples
(the <code>GatherSampleByAngle</code> structure: hypothesis list b at instance
i pairs the model row of angle (b+i) mod N with the measured value at
instance i).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static SetupAngleEstimate Estimate(IEnumerable&lt;KeyValuePair&lt;int, List&lt;List&lt;TrainingSample&gt;&gt;&gt;&gt; stepIndexToAngleSamples, double[] paraVector, SampleFlag sampleFlags, int fluteNum, double period_deg, double outlierRatio, IProgress&lt;IMessage&gt; messageProgress, CancellationToken cancellationToken)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>stepIndexToAngleSamples</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1">IEnumerable</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.keyvaluepair-2">KeyValuePair</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a>, <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.MillingForces.Fittings.TrainingSample.html">TrainingSample</a>&gt;&gt;&gt;&gt;</dt>
<dd><p>Gathered samples per step.</p>
</dd>
<dt><code>paraVector</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a>[]</dt>
<dd><p>The known cutting parameter as an element vector (the gather's template order).</p>
</dd>
<dt><code>sampleFlags</code> <a class="xref" href="Hi.MillingForces.Fittings.SampleFlag.html">SampleFlag</a></dt>
<dd><p>Channels gathered; must include Mx and My. Mz, when present, only helps the begin-angle choice.</p>
</dd>
<dt><code>fluteNum</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd><p>Flute count of the cutter.</p>
</dd>
<dt><code>period_deg</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd><p>Ambiguity period of the angle (360/N for uniform fluting).</p>
</dd>
<dt><code>outlierRatio</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd><p>Fraction of the worst-fitting steps trimmed before the final estimate.</p>
</dd>
<dt><code>messageProgress</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress</a>&lt;<a class="xref" href="Hi.Common.Messages.IMessage.html">IMessage</a>&gt;</dt>
<dd><p>Message sink.</p>
</dd>
<dt><code>cancellationToken</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken">CancellationToken</a></dt>
<dd><p>Cancellation token.</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html">SetupAngleEstimate</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,463 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class SetupAngleStepEstimate | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class SetupAngleStepEstimate | HiAPI-C# 2025 ">
<meta name="description" content="Per-step diagnostics of a .">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
<meta name="docfx:navrel" content="../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate">
<h1 id="Hi_MillingForces_Training_SetupAngleStepEstimate" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate" class="text-break">
Class SetupAngleStepEstimate
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="Hi.html">Hi</a>.<a class="xref" href="Hi.MillingForces.html">MillingForces</a>.<a class="xref" href="Hi.MillingForces.Training.html">Training</a></dd></dl>
<dl><dt>Assembly</dt><dd>HiNc.dll</dd></dl>
</div>
<div class="markdown summary"><p>Per-step diagnostics of a <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html">SetupAngleEstimate</a>.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public sealed class SetupAngleStepEstimate</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">SetupAngleStepEstimate</span></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
</dd></dl>
<dl class="typelist extensionMethods">
<dt>Extension Methods</dt>
<dd>
<div>
<a class="xref" href="Hi.Common.DuplicateUtil.html#Hi_Common_DuplicateUtil_TryDuplicate__1___0_System_Object___">DuplicateUtil.TryDuplicate&lt;TSelf&gt;(TSelf, params object[])</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__1___0_System_Action___0__">InvokeUtil.SelfInvoke&lt;TSrc&gt;(TSrc, Action&lt;TSrc&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__2___0_System_Func___0___1__">InvokeUtil.SelfInvoke&lt;TSrc, TDst&gt;(TSrc, Func&lt;TSrc, TDst&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Coloring.ColorUtil.html#Hi_Coloring_ColorUtil_GetGloomyColor_System_Object_System_Double_System_Double_">ColorUtil.GetGloomyColor(object, double, double)</a>
</div>
<div>
<a class="xref" href="Hi.Common.NameUtil.html#Hi_Common_NameUtil_GetSelectionName_System_Object_">NameUtil.GetSelectionName(object)</a>
</div>
<div>
<a class="xref" href="Hi.Common.StringUtil.html#Hi_Common_StringUtil_GetPropertyStringIfToStringNotOverloaded_System_Object_System_Boolean_System_Boolean_">StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool)</a>
</div>
<div>
<a class="xref" href="Hi.Parallels.LockUtil.html#Hi_Parallels_LockUtil_Lock_System_Object_">LockUtil.Lock(object)</a>
</div>
</dd></dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="Hi_MillingForces_Training_SetupAngleStepEstimate_AlignedBin_" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.AlignedBin*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleStepEstimate_AlignedBin" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.AlignedBin">
AlignedBin
</h3>
<div class="markdown level1 summary"><p>Begin-angle hypothesis (bin) the step aligned to under the final estimate.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int AlignedBin { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleStepEstimate_Angle_deg_" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.Angle_deg*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleStepEstimate_Angle_deg" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.Angle_deg">
Angle_deg
</h3>
<div class="markdown level1 summary"><p>The step's own rotation estimate (deg, folded into the flute period):
the argument of its complex correlation at <a class="xref" href="Hi.MillingForces.Training.SetupAngleStepEstimate.html#Hi_MillingForces_Training_SetupAngleStepEstimate_AlignedBin">AlignedBin</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double Angle_deg { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleStepEstimate_InstanceNum_" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.InstanceNum*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleStepEstimate_InstanceNum" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.InstanceNum">
InstanceNum
</h3>
<div class="markdown level1 summary"><p>Number of sampling instances the step contributed.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int InstanceNum { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleStepEstimate_ModelRipple_" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.ModelRipple*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleStepEstimate_ModelRipple" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.ModelRipple">
ModelRipple
</h3>
<div class="markdown level1 summary"><p>Model-side identifiability of the step, 0..1: the share of the
running-frame transverse moment's energy that varies within a turn
(√(Σ|H − H̄|² / Σ|H|²)). 0 is a constant running-frame moment, whose
rotation-frame series is a pure rotating vector carrying no
setup-angle information; an intermittent side cut is close to 1.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double ModelRipple { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleStepEstimate_ResidualRatio_" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.ResidualRatio*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleStepEstimate_ResidualRatio" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.ResidualRatio">
ResidualRatio
</h3>
<div class="markdown level1 summary"><p>Residual energy over measured energy at the final estimate (0 = perfect fit).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double ResidualRatio { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleStepEstimate_StepIndex_" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.StepIndex*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleStepEstimate_StepIndex" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.StepIndex">
StepIndex
</h3>
<div class="markdown level1 summary"><p>Step index (key of the gathered sample dictionary).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public int StepIndex { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleStepEstimate_Used_" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.Used*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleStepEstimate_Used" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.Used">
Used
</h3>
<div class="markdown level1 summary"><p>False when the step was trimmed as an outlier or carried no usable signal.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool Used { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="Hi_MillingForces_Training_SetupAngleStepEstimate_Weight_" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.Weight*"></a>
<h3 id="Hi_MillingForces_Training_SetupAngleStepEstimate_Weight" data-uid="Hi.MillingForces.Training.SetupAngleStepEstimate.Weight">
Weight
</h3>
<div class="markdown level1 summary"><p>Weight of the step in the pooled estimate (|Z| at the aligned bin).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public double Weight { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -110,6 +110,44 @@ without touching the file system.</p>
<dd><p>Provides utilities for milling force training and parameter identification.</p> <dd><p>Provides utilities for milling force training and parameter identification.</p>
</dd> </dd>
</dl> </dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html">SetupAngleEstimate</a></dt>
<dd><p>Result of <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimation.html#Hi_MillingForces_Training_SetupAngleEstimation_Estimate_System_Collections_Generic_IEnumerable_System_Collections_Generic_KeyValuePair_System_Int32_System_Collections_Generic_List_System_Collections_Generic_List_Hi_MillingForces_Fittings_TrainingSample_____System_Double___Hi_MillingForces_Fittings_SampleFlag_System_Int32_System_Double_System_Double_System_IProgress_Hi_Common_Messages_IMessage__System_Threading_CancellationToken_">Estimate(IEnumerable&lt;KeyValuePair&lt;int, List&lt;List&lt;TrainingSample&gt;&gt;&gt;&gt;, double[], SampleFlag, int, double, double, IProgress&lt;IMessage&gt;, CancellationToken)</a>: the rotation of the
measured spindle-rotation-frame transverse moment (Mx, My) relative to the
model built from a known cutting parameter, i.e. the cutter setup angle
the model is missing, plus the diagnostics that say how much to trust it.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimation.html">SetupAngleEstimation</a></dt>
<dd><p>Estimates the cutter setup angle from smart-holder moment samples and a
known cutting parameter.</p>
<p>
Physics: for a cutter whose flutes are all alike, mounting it turned by
φ inside the holder changes the spindle-rotation-frame transverse moment
series in two ways only — every (Mx, My) vector rotates by φ and the
series shifts by φ along the rotation angle. The per-step begin-angle
alignment the training pipeline already performs absorbs the shift, so
φ survives solely as a constant planar rotation of the model's (Mx, My)
against the measured (Mx, My); Mz, Fz and the workpiece-frame forces
carry no information about it. The estimate is therefore a
rotation-plus-scale (complex gain) Procrustes fit shared by all steps,
with the begin-angle hypothesis chosen per step by brute force.
</p>
<p>
Identifiability: the angle is determined only modulo the flute pitch
(360/N for N uniform flutes) and only when the transverse envelope is
modulated within a revolution — light side cuts or intermittent contact;
a full slot with several flutes engaged at once leaves the objective
flat, which <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html#Hi_MillingForces_Training_SetupAngleEstimate_Contrast">Contrast</a> exposes.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MillingForces.Training.SetupAngleStepEstimate.html">SetupAngleStepEstimate</a></dt>
<dd><p>Per-step diagnostics of a <a class="xref" href="Hi.MillingForces.Training.SetupAngleEstimate.html">SetupAngleEstimate</a>.</p>
</dd>
</dl>
</article> </article>
@@ -155,8 +155,8 @@ Class XyzabcUtil
<a id="Hi_Numerical_Xyzabc_XyzabcUtil_BuildAnchorToSolid_" data-uid="Hi.Numerical.Xyzabc.XyzabcUtil.BuildAnchorToSolid*"></a> <a id="Hi_Numerical_Xyzabc_XyzabcUtil_BuildAnchorToSolid_" data-uid="Hi.Numerical.Xyzabc.XyzabcUtil.BuildAnchorToSolid*"></a>
<h3 id="Hi_Numerical_Xyzabc_XyzabcUtil_BuildAnchorToSolid_System_Collections_Generic_Dictionary_Hi_Mech_Topo_Anchor_Hi_NcMech_Solids_Solid__System_Collections_Generic_List_Hi_Mech_Topo_Anchor__System_Collections_Generic_Dictionary_System_String_Hi_NcMech_Solids_Solid__" data-uid="Hi.Numerical.Xyzabc.XyzabcUtil.BuildAnchorToSolid(System.Collections.Generic.Dictionary{Hi.Mech.Topo.Anchor,Hi.NcMech.Solids.Solid},System.Collections.Generic.List{Hi.Mech.Topo.Anchor},System.Collections.Generic.Dictionary{System.String,Hi.NcMech.Solids.Solid})"> <h3 id="Hi_Numerical_Xyzabc_XyzabcUtil_BuildAnchorToSolid_System_Collections_Generic_Dictionary_Hi_Mech_Topo_Anchor_Hi_NcMech_Solids_Solid__System_Collections_Generic_IEnumerable_Hi_Mech_Topo_Anchor__System_Collections_Generic_Dictionary_System_String_Hi_NcMech_Solids_Solid__" data-uid="Hi.Numerical.Xyzabc.XyzabcUtil.BuildAnchorToSolid(System.Collections.Generic.Dictionary{Hi.Mech.Topo.Anchor,Hi.NcMech.Solids.Solid},System.Collections.Generic.IEnumerable{Hi.Mech.Topo.Anchor},System.Collections.Generic.Dictionary{System.String,Hi.NcMech.Solids.Solid})">
BuildAnchorToSolid(Dictionary&lt;Anchor, Solid&gt;, List&lt;Anchor&gt;, Dictionary&lt;string, Solid&gt;) BuildAnchorToSolid(Dictionary&lt;Anchor, Solid&gt;, IEnumerable&lt;Anchor&gt;, Dictionary&lt;string, Solid&gt;)
</h3> </h3>
@@ -165,7 +165,7 @@ Class XyzabcUtil
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
<div class="codewrapper"> <div class="codewrapper">
<pre><code class="lang-csharp hljs">public static void BuildAnchorToSolid(this Dictionary&lt;Anchor, Solid&gt; dstAnchorToSolidDictionary, List&lt;Anchor&gt; anchors, Dictionary&lt;string, Solid&gt; keyToSolid)</code></pre> <pre><code class="lang-csharp hljs">public static void BuildAnchorToSolid(this Dictionary&lt;Anchor, Solid&gt; dstAnchorToSolidDictionary, IEnumerable&lt;Anchor&gt; anchors, Dictionary&lt;string, Solid&gt; keyToSolid)</code></pre>
</div> </div>
<h4 class="section">Parameters</h4> <h4 class="section">Parameters</h4>
@@ -173,7 +173,7 @@ Class XyzabcUtil
<dt><code>dstAnchorToSolidDictionary</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>, <a class="xref" href="Hi.NcMech.Solids.Solid.html">Solid</a>&gt;</dt> <dt><code>dstAnchorToSolidDictionary</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>, <a class="xref" href="Hi.NcMech.Solids.Solid.html">Solid</a>&gt;</dt>
<dd><p>The destination dictionary to populate</p> <dd><p>The destination dictionary to populate</p>
</dd> </dd>
<dt><code>anchors</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>&gt;</dt> <dt><code>anchors</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1">IEnumerable</a>&lt;<a class="xref" href="Hi.Mech.Topo.Anchor.html">Anchor</a>&gt;</dt>
<dd><p>List of anchors</p> <dd><p>List of anchors</p>
</dd> </dd>
<dt><code>keyToSolid</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>, <a class="xref" href="Hi.NcMech.Solids.Solid.html">Solid</a>&gt;</dt> <dt><code>keyToSolid</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary-2">Dictionary</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>, <a class="xref" href="Hi.NcMech.Solids.Solid.html">Solid</a>&gt;</dt>
+9
View File
@@ -2098,6 +2098,15 @@
<li> <li>
<a href="Hi.MillingForces.Training.MillingTraining.html" name="" title="MillingTraining">MillingTraining</a> <a href="Hi.MillingForces.Training.MillingTraining.html" name="" title="MillingTraining">MillingTraining</a>
</li> </li>
<li>
<a href="Hi.MillingForces.Training.SetupAngleEstimate.html" name="" title="SetupAngleEstimate">SetupAngleEstimate</a>
</li>
<li>
<a href="Hi.MillingForces.Training.SetupAngleEstimation.html" name="" title="SetupAngleEstimation">SetupAngleEstimation</a>
</li>
<li>
<a href="Hi.MillingForces.Training.SetupAngleStepEstimate.html" name="" title="SetupAngleStepEstimate">SetupAngleStepEstimate</a>
</li>
</ul> </ul>
</li> </li>
<li> <li>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.