在 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,将其添加到数据库,并将窗户的锚点引用设置为创建的锚点。