找回密码
 立即注册

QQ登录

只需一步,快速开始

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

创建普通块和无名块

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-3 21:53:23 | 显示全部楼层 |阅读模式
  1. static Acad::ErrorStatus CreateAnonBlock(AcArray<AcDbObjectId> &selectedIds, AcDbObjectId &idAnonBlock)
  2. {
  3.          Acad::ErrorStatus es;
  4.          AcDbBlockTable *pBlockTable = NULL;
  5.          AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
  6.          AcDbBlockTableRecord *pAnonBlock = NULL;
  7.          if (idAnonBlock == AcDbObjectId::kNull)
  8.          {
  9.                  if ((es = pDb->getBlockTable(pBlockTable, AcDb::kForWrite))
  10.                          != Acad::eOk)
  11.                  {
  12.                          acutPrintf(L"Could not open block table 无法打开块表.\n");
  13.                          return es;
  14.                  }
  15.                  AcDbBlockTableRecord *pAnonBlock = new AcDbBlockTableRecord;
  16.                  if (!pAnonBlock)
  17.                  {
  18.                          acutPrintf(L"Could not create new block table record.无法创建新的块表记录\n");
  19.                          return Acad::eNullObjectPointer;
  20.                  }
  21.                  if ((es = pAnonBlock->setName(采用T("*U"))) != Acad::eOk)
  22.                  {
  23.                          acutPrintf(L"Could not name anonymous block.无法命名匿名块\n");
  24.                          return es;
  25.                  }
  26.                  if ((es = pBlockTable->add(idAnonBlock, pAnonBlock)) != Acad::eOk)
  27.                  {
  28.                          acutPrintf(L"Could not add anonymous block to block table.无法将匿名块添加到块表\n");
  29.                          return es;
  30.                  }
  31.                  if ((es = pBlockTable->close()) != Acad::eOk)
  32.                  {
  33.                          acutPrintf(L"Could not close block table.\n");
  34.                          return es;
  35.                  }
  36.                  if ((es = pAnonBlock->close()) != Acad::eOk)
  37.                  {
  38.                          acutPrintf(L"Could not close block table record.\n");
  39.                          return es;
  40.                  }
  41.          }
  42.          AcDbObjectPointer<AcDbBlockTableRecord> pAnonBlockObjectPtr(idAnonBlock, AcDb::kForWrite);
  43.          if ((es = pAnonBlockObjectPtr.openStatus()) != Acad::eOk)
  44.          {
  45.                  acutPrintf(L"Could not open anonymous block.\n");
  46.                  return es;
  47.          }
  48.          for (int cnt = 0; cnt < selectedIds.length(); cnt++)
  49.          {
  50.                  AcDbObjectId entId = selectedIds.at(cnt);
  51.                  AcDbObjectPointer<AcDbEntity> pEntity(entId, AcDb::kForWrite);
  52.                  if (Acad::eOk == pEntity.openStatus())
  53.                  {
  54.                          AcDbEntity *pCloneEnt = (AcDbEntity *)pEntity->clone();
  55.                          if ((es = pAnonBlockObjectPtr->appendAcDbEntity(pCloneEnt)) != Acad::eOk)
  56.                          {
  57.                                  acutPrintf(L"Could not append entity to anonymous block.\n");
  58.                                  return es;
  59.                          }
  60.                          if ((es = pCloneEnt->close()) != Acad::eOk)
  61.                          {
  62.                                  acutPrintf(L"Could not close entity.\n");
  63.                                  return es;
  64.                          }
  65.           pEntity->erase();
  66.                   pEntity->close();
  67.                  }
  68.          }
  69.          return Acad::eOk;
  70. }
  71. static AcDbObjectId CreateBlock1(const CString &blkName, const AcDbObjectIdArray &idObjectArray, const AcGeScale3d &m采用aScale, const double &m采用angle)
  72. {
  73.          Acad::ErrorStatus es;
  74.          AcDbBlockTable *pBlkTbl = NULL;
  75.          acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);
  76.          AcDbBlockTableRecord *pBlkRcd = new AcDbBlockTableRecord();
  77.          es = pBlkRcd->setName(blkName);
  78.          AcDbObjectId blkDefId;
  79.          pBlkTbl->add(blkDefId, pBlkRcd);
  80.          pBlkTbl->close();
  81.          AcDbObjectId entId;
  82.          for (INT32 i = 0; i < idObjectArray.length(); i++)
  83.          {
  84.                  AcDbEntity *pEntity = NULL;
  85.                  acdbOpenAcDbEntity(pEntity, idObjectArray.at(i), AcDb::kForWrite);
  86.                  //TB: You can't append an entity to another block that is already in the modelspace.
  87.                  //Instead clone it and append the clone:
  88.                  AcDbEntity *pNewEntity = AcDbEntity::cast(pEntity->clone());
  89.                  es = pBlkRcd->appendAcDbEntity(entId, pNewEntity);
  90.                  if (es)
  91.                          delete pNewEntity;
  92.                  else
  93.                          pNewEntity->close();
  94.                  pEntity->erase();
  95.                  pEntity->close();
  96.          }
  97.          pBlkRcd->close();
  98.          AcDbBlockReference *pBlkRef = new AcDbBlockReference(AcGePoint3d::kOrigin, blkDefId); //TB was entId
  99.          pBlkRef->setScaleFactors(m采用aScale);
  100.          //TB: I assume that PostToModelSpace(ent) closes the entity. So you must...
  101.          pBlkRef->setRotation(m采用angle); // ...do this 采用before采用 PostToModelSpace().
  102.          PostToModelSpace(pBlkRef);
  103.          return entId;
  104. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 14:21 , Processed in 0.151919 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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