找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2103|回复: 7

[分享] 分享一个简单的判断实体类型的代码

[复制链接]

已领礼包: 4个

财富等级: 恭喜发财

发表于 2017-2-21 14:39:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
objearx2010的实体判断,可以用这个代码,其中有些实体是基类,用不上,不过也加上了。
  1. //AcDb3dSolid                                1
  2. //AcDbBlockBegin                        2
  3. //AcDbBlockEnd                        3
  4. //AcDbBlockReference                4
  5. //AcDbBody                                5
  6. //AcDbCamera                                6
  7. //AcDbCurve                                7
  8. //AcDbDimension                        8
  9. //AcDbFace                                 9
  10. //AcDbFcf                                 10
  11. //AcDbFrame                                11
  12. //AcDbHatch                                 12
  13. //AcDbImage                                 13
  14. //AcDbLight                                 14
  15. //AcDbMLeader                         15
  16. //AcDbMline                                16
  17. //AcDbMPolygon                                 17
  18. //AcDbMText                                        18
  19. //AcDbPoint                                 19
  20. //AcDbPolyFaceMesh                         20
  21. //AcDbPolygonMesh                         21
  22. //AcDbProxyEntity                         22
  23. //AcDbRegion                                23
  24. //AcDbSection                                24
  25. //AcDbSequenceEnd                          25
  26. //AcDbShape                                        26
  27. //AcDbSolid                                 27
  28. //AcDbSubDMesh                                 28
  29. //AcDbSurface                                 29
  30. //AcDbText                                         30
  31. //AcDbTrace                                 31
  32. //AcDbUnderlayReference         32
  33. //AcDbVertex                                 33
  34. //AcDbViewport                                 34
  35. //AcDb2dPolyline                        35
  36. //AcDb3dPolyline                        36
  37. //AcDbArc                                         37
  38. //AcDbCircle                                 38
  39. //AcDbEllipse                                 39
  40. //AcDbLeader                                 40
  41. //AcDbLine                                         41
  42. //AcDbPolyline                                 42
  43. //AcDbRay                                    43
  44. //AcDbSpline                                 44
  45. //AcDbXline                                 45
  46. int JudgeEntity(const AcDbEntity* pEntity)
  47. {
  48.         const TCHAR *pEntName=pEntity->isA()->name();
  49.         CString cstr_EntName = pEntName;
  50.         char cht = cstr_EntName.GetAt(4);
  51.         switch(cht)
  52.         {
  53.         case '2':////AcDb2dPolyline
  54.                 if (0 == cstr_EntName.Compare(_T("AcDb2dPolyline")))
  55.                 {
  56.                         return 35;
  57.                 }
  58.                 break;

  59.         case '3'://AcDb3dSolid AcDb3dPolyline
  60.                 if (0 == cstr_EntName.Compare(_T("AcDb3dSolid")))
  61.                 {
  62.                         return 1;
  63.                 }
  64.                 else if (0 == cstr_EntName.Compare(_T("AcDb3dPolyline")))
  65.                 {
  66.                         return 36;
  67.                 }
  68.                 break;

  69.         case 'A':////AcDbArc
  70.                 if (0 == cstr_EntName.Compare(_T("AcDbArc")))
  71.                 {
  72.                         return 37;
  73.                 }
  74.                 break;

  75.         case 'B'://AcDbBlockBegin AcDbBlockEnd AcDbBlockReference AcDbBody
  76.                 if (0 == cstr_EntName.Compare(_T("AcDbBlockBegin")))
  77.                 {
  78.                         return 2;
  79.                 }
  80.                 else if (0 == cstr_EntName.Compare(_T("AcDbBlockEnd")))
  81.                 {
  82.                         return 3;
  83.                 }
  84.                 else if (0 == cstr_EntName.Compare(_T("AcDbBlockReference")))
  85.                 {
  86.                         return 4;
  87.                 }
  88.                 else if (0 == cstr_EntName.Compare(_T("AcDbBody")))
  89.                 {
  90.                         return 5;
  91.                 }
  92.                 break;

  93.         case 'C'://AcDbCamera AcDbCurve AcDbCircle
  94.                 if (0 == cstr_EntName.Compare(_T("AcDbCamera")))
  95.                 {
  96.                         return 6;
  97.                 }
  98.                 else if (0 == cstr_EntName.Compare(_T("AcDbCurve")))
  99.                 {
  100.                         return 7;
  101.                 }
  102.                 else if (0 == cstr_EntName.Compare(_T("AcDbCircle")))
  103.                 {
  104.                         return 38;
  105.                 }
  106.                 break;

  107.         case 'D'://AcDbDimension
  108.                 if (0 == cstr_EntName.Compare(_T("AcDbDimension")))
  109.                 {
  110.                         return 8;
  111.                 }
  112.                 break;

  113.         case 'E'://AcDbEllipse
  114.                 if (0 == cstr_EntName.Compare(_T("AcDbEllipse")))
  115.                 {
  116.                         return 39;
  117.                 }
  118.                 break;

  119.         case 'F'://AcDbFace AcDbFcf AcDbFrame
  120.                 if (0 == cstr_EntName.Compare(_T("AcDbFace")))
  121.                 {
  122.                         return 9;
  123.                 }
  124.                 else if (0 == cstr_EntName.Compare(_T("AcDbFcf")))
  125.                 {
  126.                         return 10;
  127.                 }
  128.                 else if (0 == cstr_EntName.Compare(_T("AcDbFrame")))
  129.                 {
  130.                         return 11;
  131.                 }
  132.                 break;

  133.         case 'H'://AcDbHatch
  134.                 if (0 == cstr_EntName.Compare(_T("AcDbHatch")))
  135.                 {
  136.                         return 12;
  137.                 }
  138.                 break;

  139.         case 'I'://AcDbImage
  140.                 if (0 == cstr_EntName.Compare(_T("AcDbImage")))
  141.                 {
  142.                         return 13;
  143.                 }
  144.                 break;

  145.         case 'L'://AcDbLight AcDbLeader AcDbLine
  146.                 if (0 == cstr_EntName.Compare(_T("AcDbLight")))
  147.                 {
  148.                         return 14;
  149.                 }
  150.                 else if (0 == cstr_EntName.Compare(_T("AcDbLeader")))
  151.                 {
  152.                         return 40;
  153.                 }
  154.                 else if (0 == cstr_EntName.Compare(_T("AcDbLine")))
  155.                 {
  156.                         return 41;
  157.                 }
  158.                 break;

  159.         case 'M'://AcDbMLeader AcDbMline AcDbMPolygon AcDbMText
  160.                 if (0 == cstr_EntName.Compare(_T("AcDbMLeader")))
  161.                 {
  162.                         return 15;
  163.                 }
  164.                 else if (0 == cstr_EntName.Compare(_T("AcDbMline")))
  165.                 {
  166.                         return 16;
  167.                 }
  168.                 else if (0 == cstr_EntName.Compare(_T("AcDbMPolygon")))
  169.                 {
  170.                         return 17;
  171.                 }
  172.                 else if (0 == cstr_EntName.Compare(_T("AcDbMText")))
  173.                 {
  174.                         return 18;
  175.                 }
  176.                 break;

  177.         case 'P'://AcDbPoint AcDbPolyFaceMesh AcDbPolygonMesh AcDbProxyEntity AcDbPolyline
  178.                 if (0 == cstr_EntName.Compare(_T("AcDbPoint")))
  179.                 {
  180.                         return 19;
  181.                 }
  182.                 else if (0 == cstr_EntName.Compare(_T("AcDbPolyFaceMesh")))
  183.                 {
  184.                         return 20;
  185.                 }
  186.                 else if (0 == cstr_EntName.Compare(_T("AcDbPolygonMesh")))
  187.                 {
  188.                         return 21;
  189.                 }
  190.                 else if (0 == cstr_EntName.Compare(_T("AcDbProxyEntity")))
  191.                 {
  192.                         return 22;
  193.                 }
  194.                 else if (0 == cstr_EntName.Compare(_T("AcDbPolyline")))
  195.                 {
  196.                         return 42;
  197.                 }
  198.                 break;

  199.         case 'R'://AcDbRegion AcDbRay
  200.                 if (0 == cstr_EntName.Compare(_T("AcDbRegion")))
  201.                 {
  202.                         return 23;
  203.                 }
  204.                 else if (0 == cstr_EntName.Compare(_T("AcDbRay")))
  205.                 {
  206.                         return 43;
  207.                 }
  208.                 break;

  209.         case 'S'://AcDbSection AcDbSequenceEnd AcDbShape AcDbSolid AcDbSubDMesh AcDbSurface AcDbSpline
  210.                 if (0 == cstr_EntName.Compare(_T("AcDbSection")))
  211.                 {
  212.                         return 24;
  213.                 }
  214.                 else if (0 == cstr_EntName.Compare(_T("AcDbSequenceEnd")))
  215.                 {
  216.                         return 25;
  217.                 }
  218.                 else if (0 == cstr_EntName.Compare(_T("AcDbShape")))
  219.                 {
  220.                         return 26;
  221.                 }
  222.                 else if (0 == cstr_EntName.Compare(_T("AcDbSolid")))
  223.                 {
  224.                         return 27;
  225.                 }
  226.                 else if (0 == cstr_EntName.Compare(_T("AcDbSubDMesh")))
  227.                 {
  228.                         return 28;
  229.                 }
  230.                 else if (0 == cstr_EntName.Compare(_T("AcDbSurface")))
  231.                 {
  232.                         return 29;
  233.                 }
  234.                 else if (0 == cstr_EntName.Compare(_T("AcDbSpline")))
  235.                 {
  236.                         return 44;
  237.                 }
  238.                 break;

  239.         case 'T'://AcDbText AcDbTrace
  240.                 if (0 == cstr_EntName.Compare(_T("AcDbText")))
  241.                 {
  242.                         return 30;
  243.                 }
  244.                 else if (0 == cstr_EntName.Compare(_T("AcDbTrace")))
  245.                 {
  246.                         return 31;
  247.                 }
  248.                 break;

  249.         case 'U'://AcDbUnderlayReference
  250.                 if (0 == cstr_EntName.Compare(_T("AcDbUnderlayReference")))
  251.                 {
  252.                         return 32;
  253.                 }
  254.                 break;

  255.         case 'V'://AcDbVertex AcDbViewport
  256.                 if (0 == cstr_EntName.Compare(_T("AcDbVertex")))
  257.                 {
  258.                         return 33;
  259.                 }
  260.                 else if (0 == cstr_EntName.Compare(_T("AcDbViewport")))
  261.                 {
  262.                         return 34;
  263.                 }
  264.                 break;

  265.         case 'X'://AcDbXline
  266.                 if (0 == cstr_EntName.Compare(_T("AcDbXline")))
  267.                 {
  268.                         return 45;
  269.                 }
  270.                 break;

  271.         }
  272.         return 0;
  273. }


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-2-21 15:10:55 | 显示全部楼层
感谢楼主分享

