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

ADN Club => Revit API => Тема начата: shss от 21-10-2015, 17:12:14

Название: Проекция линии на плоскость
Отправлено: shss от 21-10-2015, 17:12:14
Добрый вечер!
Пытаюсь спроецировать линию на выбранную поверхность/плоскость, для этого каждую точку линии проецирую на поверхностьЖ
Код - C# [Выбрать]
  1. if (sketch != null) {
  2.     Plane plane = sketch.GetPlane();
  3.     XYZ firstPoint = PointProject(plane, line.GetEndPoint(0));
  4.     XYZ secondPoint = PointProject(plane, line.GetEndPoint(1));
  5. }
  6.  
  7. public XYZ PointProject(Plane plane, XYZ p) {
  8.     double d = plane.Normal.DotProduct(p - plane.Origin);
  9.     return q = p + d * plane.Normal;
  10. }
  11.  
Но проекция не всегда срабатывает, особенно с вертикальной поверхностью.
За основу брал http://thebuildingcoder.typepad.com/blog/2014/09/planes-projections-and-picking-points.html
Название: Re: Проекция линии на плоскость
Отправлено: Александр Игнатович от 21-10-2015, 17:15:43
Если на выбранную поверхность, то, получив Face, можно воспользоваться методом Face.Project
Название: Re: Проекция линии на плоскость
Отправлено: shss от 21-10-2015, 17:17:19
Это не всегда будет Face, это может быть уровень.
Название: Re: Проекция линии на плоскость
Отправлено: Александр Игнатович от 21-10-2015, 17:19:02
Тогда все еще проще. Заменяем Z точки на высоту уровня
Название: Re: Проекция линии на плоскость
Отправлено: shss от 21-10-2015, 17:24:53
В этом есть смысл, но хотелось бы что-то более менее универсальное, потому как это может быть плоскость построенная по трем точкам, и в итоге я создаю SketchPlane для "любого элемента" (Face, уровень, Sketch по трем точкам).
А уже из Sketch-а я получаю поверхность, через GetPlane.
Название: Re: Проекция линии на плоскость
Отправлено: Александр Игнатович от 21-10-2015, 17:30:46
у меня есть метод, за основу брал по той же ссылке, в процессе отладки он получился вот такой:

Код - C# [Выбрать]
  1.         public static XYZ ProjectOnto(this Plane plane, XYZ p)
  2.         {
  3.             var d = plane.SignedDistanceTo(p);
  4.  
  5.             var q = p - d * plane.Normal;
  6.  
  7.             return q;
  8.         }
  9.  
  10.         public static double SignedDistanceTo(this Plane plane, XYZ p)
  11.         {
  12.             var v = p - plane.Origin;
  13.  
  14.             return plane.Normal.DotProduct(v);
  15.         }
  16.  

Подробностей уже не помню, честно говоря, хотел Тэммику написать, но как-то замотался, забыл
Название: Re: Проекция линии на плоскость
Отправлено: shss от 21-10-2015, 17:36:15
ну вот это-то у меня и не работает, я только объединил в одну функцию, вместо двух,
SignedDistanceTo - здесь он берет расстояние до точки поверхности (origin)
ProjectOnto - а вот здесь по идее берет точку опущенного перпендикуляра на поверхность,
Название: Re: Проекция линии на плоскость
Отправлено: Александр Игнатович от 21-10-2015, 17:38:05
Обратите внимание на знак

Код - C# [Выбрать]
  1. var q = p - d * plane.Normal;

В оригинале плюс был, у меня вроде бы все как надо работает
Название: Re: Проекция линии на плоскость
Отправлено: shss от 21-10-2015, 17:58:25
Вот теперь все отлично работает!
Все дело в знаке, надо взять на заметку.
Спасибо, за подсказку!
Название: Re: Проекция линии на плоскость
Отправлено: Александр Игнатович от 21-10-2015, 17:59:58
Супер, надо будет, все-таки, Тэммику написать  :)
Название: Re: Проекция линии на плоскость
Отправлено: shss от 21-10-2015, 18:03:13
Это точно.
Хотя странно, что никто ему в комментах не написал об этом.
И, кстати, это уже не первый раз, где он со знаком ошибается :)
Название: Re: Проекция линии на плоскость
Отправлено: Александр Игнатович от 21-10-2015, 18:05:26
Ну все мы люди, сколько раз я на учебе на всяких контрольных со знаком ошибался - не пересчитать :)