Разделение кривых

Автор Тема: Разделение кривых  (Прочитано 15569 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 1
Разделение кривых
« : 25-08-2023, 14:10:35 »
Есть точки пересечения с определенной линией, хочется по этой точке разрезать объект, но после добавления сегментов в базуданных происходит зависание AutoCAD. Непонятно в чем проблема. Сообщения автокад не показывает.
(pEntity может быть полилинией или кругом)
Код - C++ [Выбрать]
  1. if (line->intersectWith(pEntity, AcDb::kOnBothOperands, arrPoint) == Acad::eOk && arrPoint.length() > 0)
  2. {
  3.         AcDbVoidPtrArray segments;
  4.         AcGeDoubleArray pointsDist{ 0 };
  5.         AcDbCurve* curve = AcDbCurve::cast(pEntity);
  6.         for (auto& point : arrPoint)
  7.         {
  8.                 AcGePoint3d p;
  9.                 curve->getClosestPointTo(point, p);
  10.                 double dist{ 0 };
  11.                 curve->getParamAtPoint(p, dist);
  12.                 pointsDist.append(dist);
  13.                 acutPrintf(_T("point dist %lf\n"), dist);
  14.         }
  15.         std::sort(pointsDist.begin(), pointsDist.end());                               
  16.         if (curve->getSplitCurves(pointsDist, segments) == Acad::eOk)
  17.         {
  18.                 acutPrintf(_T("len segments %d\n"), segments.length());
  19.                 for (int i{0}; i < segments.length(); i++)
  20.                 {
  21.                         AcDbEntity* seg = AcDbEntity::cast(static_cast<AcDbObject*>(segments[i]));
  22.                         pBlockTableRecord->appendAcDbEntity(seg);
  23.                         seg->close();
  24.                 }
  25.         }                              
  26. }
  27.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разделение кривых
« Ответ #1 : 25-08-2023, 15:52:49 »
А если вместо:
Код - C++ [Выбрать]
  1. AcDbEntity* seg = AcDbEntity::cast(static_cast<AcDbObject*>(segments[i]));
написать:
Код - C++ [Выбрать]
  1. AcDbCurve* seg = static_cast<AcDbCurve*>(segments[i]);
Ну и заодно проверяй результат:
pBlockTableRecord->appendAcDbEntity(seg);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 1
Re: Разделение кривых
« Ответ #2 : 28-08-2023, 08:44:38 »
Простите за бесопокойство и за долгий ответ.
Проблема оказалась, что в это время я, с помощью итераторов, ходил по таблице. И получилось так, что я бесконечно добавлял объекты на черчеж.

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 1
Re: Разделение кривых
« Ответ #3 : 08-09-2023, 15:45:05 »
Еще вопрос появился.
intersectWith не выдает точки пересечения если line и pEntity находятся на разных уровнях.
При этом pEntity это AcDbLine. И Уровень у начальной точки 0.2, а у конечной 110.
Есть вариант как-то получить точки пересечения в таком случае ?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 1
Re: Разделение кривых
« Ответ #5 : 08-09-2023, 16:35:48 »
Я попробовал, работает, но у полученной точки уровень равен 0.
Я поменял местами объекты, но результат такой же.

Отмечено как Решение Kruvcraft 09-09-2023, 14:11:21

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разделение кривых
« Ответ #6 : 08-09-2023, 17:38:13 »
но у полученной точки уровень равен 0.
Ну тогда тебе придется найти еще пересечение с вертикальным отрезком (прямой) из этой точки
Или попробуй метод getClosestPointTo:
Код - C++ [Выбрать]
  1. virtual Acad::ErrorStatus getClosestPointTo(
  2.     const AcGePoint3d& givenPnt,
  3.     const AcGeVector3d& direction,
  4.     AcGePoint3d& pointOnCurve,
  5.     Adesk::Boolean extend = Adesk::kFalse
  6. ) const;
  7.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 1
Re: Разделение кривых
« Ответ #7 : 09-09-2023, 14:10:44 »
getClosestPointTo не подошла под задачу, так как она меняла все координаты.

Point x: 40.940229 y: 15.941884 z: 0.000000
Point x: 44.635119 y: 14.478405 z: 0.280236

А вот идея с тем, чтобы строить линию очень интересная, в целом, я получил результат, который был нужен.

Point x: 40.940229 y: 15.941884 z: 0.000000
Point x: 40.940229 y: 15.941884 z: 56.639827

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разделение кривых
« Ответ #8 : 10-09-2023, 20:04:19 »
getClosestPointTo не подошла под задачу, так как она меняла все координаты.

Point x: 40.940229 y: 15.941884 z: 0.000000
Point x: 44.635119 y: 14.478405 z: 0.280236
Это при какой direction?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 1
Re: Разделение кривых
« Ответ #9 : 11-09-2023, 11:58:14 »
Я использовал перегрузку без данного параметра. Думаю будет безопаснее использовать линию, хотя с точки зрения памяти не очень получиться.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разделение кривых
« Ответ #10 : 12-09-2023, 12:23:23 »
Я использовал перегрузку без данного параметра.
Ну и зачем я тогда писал конкретно этот перегруженный метод ???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 1
Re: Разделение кривых
« Ответ #11 : 12-09-2023, 19:14:20 »
Просто, линии могут быть на разных уровнях в разных направлениях, можно вызвать два раза метод, с разными направлениями, но мне показалось это не совсем хорошим решением проблемы.

Появился другой вопрос, используется контур для разрезания.
Сделал два разрезания, один с помощью своей функции где используется intersectWith + getSplitCurves, другой с помощью функции MAPTRIM.
Некоторые линии различаются с точки зрения геометрии, как я понимаю это вызвано тем, что использовались разные алгоритмы поиска пересечения. Проблема в том, что оба результата отличаются от оригинала, то есть линии чуть дальше чем надо, но при этом intersectWith + getSplitCurves гораздо дальше.

На скрине зеленым MAPTRIM, красным intersectWith + getSplitCurves.


Можно как-то получить результат лучше чем MAPTRIM или на том же уровне ?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разделение кривых
« Ответ #12 : 13-09-2023, 13:22:02 »
Просто, линии могут быть на разных уровнях в разных направлениях
Если бы у тебя direction был равен AcGeVector3d::kZAxis, то менялась бы только координата Z - во всяком случае именно так должно работать.
Что касается точности, то ничего не скажу. Тут нужно разбираться с цифрами в каждом конкретном случае.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 12
  • Карма: 1
Re: Разделение кривых
« Ответ #13 : 13-09-2023, 16:23:06 »
Если бы у тебя direction был равен AcGeVector3d::kZAxis, то менялась бы только координата Z - во всяком случае именно так должно работать.
Попробовал все круто, спасибо.


Что касается точности, то ничего не скажу. Тут нужно разбираться с цифрами в каждом конкретном случае.
Точность это самое странное, так как если сравнить MAPTRIM и оригинал чертежа, то там не все гладко.

Красным MAPTRIM, зеленым оригинал.

Поэтому хотелось бы спросить, есть более точные инструменты ObjectARX для разрезания кривых ? 
Я пока не вижу вообще рабочего варианта, кроме смирения. Можно наверное подгонять решение под конкретный случай, но это не универсальный подход.


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разделение кривых
« Ответ #14 : 14-09-2023, 22:56:28 »
Поэтому хотелось бы спросить, есть более точные инструменты ObjectARX для разрезания кривых ? 
А вообще что у тебя за кривые? Т.е. какой класс примитива?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение