提示:看之前的博客(1)和(4),那里已经分析了创建一个图形对象的基本过程,在之前的基础上本节开始就要将着眼点放在创建实体的参数上。
(1)ObjectARX2015 + vs2012创建直线_qq_42981953的博客-CSDN博客
(4)ObjectARX2015 + vs2012扩展绘制直线的功能为绘制实体_qq_42981953的博客-CSDN博客
1. 说明
本篇介绍: 提示用户选择所要填充的对象,然后根据用户选择的结果为该区域创建图案填充。
2. 思路
AcDbHatch 类代表 AutoCAD 中的填充对象,该类的构造函数仅创建一个空的填充对象,要想创建填充对象,必须按照下面的步骤进行:
(1
)创建一个空的填充对象。
(2)指定填充对象所在的平面。
(3)设置填充对象的关联性;
(4)指定填充图案;
(5)添加填充边界;
(6)显示填充对象;
(7)将其添加到模型空间;
(8)如果是关联性的填充,将填充对象与边界绑定。
3. 步骤
(1) 在CreateEnts类中,添加一个 CreateHatch 函数,用于根据一组首尾连接的对象创建填充。该函数的输入参数为组成填充边界的对象 ID 数组、填充图案的名称和填充的关联性.
//创建填充
AcDbObjectId CreateHatch(AcDbObjectIdArray objIds, const TCHAR* patName, bool bAssociative);//创建填充
//创建填充
//在 ObjectARX 使用 appendLoop 函数来向填充对象添加边界,该函数定义为:
/*
Acad::ErrorStatus appendLoop(
Adesk::Int32 loopType, //第一个参数指定了边界类型;
const AcDbObjectIdArray& dbObjIds); //第二个参数输入一组实体的 ID,用来定义填充边界。
*/
AcDbObjectId CCreateEnt::CreateHatch(AcDbObjectIdArray objIds, const TCHAR* patName, bool bAssociative)
{
Acad::ErrorStatus es;
AcDbHatch *pHatch = new AcDbHatch();
// 设置填充平面
AcGeVector3d normal(0, 0, 1);
pHatch->setNormal(normal);
pHatch->setElevation(0);
// 设置关联性
pHatch->setAssociative(bAssociative);
// 设置填充图案
pHatch->setPattern(AcDbHatch::kPreDefined, patName);
// 添加填充边界
es = pHatch->appendLoop(AcDbHatch::kExternal, objIds);
// 显示填充对象
es = pHatch->evaluateHatch();
// 添加到模型空间
AcDbObjectId hatchId;
hatchId = CCreateEnt::PostToModelSpace(pHatch);
// 如果是关联性的填充,将填充对象与边界绑定,以便使其能获得边界对象修改的通知
if (bAssociative)
{
AcDbEntity *pEnt;
for (int i = 0; i < objIds.length(); i++)
{
es = acdbOpenAcDbEntity(pEnt, objIds[i],
AcDb::kForWrite);
if (es == Acad::eOk)
{
// 添加一个永久反应器
pEnt->addPersistentReactor(hatchId);
pEnt->close();
}
}
}
return hatchId;
}
(2) 在acrxEntryPoint.cpp中
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyDrawHatch, MyDrawHatch, ACRX_CMD_MODAL, NULL) //画填充
//当前项目中注册一个命令 AddHatch
static void MidasMyGroupMyDrawHatch()
{
// 提示用户选择填充边界
ads_name ss;
int rt = acedSSGet(NULL, NULL, NULL, NULL, ss);
AcDbObjectIdArray objIds;
// 初始化填充边界的ID数组
if (rt == RTNORM)
{
long length;
acedSSLength(ss, &length);
for (int i = 0; i < length; i++)
{
ads_name ent;
acedSSName(ss, i, ent);
AcDbObjectId objId;
acdbGetObjectId(objId, ent);
objIds.append(objId);
}
}
acedSSFree(ss); // 释放选择集
CCreateEnt m_createEnt;
m_createEnt.CreateHatch(objIds, _T("SOLID"), true);
}
效果展示
(1) 画一个三角形
(2) 输入命令: MyDrawHatch
(3) 回车键后选择线段
(4) 回车键