【问题标题】:Insertation of blocks in Auto CAD by Accessing Block library通过访问块库在 AutoCAD 中插入块
【发布时间】:2016-12-28 14:37:57
【问题描述】:

我有 CAD 库 & wpf 包含一些组合框,用于从用户那里获取输入。如果用户单击组合框中的任何项目,则 Auto CAD 应该打开,所选块将从库中获取并插入 Auto CAD .我该怎么做?

例如, 我有一个 CAD 块库,该块包含模型 1、模型 2、模型 3、模型 4。 如果在组合框中选择了任何模型,则应该打开 Auto CAD,并且应该从块库中选择尊重的模型并插入新打开的 Auto CAD 文件中。 我怎样才能做到这一点?

【问题讨论】:

    标签: .net autocad


    【解决方案1】:

    您基本上必须从外部 C# 进程打开 AutoCAD,即 is discused herehere。我建议你制作一个单例,它处理 AutoCAD 进程的打开和关闭,并负责打开/插入/保存/关闭文档(块)。挂钩到 selectionChanged 下拉事件,如果不是,则生成 Autocad。此外,您必须调用 Insert()WblockCloneObjects() 方法才能将块插入当前文档。

    private object SpawnCadApplication(string appProgId)
    {
        var acadType = Type.GetTypeFromProgID(appProgId);
        return Activator.CreateInstance(acadType);
    }
    
    private bool ApplicationIsInstalled(string appProgId)
    {
        return Type.GetTypeFromProgID(appProgId) != null;
    }
    
    private bool GetRunninApplication(string appProgId, out object cadApp)
    {
        cadApp = null;
        try
        {
            cadApp = Marshal.GetActiveObject(appProgId);
        }
        catch (Exception e)
        {
    
        }
        return cadApp != null;
    }
    
    private void ReleaseObject(object obj)
    {
        try
        {
            Marshal.FinalReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
        }
    }
    

    一旦你控制了 AutoCAD,你就可以做出你想要的一切

    public void OpenSaveCloseFile(string filePath)
    {
        object cadApp;
        if (!GetRunninApplication(AutoCadProgId, out cadApp))
            {
                cadApp = SpawnCadApplication(AutoCadProgId);
            }
        var cadDocuments = cadApp.GetType().InvokeMember("Documents", BindingFlags.GetProperty, null, cadApp, null);
    
    // open a file
            var openArgs = new object[2];
            openArgs[0] = filePath; // Name
            openArgs[1] = false; // ReadOnly
            var acDoc = cadDocuments.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, cadDocuments, openArgs, null);
    
    // save the file
            acDoc.GetType().InvokeMember("Save", BindingFlags.InvokeMethod, null, acDoc, null);
    
    // close the file
            var closeArgs = new object[2];
            closeArgs[0] = true; //Save changes
            closeArgs[1] = filePath; // Document Name
            acDoc.GetType().InvokeMember("Close", BindingFlags.InvokeMethod, null, acDoc, closeArgs);
    
            ReleaseObject(acDoc);
        }
    

    在当前文档中插入块应该是这样的:

    var activeDocument = cadApp.GetType().InvokeMember("ActiveDocument", BindingFlags.GetProperty, null, cadApp, null);
    var database = activeDocument.GetType().InvokeMember("Database", BindingFlags.GetProperty, null, activeDocument, null);
    var insertArgs = new object[3];
    insertArgs[0]=*Objects*;
    insertArgs[1]=*Owner*;
    insertArgs[2]=*IdPairs*;
    database.GetType().InvokeMember("CopyObjects", BindingFlags.InvokeMethod, null, database, insertArgs, null);
    

    但是你必须弄清楚如何填充参数数组。看附图。

    Interop 接口中的 CloneObjects 必须对应于 WBlockCloneObjects。

    很酷的是,您不必添加任何 Acad 库作为参考。

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2015-11-04
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多