Что такое GeCurve и для чего ее используют

Автор Тема: Что такое GeCurve и для чего ее используют  (Прочитано 7822 раз)

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

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Добрый день!
Подскажите пожалуйста, где можно почитать о GeCurve и для чего она нужна? Ни на форуме, ни в поиске не смог найти вразумительного ответа...

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Скорее всего так (моё предположение):
Класс Curve представляет собой все криволинейные объекты и позволяет с ними работать как с элементами БД. Минимум математических методов.
Абстрактный класс AcGeCurve3d (или AcGeCurve2d) позволяет с этими объектами производить математические вычисления.
Т.е. это просто различные по своей направленности методы, собранные в разных пространствах имён и разных абстрактных классах для следования принципам полиморфизма

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Собственно, вопрос связан с тем, что при работе с Curve иногда возникает непонятная и нерегулярная ошибка при обращении к методу GetClosestPointTo, которому кроме точки я передаю еще и Vector3d. Вот я и думаю, может через GeCurve можно будет избежать ошибки.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
вопрос связан с тем, что при работе с Curve иногда возникает непонятная и нерегулярная ошибка при обращении к методу GetClosestPointTo
Что за ошибка? Может вы не в ту сторону копаете?

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Условия возникновения ошибки:
1. Нужно выбрать сегмент полилинии (может быть и 2d и 3d). Его я вычисляю по полученному ObjectId и PickedPoint из запроса PromptEntityResult.
2. Координаты Z вершин полилинии отличаются от нуля.
3. DSC повернута относительно WCS.

Полученный PickedPoint обычно имеет координату Z = 0. В общем случае, получаем PickedPoint визуально близкую к одному сегменту, но на самом деле по расстоянию - ближе к другому сегменту (за счет вышеописанных условий. И метод GetClosetPointTo без Vector3d дает неверный ответ. Это Vector3d я вычисляю как вектор из точки VIEWDIR и Point3d.Origin. В других местах, где я использую GetClosestPointTo без Vector3d, проблем не возникало.



Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Во-первых - описанных причин по идее не должно быть. Все методы работают с координатами в WCS. Значит логично предположить, что у вас где-то неверная координата. Если поставить WCS метод будет работать без использования Vector3D?
Во-вторых:
Это Vector3d я вычисляю как вектор из точки VIEWDIR и Point3d.Origin
Учтите, что метод должен принимать нормальный вектор, т.е. единичной длины. И этот вектор задает нормаль плоскости на которую должна проецироваться точка - т.е. VIEWDIR должно быть достаточно

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Во-первых - описанных причин по идее не должно быть. Все методы работают с координатами в WCS. Значит логично предположить, что у вас где-то неверная координата. Если поставить WCS метод будет работать без использования Vector3D?
Без использования Vector3d, будет выбран красный отрезок, тогда как на 1 картинке запрос даст точку визуально близкую к зеленому (точка получена из PickPoint, ее координаты в общем случае преобразованы из CCS в WCS). И положение точки в пространстве будет ближе к красному, а не указанному в запросе зеленому отрезку.
Использование привязки в этом случае не поможет, поскольку под привязку могут попасть другие вообще посторонние объекты чертежа.

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Учтите, что метод должен принимать нормальный вектор, т.е. единичной длины. И этот вектор задает нормаль плоскости на которую должна проецироваться точка - т.е. VIEWDIR должно быть достаточно
Благодарю за подсказку. Привел длину вектора, полученного из VIEWDIR к единице. Делением вектора на его длину. Ошибка пока не возникала. Но она нерегулярная, так что пока ничего сказать не могу.

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

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

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

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

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
А точнее?

Код частично взят из этой статьи http://adn-cis.org/obespechenie-parallelnosti-tranzitnoj-grafiki-ekranu.html

Код - vb.net [Выбрать]
  1.     Private Function GetViewDirection(ByVal acEditor As Editor) As Vector3d
  2.         Dim acUCS As Matrix3d = acEditor.CurrentUserCoordinateSystem
  3.         Dim acViewPoint As Point3d = Core.Application.GetSystemVariable("VIEWDIR")
  4.         Dim acViewVector As Vector3d = (acViewPoint - Point3d.Origin).TransformBy(acUCS).GetNormal()
  5.         Return acViewVector
  6.     End Function

Переписанная сейчас функция:

Код - vb.net [Выбрать]
  1.     Private Function GetViewDirection(ByVal acEditor As Editor) As Vector3d
  2.         Dim acViewPoint As Point3d = Core.Application.GetSystemVariable("VIEWDIR")
  3.         Dim acViewVector = acViewPoint.GetAsVector()
  4.         Return acViewVector.DivideBy(acViewVector.Length)
  5.     End Function

Что за CCS???
Ошибся при написании - UCS на самом деле (CurrentUserCoordinateSystem)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Второй вариант функции возвращает вектор в UCS, а не в WCS. Кроме того acViewVector.GetNormal() и  acViewVector.DivideBy(acViewVector.Length) - это одно и тоже.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 47
  • Карма: 0
Кроме того acViewVector.GetNormal() и  acViewVector.DivideBy(acViewVector.Length) - это одно и тоже.
Благодарю за информацию!

Второй вариант функции возвращает вектор в UCS, а не в WCS

То есть надо так?

Код - vb.net [Выбрать]
  1.     Private Function GetViewDirection(ByVal acEditor As Editor) As Vector3d
  2.         Dim acUCS As Matrix3d = acEditor.CurrentUserCoordinateSystem
  3.         Dim acViewPoint As Point3d = Core.Application.GetSystemVariable("VIEWDIR")
  4.         Return acViewPoint.TransformBy(acUCS).GetNormal()
  5.     End Function

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Скорее уж так (но я не тестировал):
Код - vb.net [Выбрать]
  1. Private Function GetViewDirection(ByVal acEditor As Editor) As Vector3d
  2.             Dim acUCS As Matrix3d = acEditor.CurrentUserCoordinateSystem
  3.             Dim acViewPoint As Point3d = Core.Application.GetSystemVariable("VIEWDIR")
  4.             Return acViewPoint.GetAsVector().TransformBy(acUCS).GetNormal()
  5. End Function
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение