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

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 14-01-2019, 20:51:17

Название: Задание условия колинеарности
Отправлено: Atomohod от 14-01-2019, 20:51:17
Здравствуйте!

Есть ли какой-нибудь предусмотренный API способ задания колинеарности прямых при построении геометрии кодом? Встроенного метода для колинеарной прямой я не нашел, может плохо искал? Подскажите, пожалуйста.
Название: Re: Задание условия колинеарности
Отправлено: Александр Ривилис от 14-01-2019, 20:53:29
Здравствуйте!

Есть ли какой-нибудь предусмотренныйспособ задания колинеарности прямых при построении геометрии кодом?
Сначала объясни что ты под этим подразумеваешь. И желательно со знаками препинания. ;-)
Название: Re: Задание условия колинеарности
Отправлено: Atomohod от 14-01-2019, 21:08:41
Смысл такой:
Название: Re: Задание условия колинеарности
Отправлено: Александр Пекшев aka Modis от 14-01-2019, 21:17:14
Это все решается через вектора:
Из первого отрезка получаем единичный вектор, отняв от второй точки отрезка (EndPoint) первую точку (StartPoint) и вызвав метод GetNomal()
Из второй точки, указанной пользователем, получаем еще одну точку: pt + normalVector * length, где length - нужная длина отрезка
Строим второй отрезок по указанной и полученной точкам
Как два пальца  :D
Название: Re: Задание условия колинеарности
Отправлено: avc от 14-01-2019, 21:33:33
И все это считается чисто математически так же легко, без всяких вызов API. Особенно в 2d. И работает раз в 100 быстрей чем на API (хотя для построения одно линии это не важно)
Чисто для примера вычисление вашей второй точки линии:
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Сдвинуть точку в направлении вектора . быстро , без вызовов API
  3.     /// </summary>
  4.     public static Point2d Move(this Point2d pt, Vector2d vector, double distance)
  5.     {
  6.       if (distance == 0) return pt;
  7.       double len = Sqrt(vector.X * vector.X + vector.Y * vector.Y);
  8.       if (len == 0) return pt;
  9.       double k = distance / len;
  10.       return new Point2d(pt.X + vector.X * k, pt.Y + vector.Y * k);
  11.     }
Название: Re: Задание условия колинеарности
Отправлено: Atomohod от 14-01-2019, 21:47:08
С построением понятно, а как сохранить колинеарность впоследствии? Нужно что-то типа constraint.
Название: Re: Задание условия колинеарности
Отправлено: avc от 14-01-2019, 21:49:39
С построением понятно, а как сохранить колинеарность впоследствии? Нужно что-то типа constraint.
Вектор направления сохраните
Название: Re: Задание условия колинеарности
Отправлено: avc от 14-01-2019, 21:52:05
И потом используйте IsCodirectionalTo или IsParallelTo если вам это надо
Название: Re: Задание условия колинеарности
Отправлено: Александр Пекшев aka Modis от 14-01-2019, 21:54:33
С построением понятно, а как сохранить колинеарность впоследствии? Нужно что-то типа constraint.
Использовать параллельность из параметризации. Вот только программно, на сколько мне известно, её не установить.
Ну или можно самому реализовать через Overrule
Название: Re: Задание условия колинеарности
Отправлено: Александр Ривилис от 14-01-2019, 21:57:25
С построением понятно, а как сохранить колинеарность впоследствии? Нужно что-то типа constraint.
Не нужно. Потом пользователи будут кричать "как от этого избавиться" и почему чертеж "не шевелится".
Но если очень хочется, то изучай: https://adndevblog.typepad.com/autocad/2013/01/a-simplified-net-api-for-accessing-autocad-parameters-and-constraints.html
Название: Re: Задание условия колинеарности
Отправлено: Atomohod от 14-01-2019, 22:25:29
Спасибо