1. 如何定义块
2. 根据定义删除块(块参照)
第一步:通过块定义名称找到实体idlist
当前图形数据库-->块表-->检查该块定义是否在块表存在-->存在,则通过定义名称,找到实体idlist
第二步:遍历块表的实体id,若属于某定义块idlist且存在块参照,则设置实体为不透明;
setColorIndex //对于单色OLED,此函数功能为是否显示对象。可以理解为透明还是不透明。对于有灰度值的屏幕则是一个灰度值,此函数功能为设置实体的颜色
1)方法定义u8g.setColorIndex(uint8_t color_index)
2)参数
color_index:
①1:表示显示,不透明②0:表示不显示,透明。
pBlkTblRcd->newIterator(pIte) 遍历
pEnt->isKindOf(AcDbBlockReference::desc())
::desc() 返回调用该函数的对象类型;
ClassA调用isKindOf(classB) 若ClassA与ClassB一致,或者递归ClassA父类,存在ClassA是ClassB的派生类,则为true
void CArrowsBlock::DeleteBlockRefByBlockName( CString& strBlockName )
{
AcDbObjectId objId;
bool bBlock = CArrowsBlock::IsBlock(strBlockName,objId);
acutPrintf(_T("\n bBlock = %d"),bBlock);
// 获得当前图形数据库的块表
AcDbBlockTable *pBlkTbl;
acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlkTbl, AcDb::kForWrite);
// 创建新的块表记录
AcDbBlockTableRecord *pBlkTblRcd = NULL;
pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlkTblRcd,kForRead);
pBlkTbl->close();
AcDbBlockTableRecordIterator *pIte = NULL;
Acad::ErrorStatus es;
es = pBlkTblRcd->newIterator(pIte);
AcDbEntity *pEnt = NULL;
int i = 0;
for(pIte->start(); !pIte->done(); pIte->step())
{
i++;
acutPrintf(_T("\n i = %d"),i);
pIte->getEntity(pEnt,AcDb::kForWrite);
if (pEnt->id() == objId)
{
bool dd = pEnt->isKindOf(AcDbBlockReference::desc());
acutPrintf(_T("\n 块参照 = %d"),dd);
if (dd)
{
es = pEnt->setColorIndex(1);
}
}
pEnt->close();
}
delete pIte;
pBlkTblRcd->close();
}
bool CArrowsBlock::IsBlock(const CString& strBlkName,AcDbObjectId& blkDefId)
{
// 获得块定义名称
CString strBlkDef = strBlkName;
// 获得当前数据库的块表
AcDbBlockTable *pBlkTbl;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);
// 查找用户指定的块定义是否存在
if (!pBlkTbl->has(strBlkDef))
{
acutPrintf(_T("\n 当前图形中未包含指定名称的块定义!"));
pBlkTbl->close();
return false;
}
else
{
acutPrintf(_T("\n 当前图形中找到!"));
// 获得用户指定的块表记录
pBlkTbl->getAt(strBlkDef, blkDefId);
acutPrintf(_T("\n ID = %x!"),blkDefId);
pBlkTbl->close();
return true;
}
}
3.如何定义组
创建实体并编组
static void MyGroupMyCommand7() {
// Put your command code here
acutPrintf(TEXT("\nHello world! make groupname"));
MyGroupMyCommand6();
// 创建带组名实体,并删除指定组名实体
//提示用户选择多个实体
TCHAR* prompts[2] = { _T("\n请选择实体"),_T("删掉一个实体") };
ads_name ss;
if (RTNORM != acedSSGet(_T(":$"), prompts, NULL, NULL, ss))
return;
Adesk::Int32 lLen;
acedSSLength(ss, &lLen);
AcDbObjectId id;
AcDbGroup* pGroup = new AcDbGroup;
for (Adesk::Int32 i = 0; i < lLen; i++)
{
ads_name ent;
if (RTNORM == acedSSName(ss, i, ent))
{
if (Acad::eOk == acdbGetObjectId(id, ent))
{
pGroup->append(id);
}
}
}
AcDbDictionary* pGroupDict = NULL;
acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
// 提示用户输入group的名称
TCHAR sGroupName[40];
if (acedGetString(NULL, TEXT("\n输入用户坐标系的名称:"), sGroupName) != RTNORM)
return;
CString sGroupName = _T("test2"); //匿名组的名称为“*”
AcDbObjectId idGroup;
Acad::ErrorStatus es;
es = pGroupDict->setAt(sGroupName, pGroup, idGroup);
pGroup->close();
pGroupDict->close();
}
4.根据组名删除块(清除组)
当前图形数据库-->组字典-->组名对应组id-->组id对应组实体-->遍历组实体的实体,打开并删除
pGroup->erase() 编组删除
pEnty->erase() 实体删除
static void MyGroupMyCommand8() {
// Put your command code here
acutPrintf(TEXT("\nHello world! make delgroupname"));
//遍历组字典,判断是否包含了给定的实体
AcDbDictionary *pGroupDict = NULL;
acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
AcDbDictionaryIterator *it = pGroupDict->newIterator();
for (; !it->done(); it->next())
{
AcDbGroup *pGroup = NULL;
if (it->getObject((AcDbObject*&)pGroup, AcDb::kForWrite) == Acad::eOk)
{
acutPrintf(TEXT("\npGroup->name()="));
acutPrintf(pGroup->name());
CString sGroupName = _T("RED");
if (sGroupName.Compare((LPCTSTR)pGroup->name())==0)
{
acutPrintf(TEXT("\npGroup->name()======"));
acutPrintf(pGroup->name());
AcDbObjectIdArray arrIds;
pGroup->allEntityIds(arrIds); //得到组中所有实体的ID
if (!arrIds.isEmpty())
{
AcDbEntity *pEnty = NULL;
Acad::ErrorStatus es;
int j;
for (j = 0; j < arrIds.length(); j++)
{
es = acdbOpenObject(pEnty, arrIds.at(j), AcDb::kForWrite);
if (Acad::eOk == es)
{
pEnty->erase(); //删除组中包含的实体
pEnty->close();
}
}
}
pGroup->erase();//删除组
}
else {
acutPrintf(TEXT("\npGroup->name()=!!!!!!====="));
acutPrintf(pGroup->name());
}
pGroup->close();
}
}
pGroupDict->close();
}