So schließen Sie eine Datei in Autocad mithilfe von C #, wodurch acad.exe ausgeführt wird?

Ich verwende Visual Studio 2010 und habe eine .DWG-Datei, die ich in Autocad öffnen möchte. Bis jetzt habe ich das benutzt.

Process p = new Process(); ProcessStartInfo s = new ProcessStartInfo("D:/Test File/" + fileName); p.StartInfo = s; p.Start(); 

Ich möchte aber die Datei im Autocad schließen, nicht jedoch im Autocad. (Mittel atocad.exe sollte weiter ausgeführt werden).

Bis jetzt habe ich dies verwendet, aber das Schließen der acad.exe nicht die Datei.

 foreach (Process Proc in Process.GetProcesses()) { if (Proc.ProcessName.Equals("acad")) { Proc.CloseMainWindow(); Proc.Kill(); } } 

Nehmen Sie die Autocad .NET-Bibliotheken von Autodesk-Sites ( http://de.autodesk.com/adsk/servlet/index?id=773204&siteID=123112 ).

Dann können Sie die classn Application und Document verwenden. Sie geben Ihnen die volle Kontrolle über das Öffnen und Schließen von Dokumenten in der Anwendung.

Sie finden viele Artikel dazu und können weitere Fragen stellen.

AutoCAD hat eine API. Es gibt 4 Baugruppen. Zwei für In-process und zwei für COM.

inprocess: acdbmgd.dll acmgd.dll

COMInterop: Autodesk.Autocad.Interop.dll Autodesk.Autocad.Interop.Common.dll

Hierbei handelt es sich um eine Methode, mit der eine neue Instanz von AutoCAD geöffnet oder eine Verbindung zu einer vorhandenen laufenden Instanz von AutoCAD hergestellt wird.

Sie müssen diese .dlls in Ihre Projektverweise laden.

 using Autodesk.AutoCAD.Interop; using Autodesk.AutoCAD.Interop.Common; namespace YourNameSpace { public class YourClass { AcadApplication AcApp; private const string progID = "AutoCAD.Application.18.2";// this is AutoCAD 2012 program id private string profileName = "< >"; private const string acadPath = @"C:\Program Files\Autodesk\AutoCAD 2012 - English\acad.exe"; public void GetAcApp() { try { AcApp = (AcadApplication)Marshal.GetActiveObject(progID); } catch { try { var acadProcess = new Process(); acadProcess.StartInfo.Arguments = string.Format("/nologo /p \"{0}\"", profileName); acadProcess.StartInfo.FileName = (@acadPath); acadProcess.Start(); while(AcApp == null) { try { AcApp = (AcadApplication)Marshal.GetActiveObject(progID); } catch { } } } catch(COMException) { MessageBox.Show(String.Format("Cannot create object of type \"{0}\"",progID)); } } try { int i = 0; var appState = AcApp.GetAcadState(); while (!appState.IsQuiescent) { if(i == 120) { Application.Exit(); } // Wait .25s Thread.Sleep(250); i++; } if(AcApp != null){ // set visibility AcApp.Visible = true; } } catch (COMException err) { if(err.ErrorCode.ToString() == "-2147417846"){ Thread.Sleep(5000); } } } } } 

es zu schließen ist so einfach wie

 Application.Exit(); 

und den Code vergeben. es war eine grausame Sache, dies war eine meiner ersten Methoden, als ich gerade mit der Entwicklung begann …

Ich bezweifle, dass Sie dazu in der Lage sein werden, es sei denn, AutoCAD verfügt über eine API, in die Sie sich einwählen können und die Datei zum Schließen der Datei auffordert.

Ihre c # -App kann nur den Vorgang (acad.exe) ausführen, hat jedoch keinen Zugriff auf die internen Vorgänge dieses processes.

Sie sollten Kill auch nicht verwenden, wenn der process nicht mehr reactjs hat und erst recht nicht unmittelbar nach CloseMainWindow.

CloseMainWindow ist die höfliche Art, eine Anwendung zu bitten, sich selbst zu schließen. Töten ist wie das Ziehen der Stromleitung aus der socket. Sie geben ihm nicht die Chance, hinter sich aufzuräumen und sauber zu verlassen.

Es gibt noch eine andere Möglichkeit – dies funktioniert nur, wenn Ihr C # -Code auf derselben Maschine wie der AutoCAD-process ausgeführt wird. Dies ist nicht wirklich zu empfehlen, aber wenn Sie wirklich festsitzen und bereit sind, sich mit dem Umschalten zwischen Fenstern zu beschäftigen Sie können Tastatureingaben mit dem Befehl SendKeys an eine Anwendung senden.

MSDN-Artikel hier: http://msdn.microsoft.com/EN-US/library/ms171548(v=VS.110,d=hv.2).aspx http://msdn.microsoft.com/en-us/ library / system.windows.forms.sendkeys.send.aspx

Mit dieser Option können Sie die Tastatureingaben senden, um den Benutzer zu simulieren, und die Datei mit den Menübefehlen schließen.

Um das Schließen der Datei durchzuführen, führen Sie am besten die Schritte in diesem ObjectARX-SDK für c # aus und ändern Sie den folgenden Code mit dem folgenden Code.

  [CommandMethod("CD", CommandFlags.Session)] static public void CloseDocuments() { DocumentCollection docs = Application.DocumentManager; foreach (Document doc in docs) { // First cancel any running command if (doc.CommandInProgress != "" && doc.CommandInProgress != "CD") { AcadDocument oDoc = (AcadDocument)doc.AcadDocument; oDoc.SendCommand("\x03\x03"); } if (doc.IsReadOnly) { doc.CloseAndDiscard(); } else { // Activate the document, so we can check DBMOD if (docs.MdiActiveDocument != doc) { docs.MdiActiveDocument = doc; } int isModified = System.Convert.ToInt32( Application.GetSystemVariable("DBMOD") ); // No need to save if not modified if (isModified == 0) { doc.CloseAndDiscard(); } else { // This may create documents in strange places doc.CloseAndSave(doc.Name); } } }