It would be good to see an Interop COM solution I am struggling to access the BlockTableRecord of a Dynamic Block. Any pointers would be great 🙂
TIA
Mark
@mark.electricaldesign wrote:
It would be good to see an Interop COM solution I am struggling to access the BlockTableRecord of a Dynamic Block. Any pointers would be great 🙂
TIA
Mark
Dynamic Blocks are more tricky than normally scaled blocks.
I recommend to use ArxDbg.arx (<ARXDIR>\samples\database\ARXDBG) and the commands SNOOPDB / SNOOPENTS to analyze dynamic BREFs/BTR.
Whenever you create a "dynamic BREF" an unnamed block (AcDbBlockTableRecord named "*U<n>") will be created and referenced. This block contains entities that are adjustet to the parameter set used.
Here is a (C++) function that I use to find out whether a BREF or BTR is dynamic. Maybe it helps you to understand the API.
bool isDynamicBlock(const AcDbObjectId &objId) { AcDbObject *pObj; AcDbBlockReference *pBref; AcDbBlockTableRecord *pBTR; Acad::ErrorStatus es; AcDbObjectId blockTableRecordId; bool bIsDynamic = false; // Is objId a BREF or a BTR? es = acdbOpenObject(pObj, objId, AcDb::kForRead); if (es==Acad::eOk) { if (pBref = AcDbBlockReference::cast(pObj)) { blockTableRecordId = pBref->blockTableRecord(); AcDbDynBlockReference dynBlockRef(pBref); // dynBlockRef.isDynamicBlock(); is not enough! // Only returns true for direct BREF to the dynamic source-block! AcDbObjectId dynBTRid = dynBlockRef.dynamicBlockTableRecord(); if (!dynBTRid.isNull()) bIsDynamic = AcDbDynBlockReference::isDynamicBlock(dynBTRid); } else if (pBTR = AcDbBlockTableRecord::cast(pObj)) { blockTableRecordId = objId; } pObj->close(); if (!bIsDynamic) bIsDynamic = AcDbDynBlockReference::isDynamicBlock(blockTableRecordId); } return bIsDynamic; }
Note that the function will return false if objId is the ID of the unnamed BTR.