将AutoCad与WPF C#应用程序集成

时间:2013-04-25 06:59:28

标签: c# wpf autocad

我有一个关于将AutoCad LT与WPF C#应用程序集成的问题。 我有一个客户为我开发ERP应用程序,该客户使用AutoCAD LT绘制他们生产的产品。他们使用主图纸为他们的产品,不同的客户订购不同尺寸的产品。

客户问我是否可以在他的订单流程中集成和自动化AutoCad。当他下新订单时,他希望它打开订购产品的图纸,更改它,并将其保存在特定文件夹中的不同名称下。

图纸的更改将由客户代表(CSR)完成,应用程序应自动将图纸保存在具有引用特定订单的名称的特定文件夹中。之后,应用程序应打印图形,然后关闭AutoCad实例。

所以我有以下用例:

  1. CSR:输入新订单并指定主图纸;
  2. 应用程序:打开AutoCad绘图;
  3. CSR:改变绘图;
  4. CSR:提交订单(在申请中);
  5. 应用程序:指示AutoCad打印已更改的图形;
  6. 应用程序:在特定文件夹中以新名称保存图形;
  7. 应用程序:关闭AutoCad LT实例。
  8. 我的问题是,是否有可用于实现此功能的AutoCad API,还是有其他方法可以将这些命令传达给AutoCad?

2 个答案:

答案 0 :(得分:1)

看看这个: AutoCad .Net Developers Guide

  

本简介介绍了通过托管.NET应用程序编程接口(API)公开AutoCAD®对象的概念。

作为旁注:为什么要使用文件夹作为图纸?我认为某种数据库会更好。

答案 1 :(得分:0)

AutoCAD developers guide下的Basics of the AutoCAD .NET API -> Out-of-Process versus In-Process

  

开发新应用程序时,它可以在进程内运行,也可以在进程外运行。 AutoCAD .NET API仅设计为在进程中运行,这与可在进程或进程中使用的ActiveX自动化库不同。   进程内应用程序设计为在与主机应用程序相同的进程空间中运行。在这种情况下,DLL程序集将加载到作为宿主应用程序的AutoCAD中。   进程外应用程序不与主机应用程序在同一空间中运行。这些应用程序通常构建为独立的可执行文件。   如果需要创建独立应用程序来驱动AutoCAD,最好创建一个使用CreateObject和GetObject方法创建AutoCAD应用程序的新实例或返回当前正在运行的实例之一的应用程序。返回对AcadApplication的引用后,可以使用SendCommand方法将进程内.NET应用程序加载到AutoCAD中,该方法是AcadApplication的ActiveDocument属性的成员。

示例代码显示如何从独立的应用程序访问正在运行的AutoCAD实例。基本上你可以这样做(插入你特定的progId):

[CommandMethod("ConnectToAcad")]
public static void ConnectToAcad()
{

    AcadApplication acAppComObj = null;
    const string strProgId = "AutoCAD.Application.18";

    // Get a running instance of AutoCAD
    try
    {
        acAppComObj = (AcadApplication)Marshal.GetActiveObject(strProgId);
    }
    catch // An error occurs if no instance is running
    {
        try
        {
            // Create a new instance of AutoCAD
            acAppComObj = (AcadApplication)Activator.CreateInstance(Type.GetTypeFromProgID(strProgId), true);
        }
        catch
        {
            // If an instance of AutoCAD is not created then message and exit
            System.Windows.Forms.MessageBox.Show("Instance of 'AutoCAD.Application'" +
                                                 " could not be created.");

            return;
        }
    }

    // Display the application and return the name and version
    acAppComObj.Visible = true;
    System.Windows.Forms.MessageBox.Show("Now running " + acAppComObj.Name +
                                         " version " + acAppComObj.Version);

    // Get the active document
    AcadDocument acDocComObj;
    acDocComObj = acAppComObj.ActiveDocument;

    // Optionally, load your assembly and start your command or if your assembly
    // is demandloaded, simply start the command of your in-process assembly.
    acDocComObj.SendCommand("(command " + (char)34 + "NETLOAD" + (char)34 + " " +
                            (char)34 + "c:/myapps/mycommands.dll" + (char)34 + ") ");

    acDocComObj.SendCommand("MyCommand ");
}