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

ADN Club => Revit API => Тема начата: Алексей (IdeaSoft) от 16-01-2019, 11:30:24

Название: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 11:30:24
Подскажите, есть семействах ГРУППА
"Обобщенные модели"
В этой ГРУППЕ я знаю имя элемента из
семейства экземпляр которого хочу создать.

Как мне найти и получить идентификатор этого элемента
другими словами какой мне класс передать в typeOf(?)

Код - C# [Выбрать]
  1. var collector = new RVT_DB.FilteredElementCollector(doc);
  2. var textNoteType = collector.OfClass(typeof(?))
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Пекшев aka Modis от 16-01-2019, 11:41:33
Первую часть вообще не понял, поэтому отвечу только на это:
Как мне найти и получить идентификатор этого элемента
другими словами какой мне класс передать в typeOf(?)
Не обязательно передавать тип - можно задать любое другое условие. Например, по категории:
Код - C# [Выбрать]
  1. List<Element> textNotes = new FilteredElementCollector(doc)
  2.     .Where(e => e.Category.Id.IntegerValue == (int)BuiltInCategory.OST_TextNotes)
  3.     .ToList();
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Игнатович от 16-01-2019, 11:43:38
Тогда уж .OfCategory(BuiltInCategory.OST_TextNotes).WhereElementIsElementType()

Вообще, некоторое противоречие есть, вроде бы упомянута категория обобщенных моделей (OST_GenericModel), а дальше var textNoteType ...
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Пекшев aka Modis от 16-01-2019, 12:06:28
Тогда уж .OfCategory(BuiltInCategory.OST_TextNotes).WhereElementIsElementType()
Да, точно) Но скорее всего WhereElementIsNotElementType()
Вообще, некоторое противоречие есть, вроде бы упомянута категория обобщенных моделей (OST_GenericModel), а дальше var textNoteType ...
Вот и я говорю - непанятна))
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 12:06:56
К вопросу добавлю картинку для пояснения
Мне нужно в иерархии семейств добраться
до элемента "К-1a" и создать его экземпляр.


(https://i.postimg.cc/MMs9LyZt/Revit-Tree-Data.png) (https://postimages.org/)
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Игнатович от 16-01-2019, 12:33:45
Для поиска типоразмера семейства можно применить вот такой фильтр
Код - C# [Выбрать]
  1.         public ElementFilter CreateFamilySymbolFilter(string familyName, string symbolName)
  2.         {
  3.             var rules = new[]
  4.                 {
  5.                     ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ALL_MODEL_FAMILY_NAME), familyName, false),
  6.                     ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.SYMBOL_NAME_PARAM), symbolName, false),
  7.                 };
  8.  
  9.             return new LogicalAndFilter(new ElementParameterFilter(rules), new ElementIsElementTypeFilter());
  10.         }
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Игнатович от 16-01-2019, 12:34:57
Для поиска типоразмера семейства можно применить вот такой фильтр
Код - C# [Выбрать]
  1.         public ElementFilter CreateFamilySymbolFilter(string familyName, string symbolName)
  2.         {
  3.             var rules = new[]
  4.                 {
  5.                     ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ALL_MODEL_FAMILY_NAME), familyName, false),
  6.                     ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.SYMBOL_NAME_PARAM), symbolName, false),
  7.                 };
  8.  
  9.             return new LogicalAndFilter(new ElementParameterFilter(rules), new ElementIsElementTypeFilter());
  10.         }

Думаю, желательно только скомбинировать с фильтром по категории
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 13:02:34
А что мне дальше с этим ElementFilter делать?
Может в качестве аргумента передать куда либо?
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Игнатович от 16-01-2019, 13:04:57
Код - C# [Выбрать]
  1. var collector = new FilteredElementCollector(doc);
  2. var familySymbol = collector.WherePasses(filter).FirstElement();
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 13:28:14
Хорошо.
Найти в дереве элемент получилось.
1) А как мне обратится к самому объекту семейства?
2) получить его ID?
3) создать экземпляр?(Иными словами это команда Revit "создать аналог")
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Игнатович от 16-01-2019, 13:34:20
1) Symbol.Family
2) family.Id
3) один из overload-ов doc.Create.NewFamilyInstance
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 13:54:56
Я так понял в моем случае это как-то таr?

