Тема: Анализ размерного стиля

Здравствуйте!
Вопрос такой. Если к уже отрисованному размерному тексту добавить префикс или суффикс (не меняя системную пременную DIMPOST), то как можно потом его значение получить. Анализ текста присоединенного к размеру блока не подходит. Анализ размерных стилей не дает результата.

Re: Анализ размерного стиля

> ROMA

static void GetDimPrefixSuffix(void)
{
  ads_point p; ads_name en;
  AcDbObjectId eId;
  if (acedEntSel(_T("\nВыберите размер для получения префикса/суфикса:"),en,p) != RTNORM)
    return;
  if (acdbGetObjectId(eId,en) != Acad::eOk)
    return;
  AcDbObjectPointer<AcDbDimension> pDim(eId,AcDb::kForRead);
  if (pDim.openStatus() == Acad::eOk) {
    std::basic_string<ACHAR> dimpost = pDim->dimpost();
    acutPrintf(_T("\nDimpost=\"%s\""), dimpost.c_str());
    int i = dimpost.find("<>");
    if (i >= 0) {
      acutPrintf(_T("\nPrefix=\"%s\""), dimpost.substr(0,i).c_str());
      acutPrintf(_T("\nSuffix=\"%s\""), dimpost.substr(i+2).c_str());
    }
  }
}

Годится?

Re: Анализ размерного стиля

Нет. Пожалуй так будет правильнее:

static void GetDimPrefixSuffix(void)
{
  ads_point p; ads_name en;
  AcDbObjectId eId;
  if (acedEntSel(_T("\nВыберите размер для получения префикса/суфикса:"),en,p) != RTNORM)
    return;
  if (acdbGetObjectId(eId,en) != Acad::eOk)
    return;
  AcDbObjectPointer<AcDbDimension> pDim(eId,AcDb::kForRead);
  if (pDim.openStatus() == Acad::eOk) {
    std::basic_string<ACHAR> dimpost = pDim->dimpost();
    acutPrintf(_T("\nDimpost=\"%s\""), dimpost.c_str());
    int i = dimpost.find("<>");
    if (i >= 0) {
      acutPrintf(_T("\nDimpost Prefix=\"%s\""), dimpost.substr(0,i).c_str());
      acutPrintf(_T("\nDimpost Suffix=\"%s\""), dimpost.substr(i+2).c_str());
    }
    ACHAR *txt = pDim->dimensionText();
    std::basic_string<ACHAR> dimtxt = txt; delete txt;
    acutPrintf(_T("\ndimensionText=\"%s\""), dimtxt.c_str());
    i = dimtxt.find("<>");
    if (i >= 0) {
      acutPrintf(_T("\ndimensionText Prefix=\"%s\""), dimtxt.substr(0,i).c_str());
      acutPrintf(_T("\ndimensionText Suffix=\"%s\""), dimtxt.substr(i+2).c_str());
    }
  }
}

Re: Анализ размерного стиля

Отлично! Большое спасибо, Александр! Раньше я работал только с ObjectArx14, да и сейчас у нас пока он в ходу. Возможно ли эти данные так же просто получить в этой версии.

Re: Анализ размерного стиля

> ROMA
Роман, а заглянуть в ObjectARX SDK R14 не судьба? :)
Проверять не стал, но метод AcDbDimension::dimensionText() есть и в этой версии, а dimpost придется получать из размерного стиля при помощи AcDbDimStyleTableRecord::getDimpost().
Конечно типа ACHAR в ObjectARX SDK R14 нет, но:

typedef char ACHAR;

Re: Анализ размерного стиля

Внял совету уважаемого Александра Ривлиса и обнаружил в ObjectARX SDK R14 функцию AcDbDimension::getDimstyleData. Через нее все и получил. Только вот при обращении к ней Acad выдает исключение (запрет общащения по адресу...). Обработкой исключений (try - catch(,,,)) это дело игнорируется. Однако опасения остаются. Кстати, если текущий стиль изменен без сохранения (помечен заком "+") исключение почему-то не генерируется.

Re: Анализ размерного стиля

> ROMA
Ну старые баги (десятилетней давности) Autodesk исправлять конечно не будет... А фамилию мою мог написать и без ошибки... :)

Re: Анализ размерного стиля

Приношу свои извинения уважаемый Александр. Спасибо за неформальную поддержку.

Re: Анализ размерного стиля

> ROMA
:) Принимаю!

Re: Анализ размерного стиля

P.S.: Есть более элегантный метод (без try/catch).
Проверить pDim->xData("ACAD") != NULL и тогда вызвать pDim->getDimstyleData() в противном случае читать из размерного стиля.

Re: Анализ размерного стиля

Действительно, все гораздо элегантней и надежней. Изменил свой код. Работает без проблем. Еще раз спасибо!