[返回博客](/cn/blog) # 将窗户附加到墙壁

Alexey Abramovsky 七月 06, 2017 [\#Architecture](/cn/blog/tag/architecture) [\#Example](/cn/blog/tag/example)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

在 Teigha Architecture 中，对象可以附加到其他对象。此类连接由特殊的锚点对象处理，这些锚点对象像任何其他对象一样存储在 .dwg 文件中。锚点由基类 AECDbAnchor 表示。对象之间连接的含义可能不同：例如，窗户插入墙壁中，或时间表附加到对象。每种类型的连接都由 AECDbAnchor 的子类处理，该子类实现连接语义。  
这些连接称为“关系”。我们如何在绘图中查看这些关系？例如，让我们看看一堵有窗户的墙：

![image1](/files/inline-images/image002_2.jpg)墙壁在插入窗户的地方会自动切割。这意味着墙壁知道附加到它的开口。如果我们移动墙壁，开口也会自动移动：

![image2](/files/inline-images/image004_0.jpg)这也意味着窗户知道它们是插入墙壁中的。关系“某物附加到墙壁”由 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，将其添加到数据库，并将窗户的锚点引用设置为创建的锚点。

## 今天就开始行动

**免费试用 ODA 软件 60 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
