Тема: Как изменить XData?

Здравствуйте.
Пытаюсь изменить XData в 2М полилинии и к сожалению автокад зависает помогите пожалуйста найти причину. Самое главное я хотел бы знать как изменить XData.
Заранее спасибо исходный код выложен ниже.

void ChangeLength(void)
{
    ads_name ss, en;
    AcDbObjectId pObj = NULL;
    Acad::ErrorStatus ers;
    //Создаем набор выбора объектов
    int es = acedSSGet(NULL,NULL,NULL,NULL,ss);
    if ( es == RTNORM)
    {
        //Вычисляем длину набора
        long len = 0;
        es = acedSSLength(ss, &len);
//        acutPrintf(_T("Длина массива равняется %i"),len);
        if ( es != RTNORM)
        {
            acutPrintf(_T("Не удалось получить длину списка примитивов!"));
            return;
        }
       
        //Обрабатываем список выбора
        for ( long i=0; i < len; i++)
        {
            es = acedSSName(ss, i, en);
            if ( es != RTNORM)
            {
                acutPrintf(_T("Не удалось получить имя примитива!"));
                return;
            }
           
            ers =acdbGetObjectId(pObj,en);
            if ( ers != Acad::eOk)
            {
                acutPrintf(_T("Не удалось открыть примитив!"));
                return;
            }
            acutPrintf(_T("Считываем свойства объекта"));
            AcDbObjectPointer<AcDb2dPolyline> pLine(pObj, AcDb::kForWrite);
            resbuf *rb = NULL;
            rb = pLine->xData(_T("DEVICE_DATAS"));
            while ( rb->rbnext != NULL)
            {
                if (rb->restype == RTSTR)
                {
                    if (rb->resval.rstring == _T("REAL_LENGTH"))
                    {
                        rb->rbnext;
                        rb->resval.rreal = 625.0;
                    }
                }
            }
            ers = pLine->setXData(rb);
            if (ers != Acad::eOk)
            {
                acutPrintf(_T("Не удалось обновить длину кабеля"));
                return;
            }
            acutRelRb(rb);
        }
    }
    acedSSFree(ss);
}

Re: Как изменить XData?

Читай внимательно в Help'е какие коды групп (rb->restype) могут быть в расширенных данных.

Re: Как изменить XData?

Спасибо.
Получается я совсем разные типы данных использовал. Для определения строкового типа буду использовать код "1000".

Re: Как изменить XData?

Присмотрись к выделенной строке:
if (rb->resval.rstring == _T("REAL_LENGTH"))
{
rb->rbnext;
rb->resval.rreal = 625.0;
}

Re: Как изменить XData?

Тут все правильно по моему. У меня как раз в чертеже расширенные данные идут следующим образом:
* Code 1000, ASCII-Zeichenfolge: REAL_LENGTH
* Code 1040, Reelle Zahlen: 30.0000
* Code 1000, ASCII-Zeichenfolge: CABLE_LENGTH
* Code 1040, Reelle Zahlen: 26.0199
Т.е. если в в текущей позиции находится строковый параметр "REAL_LENGTH", то в следующей позиции мы вводим определенное число с плавающей запятой.
Если я ошибся поправьте меня пожалуйста.

Re: Как изменить XData?

> Константин
Разницу между:

rb->rbnext;

и

rb = rb->rbnext;

чувствуешь?

Re: Как изменить XData?

Или вместо:

rb->rbnext;
rb->resval.rreal = 625.0;

должно быть:

rb->rbnext->resval.rreal = 625.0;

Re: Как изменить XData?

P.S.:
Да и это:

if (rb->resval.rstring == _T("REAL_LENGTH"))

халтура.

Re: Как изменить XData?

1) в while ни разу нет продвижения по списку rb = rb->rbnext; так что ты зацикливаешься.
2) если будешь продвигаться по списку при помощи rb = rb->rbnext; то acutRelRb(rb); не освободит список, так что нужно до цикла сохранить указатель на голову списка в другой переменной.
Так что учиться и учиться еще... smile

Re: Как изменить XData?

А я то думал почему зависает автокад smile
Да к сожалению в программировании я новичок, так что буду учиться.
А на счет освобождения списка я бы в жизни не догадался бы, то то я думаю почему в примере XData (Из ObjectARX) создали временный указатель на список.

Re: Как изменить XData?

P.S.:
Да и это:
if (rb->resval.rstring == _T("REAL_LENGTH"))
халтура.

Да уж эта строчка и впрямь халтура. Вообще не ловит расширенные данные. Я в итоге немного доработал оператор сравнения и получилось вот что у меня

if (!AcString(pTemp->resval.rstring).compare(AcString(_T("REAL_LENGTH"))))

В итоге у меня все заработало, за что вам и спасибо помощь была неоценимая.
Если у вас будет идея как доработать эту строчку сравнения рад буду выслушать.

Re: Как изменить XData?

if ( !_tcscmp(pTemp->resval.rstring, _T("REAL_LENGTH")) )

Re: Как изменить XData?

Спасибо все работает. Что бы я без вас делал. Новичок все таки. smile