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

ADN Club => Revit API => Тема начата: sdv79 от 22-09-2020, 16:38:57

Название: FamilyInstance Rotation property
Отправлено: sdv79 от 22-09-2020, 16:38:57
Подскажите как определить угол поворота.
Revit LookUp и
Код - C# [Выбрать]
  1. var rotation = (familyInstance.Location as LocationPoint).Rotation;
  2.  

выдает один и тот же результат.

(https://i.postimg.cc/671CbPND/image.png) (https://postimg.cc/671CbPND)
Название: Re: FamilyInstance Rotation property
Отправлено: Александр Игнатович от 22-09-2020, 16:44:55
Я бы использовал систему координат:
Код - C# [Выбрать]
  1. familyInstance.GetTotalTransform()

Либо свойства FacingOrientation / HandOrientation
Название: Re: FamilyInstance Rotation property
Отправлено: Александр Игнатович от 22-09-2020, 16:50:20
Вот эти направления, только, соответственно в координатах проекта будут как раз FacingOrientation (transform.BasisY) и HandOrientation (transform.BasisX)

(https://i.postimg.cc/DSjBHWXY/coordinate-system.png) (https://postimg.cc/DSjBHWXY)
Название: Re: FamilyInstance Rotation property
Отправлено: sdv79 от 22-09-2020, 16:52:55
GetTotalTransform не дает поворота
(https://i.postimg.cc/Wt4MrrQd/image.png) (https://postimg.cc/Wt4MrrQd)
Название: Re: FamilyInstance Rotation property
Отправлено: Александр Игнатович от 22-09-2020, 16:55:41
Вообще-то даёт. Целых 3. Вокруг всех осей.
Название: Re: FamilyInstance Rotation property
Отправлено: Александр Игнатович от 22-09-2020, 16:57:50
Полагаю, что тебе интересен поворот в плоскости X0Y. Тогда просто найди угол между XYZ.BasisX и transform.BasisX
Название: Re: FamilyInstance Rotation property
Отправлено: sdv79 от 22-09-2020, 17:15:00
Получилось с костылями, в радианах
Код - C# [Выбрать]
  1.  var familyInstanceTransform = familyInstance.GetTransform();
  2.  
  3.  var objectRotation = familyInstanceTransform.BasisX.AngleOnPlaneTo(familyInstanceTransform.OfVector(familyInstanceTransform.BasisX), familyInstanceTransform.BasisZ);
  4.  
Название: Re: FamilyInstance Rotation property
Отправлено: Александр Игнатович от 22-09-2020, 18:14:23
Перемудрил, хоть и верный ответ получил в итоге  ;D

Смотри на простом примере. Пусть семейство повернуто на 30 градусов в плоскости X0Y, т.е. familyInstanceTransform.BasisX / familyInstanceTransform.BasisY также повернут на 30 градусов, дальше ты просишь:
Код - C# [Выбрать]
  1. familyInstanceTransform.OfVector(familyInstanceTransform.BasisX)

Здесь familyInstanceTransform.BasisX - вектор в локальной системе координат ты просишь перевести в глобальную, т.е. к повороту вектора (30 градусов) добавляется поворот системы координат familyInstanceTransform так же 30 градусов, т.е. в глобальной системе координат это будет вектор, повернутый на 60 градусов.

Теперь на шаг назад. Ты вычисляешь угол поворота между векторами 30 градусов (familyInstanceTransform.BasisX) и 60 градусов, закономерно получая поворот на 30 градусов :-)

В общем, для плоскости X0Y всё намного проще:
Код - C# [Выбрать]
  1. XYZ.BasisX.AngleOnPlaneTo(familyInstanceTransform.BasisX, XYZ.BasisZ)

Для поворотов в остальных основных плоскостях по аналогии.