三维实体面对象获取问题-GetSubentities无法工作

名片

Paine-Zeng

lv0

需求:

BUG:

已完成:

进行中:

BUG 热度

  • 需求ID:暂无
  • 需求状态: 进行中 已完成

填写模板

产品版本:中望CAD 2026

GetSubentities一直返回null

导入任意step 或x_t实体,调用命令 选择实体面

需求背景/BUG复现步骤:

1、拿到用户选择的实体面对象

代码:

   /// <summary>
   /// 测试选择三维实体面功能
   /// 这个命令演示如何正确获取用户选择的三维实体的面,并显示面的详细信息
   /// </summary>
   [CommandMethod(“TestSelectFace”)]
   public void TestSelectFaceData()
   {
       var db = Application.DocumentManager.MdiActiveDocument.Database;
       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

       try
       {
           ed.WriteMessage(“\n========== 开始选择面测试 ==========”);
           ed.WriteMessage(“\n提示: 请用鼠标直接点击三维实体的面(不要点边缘)”);
           
           // 步骤1: 构造过滤器 – 只允许选择3DSOLID类型的实体
           TypedValue[] filList = new TypedValue[]
           {
               new TypedValue((int)DxfCode.Operator, “<or”),
               new TypedValue((int)DxfCode.Start, “3DSOLID”),
               new TypedValue((int)DxfCode.Operator, “or>”),
           };
           SelectionFilter filter = new SelectionFilter(filList);
           ed.WriteMessage(“\n[调试] 过滤器已创建: 3DSOLID”);

           // 步骤2: 设置选择选项
           PromptSelectionOptions pso = new PromptSelectionOptions();
           pso.MessageForAdding = “\n请点击选择三维实体的面(请直接点击在面上): “;
           pso.SingleOnly = true;              // 只允许选择一个对象
           pso.ForceSubSelections = true;      // 强制进行子实体选择
           pso.SinglePickInSpace = true;       // 单次点选
           ed.WriteMessage(“\n[调试] 选择选项已配置: ForceSubSelections=true”);

           // 步骤3: 执行选择,必须传入过滤器
           ed.WriteMessage(“\n[调试] 准备调用 GetSelection…”);
           var psr = ed.GetSelection(pso, filter);
           ed.WriteMessage($”\n[调试] GetSelection 返回状态: {psr.Status}”);
           
           if (psr.Status != PromptStatus.OK)
           {
               ed.WriteMessage(“\n操作已取消。”);
               return;
           }

           // 步骤4: 获取选择集
           SelectionSet sSet = psr.Value;
           ed.WriteMessage($”\n[调试] 选择集对象数量: {sSet.Count}”);
           
           if (sSet.Count == 0)
           {
               ed.WriteMessage(“\n未选择任何对象。”);
               return;
           }

           SelectedObject sObj = sSet[0];
           ed.WriteMessage($”\n[调试] 选中对象ID: {sObj.ObjectId}”);
           ed.WriteMessage($”\n[调试] SelectionMethod: {sObj.SelectionMethod}”);

           // 步骤5: 获取子实体信息(关键步骤)
           ed.WriteMessage(“\n[调试] 准备调用 GetSubentities()…”);
           SelectedSubObject[] sSubObjs = sObj.GetSubentities();
           ed.WriteMessage($”\n[调试] GetSubentities() 返回结果: {(sSubObjs == null ? “NULL” : $”数组长度={sSubObjs.Length}”)}”);
           
        
               return;
           }

         
               
               tr.Commit();
           }

           ed.WriteMessage(“\n测试完成!”);
       }
       catch (System.Exception ex)
       {
           ed.WriteMessage($”\n发生错误: {ex.Message}”);
           ed.WriteMessage($”\n堆栈跟踪: {ex.StackTrace}”);
       }
   }

 

0 条评论 A文章作者 M管理员
    暂无讨论,说说你的看法吧
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
复制链接
微信扫码
已复制到剪贴板