通过访问块库在Auto CAD中插入块

时间:2016-08-22 06:45:22

标签: .net autocad

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

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

1 个答案:

答案 0 :(得分:0)

您基本上必须从外部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);

但是你必须弄明白如何填充arguments数组。看看附件。

CopyObjects Interop接口的CloneObjects必须与WBlockCloneObjects相对应。 WBlockCloneObjets

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