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

ADN Club => Revit API => Тема начата: Bazinga от 23-05-2019, 15:57:17

Название: Вставка семейства
Отправлено: Bazinga от 23-05-2019, 15:57:17
Как правильно вставить семейство по координатам в Room?
Код - C# [Выбрать]
  1. FamilyInstance fm = document.Create.NewFamilyInstance(start_point, family, StructuralType.NonStructural);
вставляет в абсолютный ноль. Перемещение элемента не помогает.
Название: Re: Вставка семейства
Отправлено: Александр Игнатович от 23-05-2019, 16:21:39
Ну во-первых, в room семейства не вставляются. Они создаются непосредственно в модели, либо на host-е, либо на виде. Могу предположить, что:
а) либо start_point - это точка XYZ.Zero
б) либо использован не тот overload-метод для Вашего конкретного семейства
в) либо, если Вы работаете с созданным семейством дальше в коде, до вызова регенерации familyInstance.Location.Point будет показывать XYZ.Zero
Название: Re: Вставка семейства
Отправлено: Bazinga от 24-05-2019, 09:46:46
Александр Игнатович, про Room указала, т.к. если комнаты смежные у них стена (host) будет общий.
Точка рассчитывается и при передачи в функцию, дает нужные координаты.
Работаю дальше с семейством, чтобы внести данные в поля.
Вставляю вот так
Код - C# [Выбрать]
  1. document.Create.NewFamilyInstance(start_point, family, document.GetElement(elId), StructuralType.NonStructural);
Название: Re: Вставка семейства
Отправлено: Александр Игнатович от 24-05-2019, 11:05:08
Да, тут нужно в зависимости от семейства нужный метод использовать, есть ещё варианты размещать на поверхности host-а (те overload-ы метода NewFamilyInstance, у которых первый параметр типа Face и Reference)
Название: Re: Вставка семейства
Отправлено: Bazinga от 27-05-2019, 10:16:38
Александр Игнатович, да, через хост получилось. Только возникла другая проблема: как вставить внутри комнаты семейство?
Название: Re: Вставка семейства
Отправлено: Александр Игнатович от 27-05-2019, 10:25:44
А в чём собственно состоит проблема? Ещё раз напомню, инстансы семейств создаются в пространстве модели (ну или на видах, если речь идёт о 2D-семействах, типа аннотаций или элементов узлов, но это явно не относится к этой задаче).

В зависимости от того, как построено семейство, нужно использовать соответствующий метод из overload-ов Document.NewFamilyInstance, т.е. семейство может вставляться просто в заданную точку, оно может быть на основе линии, либо с вариантами на поверхность некоторого host-а
Название: Re: Вставка семейства
Отправлено: Bazinga от 27-05-2019, 10:58:20

(https://i.postimg.cc/WqzFMdz5/image.png) (https://postimg.cc/WqzFMdz5)
с другой стороны должен быть.
Название: Re: Вставка семейства
Отправлено: Александр Игнатович от 27-05-2019, 11:07:54
Попробуйте получить Reference методом HostObjectUtils.GetSideFaces и использовать метод
Код - C# [Выбрать]
  1. public FamilyInstance NewFamilyInstance(
  2.         Reference reference,
  3.         XYZ location,
  4.         XYZ referenceDirection,
  5.         FamilySymbol symbol
  6. )
Название: Re: Вставка семейства
Отправлено: Bazinga от 27-05-2019, 15:11:48
Исключение выбрасывает: Thrown when the function cannot get the face from the reference, or, when the Family cannot be placed as line-based on an input face reference, because its FamilyPlacementType is not WorkPlaneBased.
Название: Re: Вставка семейства
Отправлено: Александр Игнатович от 27-05-2019, 16:49:46
FamilyPlacementType is not WorkPlaneBased
Так может в этом дело?
Название: Re: Вставка семейства
Отправлено: Bazinga от 28-05-2019, 08:47:37
Александр Игнатович, ставить галочку в семействе и переделывать некоторые - не вариант.
Название: Re: Вставка семейства
Отправлено: Bazinga от 28-05-2019, 09:36:08
Александр Игнатович, один вопрос: как можно найти ось середины стены и задать ее как Plane?
Название: Re: Вставка семейства
Отправлено: Александр Игнатович от 28-05-2019, 11:53:12
ставить галочку в семействе и переделывать некоторые - не вариант.

Значит, переписать код :-) Посмотрите свойство Family.FamilyPlacementType

один вопрос: как можно найти ось середины стены и задать ее как Plane?

Так, смотрите, на 95% API Revit-а позволяет только то, что можно сделать руками. Я, конечно, могу быть не прав, но work-plane-based семейства создаются только на поверхностях.

Смотрим свойство HostFace созданного экземпляра:
(https://i.postimg.cc/zLDX5knJ/Host-Face-Reference.png) (https://postimg.cc/zLDX5knJ)

Теперь экспериментируем с получением из этой стенки Reference-а:
(https://i.postimg.cc/tY9cBmyC/Wall-Exterior-Reference.png) (https://postimg.cc/tY9cBmyC)

Т.е. всё как бы правильно, семейство расположено на Exterior face-е стенки

Если я, всё-таки, не прав, можете попробовать получить Reference как в этой статье:

https://thebuildingcoder.typepad.com/blog/2018/09/rebar-wall-centreline-core-and-grid-dimensioning.html






Название: Re: Вставка семейства
Отправлено: Bazinga от 06-06-2019, 13:28:45
Александр Игнатович, получилось через reference и отзеркаливание элемента.
Название: Re: Вставка семейства
Отправлено: Александр Игнатович от 06-06-2019, 14:39:15
 :) Супер