Teigha Architectureでは、オブジェクトを他のオブジェクトにアタッチできます。このような接続は、他のオブジェクトと同様に.dwgファイルに保存される特別なアンカーオブジェクトによって処理されます。アンカーは基底クラスAECDbAnchorによって表されます。オブジェクト間の接続の意味は異なる場合があります。たとえば、窓が壁に挿入されたり、スケジュールテーブルがオブジェクトにアタッチされたりします。各接続タイプは、接続セマンティクスを実装するAECDbAnchorのサブクラスによって処理されます。
これらの接続は「リレーション」と呼ばれます。図面でこれらのリレーションをどのように確認できるでしょうか?たとえば、窓のある壁を見てみましょう。
窓が挿入されている場所では、壁が自動的に切断されます。これは、壁がそれにアタッチされた開口部を認識していることを意味します。壁を移動すると、開口部も自動的に移動します。
これは、ウィンドウが壁に挿入されていることを認識していることも意味します。「何かが壁に取り付けられている」という関係は、AECDbAnchorEntToWallクラスとそのサブクラスによって処理されます。
仕組み
Teigha Architectureには、リレーショングラフと呼ばれる特別なグローバルオブジェクトがあります。これはアンカーオブジェクトを使用してオブジェクト間の関係を決定します。壁が変更されると、リレーショングラフは壁に関連するオブジェクトのリストを走査し、各オブジェクトの再計算を呼び出します。オブジェクトはアンカーを使用して新しい位置を再計算します。
例
ウィンドウを壁に取り付ける方法
void addWindowToWall(OdDbDatabasePtr pDb, OdDbObjectId idWall)
{
double wW = 1200;
double wH = 1300;
//create a window of a certain window style. Window style should be already added to the database
AECDbWindowPtr window1 = AECDbWindow::CreateAECObject(pDb->getModelSpaceId(), getWindowStyle(pDb));
//set desired window size
window1->SetWidth(wW);
window1->SetHeight(wH);
window1->SetOpenPercent(30);
if ( !idWall.isNull() )
{
window1->AttachWallAnchor(idWall);
//move window along the wall in xand z direction to a desired place
AECDbAnchorEntToWallPtr anchor = window1->GetAnchor().openObject(OdDb::kForWrite);
anchor->GetXParams()->SetOffset(400);
anchor->GetZParams()->SetOffset(1000);
}
}
上記のコードは、AecHouseBuilder標準例の一部です。完全なコードについては、AECHouseBuilderObj::addWindows1stFloor()を参照してください。
注: AttachWallAnchor()関数は、実際に新しいAECDbAnchorOpeningBaseToWallオブジェクトを作成し、その参照を壁IDに設定し、データベースに追加し、ウィンドウのアンカー参照を作成されたアンカーに設定します。