2013-10-08 39 views
0

我试图用AutoCad打开一个文件夹中的所有.dwg文件并运行以前的书面脚本。 为了做到这一点,我建立了下面的代码:如何在vb.net中打开autocad图纸并运行脚本?

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状态,现在我只是在AutoCad空闲时运行.Open,但仍然是Visual Studio返回一个没有任何数字的错误。

的COM详细例外是:-2147418113

有谁知道正确的方法来简单的开一个现有的文件,并在AutoCAD中运行脚本?我不知道,我只是跟着他们的网页上的AutoDest指令,我还以为它会很容易:(

+0

但是我不得不提到,如果你只是在每张图纸上运行脚本,LISP,命令行开关/ b,甚至Viru在AutoDesk网站上编写的ScriptPro(http://labs.autodesk.com/utilities/ ADN_plugins/catalog)可能是更简单的选项。 –

回答

2

基于基恩沃姆斯利的建议在这里与AutoCAD互操作对象时我始终贯彻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对象要准备好

+0

嗨,洛克。谢谢您的回复。在实现这个复杂的处理程序之后,我可以最终调用几次处理程序,直到acad准备就绪,并运行下一个命令。当我尝试打开AutoCad并添加一些空白模板时,它工作正常。但是当我把:Dim docMgr As AutoCAD.Interop.AcadDocuments = myapp.Documents docMgr.open(“filename”,false) - 它通过一个未处理的COMException而没有描述。代码与第一个声明相同... – Totalys

相关问题