Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Gennadiy от 04-08-2016, 13:50:05

Название: Не создается WipeOut
Отправлено: Gennadiy от 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
В других версиях не проверял.
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 04-08-2016, 14:00:17
AcWipeoutObjXX.dbx загружен в AutoCAD? Он должен быть загружен до того, как ты будешь использовать любые методы AcDbWipeout. Лучше всего его грузить в методе On_kInitAppMsg
Название: Re: Не создается WipeOut
Отправлено: Gennadiy от 04-08-2016, 15:34:51
AcWipeoutObjXX.dbx загружен в AutoCAD?
А где его искать, может в AutoCAD 2017 он по другому называется, в AutoCAD 2010 он лежит в c:\Program Files\AutoCAD 2010\,
а в 2017-м кроме AcWipeoutRes.dll ничего нет.
Название: Re: Не создается WipeOut
Отправлено: Gennadiy от 04-08-2016, 15:49:37
Всё, разобрался. В AutoCAD 2017 это acismobj21.dbx.
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 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
Название: Re: Не создается WipeOut
Отправлено: Gennadiy от 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"
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 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 уничтожается.
Название: Re: Не создается WipeOut
Отправлено: Debalance от 29-05-2018, 11:41:00
В 2015 и 2016 - acismobj20.dbx, в 2013 и 2014 - acismobj19.dbx, а до того в AcWipeoutObjXX.dbx
acismui.arx в AutoCAD 2010 присутствует?
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 29-05-2018, 11:44:40
acismui.arx в AutoCAD 2010 присутствует?
Зачем он тебе? Присутствует.
Название: Re: Не создается WipeOut
Отправлено: Debalance от 29-05-2018, 11:48:04
Зачем он тебе?
Для работы с Wipeout разумеется. Чтобы сделать как написано выше:
Код - C++ [Выбрать]
  1. acrxLoadModule(L"AcWipeoutObj18.dbx",false,false);
  2. acrxLoadModule(L"acismui.arx",false,false);

Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 29-05-2018, 11:49:51
Есть этот файл в AutoCAD 2010. Найти эту версию было не просто.
Название: Re: Не создается WipeOut
Отправлено: Debalance от 29-05-2018, 11:52:49
... Найти эту версию было не просто.
Эта версия ещё актуальна среди юзеров (как показывает жизнь).
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 29-05-2018, 11:54:42
... Найти эту версию было не просто.
Эта версия ещё актуальна среди юзеров (как показывает жизнь).
Ну тогда я тебе сразу скажу, что и в AutoCAD 2008 этот файл есть. :)
Название: Re: Не создается WipeOut
Отправлено: Debalance от 29-05-2018, 12:39:09
... в AutoCAD 2008 этот файл есть.
Спасибо за инфу, но я в своих наработках стремлюсь (всё-таки) ограничиваться 10-ой версией.
Название: Re: Не создается WipeOut
Отправлено: Debalance от 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 после загрузки такого приложения, то на выходе имеем ошибку:
(https://farm2.staticflickr.com/1745/40710233960_f4a4c2b7f9_o.png)

Как это обойти?
Название: Re: Не создается WipeOut
Отправлено: Debalance от 02-06-2018, 20:28:30
На старших версиях такого "эффекта" вроде не наблюдается...
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 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.
Название: Re: Не создается WipeOut
Отправлено: Debalance от 02-06-2018, 20:38:50
Попробуй так:
Тоже самое.

В общем если принудительно выгружать AcWipeoutObj18.dbx перед закрытием - то всё в порядке.
Название: Re: Не создается WipeOut
Отправлено: Debalance от 02-06-2018, 20:41:45
Хотя и  этого достаточно:
   
Код - C++ [Выбрать]
  1. acrxLoadModule(L"AcWipeout.arx", false, false);
Ха! А вот это прокатило....
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 02-06-2018, 20:42:14
Тоже самое.
У меня не воспроизводится в AutoCAD 2012 x64 - English SP2. Т.е. если загружен AcWipeout.arx, то завершение нормальное.
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 02-06-2018, 20:43:18
В общем если принудительно выгружать AcWipeoutObj18.dbx перед закрытием - то всё в порядке.
Ну в принципе это логично - если загрузил, то изволь выгрузить.
Название: Re: Не создается WipeOut
Отправлено: Debalance от 02-06-2018, 20:53:48
Я так понимаю "AcWipeout.arx" для всех версий имеет одинаковое название?
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 02-06-2018, 21:06:29
Я так понимаю "AcWipeout.arx" для всех версий имеет одинаковое название?
Неа. После AutoCAD 2012 его нет. Вместо него acismui.crx
Название: Re: Не создается WipeOut
Отправлено: Debalance от 02-06-2018, 21:36:28
Неа. После AutoCAD 2012 его нет. Вместо него acismui.crx
Ничего не понимаю... До него включительно грузим и то и другое, а после только один acismui.arx?
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 02-06-2018, 21:41:22
Ты же уже нашел способ. Загружаешь в начале и выгружаешь в конце AcWipeoutObjXX.dbx.
Название: Re: Не создается WipeOut
Отправлено: Debalance от 02-06-2018, 22:32:43
Ты же уже нашел способ. Загружаешь в начале и выгружаешь в конце AcWipeoutObjXX.dbx.
Для портирования приложений на кучу версий AutoCAD проще оперировать двумя константными файлами: acismui.arx и acwipeout.arx (которые возьмут на себя заботу обслуживания соответствующего *.dbx файла), чем самостоятельно подбирать различные комбинации AcWipeoutObjXX.dbx, AcismobjXX.dbx и т.п.
Название: Re: Не создается WipeOut
Отправлено: Александр Ривилис от 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);