development of

Tieghaに関する備忘録とおまけ

【IJCAD】システム変数 DBMOD の値を変更する

システム変数 DBMOD とは

 DBMOD は、図面の変更状態を示す読み取り専用のシステム変数です。 のシステム変数は、図面が編集されたときにどのような変更がされたかどうかを示しています。

DBMOD システム変数 – IJCAD ヘルプセンター

このシステム変数は読み取り専用なので、 Application.SetSystemVariable メソッドで値を変更できませんが、ある隠し関数を使用することで無理やり変更することができたりします。

サンプルコード

[DllImport("TD_Db_3.05src_10.dll",
CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?gcdbSetDbmod@@YAJPEAVOdDbDatabase@@J@Z")]
public static extern int gcdbSetDbmod(System.IntPtr db, System.Int32 newDbMod);

public void DbModSetToZero()
{
    var Doc = Application.DocumentManager.MdiActiveDocument;
    var Db = Doc.Database;
    var Ed = Doc.Editor;
    Ed.WriteMessage($"\nDBMOD {Application.GetSystemVariable("DBMOD")}");
    gcdbSetDbmod(Db.UnmanagedObject, 0);
    Ed.WriteMessage($" -> {Application.GetSystemVariable("DBMOD")}");
}

ObjectGRX の隠し関数として gcdbSetDbmod 関数が存在しています。 この関数で指定した図面データベースの、現在の DBMOD の値を自由に変更できます。

.NET API では、この関数を P/Invoke で呼び出して使用します。
指定するエントリポイントは、32bit と 64bit で関数名が少し違いますので注意が必要です。

プラットフォーム 関数名
32bit ?gcdbSetDbmod@@YAJPAVOdDbDatabase@@J@Z
64bit ?gcdbSetDbmod@@YAJPEAVOdDbDatabase@@J@Z

例えば、この関数を使用して DBMOD を "0" にしてしまう事で、編集されている図面を閉じる際に、保存確認ダイアログが表示させなくさせる事ができたりします。