ADN Club > ObjectARX

Ошибка intersectWith()

<< < (2/2)

Александр Ривилис:
pucher,
Похоже, что это проблема при распределении памяти. Попробуй компиляцию в Release, а не в Debug.

Александр Ривилис:
Решил проверить у себя, благо версия AutoCAD 2013 x64 у меня есть:

--- Код - C++ [Выбрать] ---//-----------------------------------------------------------------------------//----- acrxEntryPoint.cpp//-----------------------------------------------------------------------------#include "StdAfx.h"#include "resource.h" //-----------------------------------------------------------------------------#define szRDS _RXST("") //-----------------------------------------------------------------------------//----- ObjectARX EntryPointclass CTestIntersect2013App : public AcRxArxApp { public:  CTestIntersect2013App () : AcRxArxApp () {}   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {    AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg (pkt) ;    return (retCode) ;  }   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {    AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg (pkt) ;    return (retCode) ;  }   virtual void RegisterServerComponents () {}    // - TestIntersect2013.TestInt command (do not rename)  static void TestIntersect2013TestInt(void)  {    F4();  }   static void F4()  {    int es1, es2;    ads_name ent1, ent2;    ads_point pt1, pt2;    AcDbObjectId entId1, entId2;    AcGePoint3dArray points;     if (acedEntSel(L"\nУкажите объект 1: ", ent1, pt1) != RTNORM)      return;     if (acdbGetObjectId(entId1, ent1) != Acad::eOk)      return;     AcDbEntityPointer pEnt1(entId1, AcDb::kForRead);     if (pEnt1.openStatus() != Acad::eOk)       return;     if (acedEntSel(L"\nУкажите объект 2: ", ent2, pt2) != RTNORM)      return;     if (acdbGetObjectId(entId2, ent2) != Acad::eOk)      return;     AcDbEntityPointer pEnt2(entId2, AcDb::kForRead);    if (pEnt2.openStatus() != Acad::eOk)       return;     if (pEnt1->intersectWith(pEnt2, AcDb::kOnBothOperands, points) != Acad::eOk || (points.length() == 0))    {      acutPrintf(L"\nОбъекты не пересекаются. ");      return;    }     acutPrintf(L"\nТочки пересечения:");    for (int i = 0; i < points.length(); i++)      acutPrintf(L"\n %d: %.6f %.6f %.6f", i + 1, points[i].x, points[i].y, points[i].z);  }} ; //-----------------------------------------------------------------------------IMPLEMENT_ARX_ENTRYPOINT(CTestIntersect2013App) ACED_ARXCOMMAND_ENTRY_AUTO(CTestIntersect2013App, TestIntersect2013, TestInt, TestInt, ACRX_CMD_TRANSPARENT, NULL) 
Все нормально работает без ошибок. Кстати, на похожую ошибку я натолкнулся, когда у меня вместо Platform Toolset = v100 стояло v90.
В этом случае неправильно работает диспетчер памяти и возможны непредсказуемые ошибки.
На всякий случай прикладываю готовый проект.

pucher:

--- Цитата: Александр Ривилис от 12-05-2024, 15:30:34 ---Попробуй компиляцию в Release, а не в Debug.
--- Конец цитаты ---
В Release сработало. Это навело на мысль, что причина м.б. в разных настройках проекта для Release, Debug версий проекта. В скаченном ObjectARX 2013 SDK нет Arx Wizzard. Поэтому проект создаю "с ноля". По умолчанию Visual Studio "Runtime library" для Release выставляет Multi-threaded DLL (/MD), для Debug - Multi-threaded Debug DLL (/MDd). Установка для Debug значения в Multi-threaded DLL (/MD) убрало ошибку, всё работает. Только не понятна логика  ???. Ведь при отладке обычно используются debug версии всевозможных библиотек, задействованных в проекте. А тут такая ситуация. Хотелось бы узнать объяснение, если оно есть.

Александр Ривилис:

--- Цитата: pucher от 12-05-2024, 19:23:10 ---Только не понятна логика. Ведь при отладке обычно используются debug версии всевозможных библиотек, задействованных в проекте. А тут такая ситуация. Хотелось бы узнать объяснение, если оно есть.


--- Конец цитаты ---
Тут всё очень просто - сам AutoCAD скомпилирован в Release. Соответственно он использует Multi-threaded DLL (/MD). Смешивание вместе Multi-threaded Debug DLL (/MDd) с Multi-threaded DLL (/MD) приводит к ошибкам распределения памяти и др. Чтобы обойти эти ошибки можно использовать такой трюк. В файле stdafx.h в начале вставляем:

--- Код - C++ [Выбрать] ---#if defined( _DEBUG) && !defined(DEBUG_AUTOCAD)    #pragma message("Building debug version of arx to be used with non-debug/Prod AutoCAD")    #define _DEBUG_WAS_DEFINED    #undef _DEBUG#endif
А в конце:

--- Код - C++ [Выбрать] ---#ifdef _DEBUG_WAS_DEFINED    #define _DEBUG    #undef _DEBUG_WAS_DEFINED#endif 
В этом случае можно использовать и Multi-threaded Debug DLL (/MDd)

Александр Ривилис:

--- Цитата: pucher от 12-05-2024, 19:23:10 ---В скаченном ObjectARX 2013 SDK нет Arx Wizzard
--- Конец цитаты ---
Он есть здесь: http://images.autodesk.com/adsk/files/objectarx_wizards_2013.zip
Разблокировать и устанавливать от имени Администратора.

Навигация

[0] Главная страница сообщений

[*] Предыдущая страница

Перейти к полной версии