objectARX 定義ブロック、定義ブロックの削除、またはクイック リファレンス

1. ブロックの定義方法

2. 定義に従ってブロックを削除(ブロック参照)

ステップ 1: ブロック定義名でエンティティ ID リストを検索する

現在のグラフ データベース --> ブロック テーブル --> ブロック定義がブロック テーブルに存在するかどうかを確認 --> 存在し、名前を定義してエンティティ ID リストを検索します

ステップ 2: ブロック テーブルのエンティティ ID を調べます。定義されたブロック ID リストに属し、ブロック参照がある場合は、エンティティを不透明に設定します。

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