如何在RhinoCommon中删除点云内已选中的点?
解决方案
你当前代码是用于选取独立的Point对象,根据你的核心需求(手动裁剪点云),分两种场景给出实现方案:
场景1:删除你当前代码选中的独立点对象
直接在遍历选中对象的环节调用删除方法即可,修改后代码如下:
{ ObjRef[] obj_refs; // 这里筛选的是文档中独立的点对象,不适用于点云内部的点 var rc = Rhino.Input.RhinoGet.GetMultipleObjects("Select point", false, ObjectType.Point, out obj_refs); if (rc != Result.Success) return rc; foreach (var o_ref in obj_refs) { // 直接删除选中的点对象 doc.Objects.Delete(o_ref, true); } doc.Objects.UnselectAll(); doc.Views.Redraw(); return Result.Success; }
场景2:删除点云对象中选中的内部点(适配点云裁剪需求)
如果你的操作对象是点云(不是独立点),需要先选中点云对象、获取点云内选中点的索引,再过滤生成新的点云替换原有对象,实现代码如下:
{ ObjRef obj_ref; // 筛选点云对象,允许用户点选点云中的单个点 var rc = Rhino.Input.RhinoGet.GetObject("Select points in point cloud to delete", false, ObjectType.PointCloud, out obj_ref); if (rc != Result.Success) return rc; // 获取点云对象和被选中的点索引 var point_cloud = obj_ref.PointCloud(); var selected_indices = obj_ref.GetSelectedPointCloudIndices(); if (point_cloud == null || selected_indices == null || selected_indices.Length == 0) return Result.Nothing; // 过滤掉选中的点,生成新点云 var new_point_cloud = new PointCloud(); for (int i = 0; i < point_cloud.Count; i++) { if (!selected_indices.Contains(i)) { new_point_cloud.Add(point_cloud[i]); } } // 替换原有对象 doc.Objects.Replace(obj_ref, new_point_cloud); doc.Objects.UnselectAll(); doc.Views.Redraw(); return Result.Success; }
注意事项
- 第二种方案直接支持用户框选/点选点云里的单个点完成裁剪,符合你手动裁剪点云的需求,后续开发自动离群点检测时,只需要把
selected_indices替换为算法输出的离群点索引即可复用替换逻辑。 - 所有操作都会自动进入Rhino的撤销栈,用户可以通过Ctrl+Z回退删除操作。
内容的提问来源于stack exchange,提问作者Niek
相关产品推荐
相关产品推荐

