Не создается WipeOut

Автор Тема: Не создается WipeOut  (Прочитано 10140 раз)

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

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Не создается WipeOut
« : 04-08-2016, 13:50:05 »
Добрый день.
Пытаюсь создать AcDbWipeout в методе subExplode.
entitySet.append(pWipe) возвращает 0, маска не создается и
соответственно, при выходе из метода subExplode возникает FatalError.
Вот код
Код - C++ [Выбрать]
  1. AcDbWipeout::createImageDefinition();
  2. AcDbObjectPointer<AcDbWipeout> pWipe;
  3. pWipe.create();
  4. pWipe->setDatabaseDefaults();
  5. AcGePoint3d originPnt(-1, 0, 0);
  6. AcGeVector3d Udirection(1, 0, 0);
  7. AcGeVector3d Vdirection(0, -1, 0);
  8. pWipe->setOrientation(originPnt, Udirection, Vdirection);
  9. AcGePoint2dArray ptArray;
  10. ptArray.removeAll();
  11. ptArray.append(AcGePoint2d(-1, 0));
  12. ptArray.append(AcGePoint2d(1, 0));
  13. ptArray.append(AcGePoint2d(1, -10));
  14. ptArray.append(AcGePoint2d(-1, -10));
  15. ptArray.append(AcGePoint2d(-1, 0));
  16. pWipe->setClipBoundary(AcDbRasterImage::kPoly, ptArray);
  17. pWipe->transformBy(mat);
  18. entitySet.append(pWipe);

Использую AutoCAD 2017 SP1 и VS2015
В других версиях не проверял.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #1 : 04-08-2016, 14:00:17 »
AcWipeoutObjXX.dbx загружен в AutoCAD? Он должен быть загружен до того, как ты будешь использовать любые методы AcDbWipeout. Лучше всего его грузить в методе On_kInitAppMsg
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: Не создается WipeOut
« Ответ #2 : 04-08-2016, 15:34:51 »
AcWipeoutObjXX.dbx загружен в AutoCAD?
А где его искать, может в AutoCAD 2017 он по другому называется, в AutoCAD 2010 он лежит в c:\Program Files\AutoCAD 2010\,
а в 2017-м кроме AcWipeoutRes.dll ничего нет.

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: Не создается WipeOut
« Ответ #3 : 04-08-2016, 15:49:37 »
Всё, разобрался. В AutoCAD 2017 это acismobj21.dbx.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #4 : 04-08-2016, 15:54:05 »
Код - C++ [Выбрать]
  1. acrxLoadModule(L"acismobj21.dbx",false,false);
  2. acrxLoadModule(L"acismui.arx",false,false);
В 2015 и 2016 - acismobj20.dbx, в 2013 и 2014 - acismobj19.dbx, а до того в AcWipeoutObjXX.dbx
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: Не создается WipeOut
« Ответ #5 : 04-08-2016, 16:34:12 »
entitySet.append(pWipe) по прежнему возвращает 0, хотя WipeOut создается.
Но если в методе subExplode писать
Код - C++ [Выбрать]
  1. AcDbObjectPointer<AcDbWipeout> pWipe;
  2. pWipe.create();
то, похоже, pWipe удаляется раньше, чем попадает в базу, и далее FatalError.
когда пишу так
Код - C++ [Выбрать]
  1. AcDbWipeout *pWipe = new AcDbWipeout();
работает.
Кстати, работает и без загрузки "acismui.arx"

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #6 : 04-08-2016, 16:39:23 »
entitySet.append(pWipe) по прежнему возвращает 0, хотя WipeOut создается.
Но если в методе subExplode писать
Код - C++ [Выбрать]

    AcDbObjectPointer<AcDbWipeout> pWipe;
    pWipe.create();

то, похоже, pWipe удаляется раньше, чем попадает в базу, и далее FatalError.
когда пишу так
Код - C++ [Выбрать]

    AcDbWipeout *pWipe = new AcDbWipeout();

