[返回博客](/cn/blog) # 在 BimRv SDK 中使用地形表面（第 1 部分，共 3 部分）

Evgeniy Tikhonov 十二月 26, 2019 [\#rvt](/cn/blog/tag/rvt) [\#rfa](/cn/blog/tag/rfa)

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

在 BimRv SDK 中，TopographySurface 元素表示基于点集合的实际地形表面，该点集合可以具有任意边界。

TopographySurface 元素由 OdBmSiteSurface 类表示。由于表面点集会影响其他表面数据并由多种方法管理，为了保持表面数据的完整性，BimRv API 提供了一个辅助类 OdBmSiteSurfaceHelper。

##### 创建地形表面

与任何其他元素一样，您可以通过调用 OdBmSiteSurface::CreateObject() 方法来创建地形表面。

##### 访问和编辑表面数据

如前所述，由于数据完整性的要求，OdBmSiteSurface 仅提供检索方法。对表面数据的任何更改都必须使用 OdBmSiteSurfaceHelper 类进行。辅助类可用于操作其自身数据，然后将更改应用于相关的地形表面。

检索方法（与 OdBmSiteSurface 类类似）：

- bool arePointsEditable(); — 如果地形表面的点可以独立编辑，则返回 true。
- bool containsPoint(const OdGePoint3d&amp; point); — 如果给定点存在于地形表面中，则返回 true，否则返回 false。
- OdGePoint3dArray findPoints(const OdGeExtents3d&amp; boundingBox); — 仅返回位于输入边界框内的地形表面点。
- OdGePoint3dArray getBoundaryPoints(); — 返回位于地形表面边界上的点。
- OdGePoint3dArray getInteriorPoints(); — 返回地形表面中非边界点。
- OdGePoint3dArray getPoints(); — 返回定义此地形表面的点。

##### 设置表面点和面

使用点和面创建的地形表面无法修改；仅使用点创建的表面是可编辑的，您可以添加、删除和操作这些表面的点。

可以使用 OdBmSiteSurfaceHalper::setSurface 方法设置地形表面。此方法允许您根据点通过点或通过点和面来设置表面：

- OdResult setSurface(const OdGePoint3dArray&amp; points, OdArray&amp; facets); — 从点和面创建新的地形表面元素。使用面创建的表面无法编辑。
- OdResult setSurface(const OdGePoint3dArray&amp; points); — 从点创建新的地形表面元素。此表面的点是可编辑的。

##### 修改表面点

可以使用以下方法修改地形表面点：

- OdResult addPoints(const OdGePoint3dArray&amp; points); — 将点添加到地形表面。如果地形表面已包含具有相同 XY 位置的点，则返回 eInvalidInput，否则返回 eOk。如果输入数组为空，则返回 eInvalidInput。
- OdResult deletePoints(const OdGePoint3dArray&amp; points); — 如果点在 XY 上匹配，则删除这些点。地形表面中不存在的点将被忽略，除非所有输入点都不存在，此时返回 eInvalidInput。如果输入数组为空，则返回 eInvalidInput。
- OdResult changePointElevation(const OdGePoint3d&amp; point, double elevValue); — 更改点的高程值。如果输入点不存在于地形表面中，或者 elevValue 的给定值绝对值超过 30000 英尺，则返回 eInvalidInput。如果地形表面的点不可编辑，则返回 eNotApplicable。
- OdResult changePointsElevation(const OdGePoint3dArray&amp; points, double elevValue); — 更改点的高程值。如果所有输入点都不存在于地形表面中，或者 elevValue 的给定值绝对值超过 30000 英尺，则返回 eInvalidInput。如果地形表面的点不可编辑，则返回 eNotApplicable。
- OdResult movePoint(const OdGePoint3d&amp; moved, const OdGePoint3d&amp; target); — 将地形表面中的一个点移动到新位置。如果移动的点不存在于地形表面中，或者存在另一个点与目标点的 XY 相同，则返回 eInvalidInput。如果地形表面的点不可编辑，则返回 eNotApplicable。
- OdResult movePoints(const OdGePoint3dArray&amp; moved, const OdGeVector3d&amp; dir); — 将地形表面中的点移动到新位置。如果所有移动的点都不存在于地形表面中，或者存在另一个点与其中一个目标点的 XY 相同，则返回 eInvalidInput。如果地形表面的点不可编辑，则返回 eNotApplicable。

##### 应用更改

使用以下方法将更改应用于创建此帮助器所针对的地形表面：

- void applyToSurface(); — 将数据应用于地形表面。

本系列的下一篇文章将展示创建和修改地形表面的代码示例。

## 今天就开始行动

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

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