Proxy графика

Автор Тема: Proxy графика  (Прочитано 11677 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Proxy графика
« : 06-03-2016, 14:27:37 »
Я написал новый пользовательский объект. Вроде корректно работает в автокаде сохраняется и открывается пока загружены библиотеки в автокаде. Но стоит их выгрузить как появляется ошибка и закрытие автокада. Ведь должен такой объект отображаться как прокси графика. Подскажите в чем может быть причина.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Proxy графика
« Ответ #1 : 06-03-2016, 14:33:17 »
Но стоит их выгрузить как появляется ошибка и закрытие автокада. Ведь должен такой объект отображаться как прокси графика. Подскажите в чем может быть причина.
Скорее всего некорректная выгрузка. Покажи содержимое обработчиков сообщений InitAppMsg и UnloadAppMsg.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Proxy графика
« Ответ #2 : 06-03-2016, 14:46:53 »
Код - C++ [Выбрать]
  1.         virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  2.                 // TODO: Load dependencies here
  3.  
  4.                 // You *must* call On_kInitAppMsg here
  5.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  6.                
  7.                 // TODO: Add your initialization code here
  8.  
  9.                 return (retCode) ;
  10.         }
  11.  
  12.         virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  13.                 // TODO: Add your code here
  14.  
  15.                 // You *must* call On_kUnloadAppMsg here
  16.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  17.  
  18.                 // TODO: Unload dependencies here
  19.  
  20.                 return (retCode) ;
  21.         }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Proxy графика
« Ответ #3 : 06-03-2016, 15:14:28 »
в DBX-файле в On_kInitAppMsg должно быть:
Код - C++ [Выбрать]
  1.         ТвойКласс::rxInit();
  2.         acrxBuildClassHierarchy();
в On_kUnloadAppMsg должно быть
Код - C++ [Выбрать]
  1.         deleteAcRxClass(ТвойКласс::desc());
  2.         acrxBuildClassHierarchy();
Если классов несколько, то несколько вызовов rxInit и deleteAcRxClass
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Proxy графика
« Ответ #4 : 06-03-2016, 15:15:12 »
Вот весь код. Запускается командами ФАСПРОФ и PROFILE.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Proxy графика
« Ответ #5 : 06-03-2016, 15:28:07 »
Исправь как я написал. Если не поможет - в понедельник посмотрю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Proxy графика
« Ответ #6 : 06-03-2016, 20:13:15 »
не помогло. в CustomObjects acrxEntryPoint.cpp написал так:

Код - C++ [Выбрать]
  1.         virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  2.                 // TODO: Load dependencies here
  3.  
  4.                 // You *must* call On_kInitAppMsg here
  5.                 AcRx::AppRetCode retCode =AcRxDbxApp::On_kInitAppMsg (pkt) ;
  6.                
  7.                 // TODO: Add your initialization code here
  8.                 EuProfile::rxInit();
  9.                 PreFas::rxInit();
  10.                 FasProf::rxInit();
  11.                 Cover::rxInit();
  12.                 WindProf::rxInit();
  13.  
  14.                 acrxBuildClassHierarchy();
  15.  
  16.                 return (retCode) ;
  17.         }
  18.  
  19.         virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  20.                 // TODO: Add your code here
  21.  
  22.                 // You *must* call On_kUnloadAppMsg here
  23.                 AcRx::AppRetCode retCode =AcRxDbxApp::On_kUnloadAppMsg (pkt) ;
  24.  
  25.                 // TODO: Unload dependencies here
  26.                 deleteAcRxClass(EuProfile::desc());
  27.                 deleteAcRxClass(PreFas::desc());
  28.                 deleteAcRxClass(FasProf::desc());
  29.                 deleteAcRxClass(Cover::desc());
  30.                 deleteAcRxClass(WindProf::desc());
  31.  
  32.                 acrxBuildClassHierarchy();
  33.  
  34.                 return (retCode) ;
  35.         }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Proxy графика
« Ответ #7 : 07-03-2016, 02:16:27 »
Я не стал детально разбираться с твоим кодом - на это уйдёт слишком много времени. Судя по всему ты где-то портишь память. Где именно - я искать не буду.
Вот работоспособный пример, в котором нормально выгружается dbx-файл. Я писал его > 10 лет назад и сейчас просто портировал под AutoCAD 2012, с которым ты судя по всему работаешь. Сравни. Может быть появятся идеи почему этот код работает, а твой нет.
Заодно и немного подправленный твой код. Играет роль порядок вызовов ::rxInit и deleteAcRxClass. ::rxInit сначала вызываются для родительского класса, а затем для производных, а  deleteAcRxClass в обратном порядке.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Эд 08-03-2016, 21:53:27

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Proxy графика
« Ответ #8 : 07-03-2016, 02:41:21 »
Всё-таки нашёл из-за чего было аварийное завершение. Ты почему-то забыл в методах EuProfile::dwgOutFields и EuProfile::dwgInFields следующие строки:
Код - C++ [Выбрать]
  1.         es = AcDbPolyline::dwgOutFields (pFiler) ;
  2.         if ( es != Acad::eOk )
  3.                 return (es) ;
  4.  
и
Код - C++ [Выбрать]
  1.         es = AcDbPolyline::dwgInFields (pFiler) ;
  2.         if ( es != Acad::eOk )
  3.                 return (es) ;
  4.  
Теперь нормально выгружается приложение. Теперь тебе осталось разобраться куда девается прокси-графика.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Proxy графика
« Ответ #9 : 08-03-2016, 21:53:19 »
Я их намеренно заглушил, не знал какие там есть неизвестные методы, думал сэкономлю время выполнения. Добавил метод SaveAs, передвинул ввод и вывод всех переменных после БазовыйКласс::dwgOut(In)Fields. Теперь прокси графика отображается, команды перемещения, копирования с объектами работают. Методы rxInit() в моем случае оказались необязательными.
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Proxy графика
« Ответ #10 : 08-03-2016, 22:01:57 »
Методы rxInit() в моем случае оказались необязательными.
Ты обратил внимание на то, что я закоментировал везде ACDB_REGISTER_OBJECT_ENTRY_AUTO(XXXXXX)? Если они закоментированы, то rxInit() обязателен. Если не закомментирован, то rxInit вызывается при загрузке dbx-файла, а deleteAcRxClass при выгрузке (подробнее смотри в dbxEntryPoint.h). Но порядок вызовов непредсказуемый и могут возникнуть проблемы, которые сейчас не видны.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Re: Proxy графика
« Ответ #11 : 08-03-2016, 22:12:08 »
Понял.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Proxy графика
« Ответ #12 : 08-03-2016, 22:29:29 »
Заодно я перетащил JIG из dbx в arx, где ему и место.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение