我正在实现一个应用程序,它在 AutoCAD 的 ObjectARX 界面中使用 COM 来自动执行绘图操作,例如打开和另存为。
根据文档,我应该能够调用 AcadDocument.SaveAs() 并传入文件名、“另存为类型”和安全参数。文档明确指出,如果 security 为 NULL,则不会尝试与安全相关的操作。然而,它并没有给出任何正确的对象类型指示作为“另存为类型”参数传递。
我尝试使用文件名调用 SaveAs,其余参数为 null,但我的应用程序挂在该方法调用上,并且 AutoCAD 似乎崩溃了 - 您仍然可以使用功能区,但无法对工具栏执行任何操作并且无法关闭AutoCAD。
我有一种感觉,这是我的 NULL 参数在这里造成了悲痛,但是 COM/VBA 部门严重缺乏文档。事实上,它说 AcadDocument 类甚至没有 SaveAs 方法,它显然有。
这里有没有人实施过同样的事情?有什么指导吗?
另一种方法是我使用 SendCommand() 方法发送 _SAVEAS 命令,但我的应用程序正在管理一批绘图并且需要知道 a) 保存是否失败,以及 b) 保存完成时(我正在这样做)监听 EndSave 事件。)
编辑
这是所要求的代码 - 它所做的只是启动 AutoCAD(或连接到正在运行的实例,如果它已经在运行),打开现有图形,然后将文档保存到新位置(C:\Scratch\Document01B.dwg。)
using (AutoCad cad = AutoCad.Instance)
{
// Launch AutoCAD
cad.Launch();
// Open drawing
cad.OpenDrawing(@"C:\Scratch\Drawing01.dwg");
// Save it
cad.SaveAs(@"C:\Scratch\Drawing01B.dwg");
}
然后在我的 AutoCad 类中(this._acadDocument 是 AcadDocument 类的一个实例。)
public void Launch()
{
this._acadApplication = null;
const string ProgramId = "AutoCAD.Application.18";
try
{
// Connect to a running instance
this._acadApplication = (AcadApplication)Marshal.GetActiveObject(ProgramId);
}
catch (COMException)
{
/* No instance running, launch one */
try
{
this._acadApplication = (AcadApplication)Activator.CreateInstance(
Type.GetTypeFromProgID(ProgramId),
true);
}
catch (COMException exception)
{
// Failed - is AutoCAD installed?
throw new AutoCadNotFoundException(exception);
}
}
/* Listen for the events we need and make the application visible */
this._acadApplication.BeginOpen += this.OnAcadBeginOpen;
this._acadApplication.BeginSave += this.OnAcadBeginSave;
this._acadApplication.EndOpen += this.OnAcadEndOpen;
this._acadApplication.EndSave += this.OnAcadEndSave;
#if DEBUG
this._acadApplication.Visible = true;
#else
this._acadApplication.Visible = false;
#endif
// Get the active document
this._acadDocument = this._acadApplication.ActiveDocument;
}
public void OpenDrawing(string path)
{
// Request AutoCAD to open the document
this._acadApplication.Documents.Open(path, false, null);
// Update our reference to the new document
this._acadDocument = this._acadApplication.ActiveDocument;
}
public void SaveAs(string fullPath)
{
this._acadDocument.SaveAs(fullPath, null, null);
}