После Сохранения и переоткрытия Чертежа объект превращается в куб / квадрат

Автор Тема: После Сохранения и переоткрытия Чертежа объект превращается в куб / квадрат  (Прочитано 6443 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн knightrockerАвтор темы

  • ADN OPEN
  • Сообщений: 31
  • Карма: 1
Здравствуйте коллеги.

Итак по шагам:
Среда: MSVS 2012, Autocad 2016, Platform X64
Проект находится в архиве Problem.zip

Собираю проект.
Загружаю ARX а Автокад 2016.
По команде рисуется мой кастомный объект и рисуется успешно.
После Сохраняю данный объект как Чертёж .DWG файл.
Выхожу из Автокада.
Открываю сохранённый чертёж.
Вижу на месте объекта по максимальным его размерам но по тем же координатам находящийся КУБ.

В Архив доложил папку с принтскринами до и после сохранения и переоткрытия.
А так же сам сохранённый файл Чертежа.


Решил перепроверить код, для этого выполнил пересборку того же кода в другой студии и запустил всё в другой версии Автокада.

Среда: MSVS 2015, Autocad 2017, Platform X64
Проект находится в архиве WorkingProject.zip

Собираю проект.
Загружаю ARX а Автокад 2017.
По команде рисуется мой кастомный объект и рисуется успешно.
После Сохраняю данный объект как Чертёж .DWG файл.
Выхожу из Автокада.
Открываю сохранённый чертёж.
Объект НЕ превратился в Куб, а открылся правильным и неизменным.


Подскажите, в чём проблема .... API ? Особенности работы dwgOutFields / dwgInFields, которые мне неизвестны или которые различаются для разных версий Студии или Автокада ?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Выхожу из Автокада.
Открываю сохранённый чертёж.
Вижу на месте объекта по максимальным его размерам но по тем же координатам находящийся КУБ.
А  приложение своё ты загрузил после повторного запуска AutoCAD? Я вижу сообщение о прокси-объекте.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Подскажите, в чём проблема .... API ? Особенности работы dwgOutFields / dwgInFields, которые мне неизвестны или которые различаются для разных версий Студии или Автокада ?
В разных версиях AutoCAD и ObjectARX у ряда методов разные сигнатуры. Если эти методы виртуальные, то не так просто заметить, что нужный метод не вызывается из-за несоответствия сигнатуре базового метода. Соответственно нужно очень внимательно проверить сигнатуры всех использованных методов на соответствие сигнатурам базового класса.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение knightrocker 03-07-2018, 13:21:12

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
knightrocker
Всё оказалось намного проще. Ты забыл одну строку в dwgInFields:
Код - C++ [Выбрать]
  1. Acad::ErrorStatus Ship::dwgInFields (AcDbDwgFiler *pFiler)
  2. {
  3.   assertWriteEnabled () ;
  4.   //----- Прежде всего прочитать данные класса-родителя.
  5.   Acad::ErrorStatus es =AcDbEntity::dwgInFields (pFiler) ;
  6.   if ( es != Acad::eOk )
  7.     return (es) ;
  8.   //----- Сначала прочитать номер версии объекта
  9.   Adesk::UInt32 version =0 ;
  10.   if ( (es = pFiler->readUInt32 (&version)) != Acad::eOk )
  11.     return (es) ;
  12.   if ( version > Ship::kCurrentVersionNumber )
  13.     return (Acad::eMakeMeProxy) ;
  14.   //- Раскомментируйте следующие две строки, если текущая версия
  15.   // реализации объекта не может поддерживать его предыдущие версии.
  16.   //if ( version < Ship::kCurrentVersionNumber )
  17.   //    return (Acad::eMakeMeProxy) ;
  18.   //----- Чтение параметров
  19.   //.....
  20.   pFiler->readItem(&m_ptAft);
  21.   pFiler->readItem(&m_ptFore);
  22.   pFiler->readItem(&m_fHw);
  23.   pFiler->readItem(&m_fHeight);
  24.   pFiler->readItem(&m_fL);
  25.   pFiler->readItem(&m_vecU);
  26.   pFiler->readItem(&m_vecV);
  27.   pFiler->readItem(&m_vecW);
  28.   //----------------------------------------------------------------------------------------
  29.   storePoints(); // <- ты забыл эту строку и соответственно у тебя не пересчитываются точки
  30.   //----------------------------------------------------------------------------------------
  31.   return (pFiler->filerStatus ()) ;
  32. }
  33.  

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Решил перепроверить код, для этого выполнил пересборку того же кода в другой студии и запустил всё в другой версии Автокада.
Коды разные. Очень разные.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение