找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 138|回复: 0

ObjectArx 选择实体创建块参照

[复制链接]

1

主题

0

回帖

35

积分

管理员

积分
35
发表于 2024-5-2 22:30:35 | 显示全部楼层 |阅读模式
  1. 问题:
  2. 想要把多个CAD实体整体调整比例,可以用来对齐调整。
  3. 思路:
  4. 将要调整的多个实体整体做成一个 块参照 ,然后设置块参照的属性即可实现多个实体整体调整。
  5. (这里仅以选择一个实体并添加至新创建的块参照中为例。)
  6. 解决:
  7. 1、选择实体
  8. AcDbObjectId SelectEnt()
  9. {
  10.         ads采用name ent;
  11.         ads采用point pt;
  12.         AcDbObjectId entId = AcDbObjectId::kNull;
  13.         int ret = RTNORM;
  14.         ret = acedEntSel(采用T("\nSelect Entity: "), ent, pt);
  15.         if (RTNORM != ret)
  16.                 return entId;
  17.         acdbGetObjectId(entId, ent);
  18.         return entId;
  19. }
  20. 2、获取指定块表,没有则创建
  21. AcDbObjectId GetBlkId(const CString& sBlkName, bool bCreate)
  22. {
  23.         AcDbObjectId idBlk = AcDbObjectId::kNull;
  24.         // 获取指定块表ID 没有则添加
  25.         AcDbBlockTablePointer pTable(acdbCurDwg(), AcDb::kForRead);
  26.         if (pTable.openStatus() != Acad::eOk)
  27.                 return idBlk;
  28.        
  29.         if (pTable->has(sBlkName))// 有指定块表直接获取ID
  30.         {
  31.                 pTable->getAt(sBlkName, idBlk);
  32.         }
  33.         else if(bCreate)// 没有指定块表 且允许创建 则创建指定块表
  34.         {
  35.                 AcDbBlockTableRecord* pRecord = new AcDbBlockTableRecord();
  36.                 pRecord->setName(sBlkName);
  37.                 if (pTable->add(idBlk, pRecord) == Acad::eOk)
  38.                         pRecord->close();
  39.                 else
  40.                         delete pRecord;
  41.         }
  42.         return idBlk;
  43. }
  44. 3、将选择实体添加至新创建的块参照中,并设置属性
  45. void testCreateBlock()
  46. {
  47.         // 选择实体创建块参照
  48.         AcDbObjectId entId = SelectEnt();
  49.         if (entId.isNull())
  50.         {
  51.                 acutPrintf(采用T("选择实体失败"));
  52.                 return;
  53.         }
  54.         //获取指定块表Id
  55.         AcDbObjectId idRec = GetBlkId(采用BLOCK采用Test采用, true);
  56.         if (idRec.isNull())
  57.         {
  58.                 acutPrintf(采用T("获取%s块表Id失败"), 采用BLOCK采用Test采用);
  59.                 return;
  60.         }
  61.         AcDbEntityPointer pEnt(entId, AcDb::kForRead);
  62.         if (pEnt.openStatus() != Acad::eOk)
  63.         {
  64.                 acutPrintf(采用T("打开实体失败"));
  65.                 return;
  66.         }
  67.         //打开新的块表记录 添加实体至新块表中
  68.         AcDbBlockTableRecordPointer pBlkNew(idRec, AcDb::kForWrite);
  69.         if (pBlkNew.openStatus() != Acad::eOk)
  70.                 return;
  71.         pBlkNew->appendAcDbEntity(pEnt);
  72.         // 打开当前块表
  73.         AcDbBlockTablePointer pBlkTable(acdbCurDwg(), AcDb::kForRead);
  74.         if (pBlkTable.openStatus() != Acad::eOk)
  75.                 return;
  76.         AcGePoint3d ptInsert = AcGePoint3d::kOrigin;
  77.         // 创建块参照
  78.         AcDbObjectPointer<AcDbBlockReference> pBlkRef;
  79.         if (pBlkRef.create() != Acad::eOk)
  80.                 return;
  81.         pBlkRef->setDatabaseDefaults();
  82.         pBlkRef->setPosition(ptInsert);
  83.         pBlkRef->setBlockTableRecord(idRec);
  84.        
  85.         // 缩放块 两种方法:
  86.         // 1、通过缩放比例缩放
  87.         pBlkRef->setScaleFactors(1);//缩放比例
  88.         // 2、通过缩放矩阵缩放
  89.         AcGeMatrix3d scaleMat;
  90.         scaleMat.setToScaling(3, ptInsert);
  91.         pBlkRef->transformBy(scaleMat);
  92.        
  93.         // 旋转块 两种方法
  94.         // 1、通过旋转角度旋转
  95.         pBlkRef->setRotation(0);//旋转角度
  96.         // 2、通过旋转矩阵旋转
  97.         AcGeMatrix3d rotateMat;
  98.         rotateMat.setToRotation(3.1415926 * 0.5, AcGeVector3d::kZAxis, ptInsert);
  99.         pBlkRef->transformBy(rotateMat);
  100.         // 打开当前空间的块表记录
  101.         AcDbBlockTableRecordPointer pBlkRcd(curDoc()->database()->currentSpaceId(), AcDb::kForWrite);
  102.         if (pBlkRcd.openStatus() != Acad::eOk)
  103.                 return;
  104.         // 添加块参照到数据库
  105.         pBlkRcd->appendAcDbEntity(pBlkRef);
  106.        
  107.         return;
  108. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-1 17:51 , Processed in 0.121330 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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