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

AutoCAD .NET API:オーバールールによるオブジェクトの編集抑止

Issue

オブジェクト イベント ハンドラを使わずに、特定のオブジェクト タイプの編集を抑止することは出来ますか?

 

Solution

特定のオブジェクト タイプ(クラス)の編集を抑止する目的では、ObjectARX と .NET API で利用することが出来るオーバールール(Overrule)プロトコルを使用して、既定の振る舞いを変更することが可能です。

 

次の C# コードは、Open メソッドをオーバールール プロトコルでオーバライドし、書き込みモードのオブジェクト オープン時に例外を発生させることで、円弧(ARC)の編集を抑止する例となります。MyCommand コマンドの実行でオーバールールを有効化したり、無効化したりしています。 

名称未設定.gif

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Windows.Controls;

[assembly: CommandClass(typeof(AutoCAD_CSharp_plug_in1.MyCommands))]

namespace AutoCAD_CSharp_plug_in1
{
    public class MyCommands
    {
        public class OpenOverrule : ObjectOverrule
        {
            public override void Open(DBObject dbObject, OpenMode mode)
            {
                if (mode == OpenMode.ForWrite)
                {
                    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
                    ed.WriteMessage("\nModifying ARC is not allowed...");
                    base.Open(dbObject, mode);
                    ed.Regen();
                    throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NotApplicable);
                }
            }
        }

        static OpenOverrule _overrule = null;

        [CommandMethod("MyCommand")]
        static public void MyCommand()
        {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            if (_overrule == null)
            {
                _overrule = new OpenOverrule();
                ObjectOverrule.AddOverrule(RXObject.GetClass(typeof(Arc)), _overrule, false);
                ObjectOverrule.Overruling = true;
                ed.WriteMessage("\nBegin modifying ARC overrule");
            }
            else
            {
                ObjectOverrule.RemoveOverrule(RXObject.GetClass(typeof(Arc)), _overrule);
                _overrule.Dispose();
                _overrule = null;
                ed.WriteMessage("\nEnd modifying ARC overrule");
            }
        }
    }
}