Note that there are some explanatory texts on larger screens.

plurals
  1. POSaveAs in COM hanging AutoCAD
    text
    copied!<p>I'm implementing an application which uses COM in AutoCAD's ObjectARX interface to automate drawing actions, such as open and save as.</p> <p>According to the documentation, I should be able to call AcadDocument.SaveAs() and pass in a filename, a "save as type" and a security parameter. The documentation explicitly statses that if security is NULL, no security related operation is attempted. It doesn't, however, give any indication of the correct object type to pass as the "save as type" parameter.</p> <p>I've tried calling SaveAs with a filename and null for the remaining arguments, but my application hangs on that method call and AutoCAD appears to crash - you can still use the ribbon but can't do anything with the toolbar and can't close AutoCAD.</p> <p>I've got a feeling that it's my NULL parameters causing grief here, but the documentation is severely lacking in the COM/VBA department. In fact it says the AcadDocument class doesn't even have a SaveAs method, which it clearly does.</p> <p>Has anyone here implemented the same thing? Any guidance?</p> <p>The alternative is I use the SendCommand() method to send a _SAVEAS command, but my application is managing a batch of drawing and needs to know a) if the save fails, and b) when the save completes (which I'm doing by listening to the EndSave event.)</p> <p><strong>EDIT</strong></p> <p>Here's the code as requested - all it's doing is launching AutoCAD (or connecting to the running instance if it's already running), opening an existing drawing, then saving the document to a new location (C:\Scratch\Document01B.dwg.)</p> <pre><code>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"); } </code></pre> <p>Then in my AutoCad class (this._acadDocument is an instance of the AcadDocument class.)</p> <pre><code>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); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload