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

ADN Club => Revit API => Тема начата: shss от 16-06-2015, 17:54:14

Название: Координаты облака точек
Отправлено: shss от 16-06-2015, 17:54:14
Добрый день!
Возникла необходимость отслеживания изменения координат и вращения вставленного облака точек.
первым делом вставил облако точек и поместил его в нулевую координату
Код - C# [Выбрать]
  1. using (Transaction t = new Transaction(doc, "RCS Insertion")) {
  2.                     t.Start();
  3.                     PointCloudInstance pci = CreatePointCloud(doc, ofd.FileName);
  4.                     pci.Location.Move(XYZ.Zero);
  5.                     pci.Pinned = true;
  6.                                      
  7.                     t.Commit();
  8.                 }
Но дальше пришлось взять первую точку облака точек и по ней отслеживать перемещение, но проблема состоит в том, что при вращении и перемещении точки координаты перемещения неверны...
есть ли у облака точек точка относительно которой я могу определить его перемещение?
Что касается вращения я использовал Transform относительно нормали
Код - C# [Выбрать]
  1. Transform transform = pci.GetTransform();
  2.                         XYZ vectorTran = transform.OfVector(transform.BasisX);
  3.                         XYZ norm = new XYZ(1, 0, 0);
  4.                         double d1 = transform.BasisX.AngleTo(norm);
  5.                         pnts.Add(d1.ToString());
но при перемещении опять же координаты не верны.
Есть варианты попроще?
Спасибо
Название: Re: Координаты облака точек
Отправлено: Виктор Чекалин от 16-06-2015, 18:02:24
при вращении и перемещении точки координаты перемещения неверны
А что имеется ввиду под словом "не верны"?
есть ли у облака точек точка относительно которой я могу определить его перемещение?
В пользовательском интерфейсе есть что то подобное?

С облаками точек мне пока не приходилось работать. Если есть возможность, отправьте мне в личку файл с точками, попробуем разобраться вместе.
Название: Re: Координаты облака точек
Отправлено: shss от 16-06-2015, 18:16:44
Цитировать
А что имеется ввиду под словом "не верны"?
Если я беру координаты одной из точек облака(X,Y) и перемещаю координаты становятся (X1, Y1),которые мне нужны, но если я еще и поверну облако то координаты точки станут (X2,Y2),которые не являются верными.
Цитировать
В пользовательском интерфейсе есть что то подобное?
В пользовательском интерфейсе есть PinPoint как и у всех Insert объектов, "середина" облака точек если образно выражаться.
Название: Re: Координаты облака точек
Отправлено: Виктор Чекалин от 17-06-2015, 07:38:22
Сергей, попробуйте сделать поворот с помощью ElementTransformUtils.RotateElement.
По моему вы просто не верно выполнили поворот точек, с помощью кода из первого сообщения.
Название: Re: Координаты облака точек
Отправлено: shss от 17-06-2015, 07:41:59
Виктор, дак мне не нужно делать поворот, мне нужно определить было ли повернуто облако и на сколько градусов, относительно первоначального положения
Название: Re: Координаты облака точек
Отправлено: shss от 17-06-2015, 07:55:56
Оставил такое решение
Код - C# [Выбрать]
  1. Transform transform = pci.GetTransform();
  2.                     XYZ vectorTran = transform.OfVector(transform.BasisX);
  3.                     XYZ norm = new XYZ(1, 0, 0);
  4.                     double d1 = transform.BasisX.AngleTo(norm);
  5.                     d1 = d1 * (180 / Math.PI);
  6.  
  7.  
При этом берется угол между реальным положением облака (относительно точки вставки) и нормальным вектором.
Название: Re: Координаты облака точек
Отправлено: Виктор Чекалин от 17-06-2015, 14:12:22
Виктор, дак мне не нужно делать поворот, мне нужно определить было ли повернуто облако и на сколько градусов, относительно первоначального положения
Сергей, хорошо, что вы нашли решение, но все равно я так и не понял проблемы.
Смотрите, вы вставили облако точек. А дальше что? Поворачивали или нет? откуда мы берем первоначальное положение облака точек?

Название: Re: Координаты облака точек
Отправлено: shss от 17-06-2015, 15:00:32
Цитировать
Смотрите, вы вставили облако точек.
Вставил облако точек.
Код - C# [Выбрать]
  1.  private PointCloudInstance CreatePointCloud(Document doc, string rcsPath) {
  2.             PointCloudType type = PointCloudType.Create(doc, "rcs", rcsPath);
  3.             return (PointCloudInstance.Create(doc, type.Id, Transform.Identity));
  4.         }
  5.  
При этом вставляется в Original point.
Двигаю облако в нулевую точку.
Код - C# [Выбрать]
  1. pci.Location.Move(XYZ.Zero);
теперь двигаю облако в другое место и с помощью pci.GetTransform().Origin определяю новую точку и определяю изменение положения относительно первоначальной точки.
Запоминаю первоначальный угол поворота, ну он всегда должен быть равен 0
Цитировать
Поворачивали или нет?
Разворачиваю и с помощью
Код - C# [Выбрать]
  1. Transform transform = pci.GetTransform();
  2.                     XYZ vectorTran = transform.OfVector(transform.BasisX);
  3.                     XYZ norm = new XYZ(1, 0, 0);
  4.                     double d1 = transform.BasisX.AngleTo(norm);
  5.                     d1 = d1 * (180 / Math.PI);
  6.  
определяю угол разворота относительно первоначального положения
Название: Re: Координаты облака точек
Отправлено: Александр Ривилис от 17-06-2015, 15:32:55
shss, кто тут ленится форматировать код по правилам форума? Читайте мою подпись.
Название: Re: Координаты облака точек
Отправлено: shss от 17-06-2015, 15:35:30
Александр, исправился