This commit is contained in:
2025-12-22 23:35:40 +08:00
parent 32ff8b45e3
commit 4556281c0a
77 changed files with 9248 additions and 3996 deletions
@@ -113,7 +113,7 @@
<li>Pause</li>
</ul>
</li>
<li>Both webservice and win-desktop applications use <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> events for monitoring <a class="xref" href="../../../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_PacePlayer">PacePlayer</a> status changes.</li>
<li>Both webservice and win-desktop applications use <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> events for monitoring &lt;xref:Hi.MachiningProcs.MachiningProject.PacePlayer&gt; status changes.</li>
<li>In webservice applications, the <code>PlayerStatusService</code> subscribes to these <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> events and broadcasts status changes via <code>PlayerStatusHub</code> using SignalR for real-time communication.</li>
<li>Win-desktop applications can directly subscribe to <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> events for status updates.</li>
<li>Alter the background color of the <code>Status Text Field</code> if the status changed.
@@ -162,7 +162,7 @@
<li>Players/PlayerStatusService.cs</li>
</ul>
<h4 id="signalr-implementation-webapi-only">SignalR Implementation (Webapi Only)</h4>
<p><code>PlayerStatusHub</code> provides real-time player status updates, with methods <code>GetPlayerStatus()</code> and event <code>PlayerStatusUpdated</code>. <code>PlayerStatusService</code> monitors <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> events (<a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_PacePlayer_IsRunningChangedEvent">PacePlayer_IsRunningChangedEvent</a>, <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_PacePlayer_IsLockedChangedEvent">PacePlayer_IsLockedChangedEvent</a>, <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_PacePlayer_IsFinishedChangedEvent">PacePlayer_IsFinishedChangedEvent</a>, <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_PacePlayer_ResetedEvent">PacePlayer_ResetedEvent</a>) and broadcasts changes via SignalR. The JavaScript component connects to <code>/playerStatusHub</code> and listens for status updates. API endpoints include <code>/api/player/start</code>, <code>/api/player/pause</code>, <code>/api/player/resume</code>, <code>/api/player/run-line</code>, <code>/api/player/run-step</code>, <code>/api/player/stop</code>, and <code>/api/player/reset</code>.</p>
<p><code>PlayerStatusHub</code> provides real-time player status updates, with methods <code>GetPlayerStatus()</code> and event <code>PlayerStatusUpdated</code>. <code>PlayerStatusService</code> monitors <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> events (&lt;xref:Hi.MachiningProcs.LocalProjectService.PacePlayer_IsRunningChangedEvent&gt;, &lt;xref:Hi.MachiningProcs.LocalProjectService.PacePlayer_IsLockedChangedEvent&gt;, &lt;xref:Hi.MachiningProcs.LocalProjectService.PacePlayer_IsFinishedChangedEvent&gt;, &lt;xref:Hi.MachiningProcs.LocalProjectService.PacePlayer_ResetedEvent&gt;) and broadcasts changes via SignalR. The JavaScript component connects to <code>/playerStatusHub</code> and listens for status updates. API endpoints include <code>/api/player/start</code>, <code>/api/player/pause</code>, <code>/api/player/resume</code>, <code>/api/player/run-line</code>, <code>/api/player/run-step</code>, <code>/api/player/stop</code>, and <code>/api/player/reset</code>.</p>
<h3 id="razor-page-source-code">Razor Page Source Code</h3>
<pre><code class="lang-csharp" name="SampleCode-razor">@using Hi.Common.PathUtils;
@using Hi.HiNcKits;
@@ -173,6 +173,7 @@
@{
MachiningProject machiningProject = hiNcHost.MachiningProject;
var localProjectService = hiNcHost.LocalProjectService;
bool disabledByMachiningProject = machiningProject == null;
}
@@ -186,15 +187,15 @@
&lt;div class=&quot;d-inline-block&quot; style=&quot;width: 4rem&quot;&gt;
@{
if (machiningProject == null) { }
else if (machiningProject.PacePlayer.IsRunning)
else if (localProjectService.PacePlayer.IsRunning)
{
&lt;span class=&quot;badge text-bg-warning&quot;&gt;@Loc[&quot;Running&quot;]&lt;/span&gt;
}
else if (machiningProject.PacePlayer.IsLocked)
else if (localProjectService.PacePlayer.IsLocked)
{
&lt;span class=&quot;badge text-bg-secondary&quot;&gt;@Loc[&quot;Pause&quot;]&lt;/span&gt;
}
else if (machiningProject.PacePlayer.IsFinished)
else if (localProjectService.PacePlayer.IsFinished)
{
&lt;span class=&quot;badge text-bg-success&quot;&gt;@Loc[&quot;Finish&quot;]&lt;/span&gt;
}
@@ -210,11 +211,11 @@
&lt;div id=&quot;player-@Tid&quot; class=&quot;btn-group collapse collapse-horizontal show&quot; role=&quot;group&quot;&gt;
@if (machiningProject == null) { }
else if (!machiningProject.PacePlayer.IsLocked)
else if (!localProjectService.PacePlayer.IsLocked)
{
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Start&quot;] (S)&quot;
accesskey=&quot;s&quot;
disabled=&quot;@(disabledByMachiningProject||machiningProject.PacePlayer.IsFinished)&quot;
disabled=&quot;@(disabledByMachiningProject||localProjectService.PacePlayer.IsFinished)&quot;
@onclick=&quot;StartOrContinue&quot;&gt;
&lt;span class=&quot;oi oi-media-play me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
@@ -224,27 +225,27 @@
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Continue&quot;] (S)&quot;
accesskey=&quot;s&quot;
@onclick=&quot;StartOrContinue&quot;
disabled=&quot;@(disabledByMachiningProject||machiningProject.PacePlayer.IsFinished||machiningProject.PacePlayer.IsRunning)&quot;&gt;
disabled=&quot;@(disabledByMachiningProject||localProjectService.PacePlayer.IsFinished||localProjectService.PacePlayer.IsRunning)&quot;&gt;
&lt;span class=&quot;oi oi-media-play me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
}
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Pause&quot;] (P)&quot;
accesskey=&quot;p&quot;
@onclick=&quot;Pause&quot;
disabled=&quot;@(disabledByMachiningProject||!machiningProject.PacePlayer.IsRunning)&quot;&gt;
disabled=&quot;@(disabledByMachiningProject||!localProjectService.PacePlayer.IsRunning)&quot;&gt;
&lt;span class=&quot;oi oi-media-pause me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Run One Line&quot;] (L)&quot;
accesskey=&quot;l&quot;
@onclick=&quot;RunToLineEnd&quot;
disabled=&quot;@(disabledByMachiningProject||machiningProject.PacePlayer.IsFinished)&quot;&gt;
disabled=&quot;@(disabledByMachiningProject||localProjectService.PacePlayer.IsFinished)&quot;&gt;
&lt;span class=&quot;oi oi-media-step-forward me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Run One Step&quot;] (K)&quot;
accesskey=&quot;k&quot;
@onclick=&quot;RunToNextPace&quot;
disabled=&quot;@(disabledByMachiningProject||machiningProject.PacePlayer.IsFinished)&quot;&gt;
disabled=&quot;@(disabledByMachiningProject||localProjectService.PacePlayer.IsFinished)&quot;&gt;
&lt;CommonRcl.Shared.CombinedIcon&gt;
&lt;IconA&gt;
&lt;span class=&quot;oi oi-media-step-forward me-1&quot;&gt;&lt;/span&gt;
@@ -259,7 +260,7 @@
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Break&quot;]&quot;
@onclick=&quot;@Break&quot;
disabled=&quot;@(disabledByMachiningProject||!(machiningProject.PacePlayer.IsLocked||machiningProject.PacePlayer.IsFinished))&quot;&gt;
disabled=&quot;@(disabledByMachiningProject||!(localProjectService.PacePlayer.IsLocked||localProjectService.PacePlayer.IsFinished))&quot;&gt;
&lt;span class=&quot;oi oi-media-stop me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
@@ -285,6 +286,7 @@ namespace HiNcRcl.Areas.Player
StringLocalizer Loc { get; } = new StringLocalizer(typeof(PlayerDiv));
SemaphoreSlim DisposeSemaphore { get; } = new SemaphoreSlim(1);
MachiningProject MachiningProject =&gt; hiNcHost.MachiningProject;
LocalProjectService LocalProjectService =&gt; hiNcHost.LocalProjectService;
bool disposedValue = false;
/// &lt;inheritdoc/&gt;
protected override async Task OnAfterRenderAsync(bool firstRender)
@@ -297,11 +299,11 @@ namespace HiNcRcl.Areas.Player
var machiningProject = MachiningProject;
if (machiningProject != null)
{
machiningProject.PacePlayer.IsLockedChangedEvent
LocalProjectService.PacePlayer.IsLockedChangedEvent
+= EnumerablePlayer_IsLockedEventHandler;
machiningProject.PacePlayer.IsRunningChangedEvent
LocalProjectService.PacePlayer.IsRunningChangedEvent
+= EnumerablePlayer_IsLockedEventHandler;
machiningProject.PacePlayer.IsFinishedChangedEvent
LocalProjectService.PacePlayer.IsFinishedChangedEvent
+= EnumerablePlayer_IsLockedEventHandler;
}
}
@@ -314,11 +316,11 @@ namespace HiNcRcl.Areas.Player
var machiningProject = MachiningProject;
if (machiningProject != null)
{
machiningProject.PacePlayer.IsLockedChangedEvent
LocalProjectService.PacePlayer.IsLockedChangedEvent
-= EnumerablePlayer_IsLockedEventHandler;
machiningProject.PacePlayer.IsRunningChangedEvent
LocalProjectService.PacePlayer.IsRunningChangedEvent
-= EnumerablePlayer_IsLockedEventHandler;
machiningProject.PacePlayer.IsFinishedChangedEvent
LocalProjectService.PacePlayer.IsFinishedChangedEvent
-= EnumerablePlayer_IsLockedEventHandler;
}
disposedValue = true;
@@ -333,14 +335,15 @@ namespace HiNcRcl.Areas.Player
{
await Task.Run(() =&gt;
{
if (!MachiningProject.PacePlayer.IsLocked)
var pacePlayer = LocalProjectService.PacePlayer;
if (!pacePlayer.IsLocked)
{
MachiningProject.PacePlayer.Start();
pacePlayer.Start();
}
else if (!MachiningProject.PacePlayer.IsRunning
&amp;&amp; !MachiningProject.PacePlayer.IsFinished)
else if (!pacePlayer.IsRunning
&amp;&amp; !pacePlayer.IsFinished)
{
MachiningProject.PacePlayer.Resume();
pacePlayer.Resume();
}
}).ShowIfCatched(this);
}
@@ -348,35 +351,35 @@ namespace HiNcRcl.Areas.Player
{
await Task.Run(() =&gt;
{
MachiningProject?.PacePlayer.Pause();
LocalProjectService.PacePlayer.Pause();
}).ShowIfCatched(this);
}
public async Task RunToLineEnd()
{
await Task.Run(() =&gt;
{
MachiningProject?.NcRunner.RunToLineEnd();
LocalProjectService.NcRunner.RunToLineEnd();
}).ShowIfCatched(this);
}
public async Task RunToNextPace()
{
await Task.Run(() =&gt;
{
MachiningProject?.PacePlayer.RunToNextPace();
LocalProjectService.PacePlayer.RunToNextPace();
}).ShowIfCatched(this);
}
public async Task Break()
{
await Task.Run(() =&gt;
{
MachiningProject?.PacePlayer.Terminate();
LocalProjectService.PacePlayer.Terminate();
}).ShowIfCatched(this);
}
public async Task Reset()
{
await Task.Run(() =&gt;
{
MachiningProject?.PacePlayer.Reset();
LocalProjectService.PacePlayer.Reset();
}).ShowIfCatched(this);
}
}