3

Visual Studio 2010 を使用しており、autocad で開きたい .DWG ファイルがあります。今までこれを使ってきました。

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

しかし、私が望むのは、Autocad 自体ではなく、Autocad 内のファイルを閉じることです。(atocad.exe を実行し続ける必要があることを意味します)。

今までこれを使用していましたが、ファイルではなく acad.exe を閉じています。

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

6 に答える 6

4

AutoCAD には API があります。4つのアセンブリがあります。インプロセス用に 2 つ、COM 用に 2 つ。

インプロセス: acdbmgd.dll acmgd.dll

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

これは、AutoCAD の新しいインスタンスを開くか、既存の実行中の AutoCAD インスタンスに接続するメソッドです。

これらの .dll をプロジェクト参照にロードする必要があります。

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 = "<<Unnamed Profile>>";
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);
            }
        }
    }
    }
}

それを閉じるのは簡単です

Application.Exit();

そしてコードを許してください。そのひどい、これは私が開発を始めたばかりのときの私の最初の方法の1つでした...

于 2013-07-20T00:19:59.257 に答える
2

AutoCAD に、フックしてファイルを閉じるように要求できる API がない限り、これを実行できるとは思えません。

あなたの C# アプリはプロセス (acad.exe) に対してのみ実行でき、そのプロセスの内部操作にはアクセスできません。

于 2013-07-19T09:30:49.690 に答える
1

ファイルを閉じるには、このObjectARX SDK for c#の手順に従い、次のコードを次のコードに変更するのが最善の方法です。

            [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);
                        }
                    }
                }
于 2013-08-13T07:20:27.903 に答える