找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1341|回复: 10

[每日一码] XCLIP xrefs using ObjectARX

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-9-5 09:10:01 | 显示全部楼层 |阅读模式

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

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

×
AcDbSpatialFilter 类设计用来做这个的,在AutoCAD重新生成图形(REGEN)的时候,通过 spatial filter 来决定要处理哪些对象。

下面代码是个简单的演示,注意:命令需要用 ACRX_CMD_NOINTERNALLOCK 选项 定义。

[it618postdisplay>0]

ACED_ARXCOMMAND_ENTRY_AUTO(CMyTestApp,
                           MyTestApp,
                           _MyClip, MyClip,
                           ACRX_CMD_TRANSPARENT |
                           ACRX_CMD_NOINTERNALLOCK,
                           NULL)

[/it618postdisplay]

  1. static void MyTestApp_MyClip()
  2. {
  3.     ads_point pt1,pt2;
  4.     ads_name ent;
  5.     if (acedEntSel(_T("Select xref:"),ent,pt1)!=RTNORM)
  6.         return;
  7.     AcDbObjectId idXref;
  8.     if (acdbGetObjectId(idXref,ent)!=Acad::eOk)
  9.         return;
  10.     AcDbObjectPointer<AcDbBlockReference> pRef(idXref,AcDb::kForRead);
  11.     if (pRef.openStatus()!=Acad::eOk)
  12.     {
  13.         acutPrintf(_T("Not an xref!\n"));
  14.         return;
  15.     }
  16.     AcGePoint2dArray pts;
  17.     if (acedGetPoint(NULL,_T("First point:"),pt1)!=RTNORM)
  18.         return;
  19.     //the ECS of the vertices must be defined in the
  20.     //coordinate system of the _block_ so let's calculate
  21.     //transform all points to that coordinate system

  22.     AcGeMatrix3d mat(pRef->blockTransform());
  23.     mat.invert();

  24.     AcGePoint3d pt3d(asPnt3d(pt1));
  25.     pt3d.transformBy(mat);
  26.     pts.append(AcGePoint2d(pt3d.x,pt3d.y));
  27.     while (acedGetPoint(pt1,_T("Next point:"),pt2)==RTNORM)
  28.     {
  29.         acedGrDraw(pt1,pt2,1,1);
  30.         pt3d = asPnt3d(pt2);
  31.         pt3d.transformBy(mat);
  32.         pts.append(AcGePoint2d(pt3d.x,pt3d.y));
  33.         memcpy(pt1,pt2,sizeof(ads_point));
  34.     }
  35.     acedRedraw(NULL,0);
  36.     AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
  37.     AcGeVector3d normal;
  38.     double elev;
  39.     if (pDb->tilemode())
  40.     {
  41.         normal = pDb->ucsxdir().crossProduct(pDb->ucsydir());
  42.         elev = pDb->elevation();
  43.     }
  44.     else
  45.     {
  46.         normal = pDb->pucsxdir().crossProduct(pDb->pucsydir());
  47.         elev = pDb->pelevation();
  48.     }
  49.     normal.normalize();
  50.     Acad::ErrorStatus es = pRef.object()->upgradeOpen();
  51.     if (es !=Acad::eOk)
  52.         return;
  53.     //create the filter
  54.     AcDbSpatialFilter* pFilter = new AcDbSpatialFilter;
  55.     if (pFilter->setDefinition(pts,normal,elev,
  56.         ACDB_INFINITE_XCLIP_DEPTH,-ACDB_INFINITE_XCLIP_DEPTH,true)!=Acad::eOk)
  57.     {
  58.         delete pFilter;
  59.         return;
  60.     }
  61.     //add it to the extension dictionary of the block reference
  62.     //the AcDbIndexFilterManger class provides convenient utility functions
  63.     if (AcDbIndexFilterManager::addFilter(pRef.object(),pFilter)!=Acad::eOk)
  64.         delete pFilter;
  65.     else
  66.     {
  67.         acutPrintf(_T("Filter has been succesfully added!\n"));
  68.         pFilter->close();
  69.     }

  70. }


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

已领礼包: 2963个

财富等级: 家财万贯

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

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

发表于 2020-3-10 22:58:21 | 显示全部楼层

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

使用道具 举报

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

使用道具 举报

已领礼包: 69个

财富等级: 招财进宝

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

使用道具 举报

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

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 10个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 23:56 , Processed in 0.414827 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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