Тема: Как колучить имя блока из INSERT?

Есть указатель AcDbEntity на Insert (в Модели).
Подскажите, как колучить имя блока, на который этот Insert ссылается? Или хотя бы как можно использовать функции класса AcDbBlockReference, если есть этот указатель (типа AcDbEntity). Класс, к которому относится элемент в модели я получаю через AcDbEntity->isA()->name(), а имя блока никак получить не могу.

Re: Как колучить имя блока из INSERT?

static void GetBlockName(void)
{
  ads_name en; ads_point p;
  Acad::ErrorStatus es;
  if (acedEntSel("\nУкажите блок для получения имени: ",en,p) == RTNORM) {
    AcDbObjectId objId; acdbGetObjectId(objId,en);
    AcDbObjectPointer<AcDbBlockReference> pEnt(objId,AcDb::kForRead);
    if ((es = pEnt.openStatus()) == Acad::eOk) {
      // Находим и открываем запись таблицы блоков
      AcDbObjectId objBTRId = pEnt->blockTableRecord();
      AcDbObjectPointer<AcDbBlockTableRecord> pBTR(objBTRId,AcDb::kForRead);
      if ((es = pBTR.openStatus()) == Acad::eOk) {
        // Получаем имя блока
        const char *name; pBTR->getName(name);
        acutPrintf("\nИмя блока: %s",name);
      } else {
        acutPrintf("\nОшибка открытия AcDbBlockTableRecord: %s",acadErrorStatusText(es));
      }
    } else {
        acutPrintf("\nОшибка открытия AcDbBlockReference: %s",acadErrorStatusText(es));
    }
  }
}

Re: Как колучить имя блока из INSERT?

Спасибо, Александр! Получилось.

Re: Как колучить имя блока из INSERT?

Можно меленький вопрос по этому коду?
Почему, если здесь все "kForRead" поменять на "kForWhite" мы получаем ошибку на втором условии if? Таким образом, не получается поменять какие-либо свойства INSERT. Пришлось переделывать эту функцию, чтобы она выдавала имя блока и в головной функции уже организовывать изменение INSERT.

Re: Как колучить имя блока из INSERT?

Какое сообщение выдает и в что ты собираешься менять: AcDbBlockReference или AcDbBlockTableRecord? Проанализируй коды возврата. Думаю, что просто ошибка в логике программы а без полного ее текста гадать, почему нельзя открыть на запись - не возьмусь...

Re: Как колучить имя блока из INSERT?

Сообщение "eWasOpenForWrite". Менять собирался AcDbBlockReference - перенос на другой слой.
Для получения объекта, передаю в эту функцию указатель на запись в Модели. Объект получал через функцию "pBlockTableRecordIterator->getEntityId(Id объекта)".
В общем-то, как я писал, уже выкрутился. Просто интересно, почему так произошло.
Если интересно, приведу текст программы.

Re: Как колучить имя блока из INSERT?

> aazko
Так функция же по-английски ясно объяснила, что объект уже был открыт для записи (eWasOpenForWrite) и повторно для записи его открыть нельзя.
IMHO в данном случае(да и в любом другом) лучше использовать следующую последовательность работы:
1) Открывать объект для чтения (kForRead) и получать из него информацию.
2) Перед тем как что-то в объекте модифицировать - использовать метод upgradeOpen, и проверять результат его выполнения. Если результат не Acad::eOk - то модификация объекта невозможна.
3) Сразу после модификации объекта выполнять downgradeOpen, если нет возможности сразу закрыть объект.
Такая последовательность избавит от ошибок eWasOpenForWrite.

Re: Как колучить имя блока из INSERT?

Спасибо за совет, Александр!