Тема: Как добавлять xdata к объекту, создаваемому через "->appendAcDbEntity()"?

Здравствуйте!
Не получается добавить xdata к AcDbPolyline.
После вызова ->appendAcDbEntity() объект создаётся, но никаких xdata у него нет ... Не уверен, что правильно это делаю. Подскажите пожалуйста как правильно это сделать.
Спасибо за помощь!

Re: Как добавлять xdata к объекту, создаваемому через "->appendAcDbEntity()"?

> Сергей
1) Приложение уже зарегистрировано? Если нет, то расширенные данные добавлятся не будут.
2) А если после добавления открыть примитив, дописать XDATA и закрыть. Что тогда?
А лучше опубликуй кусочек своего кода.

Re: Как добавлять xdata к объекту, создаваемому через "->appendAcDbEntity()"?

Здравствуйте Александр!
Судя по ответу вы поняли в чём дело, и мне кажется, в моём случае второй пункт вашего ответа единственный вариант решения проблемы. Мне нужно создать имитацию объекта LDD, а именно спирали. Её я с успехом написал и она как две капли воды похожа на Autodesk'овский объект за исключением xdata. Есть желание создать приложение к LDD с возможностью редактирования осевой как в Civil3D (отличный продукт, но не без проблем), сохранив связь с базой LDD. Код выкладывать не хочу - он не доведён до конца и на данный момент, с точки зрения С++, он может претендовать лишь на "пробу пера". Обязательно покажу когда приведу в порядок.
Спасибо, что уделили внимание.

Re: Как добавлять xdata к объекту, создаваемому через "->appendAcDbEntity()"?

> Сергей
И все-таки я не поленился и проверил в AutoCAD 2004-2006 следующий код, когда к только что созданному примитиву, еще не добавленному в базу, добавляются расширенные данные. И он работает. Так что или в вашем коде ошибка, или что-то более сложное...

static void CreateEntityWithXdata(void)
{
  AcDbDatabase *pDb = acdbCurDwg();
  Acad::ErrorStatus es;
  char *MyApplication = "MyApplication";
  AcDbBlockTable *pBlockTable;
  if ((es = pDb->getSymbolTable(pBlockTable, AcDb::kForRead)) == Acad::eOk) {
    AcDbBlockTableRecord *pBlockTableRecord;
    if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite)) == Acad::eOk) {
      pBlockTable->close();
      AcDbLine *pLine = new AcDbLine(AcGePoint3d(0,0,0),AcGePoint3d(100,100,0));
      pLine->setDatabaseDefaults(pDb);
      acdbRegApp(MyApplication);
      resbuf *rb = acutBuildList(1001,MyApplication,1000,"Line1",1000,"Line2",RTNONE);
      es = pLine->setXData(rb); acutRelRb(rb);
      if (es != Acad::eOk) {
        acutPrintf("\nОшибка присвоения XDATA: %s",acadErrorStatusText(es));
      }
      AcDbObjectId eid;
      if ((es = pBlockTableRecord->appendAcDbEntity(eid,pLine)) != Acad::eOk) {
        acutPrintf("\nОшибка добавления в MODEL_SPACE: %s",acadErrorStatusText(es));
      }
      pBlockTableRecord->close();
      pLine->close();
    } else {
      pBlockTableRecord->close();
    }
  }
}

Re: Как добавлять xdata к объекту, создаваемому через "->appendAcDbEntity()"?

Спасибо Александр!
Не думал, что вы будете проверять паботоспособность кода в столь ранний час, иначе поспешил бы на работу вчера, а не убил бы ещё один день (всего четыре) на тестирование методом "тыка" слабодокументированных особенностей autodesk'овских объектов. С вниманием у меня всегда было плоховато, и в этот раз видимо я опять где-то в SDK упустил, что необходимо использовать в паре
acdbRegApp(MyApplication);
resbuf* rb = acutBuildList(1001, MyApplication,
...);
Смешно, но использовал и то и другое по-отдельности. Видимо счастливая комбинация не выпала.
Ещё раз спасибо за оказанную помщь!

Re: Как добавлять xdata к объекту, создаваемому через "->appendAcDbEntity()"?

Не думал, что вы будете проверять работоспособность кода в столь ранний час

Это был не ранний, а поздний час, хотя обычно в это время я уже сплю smile Я проверял работоспособность не из чистого любопытства. Мне казалось, что я уже натыкался на такую особенность поведения AutoCAD, когда нельзя было создавать примитив сразу с расширенными данными. Т.е. его нужно было записать в базу, а уже затем добавлять xdata. Проштудировал информацию на сайте ADN и не нашел ничего подобного. Поэтому сделал тестовый код, который оказался вполне работоспособен. Т.е. удалось развеять предположение об еще одном баге в AutoCAD (или OjectARX).

Re: Как добавлять xdata к объекту, создаваемому через "->appendAcDbEntity()"?

> Александру
Ривилису
Это не предположение о существовании "бага", а утверждение о недостаточном документировании данного раздела... В ObjectARX как и в автокаде одно и тоже можно выполнить несколькими способами, в частности низкоуровневым через вызов функций-членов класса и высокоуровневым - с помощью некоторых "глобальных" функций, которых даже intellisence не понимает, и которые невсегда целиком документированы. Ваш код и код собранный мною из приводимых Autodesk'ом участков кода несколько различаются, и в данном случае ваш опыт показался мне более предпочтительным нежели рекомендации в SDK ... Думаю, если взлянуть на оба варианта с позиции Джона Роббинса, некогда консультировавшего Autodesk, то появиться третий вариант. Было бы неплохо, если специалисты Autodesk'а внесли бОльшую ясность в SDK на предмет как правильно, а не как можно, использовать свои замечательные продукты и технологии.
Спасибо!
P.S. Вы когда-нибудь отдыхаете? :)

Re: Как добавлять xdata к объекту, создаваемому через "->appendAcDbEntity()"?

Было бы неплохо, если специалисты Autodesk'а внесли бОльшую ясность в SDK на предмет как правильно, а не как можно, использовать свои замечательные продукты и технологии.

Хм... Надеяться не вредно. smile А вообще ObjectARX - это пожалуй наиболее документированная библиотека для разработчиков под AutoCAD. Интересно, что бы Вы сказали если бы имели возможность поработать с OMF...
Кстати, Visual Assist, в отличии от встроенного intellisence лучше "понимает" функции ObjectARX, хотя и у него бывают проколы.

P.S. Вы когда-нибудь отдыхаете? :)

Так общение на форуме и есть отдых. smile