objectARX 定义块、删除定义块或快参照

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();
	}

猜你喜欢

转载自blog.csdn.net/u012151242/article/details/130594725