Тема: Custom cвойства динамического блока.

Может плохо искал, но ничего не нашел по такому вопросу: есть имя блока, требуется проверить является ли он динамическим и если да, извлечь список custom свойств. Можно ли как-то через AcDbBlockTableRecord извлечь свойства дин. блока?

Re: Custom cвойства динамического блока.

Посмотри описания: AcDbDynBlockTableRecord/AcDbDynBlockReference/AcDbDynBlockReferenceProperty

Re: Custom cвойства динамического блока.

AcDbDynBlockTableRecord  - а такой есть?

Re: Custom cвойства динамического блока.

Через AcDbDynBlockReference их извлечь-то можно. Так  мне что, искать вхождения блоков и таким образом извлекать custom свойства? А как же извлечь, если нет ни одного вхождения?

Re: Custom cвойства динамического блока.

Можно наверное создать временно, не добавляя в базу чертежа. Попробую...

Re: Custom cвойства динамического блока.

В 2009 есть.
Посмотри на такую заготовочку:

static void DynBlockTest(void)
{
  ads_name en; ads_point p;
  if (acedEntSel(_T("\nPick dynamic block: "),en,p) == RTNORM) {
    AcDbObjectId eId; acdbGetObjectId(eId,en);
    AcDbObjectPointer<AcDbBlockReference> pBlkRef(eId,AcDb::kForRead);
    if (pBlkRef.openStatus() == Acad::eOk) {
      AcDbObjectId idBlkTblRec = pBlkRef->blockTableRecord();
      if (AcDbDynBlockReference::isDynamicBlock(idBlkTblRec)) {
        AcDbDynBlockReference dynBlk(eId);
        AcDbDynBlockReferencePropertyArray aProps;
        dynBlk.getBlockProperties(aProps);
        if (aProps.length() > 0) {
          for (int i=0; i < aProps.length(); i++) {
            AcDbDynBlockReferenceProperty prop = aProps[i];
            acutPrintf(_T("\nProperty name: %s"),prop.propertyName().kTCharPtr());
          }
        }
      } else {
        acutPrintf(_T("\nSelected block is not dynamic!"));
      }
    } else {
      acutPrintf(_T("\nError: %s"),acadErrorStatusText(pBlkRef.openStatus()));
    }
  }
}

Re: Custom cвойства динамического блока.

P.S.: Если нет ни одной вставки, то тебе поможет статический метод:

static bool AcDbDynBlockReference::isDynamicBlock(AcDbObjectId [b]blockTableRecordId[/b]);

Re: Custom cвойства динамического блока.

Спасибо,Александр! Здесь все понятно. Но у меня на входе только имя блока. Вот если бы был статический метод getBlockProperties, принимающий в качестве параметра blockTableRecordId, тогда было бы вообще все отлично. А так видимо придется временно создавать вставку, так как её в большинстве случаев нет, только "анонимные" блоки. Спасибо.

Re: Custom cвойства динамического блока.

Так и сделал. Получилось примерно так (может кому пригодиться):

if (AcDbDynBlockReference::isDynamicBlock(pBlockTableRec->id()))
{
    AcDbDynBlockReferencePropertyArray arDBRP;
    AcDbBlockReference *pBlockRef = new AcDbBlockReference();
    if (pBlockRef->setBlockTableRecord (pBlockTableRec->id()) == Acad::eOk)
    {
        AcDbDynBlockReference *pDynBlockRef = new AcDbDynBlockReference(pBlockRef);
        if (pDynBlockRef != NULL)
        {
            pDynBlockRef->getBlockProperties(arDBRP);
            delete pDynBlockRef;
            for (int i = 0; i < arDBRP.length(); i++)
            {
                //выводим arDBRP[i].propertyName();
            }
        }
    }
    delete pBlockRef;
}