Создать элемент семейства из нужной категории

Автор Тема: Создать элемент семейства из нужной категории  (Прочитано 5661 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Подскажите, есть семействах ГРУППА
"Обобщенные модели"
В этой ГРУППЕ я знаю имя элемента из
семейства экземпляр которого хочу создать.

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

Код - C# [Выбрать]
  1. var collector = new RVT_DB.FilteredElementCollector(doc);
  2. var textNoteType = collector.OfClass(typeof(?))

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Первую часть вообще не понял, поэтому отвечу только на это:
Как мне найти и получить идентификатор этого элемента
другими словами какой мне класс передать в typeOf(?)
Не обязательно передавать тип - можно задать любое другое условие. Например, по категории:
Код - C# [Выбрать]
  1. List<Element> textNotes = new FilteredElementCollector(doc)
  2.     .Where(e => e.Category.Id.IntegerValue == (int)BuiltInCategory.OST_TextNotes)
  3.     .ToList();

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Тогда уж .OfCategory(BuiltInCategory.OST_TextNotes).WhereElementIsElementType()

Вообще, некоторое противоречие есть, вроде бы упомянута категория обобщенных моделей (OST_GenericModel), а дальше var textNoteType ...

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Тогда уж .OfCategory(BuiltInCategory.OST_TextNotes).WhereElementIsElementType()
Да, точно) Но скорее всего WhereElementIsNotElementType()
Вообще, некоторое противоречие есть, вроде бы упомянута категория обобщенных моделей (OST_GenericModel), а дальше var textNoteType ...
Вот и я говорю - непанятна))

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
К вопросу добавлю картинку для пояснения
Мне нужно в иерархии семейств добраться
до элемента "К-1a" и создать его экземпляр.




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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Для поиска типоразмера семейства можно применить вот такой фильтр
Код - 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.         }

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Для поиска типоразмера семейства можно применить вот такой фильтр
Код - 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.         }

Думаю, желательно только скомбинировать с фильтром по категории

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
А что мне дальше с этим ElementFilter делать?
Может в качестве аргумента передать куда либо?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Код - C# [Выбрать]
  1. var collector = new FilteredElementCollector(doc);
  2. var familySymbol = collector.WherePasses(filter).FirstElement();

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Хорошо.
Найти в дереве элемент получилось.
1) А как мне обратится к самому объекту семейства?
2) получить его ID?
3) создать экземпляр?(Иными словами это команда Revit "создать аналог")

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
1) Symbol.Family
2) family.Id
3) один из overload-ов doc.Create.NewFamilyInstance

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Я так понял в моем случае это как-то та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);

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Нет. FamilySymbol нужно найти, как указано выше, например. Ещё один момент, нужно проверить его свойство IsActive, если оно false - вызвать symbol.Activate()

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Не-а тут фигня конструктора нет
FamilySymbol fs = new FamilySymbol();

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Я сделал так, НО!!!
В конструкторе ругается соотв в строке 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.                 }