ObjectArx 选择实体创建块参照
问题:想要把多个CAD实体整体调整比例,可以用来对齐调整。
思路:
将要调整的多个实体整体做成一个 块参照 ,然后设置块参照的属性即可实现多个实体整体调整。
(这里仅以选择一个实体并添加至新创建的块参照中为例。)
解决:
1、选择实体
AcDbObjectId SelectEnt()
{
ads采用name ent;
ads采用point pt;
AcDbObjectId entId = AcDbObjectId::kNull;
int ret = RTNORM;
ret = acedEntSel(采用T("\nSelect Entity: "), ent, pt);
if (RTNORM != ret)
return entId;
acdbGetObjectId(entId, ent);
return entId;
}
2、获取指定块表,没有则创建
AcDbObjectId GetBlkId(const CString& sBlkName, bool bCreate)
{
AcDbObjectId idBlk = AcDbObjectId::kNull;
// 获取指定块表ID 没有则添加
AcDbBlockTablePointer pTable(acdbCurDwg(), AcDb::kForRead);
if (pTable.openStatus() != Acad::eOk)
return idBlk;
if (pTable->has(sBlkName))// 有指定块表直接获取ID
{
pTable->getAt(sBlkName, idBlk);
}
else if(bCreate)// 没有指定块表 且允许创建 则创建指定块表
{
AcDbBlockTableRecord* pRecord = new AcDbBlockTableRecord();
pRecord->setName(sBlkName);
if (pTable->add(idBlk, pRecord) == Acad::eOk)
pRecord->close();
else
delete pRecord;
}
return idBlk;
}
3、将选择实体添加至新创建的块参照中,并设置属性
void testCreateBlock()
{
// 选择实体创建块参照
AcDbObjectId entId = SelectEnt();
if (entId.isNull())
{
acutPrintf(采用T("选择实体失败"));
return;
}
//获取指定块表Id
AcDbObjectId idRec = GetBlkId(采用BLOCK采用Test采用, true);
if (idRec.isNull())
{
acutPrintf(采用T("获取%s块表Id失败"), 采用BLOCK采用Test采用);
return;
}
AcDbEntityPointer pEnt(entId, AcDb::kForRead);
if (pEnt.openStatus() != Acad::eOk)
{
acutPrintf(采用T("打开实体失败"));
return;
}
//打开新的块表记录 添加实体至新块表中
AcDbBlockTableRecordPointer pBlkNew(idRec, AcDb::kForWrite);
if (pBlkNew.openStatus() != Acad::eOk)
return;
pBlkNew->appendAcDbEntity(pEnt);
// 打开当前块表
AcDbBlockTablePointer pBlkTable(acdbCurDwg(), AcDb::kForRead);
if (pBlkTable.openStatus() != Acad::eOk)
return;
AcGePoint3d ptInsert = AcGePoint3d::kOrigin;
// 创建块参照
AcDbObjectPointer<AcDbBlockReference> pBlkRef;
if (pBlkRef.create() != Acad::eOk)
return;
pBlkRef->setDatabaseDefaults();
pBlkRef->setPosition(ptInsert);
pBlkRef->setBlockTableRecord(idRec);
// 缩放块 两种方法:
// 1、通过缩放比例缩放
pBlkRef->setScaleFactors(1);//缩放比例
// 2、通过缩放矩阵缩放
AcGeMatrix3d scaleMat;
scaleMat.setToScaling(3, ptInsert);
pBlkRef->transformBy(scaleMat);
// 旋转块 两种方法
// 1、通过旋转角度旋转
pBlkRef->setRotation(0);//旋转角度
// 2、通过旋转矩阵旋转
AcGeMatrix3d rotateMat;
rotateMat.setToRotation(3.1415926 * 0.5, AcGeVector3d::kZAxis, ptInsert);
pBlkRef->transformBy(rotateMat);
// 打开当前空间的块表记录
AcDbBlockTableRecordPointer pBlkRcd(curDoc()->database()->currentSpaceId(), AcDb::kForWrite);
if (pBlkRcd.openStatus() != Acad::eOk)
return;
// 添加块参照到数据库
pBlkRcd->appendAcDbEntity(pBlkRef);
return;
}
页:
[1]