Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Phil от 29-03-2018, 09:20:35

Название: Что такое GeCurve и для чего ее используют
Отправлено: Phil от 29-03-2018, 09:20:35
Добрый день!
Подскажите пожалуйста, где можно почитать о GeCurve и для чего она нужна? Ни на форуме, ни в поиске не смог найти вразумительного ответа...
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Александр Пекшев aka Modis от 29-03-2018, 09:56:33
Скорее всего так (моё предположение):
Класс Curve представляет собой все криволинейные объекты и позволяет с ними работать как с элементами БД. Минимум математических методов.
Абстрактный класс AcGeCurve3d (или AcGeCurve2d) позволяет с этими объектами производить математические вычисления.
Т.е. это просто различные по своей направленности методы, собранные в разных пространствах имён и разных абстрактных классах для следования принципам полиморфизма
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Phil от 29-03-2018, 10:00:35
Собственно, вопрос связан с тем, что при работе с Curve иногда возникает непонятная и нерегулярная ошибка при обращении к методу GetClosestPointTo, которому кроме точки я передаю еще и Vector3d. Вот я и думаю, может через GeCurve можно будет избежать ошибки.
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Александр Пекшев aka Modis от 29-03-2018, 10:02:23
вопрос связан с тем, что при работе с Curve иногда возникает непонятная и нерегулярная ошибка при обращении к методу GetClosestPointTo
Что за ошибка? Может вы не в ту сторону копаете?
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Phil от 29-03-2018, 10:21:23
Условия возникновения ошибки:
1. Нужно выбрать сегмент полилинии (может быть и 2d и 3d). Его я вычисляю по полученному ObjectId и PickedPoint из запроса PromptEntityResult.
2. Координаты Z вершин полилинии отличаются от нуля.
3. DSC повернута относительно WCS.

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

(https://s14.postimg.org/yppipn8ml/2018-03-29_10-15-22.png) (https://postimg.org/image/yppipn8ml/)(https://s14.postimg.org/r9q93usn1/2018-03-29_10-15-54.png) (https://postimg.org/image/r9q93usn1/)(https://s14.postimg.org/nriukotu5/2018-03-29_10-16-50.png) (https://postimg.org/image/nriukotu5/)
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Александр Пекшев aka Modis от 29-03-2018, 10:34:57
Во-первых - описанных причин по идее не должно быть. Все методы работают с координатами в WCS. Значит логично предположить, что у вас где-то неверная координата. Если поставить WCS метод будет работать без использования Vector3D?
Во-вторых:
Это Vector3d я вычисляю как вектор из точки VIEWDIR и Point3d.Origin
Учтите, что метод должен принимать нормальный вектор, т.е. единичной длины. И этот вектор задает нормаль плоскости на которую должна проецироваться точка - т.е. VIEWDIR должно быть достаточно
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Phil от 29-03-2018, 10:41:18
Во-первых - описанных причин по идее не должно быть. Все методы работают с координатами в WCS. Значит логично предположить, что у вас где-то неверная координата. Если поставить WCS метод будет работать без использования Vector3D?
Без использования Vector3d, будет выбран красный отрезок, тогда как на 1 картинке запрос даст точку визуально близкую к зеленому (точка получена из PickPoint, ее координаты в общем случае преобразованы из CCS в WCS). И положение точки в пространстве будет ближе к красному, а не указанному в запросе зеленому отрезку.
Использование привязки в этом случае не поможет, поскольку под привязку могут попасть другие вообще посторонние объекты чертежа.
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Phil от 29-03-2018, 10:49:04
Учтите, что метод должен принимать нормальный вектор, т.е. единичной длины. И этот вектор задает нормаль плоскости на которую должна проецироваться точка - т.е. VIEWDIR должно быть достаточно
Благодарю за подсказку. Привел длину вектора, полученного из VIEWDIR к единице. Делением вектора на его длину. Ошибка пока не возникала. Но она нерегулярная, так что пока ничего сказать не могу.
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Александр Ривилис от 29-03-2018, 11:15:30
Это Vector3d я вычисляю как вектор из точки VIEWDIR и Point3d.Origin.
А точнее?
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Александр Ривилис от 29-03-2018, 11:16:10
ее координаты в общем случае преобразованы из CCS в WCS
Что за CCS???
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Phil от 29-03-2018, 11:22:06
А точнее?

Код частично взят из этой статьи 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)
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Александр Ривилис от 29-03-2018, 11:41:11
Второй вариант функции возвращает вектор в UCS, а не в WCS. Кроме того acViewVector.GetNormal() и  acViewVector.DivideBy(acViewVector.Length) - это одно и тоже.
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Phil от 29-03-2018, 11:46:28
Кроме того 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
Название: Re: Что такое GeCurve и для чего ее используют
Отправлено: Александр Ривилис от 29-03-2018, 11:54:23
Скорее уж так (но я не тестировал):
Код - 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