找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4227|回复: 11

[分享] 源码分享:选择物体添加到块中

[复制链接]

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-11-25 21:56:07 | 显示全部楼层 |阅读模式

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

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

×
  1. //选择物体添加到块中,支持对不等比图块添加物体
  2. void XL_Add2Block (void)
  3. {
  4.   ads_name BlkRef,ss;
  5.   ads_point selPt;
  6.   AcDbBlockTable *pBlockTable;
  7.   //pBlockTableRec 要修改的块表记录
  8.   //pUnBlockTableRec 无名块的块表记录
  9.   //pBlockTableRecord 当前空间块表记录
  10.   AcDbBlockTableRecord *pBlockTableRec,*pUnBlockTableRec,*pBlockTableRecord;
  11.   AcDbObjectId BlkRefId,pBlockTableRecId,pUnBlockTableRecId;
  12.   AcDbEntity *pBlkRefEnt;
  13.   AcDbBlockReference *pBlockRef;
  14.   if (RTNORM != acedEntSel(_T("\n选择图块:"),BlkRef,selPt))
  15.   {
  16.     return;
  17.   }
  18.   acedRedraw(BlkRef,3);
  19.   acdbGetObjectId(BlkRefId,BlkRef);
  20.   Acad::ErrorStatus es = acdbOpenObject(pBlkRefEnt,BlkRefId,AcDb::kForWrite);
  21.   if (es != Acad::eOk)
  22.   {
  23.     acedRedraw(BlkRef,4);
  24.     return;
  25.   }
  26.   if (!pBlkRefEnt->isKindOf(AcDbBlockReference::desc()))
  27.   {
  28.     pBlkRefEnt->close();
  29.     acedRedraw(BlkRef,4);
  30.     return;
  31.   }
  32.   pBlockRef = AcDbBlockReference::cast(pBlkRefEnt);
  33.   //BlockDefId = pBlockRef->blockId();
  34.   if (RTNORM != acedSSGet(_T(":L"),NULL,NULL,NULL,ss))
  35.   {
  36.     pBlkRefEnt->close();
  37.     acedRedraw(BlkRef,4);
  38.     return;
  39.   }
  40.   acedSSDel(BlkRef,ss);
  41.   long len;
  42.   acedSSLength(ss,&len);
  43.   if (len < 1)
  44.   {
  45.     acdbFail(_T("没有选择实体!"));
  46.     pBlkRefEnt->close();
  47.     acedRedraw(BlkRef,4);
  48.     return;
  49.   }
  50.   
  51.   pBlockTableRecId = pBlockRef->blockTableRecord();
  52.   if (Acad::eOk != acdbOpenObject(pBlockTableRec,pBlockTableRecId,AcDb::kForWrite))
  53.   {
  54.     pBlockTableRec->close();
  55.     pBlkRefEnt->close();
  56.     acedRedraw(BlkRef,4);
  57.     return;
  58.   }
  59.   AcGeMatrix3d mat,invmat,mat1,mat2;
  60.   AcGeVector3d xAxis(1,0,0),zAxis(0,0,1);
  61.   AcGePoint3d Refposion = pBlockRef->position();
  62.   AcGeVector3d vec(-Refposion.x,-Refposion.y,-Refposion.z);
  63.   AcGeScale3d Refscale3d = pBlockRef->scaleFactors();
  64.   double RefRotion = pBlockRef->rotation();
  65.   mat = pBlockRef->blockTransform();
  66.   invmat = mat.inverse();
  67.   mat1.setToIdentity();
  68.   mat1.setToRotation( - RefRotion,zAxis,Refposion);/*图块转回水平位置的矩阵*/
  69.   mat2 = mat2.setToTranslation(vec);
  70.   mat1.setToProduct(mat2,mat1);
  71.   pBlkRefEnt->close();
  72.   if (!mat.isUniScaledOrtho())
  73.   {
  74.     //不等比例图块
  75.     Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()
  76.       ->getBlockTable(pBlockTable, AcDb::kForWrite);
  77.     if (es != Acad::eOk)
  78.     {
  79.       pBlockTable->close();
  80.       pBlockTableRec->close();
  81.       acedRedraw(BlkRef,4);
  82.       return;
  83.     }
  84.     pUnBlockTableRec = new AcDbBlockTableRecord();
  85.     if (Acad::eOk != pUnBlockTableRec->setName(_T("*U")))
  86.     {
  87.       pBlockTable->close();
  88.       pBlockTableRec->close();
  89.       acedRedraw(BlkRef,4);
  90.       delete pUnBlockTableRec;
  91.       return;
  92.     }
  93.     //定义无名块
  94.     pBlockTable->add(pUnBlockTableRecId,pUnBlockTableRec);
  95.     for (long i = 0;i < len;i++)
  96.     {
  97.       AcDbEntity *pEnt,*pnewEnt = NULL;
  98.       AcDbObjectId Id;
  99.       ads_name ent;
  100.       acedSSName(ss,i,ent);
  101.       acdbGetObjectId(Id,ent);
  102.       if (acdbOpenObject(pEnt,Id,AcDb::kForWrite) != Acad::eOk)
  103.         continue;
  104.       pEnt->getTransformedCopy(mat1,pnewEnt);
  105.       pUnBlockTableRec->appendAcDbEntity(pnewEnt);
  106.       pEnt->erase(Adesk::kTrue);
  107.       pEnt->close();
  108.       pnewEnt->close();
  109.     }
  110.    
  111.     pUnBlockTableRec->close();
  112.     //插入无名块

  113.     resbuf tilemode;
  114.     acedGetVar(_T("TILEMODE"),&tilemode);
  115.     int tile=tilemode.resval.rint;
  116.     if (tile)
  117.       es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
  118.     else
  119.       es = pBlockTable->getAt(ACDB_PAPER_SPACE, pBlockTableRecord,AcDb::kForWrite);
  120.     if (es != Acad::eOk)
  121.     {
  122.       pBlockTable->close();
  123.       pBlockTableRecord->close();
  124.       return;
  125.     }
  126.     pBlockTable->close();
  127.     AcDbBlockReference *pBlockReference;
  128.     pBlockReference = new AcDbBlockReference();
  129.     pBlockReference->setBlockTableRecord(pUnBlockTableRecId);
  130.     pBlockReference->setPosition(AcGePoint3d::kOrigin);
  131.     AcGeScale3d scale3d = Refscale3d.inverse();
  132.     pBlockReference->setScaleFactors(scale3d);
  133.     AcDbObjectId entId;
  134.     pBlockTableRecord->appendAcDbEntity(entId, pBlockReference);
  135.     pBlockTableRecord->close();
  136.     AcDbVoidPtrArray ptrArry;
  137.     if (pBlockReference->explode(ptrArry) != Acad::eOk)
  138.     {
  139.       pBlockTableRec->close();
  140.       pBlockReference->close();
  141.       return;
  142.     }
  143.     pBlockReference->erase(Adesk::kTrue);
  144.     pBlockReference->close();
  145.     for (int i = 0;i < ptrArry.length();i++)
  146.     {
  147.       AcDbEntity * pE;
  148.       pE = (AcDbEntity *)ptrArry.at(i);
  149.       pBlockTableRec->appendAcDbEntity(pE);
  150.       pE->close();
  151.     }

  152.     pBlockTableRec->close();
  153.   }
  154.   else
  155.   {
  156.     for (long i = 0;i < len;i++)
  157.     {
  158.       AcDbEntity *pEnt,*pnewEnt = NULL;
  159.       AcDbObjectId Id;
  160.       ads_name ent;
  161.       acedSSName(ss,i,ent);
  162.       acdbGetObjectId(Id,ent);
  163.       if (acdbOpenObject(pEnt,Id,AcDb::kForWrite) != Acad::eOk)
  164.         continue;
  165.       pEnt->getTransformedCopy(invmat,pnewEnt);
  166.       pBlockTableRec->appendAcDbEntity(pnewEnt);
  167.       pEnt->erase(Adesk::kTrue);
  168.       pEnt->close();
  169.       pnewEnt->close();
  170.     }
  171.     pBlockTableRec->close();

  172.   }
  173.   acedRedraw(BlkRef,4);
  174.   acedCommand(RTSTR, _T("_.REGEN"), RTNONE);

  175. }

评分

参与人数 1D豆 +3 收起 理由
SmallBlackCat + 3 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 1268个

财富等级: 财源广进

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-11-25 23:51:40 | 显示全部楼层
顶一下G版,ARX学的很深了。给大家说下思路吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2014-4-15 17:14:36 | 显示全部楼层

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 100个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 100个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 14个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 07:58 , Processed in 0.241061 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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