找回密码
 立即注册

QQ登录

只需一步,快速开始

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

定义一个全局命令,功能:使用类库创建一个块表记录,并插入块;

[复制链接]

1

主题

0

回帖

43

积分

管理员

积分
43
发表于 2024-3-14 20:36:59 | 显示全部楼层 |阅读模式
  1. static void TESTaddblkcmd()  
  2. {  
  3.         ////根据用户的输入设置块表记录的名称  
  4.         CString blkName;  
  5.         if (acedGetString(Adesk::kFalse,采用T("\n输入块名称"),blkName.GetBuffer(20)) != RTNORM)  
  6.         {  
  7.                 return;  
  8.         }  
  9.         ////用完getBuffer要及时release  
  10.         blkName.ReleaseBuffer();  
  11.         AcDbBlockTable* pBlkTbl;  
  12.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl,AcDb::kForWrite);  
  13.         AcDbObjectId rcdId ;  
  14.         ////如果没有,添加新的  
  15.         if (!pBlkTbl->has(blkName))  
  16.         {  
  17.                 ////创建新块  
  18.                 AcDbBlockTableRecord* pBlkTblRcd;  
  19.                 pBlkTblRcd = new AcDbBlockTableRecord();  
  20.                 pBlkTblRcd->setName(blkName);  
  21.                 ////将块表记录添加到块表中,设置ID  
  22.                 pBlkTbl->add(rcdId,pBlkTblRcd);  
  23.                 ////向块表记录中添加实体  
  24.                 AcGePoint3d ptStart(-10,0,0),ptEnd(10,0,0);  
  25.                 AcDbLine* pLine1 = new AcDbLine(ptStart,ptEnd);  
  26.                 ptStart.set(0,-10,0);  
  27.                 ptEnd.set(0,10,0);  
  28.                 AcDbLine *pLine2 = new AcDbLine(ptStart,ptEnd);  
  29.                 AcGeVector3d vecNormal(0,0,1);  
  30.                 AcDbCircle *pCircle = new AcDbCircle(AcGePoint3d::kOrigin,vecNormal,6);  
  31.                 AcDbObjectId entId;  
  32.                 pBlkTblRcd->appendAcDbEntity(entId,pLine1);  
  33.                 pBlkTblRcd->appendAcDbEntity(entId,pLine2);  
  34.                 pBlkTblRcd->appendAcDbEntity(entId,pCircle);  
  35.                 ////关闭实体块表记录  
  36.                 pLine1->close();  
  37.                 pLine2->close();  
  38.                 pCircle->close();  
  39.                 pBlkTblRcd->close();  
  40.         }////如果已经有了,那就根据名字读出RECORDID,插入块参照时会用到  
  41.         else  
  42.         {  
  43.                 pBlkTbl->getAt(blkName,rcdId,false);////以读的方式获取  
  44.         }  
  45.         ////在和用户交互之前,需要关闭块表,否则容易出错  
  46.         pBlkTbl->close();  
  47.         ////插入块  
  48.         ////获得用户输入的块参照的插入点  
  49.         ads采用point pt;  
  50.         if(acedGetPoint(NULL,采用T("\n输入块参照的插入点"),pt) != RTNORM)  
  51.         {  
  52.                 pBlkTbl->close();  
  53.                 return;  
  54.         }  
  55.         AcGePoint3d ptInsert = asPnt3d(pt);  
  56.         ////创建块参照  
  57.         AcDbBlockReference* pBlkRef = new AcDbBlockReference(ptInsert,rcdId);  
  58.         ////将块参照添加到模型空间  
  59.         AcDbBlockTableRecord* pBlkTblRcd2;  
  60.         pBlkTbl->getAt(ACDB采用MODEL采用SPACE,pBlkTblRcd2,AcDb::kForWrite);  
  61.         pBlkTblRcd2->appendAcDbEntity(pBlkRef);  
  62.         ////关闭数据库对象  
  63.         pBlkRef->close();  
  64.         pBlkTblRcd2->close();  
  65.         pBlkTbl->close();  
  66. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-10 21:33 , Processed in 0.121609 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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