Как получить список имен и ID объектов в проекте?

Автор Тема: Как получить список имен и ID объектов в проекте?  (Прочитано 9040 раз)

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

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

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Следующий этап: поиск всех объектов (семейств) и передача их имен и ID в ListView на форму.

С ListView я разберусь сам, а вот с поиском нужна помощь. Можно на C#, на VB сам сделаю.

Заранее спасибо.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Поиск любых объектов в Revit практически всегда делается с помощью класса FilteredElementCollector.

В статьях его применение много где встречается, поэтому дам вот такую ссылку.

Нужно всего лишь правильно создать фильтр. Пока рекомендую просто начать изучать этот класс и поиграться с ним.

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Спасибо, буду изучать!

По положительному результату отпишусь.

Оффлайн Антон Останин

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Код - C# [Выбрать]
  1. var familyNames = new FilteredElementCollector(doc).OfClass(typeof(Family)).Select(x => x.Name).ToList();
  2. var familyId's= new FilteredElementCollector(doc).OfClass(typeof(Family)).Select(x => x.Id.IntegerValue).ToList();
  3.  

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Надо опробовать, НО уже после выходных. Спасибо!

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Антон,
немного вреден такой код. Не думаю что Евгению нужны отдельно названия от айдишников. Тогда уж что то типа
Код - C# [Выбрать]
  1. var families = new FilteredElementCollector(doc).OfClass(typeof(Family)).Select(x => new {x.Id, x.Name}).ToList();
либо просто
Код - C# [Выбрать]
  1. var families = new FilteredElementCollector(doc).OfClass(typeof(Family)).ToList();

Хотя я больше чем уверен, что Евгению нужны не семейства, а экземпляры. Но просто FamilyInstance там не пойдет, потому что там будет много "мусора". В общем я поэтому и сказал, что для начала можно поиграться с фильтрами

Оффлайн Антон Останин

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Виктор Чекалин, Вы совершенно правы.

Оффлайн Владимир П

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 3
Следующий этап: поиск всех объектов (семейств) и передача их имен и ID в ListView на форму.

С ListView я разберусь сам, а вот с поиском нужна помощь. Можно на C#, на VB сам сделаю.

Заранее спасибо.

Как начинающий - начинающему... Осмелюсь посоветовать разобрать пример из SDK - CreateBeamsColumnsBraces... Там есть и то, что Вы спрашивали до сих пор (про форму, фильтр семейств проекта, создание списков на форме), и то что, возможно, еще будете спрашивать в дальнейшем... Т. е. подозреваю, что после отбора нужных семейств, Вы ж, наверняка, будете собирать из них модель?
Причем, там есть два варианта кода: и на C#, и на VB.

Отмечено как Решение Пашин Евгений 19-10-2015, 12:52:23

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

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Всем спасибо, сработало!

Добавил на форму ListView.

Код - vb.net [Выбрать]
  1. Imports Autodesk.Revit
  2. Imports Autodesk.Revit.UI
  3. Imports Autodesk.Revit.DB
  4. Imports System
  5. Imports System.Windows.Forms
  6.  
  7.  
  8. Public Class Form1
  9.  
  10.     Private myCD As ExternalCommandData
  11.  
  12.     Public Sub New(ByVal commandData As ExternalCommandData)
  13.         MyBase.New()
  14.         InitializeComponent()
  15.         myCD = commandData
  16.     End Sub
  17.  
  18.     ' ....
  19.  
  20.     Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  21.         Dim App As Autodesk.Revit.UI.UIApplication = myCD.Application
  22.         Dim Doc As UIDocument = App.ActiveUIDocument
  23.         ListAllElements()
  24.     End Sub
  25.  
  26.     Sub ListAllElements()
  27.         Dim App As Autodesk.Revit.UI.UIApplication = myCD.Application
  28.         Dim Doc As UIDocument = App.ActiveUIDocument
  29.  
  30.         Dim collector As FilteredElementCollector = New FilteredElementCollector(Doc.Document).WhereElementIsNotElementType
  31.         ' или Dim collector As FilteredElementCollector = New FilteredElementCollector(Doc.Document).OfClass(GetType(Family))
  32.  
  33.         Me.ListView1.Clear()
  34.         Me.ListView1.Columns.Add("№")               '0
  35.         Me.ListView1.Columns.Add("ID")              '1
  36.         Me.ListView1.Columns.Add("Class")           '2
  37.         Me.ListView1.Columns.Add("Category")        '3
  38.         Me.ListView1.Columns.Add("Name")            '4
  39.  
  40.         Dim s As String
  41.         Dim e As Element
  42.         Dim num As Long = 1
  43.  
  44.         For Each e In collector
  45.             Dim LVI As New ListViewItem
  46.             With LVI
  47.                 For i As Long = 0 To 4
  48.                     .SubItems.Add("")
  49.                 Next
  50.             End With
  51.  
  52.             s = String.Empty
  53.             If Not Nothing Is e.Category Then
  54.                 s = e.Category.Name
  55.             End If
  56.             If 0 = s.Length AndAlso TypeOf e Is Family AndAlso Not Nothing Is DirectCast(e, Family).FamilyCategory Then
  57.                 s = DirectCast(e, Family).FamilyCategory.Name
  58.             End If
  59.             If 0 = s.Length Then
  60.                 s = "?"
  61.             End If
  62.  
  63.             LVI.SubItems(0).Text = num
  64.             LVI.SubItems(1).Text = e.Id.IntegerValue.ToString
  65.             LVI.SubItems(2).Text = e.GetType.Name
  66.             LVI.SubItems(3).Text = s
  67.             LVI.SubItems(4).Text = e.Name
  68.  
  69.             If LVI.SubItems(2).Text = "Family" Then
  70.                 Me.ListView1.Items.Add(LVI)
  71.                 num += 1
  72.             ElseIf LVI.SubItems(2).Text = "Element" Then
  73.                 Me.ListView1.Items.Add(LVI)
  74.                 num += 1
  75.             End If
  76.         Next
  77.  
  78.         For i As Integer = 0 To Me.ListView1.Columns.Count - 1
  79.             Me.ListView1.Columns(i).AutoResize(Windows.Forms.ColumnHeaderAutoResizeStyle.ColumnContent)
  80.         Next i
  81.  
  82.     End Sub
  83.  
  84. End Class
  85.  

Единственное, что меня смущает, что когда создаю семейство, то модуль определяет 4 семейства: 1 - тот, что мой, а остальные - марки разрезов (2 шт), головные части уровней (1 шт).
Подскажите как показать только те семейства, которые я создаю сам. Так как к ним мне и нужно будет обращаться.


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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Подскажите как показать только те семейства, которые я создаю сам. Так как к ним мне и нужно будет обращаться.
С точки зрения Revit, нет такого понятия "семейства, который я создаю сам". Для него все семейства на одно лицо.

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

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

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