|
[code]所有的实体都保存在块表记录中,而块表记录则存储在块表中。实际上,用户在
AutoCAD 中定义块相当于增加了一个块表记录,块表记录的名称就是块定义的名称。
创建块定义的一般步骤(仿照在图形数据库中创建实体的步骤)
(1)获得当前图形数据库的块表,向其中添加一条新的块表记录。
(2)创建组成块定义的实体,将其添加到新的块表记录中。
(3)关闭块表、块表记录和新创建的实体。
3. 步骤
(1)用户输入块定义的名称,使用 acedGetString 函数来获得用户输入的字符串,
acedGetString 函数函数定义为:
//acedGetString 函数函数定义为
//使用 acedGetString 函数来获得用户输入的字符串
int acedGetString(
int cronly, //cronly 指定用户输入的字符串中是否可以包含空格,可以输入 Adesk::kTrue 或者 Adesk::kFalse
const char * prompt, //prompt 指定了在命令行提示用户输入的文本
char * result); //result 则保存了用户输入的结果
(2)在CCreateEnt中添加函数AddBlk()
//添加块
static void AddBlk(); //添加块
//添加块
void CCreateEnt::AddBlk()
{
// 获得当前图形数据库的块表
AcDbBlockTable *pBlkTbl;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);
// 创建新的块表记录
AcDbBlockTableRecord *pBlkTblRcd;
pBlkTblRcd = new AcDbBlockTableRecord();
// 根据用户的输入设置块表记录的名称
TCHAR blkName[40];
if (acedGetString(Adesk::kFalse, _T("\n输入图块的名称:"), blkName) != RTNORM)
{
pBlkTbl->close();
delete pBlkTblRcd;
return;
}
pBlkTblRcd->setName(blkName);
// 将块表记录添加到块表中
AcDbObjectId blkDefId;
pBlkTbl->add(blkDefId, pBlkTblRcd);
pBlkTbl->close();
// 向块表记录中添加实体
AcGePoint3d ptStart(-10, 0, 0), ptEnd(10, 0, 0);
AcDbLine *pLine1 = new AcDbLine(ptStart, ptEnd); // 创建一条直线
ptStart.set(0, -10, 0);
ptEnd.set(0, 10, 0);
AcDbLine *pLine2 = new AcDbLine(ptStart, ptEnd); // 创建一条直线
AcGeVector3d vecNormal(0, 0, 1);
AcDbCircle *pCircle = new AcDbCircle(AcGePoint3d::kOrigin, vecNormal, 6);
AcDbObjectId entId;
pBlkTblRcd->appendAcDbEntity(entId, pLine1);
pBlkTblRcd->appendAcDbEntity(entId, pLine2);
pBlkTblRcd->appendAcDbEntity(entId, pCircle);
// 关闭实体和块表记录
pLine1->close();
pLine2->close();
pCircle->close();
pBlkTblRcd->close();
}
(3)在acrxEntryPoint.cpp中
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyAddBlk, MyAddBlk, ACRX_CMD_MODAL, NULL) //创建块
//当前项目中注册一个命令 AddBlk
static void MidasMyGroupMyAddBlk()
{
//添加长方体
CCreateEnt::AddBlk();
}
效果展示:
————————————————
版权声明:本文为CSDN博主「qq_42981953」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42981953/article/details/121889382[/code] |
|