admin 发表于 2024-2-12 22:24:03

判断一个图块是否为动态块isDynamicBlock

      bool IsThisDynamicBlockByXData(AcDbBlockReference *pBlockReference) {
        AcDbObjectId idDynBTR; // We are looking for this: The named dynamic "root block".

        AcDbObjectId idBTR = pBlockReference->blockTableRecord();
        AcDbBlockTableRecord *pBTR;
        Acad::ErrorStatus es;
        es = acdbOpenObject(pBTR, idBTR, AcDb::kForRead);
        if (!es) {
                if (pBTR->isAnonymous()) {
                        resbuf *rbx = pBTR->xData(L"AcDbBlockRepBTag");
                        if (rbx) {
                                //The resbuf list looks like this:
                                //1001, "AcDbBlockRepBTag",                        kDxfRegAppName
                                //1070, 1                                        kDxfXdInteger16
                                //1005, <Handle of the dynamic root block>,        kDxfXdHandle
                                //walk to kDxfXdHandle
                                for (resbuf *r = rbx; r; r = r->rbnext) {
                                        if (r->restype == AcDb::kDxfXdHandle)        {
                                                AcDbDatabase *pDb = pBlockReference->database();
                                                AcDbHandle handle(r->resval.rstring);
                                                es = pDb->getAcDbObjectId(idDynBTR, false, handle);
                                                if (!es)
                                                        break; // success!
                                        }
                                }
                                acutRelRb(rbx);
                        }
                }
                else
                        idDynBTR = idBTR; // If it isn't anonymous, it must be the dynamic block itself
        }

        bool bIsDynamic = false;
        if (!es && !idDynBTR.isNull())        {
                AcDbDynBlockTableRecord testDynBtr(idDynBTR);
                if (bIsDynamic = testDynBtr.isDynamicBlock())         {
                        // verify that idBTR is an anonymous block from idDynBTR
                        AcDbObjectIdArray anonymousIds;
                        es = testDynBtr.getAnonymousBlockIds(anonymousIds);
                        if (!anonymousIds.contains(idBTR)){
                                acutPrintf(L"\nVerificatio FAILED!");
                                bIsDynamic = false;
                        }
                }

                if (bIsDynamic) {
                        es = acdbOpenObject(pBTR, idDynBTR, AcDb::kForRead);
                        if (!es)        {
                                const ACHAR *pBlockName = nullptr;
                                pBTR->getName(pBlockName);
                                acutPrintf(L"\nDynamic BREF to block '%s'.", pBlockName);
                                pBTR->close();
                        }
                }
        }
        return bIsDynamic;
}

admin 发表于 2024-2-12 22:24:20

bool IsThisDynamicBlock(AcDbBlockReference *pBlockReference)
{
        bool bIsDynamicBlock;
        bIsDynamicBlock = AcDbDynBlockReference::isDynamicBlock(pBlockReference->blockTableRecord());
        //or:
        AcDbDynBlockTableRecord testDynBtr(pBlockReference->blockTableRecord());
        bIsDynamicBlock = testDynBtr.isDynamicBlock();
        return bIsDynamicBlock;
}
页: [1]
查看完整版本: 判断一个图块是否为动态块isDynamicBlock