判断实体类型一般用 isKindOf 加Cast 不就可以吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2017-2-22 09:39:49 | 显示全部楼层

我想的是,在数据库中拿到了一个实体,不知道这个实体是什么类型的,那么可以用这个函数判断。
就我目前理解,如果事先知道这个实体是什么类型的实体,可以用 iskingof 判断是不是。就是说,要事先知道entType这个参数。
  1. Adesk::Boolean isKindOf(    AcGe::EntityId entType) const;
我是arx新手,不知道我这么理解对不对,还请多多指点下,谢谢~

点评

你的逻辑不对,想获取对象类型,AcRxClass::name就可以得到 而且你这样写代码,if太多不容易维护  详情 回复 发表于 2020-6-23 20:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-2-22 10:31:53 | 显示全部楼层

一般情况下,你的程序处理 需要对哪些实体进行操作,事先是有规划的,比如你的程序就是要处理曲线

那你开始用一个 pEnt->isKindOf(AcDbCurve::desc()),满足,就可以进一步cast到具体的类型比如AcDbPolyline等类型了。或者直接cast都行,
比如:
AcDbPolyline *pPoly = NULL;
pPoly = AcDbPolyline::cast(pEnt);
if (!pPoly)
   return;
...... //下面你就可以用AcDbPolyline了。

用你这个判断后,你还是需要进一步的cast,而且判断了很多本不必要判断的类型,比较繁杂了些。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-2-22 11:51:43 | 显示全部楼层

感谢楼主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2017-2-23 09:07:20 | 显示全部楼层

奥,我明白了,谢谢你~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

发表于 2020-6-23 20:44:25 | 显示全部楼层
liyupitt 发表于 2017-2-22 09:39
我想的是,在数据库中拿到了一个实体,不知道这个实体是什么类型的,那么可以用这个函数判断。
就我目前 ...

你的逻辑不对,想获取对象类型,AcRxClass::name就可以得到
而且你这样写代码,if太多不容易维护
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10个

财富等级: 恭喜发财

发表于 2020-9-22 19:51:41 | 显示全部楼层
thanks your code.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-27 12:43 , Processed in 0.426079 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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