明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1204|回复: 10

[求助]选择带有特定扩展数据的3DSOLID实体 失败问题?

[复制链接]
发表于 2025-8-20 19:47:44 | 显示全部楼层 |阅读模式
  1. // 选择带有特定扩展数据的3DSOLID实体
  2. static void SelectSolidWithXData()
  3. {
  4.     CString appName = _T("1234");
  5.     ads_name ss;

  6.     ACHAR* promptPtrs[] = {
  7.         const_cast<ACHAR*>(_T("\n选择 3DSOLID (ENTER 退出):")),
  8.         const_cast<ACHAR*>(_T("\n "))
  9.     };

  10.     // Step 1: 构建 XData 条件
  11.     resbuf* rbXData = acutBuildList(AcDb::kDxfRegAppName, (TCHAR*)appName.GetString(), RTNONE);
  12.     if (rbXData == NULL)
  13.     {
  14.         acutPrintf(_T("\n错误:无法构建 XData 过滤器。"));
  15.         return;
  16.     }

  17.     // Step 2: 构建主过滤器
  18.     resbuf* rbFilter = acutBuildList(RTDXF0, _T("3DSOLID"), -3, rbXData, RTNONE);
  19.    
  20.     // 先释放XData资源
  21.     acutRelRb(rbXData);
  22.     rbXData = NULL;

  23.     // 检查rbFilter是否为NULL
  24.     if (rbFilter == NULL)    //问题这里不成功
  25.     {
  26.         acutPrintf(_T("\n错误:无法构建对象过滤器。内存分配失败或参数无效。"));
  27.         return;
  28.     }

  29.     // Step 3: 执行选择
  30.     int rc = acedSSGet(_T("I"), NULL, NULL, rbFilter, ss);
  31.    
  32.     // 释放过滤器资源
  33.     acutRelRb(rbFilter);
  34.     rbFilter = NULL;

  35.     if (rc != RTNORM)
  36.     {
  37.         if (rc == RTCAN)
  38.         {
  39.             acutPrintf(_T("\n选择取消。"));
  40.         }
  41.         else
  42.         {
  43.             acutPrintf(_T("\n未找到符合条件的3DSOLID实体。"));
  44.         }
  45.         return;
  46.     }

  47.     int count = 0;
  48.     if (acedSSLength(ss, &count) != RTNORM)
  49.     {
  50.         count = 0;
  51.     }
  52.    
  53.     acutPrintf(_T("\n成功选中 %d 个带 '%s' XData 的 3DSOLID。"), count, appName.GetString());

  54.     // 释放选择集
  55.     acedSSFree(ss);
  56. }
复制代码


回复

使用道具 举报

发表于 2025-8-20 20:52:44 | 显示全部楼层
本帖最后由 gzxl 于 2025-8-20 21:12 编辑

过滤器有 -3 这我好像从来没见过。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 2025-8-20 23:29:46 | 显示全部楼层
你得上个dwg例子。
回复 支持 反对

使用道具 举报

发表于 2025-8-20 23:48:25 | 显示全部楼层
  1. resbuf* rbFilter = acutBuildList(RTDXF0, _T("3DSOLID"), -3,RTRESBUF,rbXData, RTNONE);

  2.                 // 先释放XData资源
  3.                 //acutRelRb(rbXData);
  4.                 //rbXData = NULL;

看似有条不紊,实则到处挖坑。
回复 支持 反对

使用道具 举报

发表于 2025-8-20 23:50:00 | 显示全部楼层
acutBuildList(RTDXF0, _T("3DSOLID"), -3, AcDb::kDxfRegAppName, appName, RTNONE);
回复 支持 反对

使用道具 举报

发表于 2025-8-21 01:13:09 | 显示全部楼层
筛选 3DSOLID+XData 的
  1. ads_name ss;
  2. struct resbuf* rb;
  3. rb = acutBuildList(RTDXF0, _T("3DSOLID"), RTNONE);
  4. int res = acedSSGet(_T("X"), NULL, NULL, rb, ss);
  5. acutRelRb(rb);
  6. if (res != RTNORM)
  7.     return;
  8. Acad::ErrorStatus es;
  9. Adesk::Int32 length = 0;
  10. acedSSLength(ss, &length);
  11. ads_name ssSet;
  12. acedSSAdd(NULL, NULL, ssSet);
  13. for (int i = 0; i < length; i++)
  14. {
  15.     ads_name ent;
  16.     acedSSName(ss, i, ent);
  17.     AcDbObjectId objId = AcDbObjectId::kNull;
  18.     es = acdbGetObjectId(objId, ent);
  19.     AcDbEntity *pEnt = NULL;
  20.     es = acdbOpenObject(pEnt, objId, AcDb::kForRead);
  21.     if (pEnt->isKindOf(AcDb3dSolid::desc()))
  22.     {
  23.         AcDb3dSolid *p3dSolid = AcDb3dSolid::cast(pEnt);
  24.         struct resbuf* xdata;
  25.         xdata = pEnt->xData((ACHAR*)0);
  26.         if (xdata != NULL)
  27.         {
  28.             acedSSAdd(ent, ssSet, ssSet);
  29.             acedSSSetFirst(ssSet, NULL);
  30.         }
  31.         p3dSolid->close();
  32.     }
  33.     pEnt->close();
  34. }
  35. acedSSFree(ss);
  36. //acedSSSetFirst(NULL, NULL);

回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-21 08:21:00 | 显示全部楼层
本帖最后由 cable2004 于 2025-8-21 08:24 编辑
edata 发表于 2025-8-20 23:50
acutBuildList(RTDXF0, _T("3DSOLID"), -3, AcDb::kDxfRegAppName, appName, RTNONE);

谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-21 08:24:13 | 显示全部楼层
gzxl 发表于 2025-8-21 01:13
筛选 3DSOLID+XData 的

我现在也是这个方法,谢谢!
回复 支持 反对

使用道具 举报

发表于 2025-8-21 10:53:46 | 显示全部楼层
cable2004 发表于 2025-8-21 08:24
我现在也是这个方法,谢谢!

如果非要索引,就自己实现一个静态变量,然后事件维护会不会更好
回复 支持 反对

使用道具 举报

发表于 2025-8-21 11:13:27 | 显示全部楼层
本帖最后由 gzxl 于 2025-8-21 11:16 编辑
你有种再说一遍 发表于 2025-8-21 10:53
如果非要索引,就自己实现一个静态变量,然后事件维护会不会更好

凤毛麟角没有多少个的。
JJ 发表的我也多数看不懂。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2026-1-9 04:30 , Processed in 0.159641 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表