Тема: Как осуществить регенерацию объектов внутри конкретного BTR?

Дано: программно удаляем некоторые примитивы из конкретного BTR.
Требуется: осуществить регенерацию BTR чтобы по окончании работы программы визуальный эффект отсутствия объектов на экране монитора "вступил в силу".
Какие будут предложения?

Re: Как осуществить регенерацию объектов внутри конкретного BTR?

Есть пару вариантов:
1) Воспользоваться недокументированной функцией void ads_regen(void), которая выполнит регенерацию всего чертежа.
2) Воспользоваться AcDbBlockTableRecord::getBlockReferenceIds(...), т.е. найти все вставки этого блока (AcDbBlockReference), открыть их поочередно на запись, выполнить для них pRef->recordGraphicsModified(true) и закрыть их. В этом случае должны регенирироваться только блоки:

  static void RegenBlockTableRecord(AcDbBlockTableRecord *pBTR)
  {
    Acad::ErrorStatus es;
    AcDbObjectIdArray refIDs;
    pBTR->getBlockReferenceIds(refIDs,false);
    if (refIDs.length() > 0) {
      for (int i=0; i<refIDs.length(); i++) {
        AcDbObjectPointer<AcDbBlockReference> pRef(refIDs[i],AcDb::kForWrite);
        if (pRef.openStatus() == Acad::eOk) {
          pRef->recordGraphicsModified(true);
        }
      }
    }
  }

Попробуй. Я не проверял, но теоретически должно работать.

Re: Как осуществить регенерацию объектов внутри конкретного BTR?

> Александр Ривилис
Спасибо. Вариант 2 прекрасно работает. А нет ли более детальной информации на счет  void ads_regen(void)?

Re: Как осуществить регенерацию объектов внутри конкретного BTR?

> Debalance
А какая нужна еще информация? Экспортируется из acad.exe. Есть во всех версиях начиная с AutoCAD R14. Выполняет полную регенерацию чертежа (аналогично команде _REGENALL).
Если нужно ее использовать в программе вставляешь ее описание:

void ads_regen(void);

И в нужном месте вызываешь.
Само собой, что для линковки требуется acad.lib
Вот пожалуй и все.

Re: Как осуществить регенерацию объектов внутри конкретного BTR?

Выполняет полную регенерацию чертежа...

Вот это я и хотел услышать :)

Re: Как осуществить регенерацию объектов внутри конкретного BTR?

> Debalance
Вы невнимательны. Я в первом же сообщении написал:

1) Воспользоваться недокументированной функцией void ads_regen(void), которая выполнит регенерацию всего чертежа.

:)

Re: Как осуществить регенерацию объектов внутри конкретного BTR?

> Александр Ривилис
Против фактов трудно спорить. Может это усталость, может авитаминоз, а может и жгучее желание побыстрее исследовать Ваш программный код, ярко бросающийся в глаза. Кто знает, а может это и действие синергии перечисленных факторов... :)