Поворот системы координат и ее перемещение

Автор Тема: Поворот системы координат и ее перемещение  (Прочитано 8164 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн GIPPYАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 65
  • Карма: 0
Всем привет, прошу помощи.
У меня такой вопрос:
В автокаде есть такая команда UCS, она позволяет повернуть систему координат и передвинуть, при этом нарисованные объекты как-бы остаются на месте, автокад у них меняет координаты под новое положение системы координат. Можно ли в ревите провернуть такое ?
Поясню для чего это. У меня на схеме есть группа объектов, расположенных ортогонально, я часть объектов повернуто и они привязаны по координатам к повернутой системе координат. Я когда плагином рисую в автокаде эти объекты просто командой  UCS меняю положение системы коодинат, рисую повернуьтые объекты, затем этой же командой  UCS возвращаю систему координат на место. Все это делается, чтобы не пересчитывать координаты для повернутых объектов, если бы не было команды UCS.  Есть в ревите API такая команда ?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Прям аналога - нет. Вариантов 2 на самом деле. Первый - всё-таки считать координаты, благо в Revit-е работа с ними проще и приятнее, чем в автокаде. Второй вариант - ElementTransformUtils, но там, к сожалению нет возможности передать Transform, приходится по отдельным операциям - move, rotate и т.д. Второй вариант в определенных ситуациях может дать серьёзный прирост в производительности. Как-то нужно было мне создать большое количество семейств и каждое повернуть на определенный угол (один для всех), окей, поехали, несколько семейств создаем методом NewFamilyInstances2 - ок, но поворот каждого - как-то неприлично долго. Тогда идём другим путём, создаем семейства в позициях, повернутых на -1*угол, потом методом RotateElements поворачиваем их все сразу на заданный угол. Получилось сильно быстрее.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
благо в Revit-е работа с ними проще и приятнее, чем в автокаде.
Докажи свою мысль.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Ну ладно, может был слегка категоричен. Пусть будет имхо. На вскидку вот.

Много шума. Пара примеров:
  • 0.5*(x + y) vs 0.5*(x.GetAsVector() + y.GetAsVector())
  • x.DotProduct(y) vs x.GetAsVector().DotProduct(y.GetAsVector())

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

Создание Autodesk.Revit.DB.Transform легче, чем Autodesk.AutoCAD.Geometry.Matrix3d

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Много шума. Пара примеров:

    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 может найтись соответствующая система координат.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
не разделяет понятия точки и вектора

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

Для примитивов AutoCAD
Для примитивов - согласен, но в основе, всё равно, используется базовый функционал преобразований векторов

Оффлайн GIPPYАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 65
  • Карма: 0
Второй вариант - ElementTransformUtils, но там, к сожалению нет возможности передать Transform, приходится по отдельным операциям - move, rotate и т.д.

Спасибо за ответ !
По второму варианту можно пояснить, как он работает по подробнее ......

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
А что конкретно не ясно? Там, вроде, всё просто. Статические методы для переноса (Move), поворота (Rotate), отражения (Mirror) элементов.

Оффлайн GIPPYАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 65
  • Карма: 0
Так все-таки речь о изменении положения объектов, а не системы координат ?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Да, о положении объекта или объектов. Но расчёты можно делать предварительно в удобной системе координат и потом просто перейти к глобальной

Оффлайн GIPPYАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 65
  • Карма: 0
Нашел эту команду, она применима к элементам, ее можно использовать для перемещения и поворота семейства ?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Можно

Оффлайн GIPPYАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 65
  • Карма: 0
Можете подсказать как ? Я не силен в ревите API, поэтому прошу помощи, может какой пример....

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Уточни конкретнее, в чём проблема. Всё, вроде, прозрачно:
Код - C# [Выбрать]
  1. ElementTransformUtils.MoveElements(document, elementsToMove, distance*XYZ.BasisX);

Переместит все элементы из списка elementsToMove на расстояние distance по оси OX

Оффлайн GIPPYАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 65
  • Карма: 0
Спасибо за ответ !
Мне нужна команда поворота для семейства вокруг оси 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
« Последнее редактирование: 09-07-2021, 20:50:34 от GIPPY »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
GIPPY,
Напоминаю о правиле форматирования кода на форуме!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
ЭЭЭ... А почему ты ищешь типоразмеры?

Оффлайн GIPPYАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 65
  • Карма: 0
Типоразмеры ?
Наверное не понял ваш вопрос.
В моём коде я попытался отфильтровать семейства по имени и сделать поворот на заданный угол, но поворот не получается.



Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
.OfClass(GetType(FamilySymbol))


Типоразмеры. А поворачиваются экземпляры

Оффлайн GIPPYАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 65
  • Карма: 0
Подскажите, а как правильно ?

Отмечено как Решение Александр Ривилис 14-07-2021, 19:15:37

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Так от твоей задачи зависит же. Думаю, тебе имеет смысл поставить RevitLookup для того, чтобы понять структуру модели, какие классы используются и т.д.

Здесь сложновато дать совет. Имей ввиду, есть системные семейства, такие как Wall или Floor, есть пользовательские - FamilyInstance. Твой код показывает намерение поворачивать именно пользовательские семейства - модели в контексте (и, возможно, полученные через трюк с экспортом-импортом в IFC), тогда бы я сказал, что нужно заменить FamilySymbol на FamilyInstance, но совпадает ли это с тем, что ты хочешь получить я не знаю

Оффлайн GIPPYАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 65
  • Карма: 0
Огромное спасибо !
Заменил на FamilyInstance - все заработало !