在 BimRv SDK 中,TopographySurface 元素表示基于点集合的实际地形表面,该点集合可以具有任意边界。
TopographySurface 元素由 OdBmSiteSurface 类表示。由于表面点集会影响其他表面数据并由多种方法管理,为了保持表面数据的完整性,BimRv API 提供了一个辅助类 OdBmSiteSurfaceHelper。
创建地形表面
与任何其他元素一样,您可以通过调用 OdBmSiteSurface::CreateObject() 方法来创建地形表面。
访问和编辑表面数据
如前所述,由于数据完整性的要求,OdBmSiteSurface 仅提供检索方法。对表面数据的任何更改都必须使用 OdBmSiteSurfaceHelper 类进行。辅助类可用于操作其自身数据,然后将更改应用于相关的地形表面。
检索方法(与 OdBmSiteSurface 类类似):
- bool arePointsEditable(); — 如果地形表面的点可以独立编辑,则返回 true。
- bool containsPoint(const OdGePoint3d& point); — 如果给定点存在于地形表面中,则返回 true,否则返回 false。
- OdGePoint3dArray findPoints(const OdGeExtents3d& boundingBox); — 仅返回位于输入边界框内的地形表面点。
- OdGePoint3dArray getBoundaryPoints(); — 返回位于地形表面边界上的点。
- OdGePoint3dArray getInteriorPoints(); — 返回地形表面中非边界点。
- OdGePoint3dArray getPoints(); — 返回定义此地形表面的点。
设置表面点和面
使用点和面创建的地形表面无法修改;仅使用点创建的表面是可编辑的,您可以添加、删除和操作这些表面的点。
可以使用 OdBmSiteSurfaceHalper::setSurface 方法设置地形表面。此方法允许您根据点通过点或通过点和面来设置表面:
- OdResult setSurface(const OdGePoint3dArray& points, OdArray
& facets); — 从点和面创建新的地形表面元素。使用面创建的表面无法编辑。 - OdResult setSurface(const OdGePoint3dArray& points); — 从点创建新的地形表面元素。此表面的点是可编辑的。
修改表面点
可以使用以下方法修改地形表面点:
- OdResult addPoints(const OdGePoint3dArray& points); — 将点添加到地形表面。如果地形表面已包含具有相同 XY 位置的点,则返回 eInvalidInput,否则返回 eOk。如果输入数组为空,则返回 eInvalidInput。
- OdResult deletePoints(const OdGePoint3dArray& points); — 如果点在 XY 上匹配,则删除这些点。地形表面中不存在的点将被忽略,除非所有输入点都不存在,此时返回 eInvalidInput。如果输入数组为空,则返回 eInvalidInput。
- OdResult changePointElevation(const OdGePoint3d& point, double elevValue); — 更改点的高程值。如果输入点不存在于地形表面中,或者 elevValue 的给定值绝对值超过 30000 英尺,则返回 eInvalidInput。如果地形表面的点不可编辑,则返回 eNotApplicable。
- OdResult changePointsElevation(const OdGePoint3dArray& points, double elevValue); — 更改点的高程值。如果所有输入点都不存在于地形表面中,或者 elevValue 的给定值绝对值超过 30000 英尺,则返回 eInvalidInput。如果地形表面的点不可编辑,则返回 eNotApplicable。
- OdResult movePoint(const OdGePoint3d& moved, const OdGePoint3d& target); — 将地形表面中的一个点移动到新位置。如果移动的点不存在于地形表面中,或者存在另一个点与目标点的 XY 相同,则返回 eInvalidInput。如果地形表面的点不可编辑,则返回 eNotApplicable。
- OdResult movePoints(const OdGePoint3dArray& moved, const OdGeVector3d& dir); — 将地形表面中的点移动到新位置。如果所有移动的点都不存在于地形表面中,或者存在另一个点与其中一个目标点的 XY 相同,则返回 eInvalidInput。如果地形表面的点不可编辑,则返回 eNotApplicable。
应用更改
使用以下方法将更改应用于创建此帮助器所针对的地形表面:
- void applyToSurface(); — 将数据应用于地形表面。
本系列的下一篇文章将展示创建和修改地形表面的代码示例。