我有CAD库&amp; wpf包含一些用于从user获取输入的组合框。如果用户单击组合框中的任何项目,则Auto CAD应该打开,所选块将从库中获取并插入Auto CAD中。我该怎么办?< / p>
例如, 我有一个CAD块库,该块包含模型1,模型2,模型3,模型4。 如果在组合框中选择任何模型,则应从块库中选择Auto CAD应打开并尊重模型,并将其插入新打开的Auto CAD文件中。 我怎样才能做到这一点?
答案 0 :(得分:0)
您基本上必须从外部C#流程打开AutoCAD,is discused here和here。我建议你制作一个单例,用于处理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数组。看看附件。
Interop接口的CloneObjects必须与WBlockCloneObjects相对应。
很酷的是,您不必添加任何Acad库作为参考。