Create.NewReferencePlane to left or to right

Автор Тема: Create.NewReferencePlane to left or to right  (Прочитано 5944 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Create.NewReferencePlane to left or to right
« : 25-09-2020, 11:11:24 »
Имеется семейство устанавливаемое программно на программно созданную опорную плоскость (в последствии удаляется).
Если опорная плоскость создается слева направо семейство вставляется верно. Если справа налево, вставляется перевернуто.
Как понять по семейству что ему нужно создавать "левую" или "правую" опорную плоскость?

« Последнее редактирование: 25-09-2020, 11:47:46 от sdv79 »

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Create.NewReferencePlane to left or to right
« Ответ #1 : 25-09-2020, 11:16:58 »
По ReferencePlane.Normal или ReferencePlane.GetPlane().Normal

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

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Re: Create.NewReferencePlane to left or to right
« Ответ #2 : 25-09-2020, 11:40:15 »
Это свойство у Family, FamilyInstance или FamilySymbol?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Create.NewReferencePlane to left or to right
« Ответ #3 : 25-09-2020, 11:41:48 »
Опорной плоскости, на которой размещается семейство.

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

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Re: Create.NewReferencePlane to left or to right
« Ответ #4 : 25-09-2020, 11:46:06 »
Я сам создаю опорную плоскость. Мне по элементу перед его вставкой необходимо понять в какую сторону мне создавать опорную плоскость.
В последствии я удаляю эту плоскость.

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Create.NewReferencePlane to left or to right
« Ответ #5 : 25-09-2020, 11:55:50 »
А при чём тут элемент? При расстановке на рабочей плоскости ось Z локальной системы координат семейства совпадет с нормалью рабочей плоскости

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

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Re: Create.NewReferencePlane to left or to right
« Ответ #6 : 25-09-2020, 12:06:00 »
Если создать вот так плоскость будет ок

Код - C# [Выбрать]
  1.  var referencePlane =doc.Create.NewReferencePlane(new XYZ(0, 0, Z),  new XYZ(0, 1, Z),  XYZ.BasisX, doc.ActiveView);
  2.  

а так - перевёртыш
Код - C# [Выбрать]
  1. var referencePlane= doc.Create.NewReferencePlane(new XYZ(0, 1, Z),  new XYZ(0, 0, Z),  XYZ.BasisX, doc.ActiveView);
  2.  

а потом на эту плоскость "падает" элемент. Как мне определить как создать плоскость?
« Последнее редактирование: 25-09-2020, 14:10:58 от sdv79 »

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Create.NewReferencePlane to left or to right
« Ответ #7 : 25-09-2020, 12:56:16 »
Нормаль будет:
Код - C# [Выбрать]
  1. (bubbleEnd - freeEnd).CrossProduct(cutVec)

Тогда в первом случае будет XYZ.BasisZ, во втором: -XYZ.BasisZ

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

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Re: Create.NewReferencePlane to left or to right
« Ответ #8 : 25-09-2020, 13:13:56 »
У меня есть плоскость, на нее одно семейство ставится нормально а другое перевернуто.
Как мне определить семейство с перевернутой плоскостью?




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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Create.NewReferencePlane to left or to right
« Ответ #9 : 25-09-2020, 13:25:15 »
Дай семейства посмотреть

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

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Re: Create.NewReferencePlane to left or to right
« Ответ #10 : 25-09-2020, 13:35:42 »
Семейства от производителя оборудования.
Причем закономерно у одного все перевернуты, у другого нормальные

https://drive.google.com/file/d/1mR8TXOz6eLRtfTb4eKx3n6ahZaeTL7Rp/view?usp=sharing

нужно найти свойство https://www.revitapidocs.com/2015/33d135c3-d887-c574-a049-f8abdcb01ded.htm

только у Family или FamilySymbol.

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Create.NewReferencePlane to left or to right
« Ответ #11 : 25-09-2020, 14:01:34 »
Свойство тебе не поможет, оно по умолчанию False, размещенный инстанс семейства можно программно или вручную развернуть относительно опорной плоскости.

В общем случае задача не решается, тут просто по-разному семейства созданы, эта информация как бы вне пределов геометрии / BIM. Открой в режиме редактирования, посмотри со стороны фасада, поймёшь о чем я.

В данном конкретном можешь попробовать сделать следующее: размести инстанс, потом в его геометрии найди источники света, т.е. ту геометрию, у которой в GraphicStyle.GraphicsStyleCategory будет OST_LightingFixtureSource, получи её габариты, сравни с габаритами основной геометрии (или точкой вставки), поймёшь, в какую сторону оно светит, если не в ту, которую тебе надо, тогда уже поставь IsWorkPlaneFlipped в True.

Альтернативно, открой семейство (doc.EditFamily), проанализируй расположение геометрии объектов относительно опорного уровня, хотя бы того самого источника света или всей геометрии.

Это, правда, тоже не панацея, светильники могут быть и напольные. Возможно, правильнее будет завести параметр проекта (типа да/нет) на типоразмеры интересующих тебя категорий и дать пользователю возможность самому определить...

Ещё вариант ставить не на опорные плоскости а на грани, т.е. на потолок, пол, тогда опять же смотреть по источникам света, но тут опять же может быть ситуация, когда в семействе их не задали.

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

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Re: Create.NewReferencePlane to left or to right
« Ответ #12 : 25-09-2020, 16:17:15 »
Получил GraphicsStyle. OST_LightingFixtureSource нет в семействе - заменил на OST_LightingFixtures. Дальше не понятно куда двигаться.
Код - C# [Выбрать]
  1.  
  2.             var reference = uiDoc.Selection.PickObject(ObjectType.Element);
  3.             var element = doc.GetElement(reference);
  4.  
  5.             var graphicsStyle = element
  6.                                .get_Geometry(new Options())
  7.                                .Cast<GeometryInstance>()
  8.                                .Select(solid => doc.GetElement(solid.GetSymbolGeometry().GraphicsStyleId))
  9.                                .Cast<GraphicsStyle>()
  10.                                .Where(w => w.GraphicsStyleCategory.Id.IntegerValue == (int)BuiltInCategory.OST_LightingFixtures) // OST_LightingFixtureSource
  11.                                .Single();
  12.  

Отмечено как Решение sdv79 25-09-2020, 17:09:04

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Create.NewReferencePlane to left or to right
« Ответ #13 : 25-09-2020, 16:35:39 »
Вот из твоего проекта:


Мелкая придирка, геометрию надо рекурсивно получать, в общем случае, у тебя на любом уровне могут быть Solid-ы, GeometryInstance-ы, линии там всякие.

Тебе нужен Mesh источника света.

Если ты используешь GetSymbolGeometry, то проанализировать минимальный и максимальный Z из mesh-а источника света, взять больший по модулю, если он отрицательный, то, скорее всего, источник света смотрит вниз, иначе вверх. Если использовать GetInstanceGeometry, то сравивать с Z-координтой точки вставки. По результатам устанавливать свойство IsWorkPlaneFlipped

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

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Re: Create.NewReferencePlane to left or to right
« Ответ #14 : 25-09-2020, 17:09:01 »
Спасибо. Помогло. Да, смотрим по Z.