36点云
点云
Revit API提供了两种处理点云的方法。第一种方法允许您创建新的点云实例,读取和过滤点,选择整体点的子集,以及选择要高亮显示或隔离的点。第二种方法允许您使用自己的点云引擎并处理不支持的文件格式(即.pcg、.rcp或.rcs以外的格式),从而向Revit提供点以供用户查看。
- 客户端API
- 创建新的点云实例
- 读取和过滤点
- 点集选择
- 控制点云高亮显示
- 引擎API
- 注册点云文件扩展名
- 向Revit提供点以进行渲染
本节中的页面
- 点云客户端
- 点云引擎
点云客户端
点云客户端API支持在Revit中读取和修改点云实例。
点云实例提供的点来自点云引擎,该引擎可以是Revit中的内置引擎,也可以是作为应用程序加载的第三方引擎。客户端点云API应用程序不需要关心引擎如何存储点并将点提供给Revit的详细信息。相反,客户端API可用于创建点云、操作其属性以及读取找到的与给定过滤器匹配的点。
与点云相关的主要类有:
- PointCloudType - 加载到Revit文档中的点云类型。每个PointCloudType映射到单个文件或标识符(取决于控制它的点云引擎的类型)。
- PointCloudInstance - Revit项目中某个位置的点云实例。
- PointCloudFilter - 在提取点时确定感兴趣体积的过滤器。
- PointCollection -从实例和过滤器获得的点的集合。
- PointIterator - PointCollection中的点的迭代器。
- CloudPoint - 单个点云点,表示云坐标中的X、Y、Z位置和颜色。
- PointCloudOverrides -及其相关设置类指定要应用于PointCloudInstance元素或元素内扫描的视图存储的图形覆盖。
点云文件路径
处理点云的两个重要路径位置可作为只读数据提供:
- PointCloudType.GetPath()-从中加载点的链接源的路径
- Application.PointCloudsRootPath -点云文件的根路径,Revit使用该路径计算点云文件的相对路径
创建点云
要在Revit文档中创建新的点云,请创建PointCloudType,然后使用它创建PointCloudInstance。静态PointCloudType.Create()方法需要引擎标识符(因为它是由第三方向Revit注册的),或者点云文件的文件扩展名(如果它是受支持的文件类型)。对于非基于文件的引擎,它还需要文件名或标识字符串。在以下示例中,pcg文件用于在Revit文档中创建点云。
代码区域:从rcs文件创建点云
1 | private PointCloudInstance CreatePointCloud(Document doc) |
访问点云中的点有两种方法可以访问点云中的点:1.使用lEnumerable接口直接从PointCollection返回迭代resultingl点2。无论
采用哪种方式,从PointCloudlnstance访问点集合的第一步是使用PointCloudlnstance方法。GetPoints(PointCloudFilterfilter,double
averageDistance,int numPoints)注意,作为Revit和点云引擎使用的搜索算法的结果,可能不会返回所请求的确切点数。虽然第二种选择涉及到直接处理指针,但在遍历大量的点缓冲区时,可能会有性能上的提升。不过,这个选项只能在c#和c++/CLI中实现。下面两个例子展示了如何使用这两种方法中的一种来迭代点云的一部分。
代码区域:通过迭代阅读点云点
1 | private void GetPointCloudDataByIteration(PointCloudInstance pcInstance, PointCloudFilter pointCloudFilter) |
代码区域:通过指针阅读点云点
1 | public unsafe void GetPointCloudDataByPointer(PointCloudInstance pcInstance, PointCloudFilter pointCloudFilter) |
过滤器
过滤器用于限制阅读点时搜索的体积,也用于管理点云的显示。可以基于平面边界的集合创建PointCloudFilter。过滤器将检查点是否位于每个输入平面的“正”侧,如平面法线的正方向所指示的。因此,这种过滤器隐含地定义了一个体积,它是对应于所有平面的正半空间的交集。这个体积不必闭合,但它将始终是凸的。
The display of point clouds can be controlled by assigning a filter to:
点云的显示可以通过将过滤器分配给以下对象来控制:
- PointCloudInstance.SetSelectionFilter()
Display of the filtered points will be based on the value of the property:
过滤点的显示将基于特性的值:
- PointCloudInstance.FilterAction
如果设置为“无”,则忽略选择过滤器。如果将其设置为“高亮显示”,则通过过滤器的点将高亮显示。如果将其设置为“隔离”(Isolate),则只有通过过滤器的点可见。
以下示例将基于点云的边界框高亮显示点云中的点子集。
代码区域:通过指针阅读点云点
1 | // Filter will match 1/8 of the overall point cloud |
这是在小管道点云上运行上述示例时的结果:
图:带有选择过滤器的点云
Selection.PickBox()方法调用一个通用的双击编辑器,让用户在屏幕上指定一个矩形区域,可以与PointCloudFilter结合使用,方法是使用生成的PickedBox来生成过滤器的平面边界。
扫描
.rcp文件可以包含多个扫描。方法PointCloudInstance.GetScans()返回一个扫描名称列表,可用于为PointCloudInstance中的每次扫描单独设置可见性和固定颜色覆盖。PointCloudInstance.ContainsScan()指示给定扫描名称是否包含在点云实例中,而PointCloudInstance.GetScanOrigin()将以模型坐标返回给定扫描的原点。
区域
扫描区域特定于Autodesk ReCap™。如果点云是在ReCap中创建的,则它可能具有区域。PointCloudInstance.GetRegions()返回区域名称列表,可用于为PointCloudInstance中的每个区域单独设置可见性和固定颜色覆盖。
覆盖
可以使用Revit API修改指定给给定视图的点云替代设置。这些设置对应于Revit UI中“可见性/图形替换”任务窗格的“点云”选项卡上的设置。覆盖可以应用于整个点云实例,也可以应用于该实例中的特定扫描。覆盖选项包括设置点云实例中扫描的可见性、将其设置为固定颜色或基于高程、法线或强度的颜色梯度。PointCloudInstance.SupportsOverrides属性标识支持覆盖设置的点云(基于.rcp或.rcs文件的点云)。
设置点云的替代时涉及以下类:
- PointCloudOverrides - 用于获取或设置PointCloudInstance、其扫描之一或PointCloudInstance内特定区域的PointCloudOverrideSettings。
- PointCloudOverrideSettings - 用于获取或设置可见性、颜色模式和PointCloudColorSettings。
- PointCloudColorSettings - 于将特定颜色模式的特定颜色指定给PointCloudInstance元素或其扫描之一。如果PointCloudColorMode为“Noise”或“Normals”,则不适用。
点云引擎
可以实现自定义点云引擎,以向Revit提供云点。
点云引擎可以基于文件,也可以不基于文件。基于文件的实现要求将每个点云映射到磁盘上的单个文件。Revit将允许用户通过选择扩展名与引擎标识符匹配的点云文件,直接在文档中创建新的点云实例。这些文件在Revit中被视为外部链接,必要时可以从“管理链接”对话框中重新加载和重新映射。
非基于文件的引擎实现可以从任何地方(例如,从数据库、从服务器、或从较大聚合文件的一部分)获得点云。由于没有用户可以选择的文件,因此Revit的用户界面不允许用户创建此类型的点云。相反,引擎提供程序提供了一个使用PointCloudType.Create()和PointCloudInstance.Create()的自定义命令,以创建和放置此类型的点云。“管理链接”对话框将显示此类型的点云,但由于没有与点云关联的文件,因此用户无法管理、重新加载或重新映射此类型的点云。
无论实现的类型如何,自定义引擎实现都包括以下内容:
- 通过PointCloudEngineRegistry向Revit注册的IPointCloudEngine实现。
- IPointCloudAccess的实现,它将响应来自Revit的有关单个点云属性的查询。
- IPointSetIterator的实现,它将在请求时向Revit返回点集。
为了将点云的点提供给Revit,必须实现两个ReadPoints()方法:
- IPointCloudAccess.ReadPoints()-这在一次性调用中提供一组点,可以从Revit或API调用。Revit在某些显示活动(包括选择预高亮显示)中使用此选项。API客户端也可以通过PointCloudInstance.GetPoints()直接调用此方法。
- IPointSetIterator.ReadPoints()-这提供了点的子集,作为云中点的更大迭代的一部分。Revit在点云的正常显示期间使用此方法;将重复请求点的数量,直到获得足够的点或显示中的某些内容发生更改。在任何给定的点集迭代过程中,引擎实现必须跟踪哪些点已返回到Revit。
有关注册和实施基于文件和非基于文件的点云引擎的完整示例,请参见Revit API SDK附带的Samples目录下的PointCloudEngine文件夹。