Как подсчитать количество экземпляров семейства в проекте?

Автор Тема: Как подсчитать количество экземпляров семейства в проекте?  (Прочитано 23384 раз)

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Не могу врубиться, что такое «e»?

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Мне сначала нужно сделать выборку элементов и для каждого элемента выполнить этот код?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Не могу врубиться, что такое «e»?
Лямбда-выражения.
В данном случае это объект класса Element, так как collector возвращает список объектов класса Element
Мне сначала нужно сделать выборку элементов и для каждого элемента выполнить этот код?
Нет, выполнить как есть

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Правильно ли я понимаю, что сначала нужна эта строка:

Код - vb.net [Выбрать]
  1. Dim collector As FilteredElementCollector = New FilteredElementCollector(Doc.Document).OfClass(GetType(Element))
  2.  

А затем:

Код - vb.net [Выбрать]
  1.             For Each el As Element In collector
  2.  
  3.                 ' Здесь Ваш код, который я пока переписать на VB не могу )))
  4.  
  5.             Next

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Правильно ли я понимаю, что сначала нужна эта строка:

Код - vb.net: [Выделить]
Dim collector As FilteredElementCollector = New FilteredElementCollector(Doc.Document).OfClass(GetType(Element))
 
Нет. Она просто лишняя. New FilteredElementCollector(Doc.Document) и так уже возвратит коллекцию Element.

' Здесь Ваш код, который я пока переписать на VB не могу )))
Гуглитть по словам Linq VB.NET :) записать это вроде можно на vb.net

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Гуглитть по словам Linq VB.NET  записать это вроде можно на vb.net

Задача на засыпку?  :)

Я первый раз имею дело с LINQ!

А есть какое-нибудь решение, только проще ? )))

Не получается пока.

Оффлайн Андрей Фазлеев

  • ADN Club
  • Сообщений: 24
  • Карма: 8
    • Andrey Stroitel
С Linq-запросами очень рекомендую разобраться,
в документации есть пример использования.
Незаменимый инструмент для работы со списками.

По вопросу темы - можно сначала получить все элементы, являющиеся объектами модели

описано здесь: http://adn-cis.org/izvlechenie-vsex-elementov-modeli.html

а затем перебирать их по типу элемента

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy

Оффлайн miko

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
Усложню задачу, нужно узнать сколько экземпляров каждого типа семейства , количество типов не ограниченно.
То есть допустим есть список значения какого нибудь параметра семейства:
ширина=[300, 300,500,500,1000,100,100,100]
тут видно что есть экземпляры с одинаковым типом, единственное что я придумал это сортировка по одинаковым значениям , но проблема в том что таких параметров десятки

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Усложню задачу, нужно узнать сколько экземпляров каждого типа семейства , количество типов не ограниченно.
То есть допустим есть список значения какого нибудь параметра семейства:
ширина=[300, 300,500,500,1000,100,100,100]
тут видно что есть экземпляры с одинаковым типом, единственное что я придумал это сортировка по одинаковым значениям , но проблема в том что таких параметров десятки

Правильно ли я Вас понимаю, что речь идет об одном и том же семействе, просто у семейства имеются множество (список) типоразмеров с разными значениями свойств?
Если это так, то можно у данного семейства проверить список FamilySymbolSet, если справочник не обманывает )))
У каждого такого типоразмера свое имя, а значит и число таких экземпляров легко будет найти.

А сортировку вести по списку, взятому из FamilySymbolSet! Там этот список уже готов, просто считай количество )

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Усложню задачу, нужно узнать сколько экземпляров каждого типа семейства
Очевидно, что нужно узнать тип каждого экземпляра, и посчитать количество в разрезе типов.
Поможет LINQ и группировка:
Код - C# [Выбрать]
  1.                         var collector = new FilteredElementCollector(ActiveUIDocument.Document);
  2.                          
  3.             var instances =
  4.                 collector
  5.                 .OfClass(typeof(FamilyInstance))
  6.                 .OfType<FamilyInstance>()
  7.                 .GroupBy(fi=>fi.GetTypeId())
  8.                 .Select(g=> new {ElementTypeElementTypeId = g.Key, ElementType = doc.GetElement(g.Key) as ElementType, Instances = g.ToList()})
  9.                 .ToList();

Оффлайн miko

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
Если это так, то можно у данного семейства проверить список FamilySymbolSet, если справочник не обманывает )))
в 2016 эта коллекция удаленна ((
Autodesk.Revit.DB.FamilySymbolSet

Правильно ли я Вас понимаю, что речь идет об одном и том же семействе, просто у семейства имеются множество (список) типоразмеров с разными значениями свойств?
не только разные значения но и разные типы семейства , тоесть значения могут совпадать абсолютно все но это другой тип.
Очевидно, что нужно узнать тип каждого экземпляра, и посчитать количество в разрезе типов.
ну да в принципе , так и иду :
detail = collector2.OfClass(FamilyInstance).ToElements()
detail2 = collector2.OfType(FamilyInstance).ToElements()
Поможет LINQ и группировка:
спасибо , будем гуглить тогда и разбираться :) думал что есть в самом API что то чтобы не изобретать велосипед.......

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
detail = collector2.OfClass(FamilyInstance).ToElements()
detail2 = collector2.OfType(FamilyInstance).ToElements()
в коде между detail и detail2 разницы нет:)

думал что есть в самом API что то
Так вроде и нет велосипеда:) Используется API в чистом виде без всяких велосипедов для удовлетворения ваших нужд. Для этого API и нужно. Какой вы метод ожидали в API? GetAllFamilySymbolsWithInstances?

Оффлайн miko

  • ADN OPEN
  • **
  • Сообщений: 55
  • Карма: 0
detail = collector2.OfClass(FamilyInstance).ToElements()
detail2 = collector2.OfType(FamilySymbol).ToElements()
а так ? :)
Так вроде и нет велосипеда:)
ну я увидел LINQ и у меня сразу возник перед глазами такой хороший циклокрос ) я так понимаю это множественный критерий сортировки, тогда в  Python нужно еще почитать как это реализуется

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
detail = collector2.OfClass(FamilyInstance).ToElements()
detail2 = collector2.OfType(FamilySymbol).ToElements()
а так ?
А так вижу, что напрямую collector2.OfType(FamilySymbol) лучше не применять. В этом случае фильтрация идет не средствами Revit, а выбираются абсолютно все элементы и после этого с помощью LINQ идет фильтрация.
Ну и собственно не очень понятно что хотели этим добиться.

ну я увидел LINQ и у меня сразу возник перед глазами такой хороший циклокрос ) я так понимаю это множественный критерий сортировки, тогда в  Python нужно еще почитать как это реализуется
LINQ это не велосипед, а инструмент, которым как и любым другим надо правильно уметь пользоваться.

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