XYZ для CreateViaOffset

Автор Тема: XYZ для CreateViaOffset  (Прочитано 5528 раз)

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

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
XYZ для CreateViaOffset
« : 30-10-2018, 19:34:47 »
Добрый день.
Вопрос:
Как верно задать вектор XYZ в методе  CurveLoop.CreateViaOffset:
http://www.revitapidocs.com/2018.1/6cffc624-d197-0f3b-b68c-26b9c9a0adf8.htm
 , чтобы линии замкнутой фигуры сместились наружу ?



Отмечено как Решение Александр Ривилис 30-10-2018, 22:21:33

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: XYZ для CreateViaOffset
« Ответ #1 : 30-10-2018, 21:54:48 »
Если CurveLoop замкнутый, и все линии в одной плоскости, тогда указываем нормаль к этой плоскости, т.е. проверяем с помощью метода sourceLoop.HasPlane(), далее получаем плоскость и её нормаль:
Код - C# [Выбрать]
  1. var newLoop = CurveLoop.CreateViaOffset(sourceLoop, distance, sourceLoop.GetPlane().Normal);

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XYZ для CreateViaOffset
« Ответ #2 : 30-10-2018, 21:57:57 »
Тут нужно не normal'ом играться, а offset (положительный или отрицательный), а normal скорее всего { 0.0, 0.0, 1.0 }
Ну и судя по документации всё зависит от направления вращения исходного CurveLoop. Если он против часовой стрелки, то при положительном значении offset новый CurveLoop будет наружу, а при отрицательном внутрь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: XYZ для CreateViaOffset
« Ответ #3 : 30-10-2018, 22:00:28 »
А offset то с чего бы, это просто расстояние, на которое смещаются линии. normal тут ключевое, т.к. определяет плоскость, в которой производится работа

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: XYZ для CreateViaOffset
« Ответ #4 : 30-10-2018, 22:02:17 »
 Александр Ривилис,  Благодарю!
Я не понимаю причем тут Z=1 (и куда что то там вращается), но это работает

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XYZ для CreateViaOffset
« Ответ #5 : 30-10-2018, 22:03:21 »
Александр Игнатович,
А потому, что enot'а  интересует направление смещения - внутрь или наружу. И это определяет знак offset. Что касается выбора нормали, то ты абсолютно прав. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: XYZ для CreateViaOffset
« Ответ #6 : 30-10-2018, 22:05:41 »
А тут двояко, если нормаль взять с обратным знаком, то положительный distance будет внутрь втягивать :-)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XYZ для CreateViaOffset
« Ответ #7 : 30-10-2018, 22:12:18 »
А тут двояко, если нормаль взять с обратным знаком, то положительный distance будет внутрь втягивать :-)
Да. Но тогда скорее всего поменяется и ориентация у результирующего контура, что не есть хорошо.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XYZ для CreateViaOffset
« Ответ #8 : 30-10-2018, 22:14:11 »
Александр Ривилис,  Благодарю!
Я не понимаю причем тут Z=1 (и куда что то там вращается), но это работает
{0,0,1} - это вектор оси Z.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: XYZ для CreateViaOffset
« Ответ #9 : 30-10-2018, 22:20:12 »
Я не понимаю причем тут Z=1 (и куда что то там вращается), но это работает

Перестанет, если Ваш Curveloop будет, например, в плоскости X0Z

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XYZ для CreateViaOffset
« Ответ #10 : 30-10-2018, 22:22:41 »
Я переназначил Решение на ответ Александра Игнатовича, так как он более универсальный.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: XYZ для CreateViaOffset
« Ответ #11 : 30-10-2018, 22:23:09 »
Перестанет, если Ваш Curveloop будет, например, в плоскости X0Z
Вы можете дать ссылку где об этом можно почитать подробнее?

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: XYZ для CreateViaOffset
« Ответ #12 : 30-10-2018, 22:25:25 »
Я переназначил Решение на ответ Александра, так как он более универсальный
Замечательно) сам проверить сейчас не могу, завтра буду у компа и запущу)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XYZ для CreateViaOffset
« Ответ #13 : 30-10-2018, 22:25:44 »
Вы можете дать ссылку где об этом можно почитать подробнее?
Об этом не нужно читать. Представьте себе, что этот CurveLoop - это контур стены (сбоку, а не сверху!!!). У него нормаль будет как раз в сторону, а не вверх, т.е. точно не по оси Z.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: XYZ для CreateViaOffset
« Ответ #14 : 30-10-2018, 22:31:43 »
Вы можете дать ссылку где об этом можно почитать подробнее?

Боюсь, что нет, но смотрите в SDK про этот параметр написано:
Цитировать
normal
    Type: Autodesk.Revit.DB XYZ
    The normal of the offset plane.