Код - C# [Выбрать]
  1. XYZ p = new XYZ(0, 0, 0);
  2. View v = doc.ActiveView;  
  3. FamilySymbol fs = new FamilySymbol();
  4. fs.Name = "К-1а";
  5. doc.Create.NewFamilyInstance(p, fs, v);
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Игнатович от 16-01-2019, 13:58:44
Нет. FamilySymbol нужно найти, как указано выше, например. Ещё один момент, нужно проверить его свойство IsActive, если оно false - вызвать symbol.Activate()
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 13:59:11
Не-а тут фигня конструктора нет
FamilySymbol fs = new FamilySymbol();
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 14:12:24
Я сделал так, НО!!!
В конструкторе ругается соотв в строке 12 где вызов конструктора.
Вот что пишет

Family cannot be placed as hosted on an input face reference, because its FamilyPlacementType is not ViewBased
Parameter name: symbol


Я так понял что эта ошибка в том,
что базовый тип ViewBase не может быть помещен в вид


Код - C# [Выбрать]
  1.                
  2. string rvtName = @"c:\work\file.rvt";
  3.                 UIDocument uidoc = data.Application.OpenAndActivateDocument(rvtName);
  4.                 RVT_DB.Document doc = uidoc.Application.ActiveUIDocument.Document;
  5.                 RVT_DB.ElementFilter EF = CreateFamilySymbolFilter("К-1а", "К-1а");
  6.                 var collector = new RVT_DB.FilteredElementCollector(doc);
  7.                 var familySymbol = collector.WherePasses(EF).FirstElement();
  8.                 RVT_DB.FamilySymbol fs = familySymbol as RVT_DB.FamilySymbol;
  9.                 using (RVT_DB.Transaction tr = new RVT_DB.Transaction(doc, "add new elem sem"))
  10.                 {
  11.                     tr.Start();
  12.                     doc.Create.NewFamilyInstance(new RVT_DB.XYZ(0, 0, 0), fs, doc.ActiveView);
  13.                     tr.Commit();
  14.                 }


Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 14:14:58
Я так понял что это о том что базовый тип ViewBase не может быть помещен в вид
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Игнатович от 16-01-2019, 14:17:34
Не тот метод NewFamilyInstance, их довольно много и тот, который нужно использовать зависит от типа семейства.

Тот метод, который Вы пытаетесь использовать предназначен, например, для семейств категории "Элементы узлов" или "Типовые аннотации".
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 14:39:25
А какой же мне использовать метод NewFamilyInstance
В API Recvit этого метода 12 перегрузок.

Вот прикрепляю еще картинку этого элемента

Специально переименовал в "К-1а_111" чтобы понимать что есть что.


(https://i.postimg.cc/1VQZvtw5/Sem.png) (https://postimg.cc/1VQZvtw5)
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Александр Игнатович от 16-01-2019, 15:03:44
Там в перегрузках нет абсолютно ничего сложного. Их можно условно разделить на несколько групп:
1) 2 метода создания view-specific элементов - таких как элементы узлов и аннотации. 1 метод вставка в определенную точку, второй - по линии, если семейство на базе линии
NewFamilyInstance(XYZ, FamilySymbol, View)
NewFamilyInstance(Line, FamilySymbol, View)

2) 3 метода создания элементов в пространстве:
NewFamilyInstance(XYZ, FamilySymbol, StructuralType)
NewFamilyInstance(XYZ, FamilySymbol, Level, StructuralType)
NewFamilyInstance(Curve, FamilySymbol, Level, StructuralType)

3) остальные методы для создания экземпляров семейств на поверхностях, гранях, в общем экземпляры таких семейств будут иметь некий Host
Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 16-01-2019, 17:09:40
Использовал вот этот конструктор транзакция прошла. Но где найти этот элемент?

Название: Re: Создать элемент семейства из нужной категории
Отправлено: Алексей (IdeaSoft) от 17-01-2019, 16:12:20
Всем большое спасибо все получилось!