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

ADN Club => Revit API => Тема начата: GIPPY от 05-07-2021, 09:51:19

Название: Поворот системы координат и ее перемещение
Отправлено: GIPPY от 05-07-2021, 09:51:19
Всем привет, прошу помощи.
У меня такой вопрос:
В автокаде есть такая команда UCS, она позволяет повернуть систему координат и передвинуть, при этом нарисованные объекты как-бы остаются на месте, автокад у них меняет координаты под новое положение системы координат. Можно ли в ревите провернуть такое ?
Поясню для чего это. У меня на схеме есть группа объектов, расположенных ортогонально, я часть объектов повернуто и они привязаны по координатам к повернутой системе координат. Я когда плагином рисую в автокаде эти объекты просто командой  UCS меняю положение системы коодинат, рисую повернуьтые объекты, затем этой же командой  UCS возвращаю систему координат на место. Все это делается, чтобы не пересчитывать координаты для повернутых объектов, если бы не было команды UCS.  Есть в ревите API такая команда ?
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 05-07-2021, 11:10:28
Прям аналога - нет. Вариантов 2 на самом деле. Первый - всё-таки считать координаты, благо в Revit-е работа с ними проще и приятнее, чем в автокаде. Второй вариант - ElementTransformUtils, но там, к сожалению нет возможности передать Transform, приходится по отдельным операциям - move, rotate и т.д. Второй вариант в определенных ситуациях может дать серьёзный прирост в производительности. Как-то нужно было мне создать большое количество семейств и каждое повернуть на определенный угол (один для всех), окей, поехали, несколько семейств создаем методом NewFamilyInstances2 - ок, но поворот каждого - как-то неприлично долго. Тогда идём другим путём, создаем семейства в позициях, повернутых на -1*угол, потом методом RotateElements поворачиваем их все сразу на заданный угол. Получилось сильно быстрее.
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Ривилис от 05-07-2021, 12:25:48
благо в Revit-е работа с ними проще и приятнее, чем в автокаде.
Докажи свою мысль.
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 05-07-2021, 14:05:52
Ну ладно, может был слегка категоричен. Пусть будет имхо. На вскидку вот.

Много шума. Пара примеров:

Преобразование координат скорее задача системы координат, чем точки, т.е., имхо transform.OfPoint(x) логичнее, чем x.TransformBy(matrix)

Создание Autodesk.Revit.DB.Transform легче, чем Autodesk.AutoCAD.Geometry.Matrix3d
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Ривилис от 05-07-2021, 16:34:50
Много шума. Пара примеров:

    0.5*(x + y) vs 0.5*(x.GetAsVector() + y.GetAsVector())
    x.DotProduct(y) vs x.GetAsVector().DotProduct(y.GetAsVector())
Это лишь в силу того, что Revit API не разделяет понятия точки и вектора. Не уверен, что это хорошее решение.
Преобразование координат скорее задача системы координат, чем точки, т.е., имхо transform.OfPoint(x) логичнее, чем x.TransformBy(matrix)
Это если идет речь о геометрических точках. Для примитивов AutoCAD это физическое преобразование их геометрии, причем для некоторых примитивов после такой трансформации это реально другая геометрия. Например, разные масштабы по X,Y.Z, что приводит к преобразованию типа круг->эллипс. Систему координат так не преобразуешь. Во всяком случае в AutoCAD любые системы координат имеют равные по длине единицы вдоль всех осей. Так что не для любой матрицы в AutoCAD может найтись соответствующая система координат.
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 05-07-2021, 16:56:32
не разделяет понятия точки и вектора

Точка в пространстве = радиус-вектор :-)

Для примитивов AutoCAD
Для примитивов - согласен, но в основе, всё равно, используется базовый функционал преобразований векторов
Название: Re: Поворот системы координат и ее перемещение
Отправлено: GIPPY от 06-07-2021, 18:02:14
Второй вариант - ElementTransformUtils, но там, к сожалению нет возможности передать Transform, приходится по отдельным операциям - move, rotate и т.д.