И еще тут полезно, как раз где про "to the right" - это как раз определяется нормалью плоскости. Например, Ваша картинка - цикл в плоскости X0Y, смотрим сверху, кривые заданы против часовой стрелки, нормаль XYZ.BasisZ, в нашем направлении, тогда "направо" будет наружу. Теперь взглянем на ту же фигуру как бы снизу, направление линий то же самое, нормаль плоскости цикла уже будет -1*XYZ.BasisZ, а "направо" будет внутрь фигуры. Поэтому желательно таки спросить CurveLoop о его плоскости ))
Цитировать
Remarks
For each curve in the curve loop, the offset curve is theoretically defined by translating every point of the original curve by the vector offsetDist * (curveTan x normal) where curveTan is the curve's unit tangent vector at the given point. The curves are then trimmed to create a continuous curve loop. For a planar curve loop, this amounts to pushing each point "to the right" of the curve loop by the signed offset distance offsetDist, within the plane of the curve loop. The "right" side of the curve loop at a given point on the curve loop is defined with reference to normal being thought of as the upward direction and curveTan being thought of as the forward direction, as if you are walking along the curve loop. It follows that if offsetDist is positive, points will be offset to the right of the curve loop, whereas if offsetDist is negative, points will be offset to the left of the curve loop.

If the curve loop contains curves such as elliptical segments or splines, it is possible the offset creation will fail if Revit will not be able to trim contiguous curves to meet one another. If the offset is successful, offsets of those curve types will be created as HermiteSplines.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XYZ для CreateViaOffset
« Ответ #15 : 30-10-2018, 22:38:34 »
Еще один вариант для того, чтобы точно определить какой знак для offset нужен - это получить площадь при положительном и отрицательном значении. CurveLoop с большей площадью и будет той, которая снаружи.
Площади CurveLoop, как я понял можно считать при помощи метода Autodesk.Revit.DB.IFC.ExporterIFCUtils.ComputeAreaOfCurveLoops
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: XYZ для CreateViaOffset
« Ответ #16 : 30-10-2018, 22:41:02 »
Надо ж сколько полезной информации на сегодня  :)
Спасибо Вам еще раз , особенно за ценные комментарии к ответу
Буду "переваривать", думаю, не один раз ;D

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: XYZ для CreateViaOffset
« Ответ #17 : 31-10-2018, 09:51:37 »
Кстати, если исходной фигурой является Solid, то нормали его граней всегда будут указывать наружу

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: XYZ для CreateViaOffset
« Ответ #18 : 31-10-2018, 10:25:12 »
Логично, но тоже есть нюансы, если из граней получать контуры, то внешний контур грани будет против часовой стрелки (с направления нормали), а если в грани есть дырки, то контуры дырок будут уже по часовой стрелке с направления нормали и у curveloop-ов дырок будут нормали curveloop-ов в противоположную сторону

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: XYZ для CreateViaOffset
« Ответ #19 : 31-10-2018, 10:31:42 »
Это я к тому, что нормаль можно брать у грани, из которой получается CurveLoop, а не у этого самого CurveLoop, и тогда будет совершенно фиолетово в какую сторону построен CurveLoop

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: XYZ для CreateViaOffset
« Ответ #20 : 31-10-2018, 10:36:36 »
Да ну? Работаем с контуром дырки из этой грани, берем нормаль из грани, вызываем CreateViaOffset с положительным distance, получаем смещение внутрь.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: XYZ для CreateViaOffset
« Ответ #21 : 31-10-2018, 10:46:57 »
Да ну? Работаем с контуром дырки из этой грани, берем нормаль из грани, вызываем CreateViaOffset с положительным distance, получаем смещение внутрь.
Соглашусь с Вам. Метод CreateViaOffset, на мой взгляд, сделан плохо. Логично было бы, чтобы вектор просто задавал направление смещения и не зависел от самого CurveLoop. Да, судя, по замечаниям к методу, там слишком много проблем )) Много таких методов в API Ревита  :(

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: XYZ для CreateViaOffset
« Ответ #22 : 31-10-2018, 11:07:22 »
Александр, соглашусь и не соглашусь с Вами одновременно. API так то все-таки неплох и достаточно логичен. По этому конкретно методу, вроде бы интересная возможность должна быть указать нормаль, неколлинеарную плоскости контура, но по описанию метода
Цитировать
defined by translating every point of the original curve by the vector offsetDist * (curveTan x normal) where curveTan is the curve's unit tangent vector at the given point

curveLoop окажется незамкнутым, но с учетом того, что метод пытается создать замкнутый контур, вполне логично ловим InternalException.

Скорее всего, это всё имеет смысл с неплоскими контурами, надо будет как-нибудь поэкспериментировать на досуге, тогда единственный мааааленький упрек в сторону API в данном случае, это то, что нет перегруженного метода без параметра нормали, который бы работал с плоскими контурами, и определял нормаль исходя из направления линий контура