お知らせ

--------------------------------------------------

プログラム作成/コンサルティングの申し込みはこちら

--------------------------------------------------

2010年7月6日火曜日

.NET - 「AutoCAD をバックグラウンドで実行する方法見つからず」(AutoCAD 2011)

Twitter でもつぶやいていたんですが、Windows アプリから AutoCAD をバックグラウンドで起動して何か実行することをやろうと思ったのですが、残念ながら方法を見つけることができませんでした。

今回はギブアップだったのですが、一応履歴としてどんなことしたか書いとこうかと思います。



「AutoCAD .NET デベロッパガイド」を参考に、CreateObjec を使ってこんな感じで AutoCAD を起動することができました。
Dim acAppComObj As AcadApplication
acAppComObj = CreateObject("AutoCAD.Application.18.1")

で、起動したあとにこんな感じで NETLOAD コマンドを実行してロードしたあとコマンドを実行します。
acDocComObj.SendCommand("(command " & Chr(34) & "NETLOAD" & Chr(34) & " " & _
Chr(34) & "c:/myapps/mycommands.dll" & Chr(34) & ") ")

acDocComObj.SendCommand("MyCommand ")

実行するコマンドで、最後に図面を保存して AutoCAD を終了するようにしておけば、勝手に作業を初めて勝手に終了するという動作になります。


【できなかったこと】
CreateObject で AutoCAD を起動できたんですが、AutoCAD のウインドウを表示することなくバックグラウンドで動かすことができませんでした。

acAppComObj.Visible = False とすれば非表示になるんですが、一旦 AutoCAD が起動してくるのが見えて、その後非表示という動きになりました。また、その後 SendCommand を実行すると、また AutoCAD のウインドウが表示されてしまいました。


ということで、AutoCAD を起動する方法として探してみたら、こんな方法がありました。
Dim regKey As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:411")
Dim acadLoc As String = DirectCast(regKey.GetValue("Location"), String)

Dim acad As ProcessStartInfo = New ProcessStartInfo(acadLoc & "\acad.exe")
acad.Arguments = "/nologo"
'acad.WindowStyle = ProcessWindowStyle.Hidden

Dim pro As Process
pro = Process.Start(acad)

この後、こんな感じで AutoCAD のインスタンスを取得することができます。
Dim acAppComObj() As AcadApplication
acAppComObj = GetObject(, "AutoCAD.Application.18.1")

でも、これだとプログラムが AutoCAD が起動してくるまで待ってくれないで先に進んでしまうので、ちゃんと動きません。

WaitForInputIdle っていうので待ってくれるかなと思ったんですが、待ってくれませんでした。

そこで、WaitForExit(20000) で 20 秒間待つようにしてみたところ、ちゃんと動くようになりました。
でも、もし AutoCAD が起動するまで 20 秒以上たったらちゃんと動かないし、安全のためもっと長くしても時間がかかってもったいないですよね。

また、もっと大きな問題で、AutoCAD が他に起動されていると、そっちに SendCommand で指定したコマンドが送られてしまうのでおかしなことになってしまいます。

複数 AutoCAD が起動しているときに識別する方法がないかググッてみたのですが、残念ながらその方法を見つけることができませんでした。(VB.NET では無理なのかも???)

ということで、今回はギブアップしてしまいました…残念。

2 件のコメント:

  1. ご無沙汰しております。

    AutoCAD2006時代に似たようなことやっていました。
    できると思うんですけどね。

    今度調べてみま~す♪

    返信削除
    返信
    1. どうも久しぶりです。

      やったことあるんですか。
      もし何か見つけたら教えてくださいね。

      削除