Hello!
I’ve encountered a problem when trying to execute Rhino commands using the RhinoApp.RunScript
method within a custom C# server. To give some context, I’ve created a custom Rhino plugin that includes a server implemented in C#. This server listens for specific commands, such as moving vertices, which are then executed within Rhino. The server class is derived from Rhino.Commands.Command
.
The server class was implemented using the Rhino3D guide “Run a Rhino command from a Plugin”. However, when these commands are executed, Rhino processes the script but doesn’t make any visible changes to the document, likely due to threading issues. It seems Rhino commands executed from a background thread don’t properly sync with the main UI thread. I’m seeking advice on how to properly execute and synchronize these commands in a multi-threaded environment to ensure they work as expected.
Here’s the code structure for starting the server:
using System;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
using Rhino;
using Rhino.Commands;
using Rhino.Display;
namespace PlugIn_Modelisation
{
[CommandStyle(Style.ScriptRunner)]
public class StartServer : Command
{
private static BackgroundWorker _worker;
public StartServer()
{
Instance = this;
}
public static StartServer Instance { get; private set; }
public override string EnglishName => "StartServer";
protected override Result RunCommand(RhinoDoc doc, RunMode mode)
{
RhinoView activeView = doc.Views.ActiveView;
var shadedMode = DisplayModeDescription.FindByName("Shaded");
activeView.ActiveViewport.DisplayMode = shadedMode;
activeView.Redraw();
Server serveur = Server.build();
// The issue seems to be related to this part:
Thread newThread = new Thread(() => serveur.RunServer(doc));
newThread.Start();
RhinoApp.WriteLine("Server done");
return Result.Success;
}
}
}
However, I’m facing issues with threading. The RunServer
method is called on a separate thread, which seems to cause problems when trying to execute Rhino commands. Here’s a sequence diagram that outlines the current call structure:
What should I change in the Server
class to make Rhino execute commands properly?**