ADN Club > ObjectARX
Ошибка intersectWith()
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().
Навигация
Перейти к полной версии