本例将在Revit ExternalApplication中启动一个服务器,监听客户端发送的消息,并通过这个消息,打开对应的rvt文件,当然你可以基于此定义更多消息并处理这些消息,以实现更多可能。
本例将分为以下几个部分:
1、需要构建一个ExternalApplication常驻Revit,并获取UIApplication对象,用以打开项目文件
2、在ExternalApplication中启动Socket服务器,监听客户端消息
3、由于Revit可能会处理耗时任务,需要建立一个单例的消息队列,管理来自不同客户端的不同消息,以便Revit顺序处理
4、Client程序发送消息给Revit服务器
第一部分,Revit外部应用,以打开一个Revit文档为例
public class Exporter : IExternalApplication
{
private UIApplication uiApp = null;
public Result OnStartup(UIControlledApplication application)
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
/创建并启动第二部分创建的服务器
Communicator server = new Communicator("127.0.0.1", 2000);
server.StartListening();
application.ControlledApplication.ApplicationInitialized += OnApplicationInitialized;
return Result.Succeeded;
}
public Result OnShutdown(UIControlledApplication application)
{
return Result.Succeeded;
}
private void OnApplicationInitialized(object sender, ApplicationInitializedEventArgs e)
{
//获取UIApplication对象
Application app = sender as Application;
uiApp = new UIApplication(app);
uiApp.Idling += HandleMessage;
}
//循环处理消息
private void HandleMessage(object sender, IdlingEventArgs e)
{
if (MessageStation.Messages.HasMessage)
{
KeyValuePair<int, string> message = MessageStation.Messages.GetMessage();
try
{
Document document = uiApp.Application.OpenDocumentFile(message.Value);
TaskDialog.Show("document", document.PathName);
}
catch (Exception ex)
{
TaskDialog.Show("error", ex.ToString());