работает.
Черт!!! Ну конечно же! Ты же создавал интеллектуальный указатель. Как только он уходит из области видимости, так вызывается его деструктор. Т.е. при выходе из метода зовётся его деструктор и pWipe уничтожается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #7 : 29-05-2018, 11:41:00 »
В 2015 и 2016 - acismobj20.dbx, в 2013 и 2014 - acismobj19.dbx, а до того в AcWipeoutObjXX.dbx
acismui.arx в AutoCAD 2010 присутствует?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #8 : 29-05-2018, 11:44:40 »
acismui.arx в AutoCAD 2010 присутствует?
Зачем он тебе? Присутствует.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #9 : 29-05-2018, 11:48:04 »
Зачем он тебе?
Для работы с Wipeout разумеется. Чтобы сделать как написано выше:
Код - C++ [Выбрать]
  1. acrxLoadModule(L"AcWipeoutObj18.dbx",false,false);
  2. acrxLoadModule(L"acismui.arx",false,false);


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #10 : 29-05-2018, 11:49:51 »
Есть этот файл в AutoCAD 2010. Найти эту версию было не просто.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #11 : 29-05-2018, 11:52:49 »
... Найти эту версию было не просто.
Эта версия ещё актуальна среди юзеров (как показывает жизнь).

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #12 : 29-05-2018, 11:54:42 »
... Найти эту версию было не просто.
Эта версия ещё актуальна среди юзеров (как показывает жизнь).
Ну тогда я тебе сразу скажу, что и в AutoCAD 2008 этот файл есть. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #13 : 29-05-2018, 12:39:09 »
... в AutoCAD 2008 этот файл есть.
Спасибо за инфу, но я в своих наработках стремлюсь (всё-таки) ограничиваться 10-ой версией.

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #14 : 02-06-2018, 20:14:31 »
Тема получила некоторое продолжение. Написал простейший код для AutoCAD 2012 который содержит лишь это:
Код - C++ [Выбрать]
  1. extern "C" AcRx::AppRetCode
  2. acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
  3. {
  4.     switch(msg)
  5.     {
  6.     case AcRx::kInitAppMsg:
  7.         acrxDynamicLinker->unlockApplication(appId);
  8.         acrxDynamicLinker->registerAppMDIAware(appId);
  9.         acrxLoadModule(L"AcWipeoutObj18.dbx", false, false);
  10.         break;
  11.     case AcRx::kUnloadAppMsg:
  12.         break;
  13.     default:
  14.         break;
  15.     }
  16.     return AcRx::kRetOK;
  17. }

Если закрыть AutoCAD после загрузки такого приложения, то на выходе имеем ошибку:


Как это обойти?

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #15 : 02-06-2018, 20:28:30 »
На старших версиях такого "эффекта" вроде не наблюдается...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #16 : 02-06-2018, 20:33:22 »
Как это обойти?
Попробуй так:
Код - C++ [Выбрать]
  1.     acrxLoadModule(L"AcWipeoutObj18.dbx", false, false);
  2.     acrxLoadModule(L"AcWipeout.arx", false, false);
Хотя и  этого достаточно:
Код - C++ [Выбрать]
  1.    acrxLoadModule(L"AcWipeout.arx", false, false);
Он сам загружает AcWipeoutObj18.dbx.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #17 : 02-06-2018, 20:38:50 »
Попробуй так:
Тоже самое.

В общем если принудительно выгружать AcWipeoutObj18.dbx перед закрытием - то всё в порядке.

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #18 : 02-06-2018, 20:41:45 »
Хотя и  этого достаточно:
   
Код - C++ [Выбрать]
  1. acrxLoadModule(L"AcWipeout.arx", false, false);
Ха! А вот это прокатило....

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #19 : 02-06-2018, 20:42:14 »
Тоже самое.
У меня не воспроизводится в AutoCAD 2012 x64 - English SP2. Т.е. если загружен AcWipeout.arx, то завершение нормальное.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #20 : 02-06-2018, 20:43:18 »
В общем если принудительно выгружать AcWipeoutObj18.dbx перед закрытием - то всё в порядке.
Ну в принципе это логично - если загрузил, то изволь выгрузить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #21 : 02-06-2018, 20:53:48 »
Я так понимаю "AcWipeout.arx" для всех версий имеет одинаковое название?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #22 : 02-06-2018, 21:06:29 »
Я так понимаю "AcWipeout.arx" для всех версий имеет одинаковое название?
Неа. После AutoCAD 2012 его нет. Вместо него acismui.crx
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #23 : 02-06-2018, 21:36:28 »
Неа. После AutoCAD 2012 его нет. Вместо него acismui.crx
Ничего не понимаю... До него включительно грузим и то и другое, а после только один acismui.arx?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #24 : 02-06-2018, 21:41:22 »
Ты же уже нашел способ. Загружаешь в начале и выгружаешь в конце AcWipeoutObjXX.dbx.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Не создается WipeOut
« Ответ #25 : 02-06-2018, 22:32:43 »
Ты же уже нашел способ. Загружаешь в начале и выгружаешь в конце AcWipeoutObjXX.dbx.
Для портирования приложений на кучу версий AutoCAD проще оперировать двумя константными файлами: acismui.arx и acwipeout.arx (которые возьмут на себя заботу обслуживания соответствующего *.dbx файла), чем самостоятельно подбирать различные комбинации AcWipeoutObjXX.dbx, AcismobjXX.dbx и т.п.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не создается WipeOut
« Ответ #26 : 02-06-2018, 23:50:47 »
Debalance
Предлагаю такой вариант:
Код - C++ [Выбрать]
  1.     ACHAR path[_MAX_PATH] = L"";
  2.     if (acedFindFile(L"AcWipeout.arx", path) == RTNORM ||
  3.         acedFindFile(L"acISMui.arx", path) == RTNORM)
  4.      acrxLoadModule(path,false,false);

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