Спасибо за ответ !
По второму варианту можно пояснить, как он работает по подробнее ......
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 06-07-2021, 18:17:01
А что конкретно не ясно? Там, вроде, всё просто. Статические методы для переноса (Move), поворота (Rotate), отражения (Mirror) элементов.
Название: Re: Поворот системы координат и ее перемещение
Отправлено: GIPPY от 06-07-2021, 18:23:16
Так все-таки речь о изменении положения объектов, а не системы координат ?
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 06-07-2021, 18:27:45
Да, о положении объекта или объектов. Но расчёты можно делать предварительно в удобной системе координат и потом просто перейти к глобальной
Название: Re: Поворот системы координат и ее перемещение
Отправлено: GIPPY от 06-07-2021, 18:34:00
Нашел эту команду, она применима к элементам, ее можно использовать для перемещения и поворота семейства ?
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 06-07-2021, 18:35:54
Можно
Название: Re: Поворот системы координат и ее перемещение
Отправлено: GIPPY от 06-07-2021, 18:38:24
Можете подсказать как ? Я не силен в ревите API, поэтому прошу помощи, может какой пример....
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 07-07-2021, 09:55:32
Уточни конкретнее, в чём проблема. Всё, вроде, прозрачно:
Код - C# [Выбрать]
  1. ElementTransformUtils.MoveElements(document, elementsToMove, distance*XYZ.BasisX);

Переместит все элементы из списка elementsToMove на расстояние distance по оси OX
Название: Re: Поворот системы координат и ее перемещение
Отправлено: GIPPY от 09-07-2021, 19:00:57
Спасибо за ответ !
Мне нужна команда поворота для семейства вокруг оси Z.
Написал вот такой код, ревит не ругается, но поворот не осуществляет вокруг оси Z.
Код - vb.net [Выбрать]
  1. Dim collector4 As New FilteredElementCollector(doc)
  2.         Dim list_level4 As New List(Of Element)
  3.         collector4.OfClass(GetType(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFoundation)
  4.         level_count = collector4.OfClass(GetType(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFoundation).Count
  5.  
  6.         If level_count >= 1 Then
  7.             list_level4 = collector4.OfClass(GetType(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralFoundation).ToElements
  8.             Dim transaction6 As New Transaction(doc, "RvtCmd_CrExtrusion")
  9.             Dim ln As Line
  10.             Dim gh As New XYZ(0, 0, 0)
  11.             ln = Line.CreateUnbound(gh, XYZ.BasisZ)
  12.             For ik = 0 To level_count - 1
  13.                 If list_level4.Item(ik).Name = srsm + "-" + Format(imarka, "0") Then
  14.                     transaction6.Start()
  15.                     Dim s As String
  16.                     s = InputBox("Задайте угол в радианах", "Поворот")
  17.                     ElementTransformUtils.RotateElement(doc, list_level4.Item(ik).Id, ln, Val(s))
  18.                     transaction6.Commit()
  19.                 End If
  20.             Next
  21.         End If
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Ривилис от 09-07-2021, 20:30:18
GIPPY,
Напоминаю о правиле форматирования кода на форуме!
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 12-07-2021, 12:19:49
ЭЭЭ... А почему ты ищешь типоразмеры?
Название: Re: Поворот системы координат и ее перемещение
Отправлено: GIPPY от 13-07-2021, 09:14:00
Типоразмеры ?
Наверное не понял ваш вопрос.
В моём коде я попытался отфильтровать семейства по имени и сделать поворот на заданный угол, но поворот не получается.


Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 13-07-2021, 10:25:54
.OfClass(GetType(FamilySymbol))


Типоразмеры. А поворачиваются экземпляры
Название: Re: Поворот системы координат и ее перемещение
Отправлено: GIPPY от 13-07-2021, 10:39:31
Подскажите, а как правильно ?
Название: Re: Поворот системы координат и ее перемещение
Отправлено: Александр Игнатович от 13-07-2021, 10:52:32
Так от твоей задачи зависит же. Думаю, тебе имеет смысл поставить RevitLookup для того, чтобы понять структуру модели, какие классы используются и т.д.

Здесь сложновато дать совет. Имей ввиду, есть системные семейства, такие как Wall или Floor, есть пользовательские - FamilyInstance. Твой код показывает намерение поворачивать именно пользовательские семейства - модели в контексте (и, возможно, полученные через трюк с экспортом-импортом в IFC), тогда бы я сказал, что нужно заменить FamilySymbol на FamilyInstance, но совпадает ли это с тем, что ты хочешь получить я не знаю
Название: Re: Поворот системы координат и ее перемещение
Отправлено: GIPPY от 14-07-2021, 14:01:49
Огромное спасибо !
Заменил на FamilyInstance - все заработало !