ADN Club > ObjectARX

Ошибка intersectWith()

(1/2) > >>

pucher:
Добрый. Если выбрать 2 не пересекающихся объекта, функция работает, как задумано. Если выбрать пересекающиеся объекты, то после выхода из функции вылетает ошибка.

--- Код - C++ [Выбрать] ---void F4(){        int es1, es2;        ads_name ent1, ent2;        ads_point pt1, pt2;        AcDbObjectId entId1, entId2;        AcDbEntity* pEnt1 = NULL;        AcDbEntity* pEnt2 = NULL;        AcGePoint3dArray points;         if (acedEntSel(L"\nУкажите объект 1: ", ent1, pt1) != RTNORM)                return;         if (acdbGetObjectId(entId1, ent1) != Acad::eOk)                return;         if (acdbOpenAcDbEntity(pEnt1, entId1, AcDb::kForRead) != Acad::eOk)                return;         if (acedEntSel(L"\nУкажите объект 2: ", ent2, pt2) != RTNORM)        {                pEnt1->close();                return;        }         if (acdbGetObjectId(entId2, ent2) != Acad::eOk)        {                pEnt1->close();                return;        }         if (acdbOpenAcDbEntity(pEnt2, entId2, AcDb::kForRead) != Acad::eOk)        {                pEnt1->close();                return;        }         if (pEnt1->intersectWith(pEnt2, AcDb::kOnBothOperands, points) != Acad::eOk)                return;         if (points.length() == 0)                acutPrintf(L"\nОбъекты не пересекаются. ");         else        {                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);        }         pEnt1->close();        pEnt2->close();         return;}

Александр Ривилис:
Я смотрю, что в твоем коде далеко не всегда вызывается метод pEnt1->close() и pEnt2->close() - а именно в случае если объекты не пересекаются.
Очень рекомендую использовать интеллектуальные указатели (типа AcDbObjectPointer<AcDbLine> или AcDbEntityPointer)
Они автоматически закроют объект (вызовут его метод close()) по выходе из области видимости локальной переменной.

pucher:

--- Цитата: Александр Ривилис от 11-05-2024, 21:27:44 ---Я смотрю, что в твоем коде далеко не всегда вызывается метод pEnt1->close() и pEnt2->close() - а именно в случае если объекты не пересекаются.
--- Конец цитаты ---
Как я понимаю, закрытие производится только после успешного открытия через acdbOpenAcDbEntity(). Любой код ошибки - объект не открылся, закрывать, соответственно, нечего. Например:
- открыли объект через acdbOpenAcDbEntity();
- выполнили необходимые манипуляции с объектом, в моем случае intersectWith();
- независимо от результата intersectWith() объекты закрыли в 51, 52 строках через close();
Поэтому не понял замечание.

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

--- Цитата: pucher от 11-05-2024, 23:31:12 ---- независимо от результата intersectWith() объекты закрыли в 51, 52 строках через close();
--- Конец цитаты ---
Да? Ты уверен? :) Посмотри на строки 38 и 39.

pucher:

--- Цитата: Александр Ривилис от 11-05-2024, 23:35:26 ---Посмотри на строки 38 и 39.
--- Конец цитаты ---
Добавил,

--- Код - C++ [Выбрать] ---if (pEnt1->intersectWith(pEnt2, AcDb::kOnBothOperands, points) != Acad::eOk)        {                pEnt1->close();                pEnt2->close();                return;        }Только функция в случае наличия и отсутствия общих точек срабатывает правильно. Если после нее добавить

--- Код - C++ [Выбрать] ---AcGePoint3d acGePoint3d=points[0];Там будет точка с правильными координатами.
У меня ошибка вылетает не во время выполнения вызова какой-либо из функций, а после завершения основной функции F4().

Навигация

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

[#] Следующая страница

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