Issue
オブジェクト イベント ハンドラを使わずに、特定のオブジェクト タイプの編集を抑止することは出来ますか?
Solution
特定のオブジェクト タイプ(クラス)の編集を抑止する目的では、ObjectARX と .NET API で利用することが出来るオーバールール(Overrule)プロトコルを使用して、既定の振る舞いを変更することが可能です。
次の C# コードは、Open メソッドをオーバールール プロトコルでオーバライドし、書き込みモードのオブジェクト オープン時に例外を発生させることで、円弧(ARC)の編集を抑止する例となります。MyCommand コマンドの実行でオーバールールを有効化したり、無効化したりしています。
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");
}
}
}
}
記事全体を表示