ARESのカスタムコマンド間でデータを共有する方法は複数あります。
システム変数 USER
システム変数 USERI1~5、USERR1~5、USERS1~5 を使ってコマンド間でデータを共有することができます。
注 USERI1~5、USERR1~5 は図面に保存されますが、USERS1~5 は図面に保存されません。
; LISP では setvar 関数と getvar 関数があります
(setvar "USERI1" 10)
(setq num (getvar "USERI1")
(setvar "USERR2" -2415.15)
(setq num (getvar "USERR2")
(setvar "USERS5" "ABCDEFG")
(setq text (getvar "USERS5")
; C++ では fdt_getvar 関数と fdt_setvar 関数があります
fdt_resbufW rb; // データは fdt_resbufW 構造体に格納されます
FXAPI()->fdt_getvarW(L"USERS5", &rb);
FXAPI()->fdt_free(rb.resval.rstring); // 取得した文字データは使用後に解放が必要です。
rb.resval.rstring = L"You can set any value from constants.";
FXAPI()->fdt_setvarW(L"USERS5", &rb);
; C# では GetSystemVariable 関数と SetSystemVariable 関数があります
String text = System.Converter.ToString( Application.GetSystemVariable("USERS5"));
Application.SetSystemVariable("USERS5", "Sample Data");
INI ファイル
サポートフォルダの ARES Commander 2025.ini ファイルにデータを保存、取得するAPIを提供しています。
; LISP Commander/Standard 共 PCADLSPTOOLS.DLL の 以下の関数が使用できる
(setq num (fx_getcfgint "Jwwin" "SetByLayer" 0))
(Fx_setcfgInt "Jwwin" "SetByLayer" num)
(setq str (fx_getcfgstr "JdLoadFile" "Name" "NAME"))
(fx_setcfgstr "JdLoadFile" "Name" str)
; C++ には fdt_getconfint, fdt_putconfint, fdt_getconfStringW, fdt_putconfstringW 関数があります。
TCHAR buf[BUFSIZ];
FXAPI()->fdt_getconfstringW(L"JdLoadFile", L"Name", L"NAME", buf, BUFSIZ);
FXAPI()->fdt_putconfstringW(L"JdLoadFile", L"Name", buf);
; C# は .Net Frameworkの関数を使用してください
テキストファイルやレジストリへのアクセス
LISPにはテキストファイルの読み書き関数 open close read-line write-line print などがあります。
Visual LISP 拡張のレジストリアクセス関数もあります(Windows 向け ARES のみ)
C++ はテキストファイルのアクセスに標準Cライブラリ、MFCライブラリ、C++ ストリーム入出力を使用できます。
レジストリへのアクセスにはWin32 API や MFCライブラリが使用できます。
拡張データとして図面に保存する
データベースオブジェクトに任意のデータを追加することができます。1つのデータベースオブジェクトに最大16キロバイトのデータが付加できます。
;LISP で既存のデータベース
(setq pt (getpoint "拡張データに追加する点"))
(regapp "SAMPLE_APPID") ;拡張データ名を図面に登録する必要がある
(setq el (entget (entlast))) ;データベースオブジェクトをリストとして取得する
(setq data (list (cons 1001 "SAMPLE_APPID")(cons 1070 1)(cons 1010 pt)))
(entmod (append el data)) ;データベースオブジェクトに拡張データを追加する
追加したデータを取得します
(setq el (entget (entlast) '("SAMPLE_APPID"))) ;拡張データ付きリストとして取得する
(setq data (cadr (assoc -3 el))) ;拡張データ名とデータがリストになる
(setq pt (cdr (nth 2 data))) ;座標データをデータの順序指定で取得する
C++の場合は次のようになります
// 拡張データ名を図面に登録する
CFxDatabase *pDb = pCmdCtx->GetFxDocument()->GetFxDatabase();
OdDbRegAppTablePtr pTbl = pDb->getRegAppTableId().safeOpenObject(OdDb::kForWrite);
if (pTbl->getAt(L"SAMPLE_APPID").isNull())
{
OdDbRegAppTableRecordPtr pRec = OdDbRegAppTableRecord::createObject();
pRec->setName(L"SAMPLE_APPID");
pTbl->add(pRec);
}
// 拡張データを図形に追加する
OdResBufPtr pRbuf = OdResBuf::newRb(OdResBuf::kDxfRegAppName,L"SAMPLE_APPID");
pRbuf->setNext(OdResBuf::newRb(OdResBuf::kDxfXdInteger16, OdInt16(1)));
pRbuf->last()->setNext(OdResBuf::newRb(OdResBuf::kDxfXdReal, (double)-1.0));
OdDbObjectId id = pFxSelSet->GetId(0); // 選択セットからオブジェクトIDを取得
OdDbEntityPtr pEnt = id.safeOpenObject(OdDb::kForWrite);
pEnt->setXData(pRBuf);
拡張レコードとして図面に保存する
レイアウトやグループを管理するディクショナリオブジェクトにユーザー固有のデータを格納するオブジェクトを追加することができます。
; 拡張レコードをリストとして用意します
(setq xrec (list (cons 0 "XRECORD")(cons 70 1)(cons 300 "sample")))
; 図面に未登録のデータベースオブジェクトを作成します
(setq obj (entmakex xrec))
; レイアウトやグループを管理するディクショナリオブジェクトに追加します
(dictadd (namedobjdict) "SAMPLE_XOBJ" obj)
; レイアウトやグループを管理するディクショナリオブジェクトから取得します
(setq obj (dictsearch (namedobjdict) "SAMPLE_XOBJ"))
C++の場合は次のようになります。
// ルートディクショナリを取得
OdDbDatabase* pDb = pDoc->GetFxDatabase();
OdDbDictionaryPtr pRoot = OdDbDictionary::cast(
pDb->getNamedObjectsDictionaryId().safeOpenObject());
// 拡張レコードを取得
OdDbXrecordPtr pRec = OdDbXrecord::cast(pRoot->getAt(L"SAMPLE_XOBJ", OdDb::kForRead));
if (!pRec.isNull())
{
OdResBufPtr pRb = pRec->rbChain();
...
}
// 拡張レコードオブジェクトを作成
OdDbXrecordPtr pRec = OdDbXrecord::createObject();
OdResBufPtr pRb = OdResBuf::newRb(70, OdInt16(1));
pRb->last()->setNext(OdResBuf::newRb(300, text));
...
pRec->setFromRbChain(pRb);
pRoot->setAt(L"SAMPLE_XOBJ", pRec);