You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:27:05