【问题标题】:How to open autocad drawings in vb.net and run scripts?如何在 vb.net 中打开 AutoCAD 图纸并运行脚本?
【发布时间】:2013-10-15 19:43:18
【问题描述】:

我正在尝试使用 AutoCad 打开文件夹中的所有 .dwg 文件并运行之前编写的脚本。 为此,我构建了以下代码:

 Dim myapp As New Autodesk.AutoCAD.Interop.AcadApplication
 Dim docMgr As AutoCAD.Interop.AcadDocuments = myapp.Documents

 docMgr.Open(File.FullName, False)

谁能帮我理解为什么它不起作用?

首先,我收到了“RPC_E_CALL_REJECTED”错误。但是我插入了一个句柄来读取 isQuiescent 状态,现在我只是运行 .Open 当 AutoCad 空闲但静止时,Visual Studio 正在返回一个没有任何数字的错误。

COM 详细信息例外是:-2147418113

有人知道在 AutoCad 中简单地打开现有文件并运行脚本的正确方法吗?我不知道,我只是按照他们网页上的 AutoDest 说明进行操作,我认为这很容易:(

【问题讨论】:

  • 我不得不提一下,如果你只是在每个绘图上运行脚本,LISP、命令行开关 /b,甚至是由 Viru 在 AutoDesk 网站 (labs.autodesk.com/utilities/ADN_plugins/catalog) 上编写的 ScriptPro 都可能是更简单的选择。

标签: vb.net file autocad dwg


【解决方案1】:

在使用 AutoCAD 互操作对象时,我总是根据 Kean Walmsley 的建议实现 IMessageFilter:http://adndevblog.typepad.com/autocad/2012/05/cannot-instantiate-autocad-2010-from-an-external-net-application-after-installing-update-1.html

// IMessageFilter Interface
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000016-0000-0000-C000-000000000046")]
public interface IMessageFilter
{
    [PreserveSig]
    int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo);

    [PreserveSig]
    int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType);

    [PreserveSig]
    int MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType);
}

对于一个表单,它看起来像这样:

public partial class Form1 : Form, IMessageFilter
{
    public Form1()
    {
        InitializeComponent();
        CoRegisterMessageFilter(this, null);
    }

    int IMessageFilter.HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo)
    {
        // SERVERCALL_ISHANDLED
        return 0;
    }

    int IMessageFilter.RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType)
    {
        // Retry in a second
        return 1000;
    }

    int IMessageFilter.MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType)
    {
        // PENDINGMSG_WAITNOPROCESS
        return 1;
    }

    [DllImport("ole32.dll")]
    private static extern int CoRegisterMessageFilter(IMessageFilter lpMessageFilter, IMessageFilter lplpMessageFilter); 

    ...


}

这似乎基本上是在告诉那些 COM 异常,让他们闭嘴等待 AutoCAD COM 对象准备好。

【讨论】:

  • 嗨洛克。谢谢您的回复。在实现了这个复杂的处理程序之后,我可以最终确定处理程序被调用了几次,直到 acad 准备好并运行下一个命令。当我尝试打开 AutoCad 并添加一些空白模板时,它起作用了。但是当我输入: Dim docMgr As AutoCAD.Interop.AcadDocuments = myapp.Documents docMgr.open("filename", false) - 它通过 Unhandled COMException 没有描述。代码和第一个语句一样...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多