锁定、解锁图纸(多重插入块)

最近看了中望CAD上的锁定解锁图纸,发现其实是通过多重插入块来实现的,其设置的密码也毫无意义,对通过ARX代码来解锁毫无影响。下面是个人写的通过多重插入块锁定解锁的代码。注:使用了ArxDbg代码,ArxDbg见objectArx 安装目录下,例如:C:ObjectARX\samples\database\ARXDBG

void CLockDwg::doLockDwg()
{
	auto state = m_selset.userSelect(L"请选择需要锁定的对象:", L"请选择需要移除的对象:");
	if (state != ArxDbgSelSet::kSelected)
	{
		return;
	}

	AcDbBlockTableRecord *pBlkTblRec = ArxDbgUtils::openCurrentSpaceBlock(AcDb::kForRead, acdbCurDwg());

	AcDbExtents extents;
	extents.addBlockExt(pBlkTblRec);
	pBlkTblRec->close();

	m_basePt = AcGePoint3d(extents.minPoint().x, extents.maxPoint().y, 0);

	AcDbObjectId blkdefId;
	AcDbBlockTableRecord *pNewBlkTblRec;
    //创建匿名块
	ArxDbgUtils::defineNewAnonymousBlock(pNewBlkTblRec, blkdefId, acdbCurDwg());
	pNewBlkTblRec->setOrigin(m_basePt);
	pNewBlkTblRec->close();
	AcDbObjectIdArray selectIds;
	m_selset.asArray(selectIds);
    
	ArxDbgUtils::cloneObjects(acdbCurDwg(), selectIds, blkdefId, false);
    
    //创建多重插入块
	AcDbMInsertBlock *pMinsertBlk = new AcDbMInsertBlock(m_basePt, blkdefId, 1, 1, 0, 0);

	ArxDbgUtils::addToCurrentSpaceAndClose(pMinsertBlk);
    

    for(int i = 0; i < selectIds.length(); i++)
	{
		AcDbEntityPointer pEnt(selectIds[i],AcDb::kForWrite);
		pEnt->erase();
		pEnt->close();
	}

}
void CLockDwg::doUnLockDwg()
{
	struct resbuf *rb;
	rb = acutBuildList(100,L"AcDbMInsertBlock",RTNONE);
	m_selset.setAllowSingleOnly(true,false);
	m_selset.userSelect(L"请选择需要解锁的实体",L"请选择要移除的实体:",rb);
	
	AcDbObjectIdArray idArr;
	m_selset.asArray(idArr);

	AcDbMInsertBlock *pMInsert;
	acdbOpenObject(pMInsert,idArr.at(0),AcDb::kForWrite);
	AcDbObjectId blkTblRecId = pMInsert->blockTableRecord();

	AcDbDatabase *pCurDb = acdbCurDwg();
	
	AcDbDatabase *pOutPutDb = NULL;
	pCurDb->wblock(pOutPutDb,blkTblRecId);

	pCurDb->insert(AcGeMatrix3d(),pOutPutDb);
	pOutPutDb = NULL;

	pMInsert->erase();
	pMInsert->close();

	delete pOutPutDb;
	acutRelRb(rb);
}

关注公众号,回复ZWCAD,获取中望CAD2014-2020各版本ZRXSDK!

锁定、解锁图纸(多重插入块)_第1张图片

你可能感兴趣的:(objectarx)