大家好,感谢您在此论坛中提供的所有信息,我发现它在很多场合都很有用。但是,我现在有一个问题,我找不到答案。我的公司有一个应用程序,需要定期跳转到 AutoCAD 并执行一些工作(通常是对数据库对象执行 CRUD 操作)。目前实现的方式如下:- 我们有一个AutoCAD插件,在插件的主 IExtensionApplication 类中,我们在 Initialize() 方法中启动一个后台线程,如下所示:Thread backgroundThread = new Thread(backgroundThreadNew);。
backgroundThread.Name = “MainThreadScheduler”;。
backgroundThread.IsBackground = true;。
backgroundThread.Start(Dispatcher.CurrentDispatcher);- 当我们的应用程序想要访问AutoCAD时,我们要求AutoCAD从其主线程回调到我们的应用程序,方法是执行以下操作:Dispatcher.Invoke(new MainThreadCallbackDelegate(mainThreadCallback));- 当我们收到回调时,我们第一次尝试并检查AutoCAD是否不忙:private bool isCadQuiescent()。
{。
布尔静止 = 真;。
如果(文档,LockMode() != DocumentLockMode.None && document.LockMode() != DocumentLockMode.NotLock)。
{。
静态 = 假;。
}。
。
如果 (!Application.IsQuiescent)。
{。
静态 = 假;。
}。
返回静态;。
}- 如果 AutoCAD 繁忙,我们将不执行任何操作并等待另一个回调。如果它不忙,我们要求AutoCAD调用我们使用以下命令定义的命令:Application.DocumentManager.MdiActiveDocument.SendStringToExecute(“MY_COMMAND\n”, false, false, false);- 在定义“MY_COMMAND”的方法中,我们启动一个事务并像往常一样使用所需的DB对象我会说99%的时间,一切都很顺利。但是,另外1%的时间我收到以下异常:
- eInvalidInput
- at Autodesk.AutoCAD.ApplicationServices.Document.SendStringToExecute(String command, Boolean activate, Boolean wrapUpInactiveDoc, Boolean echoCommand)
我的问题是:1.这是尝试控制AutoCAD的有效方法吗?2. 在尝试发送命令之前,我们是否进行了足够的检查以确保AutoCAD确实处于静止状态?3. 在什么情况下,我会收到错误?到目前为止,从用户报告和我们自己的日志记录中,我无法确定这一点。尝试像这样控制AutoCAD时,还有其他提示吗?非常感谢!。
本帖以下内容被隐藏保护;需要你回复后,才能看到! 游客,如果您要查看本帖隐藏内容请 回复 |