0

objectARX を使用して、新しいドキュメントを作成しようとしています。私が最初にやっていることは、AutoCad を実行することです。

Process acadApp = new Process();
            acadApp.StartInfo.FileName = "C:/Program Files/Autodesk/AutoCAD 2015/acad.exe";
            acadApp.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
            acadApp.Start();

次に問題は、Acad のインスタンスの準備が整うまで待つときです。Autocad ウィンドウがまだ準備できておらず、AcadApplication インスタンスを作成できないため、Process クラスを使用して彼の名前でプロセスを取得できません。Autocad が完全にロードされた場合にのみ機能するので、 を使用します。

bool checkInstance = true;
            //This piece of pure shit listen for an Acad instnce until this is opened
            while (checkInstance)
            {
                try
                {
                    var checkinstance = Marshal.GetActiveObject("AutoCAD.Application");
                    checkInstance = false;
                }
                catch (Exception ex)
                {

                }
            }
            //Once the acad instance is opende The show starts
            Thread.Sleep(12000);
            Thread jili2 = new Thread(new ThreadStart(() => acadG.AcadGrid(Convert.ToInt32(grid.floorHeight), Convert.ToInt32(grid.floorWidth), grid.numFloors)));
            jili2.Start();
           // MessageBox.Show("I don't know why it was executed");
        }

スレッドで実行されている acadGrid メソッドは、AutoCad で新しいドキュメントを作成し、グリッドを描画します。機能する場合と機能しない場合があり、機能する場合でも CPU の 50% を使用します。時々、この例外が発生します。 ここに画像の説明を入力

4

2 に答える 2

1

Process.WaitForInputIdleそしてApplication.GetAcadState助けることができます:

Process acadProc = new Process();
acadProc.StartInfo.FileName = "C:/Program Files/Autodesk/AutoCAD 2015/acad.exe";
acadProc.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
acadProc.Start();
if (!acadProc.WaitForInputIdle(300000))
  throw new ApplicationException("Acad takes too much time to start.");
AcadApplication acadApp;
while (true)
{
  try
  {
    acadApp = Marshal.GetActiveObject("AutoCAD.Application.20");
    return;
  }
  catch (COMException ex)
  {
    const uint MK_E_UNAVAILABLE = 0x800401e3;
    if ((uint) ex.ErrorCode != MK_E_UNAVAILABLE) throw;
    Thread.Sleep(1000);
  }
}
while (true)
{
  AcadState state = acadApp.GetAcadState();
  if (state.IsQuiescent) break;
  Thread.Sleep(1000);
}
于 2016-10-21T07:09:15.463 に答える
0

ルーチンを実行する前に AutoCAD が読み込まれるのを待つのではなく、プロセスを起動するためのパラメーターとして定義するスクリプト (.scr) ファイルを作成するのが最善の方法だと思います。

// Build parameters.
StringBuilder param = new StringBuilder();
string exportScript = @"C:\script.scr";
if (!string.IsNullOrWhiteSpace(exportScript))
{ param.AppendFormat(" /s \"{0}\"", exportScript); }

// Create Process & set the parameters.
Process acadProcess = new Process();
acadProcess.StartInfo.FileName = AcadExePath;
acadProcess.StartInfo.Arguments = param.ToString();
acadProcess.Start();

スクリプト ファイルは基本的なテキスト ファイルで、AutoCAD コマンドと関連する値 (定義されている場合) がリストされ、ロード時に実行されます。スクリプトをパラメーターとしてプロセスにロードすると、そのスクリプトが自動的に実行されます。

スクリプトの作成に関する簡単なガイドは次のとおりです - http://www.ellenfinkelstein.com/acadblog/tutorial-automate-tasks-with-a-script-file/

このプロセスは、AutoCAD Core Console を使用して行うこともできます。これは、プロセスを高速化する場合にコマンドラインでのみ実行される、バージョン 2013 以降に含まれる AutoCAD のバージョンです - http://through-the-interface.typepad.com/through_the_interface/2012/02/the-autocad-2013 -core-console.html

于 2016-10-20T22:01:19.877 に答える