【删除未使用块】

获取全部块定义ID

bool GetBTRIdOnDb(AcDbObjectIdArray& arrBTRId, AcDbDatabase* pDb /*= acdbCurDwg()*/)
{
	AcDbBlockTablePointer pBlkTbl(pDb, AcDb::kForRead);

	if (Acad::eOk != pBlkTbl.openStatus())
	{
		return false;
	}

	AcDbBlockTableIterator* pIt = NULL;

	if (Acad::eOk != pBlkTbl->newIterator(pIt))
	{
		return false;
	}

	for (pIt->start(); !pIt->done(); pIt->step())
	{
		AcDbBlockTableRecord* pBTRecord = NULL;

		if (Acad::eOk == pIt->getRecord(pBTRecord, AcDb::kForRead))
		{
			if (!pBTRecord->isLayout())
			{
				arrBTRId.append(pBTRecord->objectId());
			}
			
			pBTRecord->close();
		}
	}

	DEL(pIt);
	return true;
}

获取未使用块定义


bool GetUnusedBTRId(AcDbObjectIdArray& arrUnusedId)
{
	AcDbObjectIdArray arrBTRId;
	if (!GetBTRIdOnDb(arrBTRId))
	{
		return false;
	}

	for (int i = 0; i < arrBTRId.length(); i++)
	{
		auto id = arrBTRId.at(i);
		AcDbBlockTableRecordPointer pBTRecord(id, AcDb::kForRead);
		if (Acad::eOk != pBTRecord.openStatus())
		{
			continue;
		}

		AcDbObjectIdArray arrBlkRecId;
		if (Acad::eOk != pBTRecord->getBlockReferenceIds(arrBlkRecId))
		{
			continue;
		}
		
		// isAnonymous判断是否是匿名块
		if (arrBlkRecId.length() == 0)// && !pBTRecord->isAnonymous())
		{
			arrUnusedId.append(id);
		}
	}

	return true;
}

删除未使用块定义

bool Delete()
{
	AcDbObjectIdArray arrUnusedId;
	
	//while循环 删除未使用块定义嵌套,防止块定义被其他未使用块定义使用
	do
	{
		arrUnusedId.removeAll();
		
		if (!GetUnusedBTRId(arrUnusedId))
		{
			return false;
		}
		
		for (int i = 0; i < arrUnusedId.length(); i++)
		{
			AcDbBlockTableRecordPointer pBlkTblRcd(arrUnusedId.at(i), AcDb::kForWrite);
	
			if (Acad::eOk != pBlkTblRcd.openStatus())
			{
				continue;
			}
	
			pBlkTblRcd->erase();
		}
		
	} while (arrUnusedId.length() != 0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值