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

ADN Club => AutoCAD .NET API => Тема начата: Zombiy от 08-04-2016, 15:04:10

Название: Создать текст перпендикулярно полилинии
Отправлено: Zombiy от 08-04-2016, 15:04:10
Здравствуйте! Не могу разобраться как создавать текст под определенным углом. У меня есть полилиния, на которой я в определенных точках строю перпендикуляры, и выполняю прочие действия. Мне нужно в этих точках создавать текст, который будет расположен параллельно этим перпендикулярам. C#
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Александр Пекшев aka Modis от 08-04-2016, 15:07:22
Его можно создавать горизонтальным и поворачивать (https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-NET/files/GUID-DAF76951-DD0C-413F-86A8-471E2B94C1C0-htm.html) на нужный угол
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Zombiy от 08-04-2016, 15:17:13
Его можно создавать горизонтальным и поворачивать на нужный угол
спасибо. Хотелось знать из чего можно извлечь этот угол. На данный момент мне приходится ради этого строить линию, перпендикулярную полилинии, и извлекать угол из нее.
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Дмитрий Загорулькин от 08-04-2016, 15:49:14
На данный момент мне приходится ради этого строить линию, перпендикулярную полилинии
А линию как-то же строите? По каким данным?
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Zombiy от 08-04-2016, 16:20:41
Цитировать
А линию как-то же строите? По каким данным?
Код - C# [Выбрать]
  1. Vector3d tangentVector = acPoly.GetFirstDerivative(acPoly.GetPointAtDist(i));
  2.                             Vector3d perpendicularVector = tangentVector.GetPerpendicularVector();
  3.                             perpendicularVector = perpendicularVector.GetNormal();
  4.                             Point3d startPoint = acPoly.GetPointAtDist(i) + perpendicularVector *10;
  5.                             Point3d endPoint = acPoly.GetPointAtDist(i) - perpendicularVector * 10;
с помощью вектора, беру две точки, соединяю линией. У вектора не знаю как угол взять
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Дмитрий Загорулькин от 08-04-2016, 17:03:48
Можно так:
Код - C# [Выбрать]
  1. Vector3d vec = new Vector3d(1.0, 2.0, 0.0);
  2. double angle = vec.GetAngleTo(Vector3d.XAxis);
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Александр Ривилис от 08-04-2016, 17:19:43
У вектора не знаю как угол взять
Например так:
Код - C# [Выбрать]
  1. double ang = Vector3d.XAxis.GetAngleTo(perpendicularVector, Vector3d.ZAxis);

Код исправлен.
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Zombiy от 08-04-2016, 17:26:34
Спасибо! то что надо!
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Дмитрий Загорулькин от 08-04-2016, 17:29:12
Код - C# [Выбрать]
  1. double ang = perpendicularVector.GetAngleTo(Vector3d.XAxis, Vector3d.ZAxis);
Да, такой вариант более правильный. Учитывает, что вектора могут быть трехмерными. Я даже не знал о такой перегрузке метода :)
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Александр Ривилис от 08-04-2016, 17:32:20
Да, такой вариант более правильный. Учитывает, что вектора могут быть трехмерными. Я даже не знал о такой перегрузке метода :)
Тут важнее другое: в моём варианте угол в пределах [0, 2 x Pi]. А в твоём варианте в пределах [0, Pi]
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Дмитрий Загорулькин от 08-04-2016, 18:11:22
Я же не поленился и проверил :)
Да, мой вариант не возвращает углы больше 180 градусов.
Странно, но эти два варианта разные значения возвращают в тех случаях, когда должны возвращать одинаковые, по идее. Такое ощущение, что в Вашем варианте угол измеряется по часовой стрелке (по правилу левой руки). Особенность?
Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Александр Ривилис от 08-04-2016, 18:55:37
В моём случае правильнее будет так
Код - C# [Выбрать]
  1. double ang = Vector3d.XAxis.GetAngleTo(perpendicularVector, Vector3d.ZAxis);
т.е. на какой угол нужно повернуть ось X по правилу правой руки, чтобы получить вектор perpendicularVector.
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Александр Ривилис от 08-04-2016, 18:56:17
Особенность?
Нет. Ошибка в моём коде. Я исправил в своём сообщении, чтобы не вводить в заблуждение.
Название: Re: Создать текст перпендикулярно полилинии
Отправлено: Дмитрий Загорулькин от 08-04-2016, 19:32:36
т.е. на какой угол нужно повернуть ось X по правилу правой руки, чтобы получить вектор perpendicularVector
Понятно. Да, вполне логично. Проверил - работает как надо!