【问题标题】:Opening AutoCAD from Windows Forms Application从 Windows 窗体应用程序打开 AutoCAD
【发布时间】:2014-08-16 12:04:39
【问题描述】:

我正在使用 C# 中的 Windows 窗体编写一个程序,该程序对 3d 对象进行建模,然后应该从 .NET 框架打开 AutoCAD 以绘制对象,我正在尝试找出最好的方法来做到这一点。

我以前尝试过opening AutoCAD from .NET using COM,但我想知道是否有一种方法不会以no such interface supported 错误结束,因为我尝试过的每一种途径(打开绘图,使用 COM 打开 AutoCAD等)已经结束而没有结果。有什么建议吗?

【问题讨论】:

    标签: c# winforms autocad


    【解决方案1】:

    我使用您显示的示例,但我尝试先获取活动的 Autocad。您可以将其与上一个答案中提到的使用过程结合起来,但这需要始终知道 Autocad 的安装位置。

    try
    {
      // you may choose to reverse this, by calling getActiveObject first
      // or you can try repeating the getActiveObject after a short delay
      var t = Type.GetTypeFromProgID(_autocadClassId, true);
      // Create a new instance AutoCAD
      _application = Activator.CreateInstance(t, true);      
    }
    catch (COMException ex)
    {
        try
        {
            // Start works every time, but due to the delay it may appear not to
            // check task manager when testing this
            // add a delay here before trying to get what was started
            Thread.Sleep(750); //for example
            _application = Marshal.GetActiveObject(_autocadClassId);
        }
        catch (Exception e2x)
        {
            Log.Error(e2x);
        }
    }
    

    我的 _application 对象是动态的,我有一个 CAD 类,它带有封装 AutoCAD 功能的静态方法,为了添加新功能,我有一个带有 CAD 类的虚拟项目,它使用 AutoCAD 互操作来获取方法和属性名称和套管正确,但我使用动态部署。

    【讨论】:

      【解决方案2】:

      当我做这种事情时,我只是用System.Diagnostics.Process 启动 AutoCAD,并确保在启动时传入一个 AutoCAD 脚本文件:

      System.Diagnostics.Process proc = new Process();
      proc.StartInfo.FileName = @"C:\Program Files\AutoCAD 2010\acad.exe /b myScriptFile.scr";
      proc.Start();
      

      我没有尝试直接从 .NET 操作 AutoCAD,正如您所发现的那样,这可能会出现问题,我只是将所有 AutoCAD 命令写入脚本文件,然后将该脚本文件作为命令行参数发送到 AutoCAD如上所示。

      【讨论】:

      • 如果您在应用程序运行后不需要真正触摸它,这将非常有效。 AutoDesk 的 Viru 在创作 ScriptPro 时使用了同样的方法。
      • 您可以在脚本文件中包含等待点,以便在脚本运行时暂停某些(有限的)用户输入。
      • 我的意思是在 .NET 的上下文中与和/或实时控制事物。大多数情况下,使用这种方法,添加空闲操作计时器以在出现问题时强制重新启动 AutoCAD 是一个好主意。由于 OP 的 Interop 方法不起作用,因此您的方法是这里的合乎逻辑的选择。
      猜你喜欢
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2012-09-10
      • 1970-01-01
      • 2015-03-03
      • 2015-07-13
      • 1970-01-01
      相关资源
      最近更新 更多