鎖定、解鎖圖紙(多重插入塊)
阿新 • • 發佈:2022-04-01
最近看了中望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);
}