Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoCAD .NET API:コマンド実行の抑止

Issue

特定の作図コマンドの実行を抑止する目的で、CommandWillStart イベント ハンドラ内で Document.SendStringToExecute メソッドを使って ESC コード(C#:"\x1B"、VB.NET:Chr$(27) )を送信してコマンドの実行をキャンセルしています。

 

Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
doc.SendStringToExecute("\x1B\x1B", false, true, false);

 

他にコマンドの実行を抑止する方法はないでしょうか?

 

Solution

ドキュメント ウィンドウに表示されている図面に作図をする場合、AutoCAD は内部的にドキュメントをロックします。

 

ドキュメント ロックはアプリケーション実行コンテキストで定義したコマンドの実装時に必要になる知識と言えますが、この仕組みをイベント ハンドラで取得、利用することが出来ます。

 

この場合、DocumentLockModeChanged イベント ハンドラで DocumentLockModeChangedEventArgs.Veto メソッドを呼び出すことで、作図コマンドの実行時にドキュメント ロックを拒否してコマンドの実行そのものを抑止することが出来ます。

 

 次の C# コードは、LINE コマンドの実行を抑止する例です。

 

...
[CommandMethod("MyCommand", CommandFlags.Modal)]
public void MyCommand()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    Application.DocumentManager.DocumentLockModeChanged += DocumentEvent_LockModeChanged_Handler;
}

private static void DocumentEvent_LockModeChanged_Handler(object sender, DocumentLockModeChangedEventArgs e)
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    if (e.GlobalCommandName == "LINE")
    {
        e.Veto();
        ed.WriteMessage(string.Format("\n{0} command was vetoed\n", e.GlobalCommandName));
    }
}
...

 lock_veto.jpg