Получение списка типоразмеров семейства

Автор Тема: Получение списка типоразмеров семейства  (Прочитано 7050 раз)

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Здравствуйте, не могу разобраться как получить отдельно список типоразмеров. По коду ниже выуживается имя семейства, если исправить на FamSymb.Family.Id, получаю Id (Но FamSymb.Family.Id == FamId (Не важно текстовый или численный) не работает. В конечном итоге в точке создается множество семейств (по 1 типорамеру), как выудить типоразмер?
Код - Python [Выбрать]
  1.         SymbName = 'Выноска. API'
  2.         collector = FilteredElementCollector(doc)
  3.         collector.OfCategory(BuiltInCategory.OST_GenericAnnotation)
  4.         collector.OfClass(FamilySymbol)
  5.         famtypeitr = collector.GetElementIdIterator()
  6.         famtypeitr.Reset()
  7.         for item in famtypeitr:
  8.                 typeID = item
  9.                 FamSymb = doc.GetElement(typeID)
  10.                 if FamSymb.FamilyName == SymbName:
  11.                         text = doc.Create.NewFamilyInstance(PointU,FamSymb,view)
« Последнее редактирование: 21-11-2016, 22:04:43 от Александр Ривилис »

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Здравствуйте, зная из какого семейства вы хотите получить все типоразмеры, попробуйте использовать метод: family.GetFamilySymbolIds()
Например:
 
Код - C# [Выбрать]
  1.   foreach (var idSymbol in family.GetFamilySymbolIds())
  2.             {
  3.                  FamilySymbol famSymbol = doc.GetElement(idSymbol) as FamilySymbol;
  4.                  doc.Create.NewFamilyInstance(PointU,FamSymb,view)
  5.             }
  6.  

Если я все правильно понял, ну и конечно не забыть про транзакцию.

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Антон Останин, Наоборот, мне нужен один типоразмер из семейства. Поиск осложняется не знанием языков кроме питона, да и его я начал учить только пару недель назад. А вот все примеры в шарпе и в вб

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
не могу разобраться как получить отдельно список типоразмеров
мне нужен один типоразмер из семейства
Евгений, так список нужно или один?
В целом Антон все верно подсказал. Получаете все типоразмеры семейства, затем из этого списка получаете тот один, который вам нужен.
Код - C# [Выбрать]
  1.  foreach (var idSymbol in family.GetFamilySymbolIds())
  2. {
  3.       FamilySymbol famSymbol = doc.GetElement(idSymbol) as FamilySymbol;
  4.       // проверяем является ли типоразмер тем, что нам нужен
  5.       if (famSymbol.Name == "Имя типоразмера")
  6.          doc.Create.NewFamilyInstance(PointU,FamSymb,view)
  7. }

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
При использовании такой конструкции выдает ошибку: "AttributeError: 'AnnotationSymbolType' object has no attribute 'GetFamilySymbolIds'"
Код - Python [Выбрать]
  1. doc = DocumentManager.Instance.CurrentDBDocument
  2. collector = FilteredElementCollector(doc)
  3. collector.OfClass(FamilySymbol)
  4. famtypeitr = collector.GetElementIdIterator()
  5. famtypeitr.Reset()
  6. for typeID in famtypeitr:
  7.         FamSymb = doc.GetElement(typeID)
  8.         if FamSymb.FamilyName == "Название семейства":
  9.                 for idSymbol in FamSymb.GetFamilySymbolIds():
  10.                         famSymbol = doc.GetElement(idSymbol)
  11.                         if famSymbol.Name == "Название типоразмера"::
А если:
Код - Python [Выбрать]
  1. doc = DocumentManager.Instance.CurrentDBDocument
  2. for Family in FilteredElementCollector(doc).OfClass(Family):
  3.         if Family.Name == 'Название семейства':
  4.                 for idSymbol in Family.GetFamilySymbolIds():
  5.                         famSymbol = doc.GetElement(idSymbol)
  6.                         if famSymbol.Name == 'Название типоразмера'::
То он ничего не находит, если заменить "название типоразмера" на "название семейства", то снова выводит все его типоразмеры.

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Евгений, семейство какой категории вы рассматриваете?

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Антон Останин, Типовая аннотация

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Евгений, попробуйте так, у меня этот код отработал:
 
Код - C# [Выбрать]
  1.  var families = new FilteredElementCollector(doc).OfClass(typeof(Family)).ToList();
  2.             foreach (Family family in families)
  3.             {
  4.                 if (!family.Name.Equals("Имя семейства")) continue;
  5.                 var symbolsId = family.GetFamilySymbolIds();
  6.                foreach (var symbolId in symbolsId)
  7.                {
  8.                    var symb = doc.GetElement(symbolId);
  9.                    if (!symb.Name.Equals("Имя типоразмера")) continue;
  10.                    var neededSymbol = symb;
  11.                }
  12.             }
  13.  

Если вам достаточно имени типоразмера, то можно получить вот так:

Код - C# [Выбрать]
  1. var neededSymbol = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_GenericAnnotation).FirstOrDefault(x => x.Name.Equals("Имя типоразмера"));
  2.  

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
При использовании такой конструкции выдает ошибку: "AttributeError: 'AnnotationSymbolType' object has no attribute 'GetFamilySymbolIds'"
Все верно. Потому что объект FamSymb имеет тип FamilySymbol, т.е. типоразмер. А вышеуказанный метод - метод семейства.

то снова выводит все его типоразмеры
Куда выводит? Код в сообщении- это полный код метода?

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Выдает ошибку:
Traceback (most recent call last):
File "<string>", line 7, in <module>
AttributeError: Name
Код - Python [Выбрать]
  1. families = FilteredElementCollector(doc).OfClass(Family)
  2. for family in families:
  3.         if family.Name.Equals('Выноска. API'):
  4.                 symbolsId = family.GetFamilySymbolIds()
  5.                 for symbolId in symbolsId:
  6.                         symb = doc.GetElement(symbolId)
  7.                         if symb.Name.Equals('Стрелка'):
  8.                                 neededSymbol = symb

Куда выводит? Код в сообщении- это полный код метода?
В цикле строю список:
Код - Python [Выбрать]
  1. lst = []
  2. families = FilteredElementCollector(doc).OfClass(Family)
  3. for family in families:
  4.         if family.Name.Equals('Выноска. API'):
  5.                 symbolsId = family.GetFamilySymbolIds()
  6.                 for symbolId in symbolsId:
  7.                         symb = doc.GetElement(symbolId)
  8.                         lst.append(symb)
  9. OUT =lst
В этом случае получаю список типоразмеров моего семейства

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Здравствуйте, зная из какого семейства вы хотите получить все типоразмеры, попробуйте использовать метод: family.GetFamilySymbolIds()

Добрый день, я тоже пытаюсь получить список всех типоразмеров для каждого семейства, но вместо этого получаю только имена их типов. Что не так делаю? Использую как раз family.GetFamilySymbolIds.
Как действительно можно получить список типоразмеров? Список типоразмеров намного больше для каждого семейства.



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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Евгений, можешь по подробней описать? желательно  примером. Метод возвращает идентификаторы типоразмеров семейства, по идентификатору затем можно получить сам типоразмер, включая его имя.

Оффлайн Пашин Евгений

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

Да, Виктор, конечно:

Я пакетно обрабатываю множество семейств. Отображение осуществляется с помощью элемента управления TreeView.
1. Мне требуется собрать из каждого семейства список типоразмеров, даже если семейство будет вложенным. То есть, если в семействе будет вложенное семейство присутствовать, то для данного случая я должен отобразить два списка типоразмеров. Вот тут я и остановился.

Код - vb.net [Выбрать]
  1.             ' Ищу типоразмеры для семейства
  2.             Try
  3.                 Dim coll As FilteredElementCollector = New FilteredElementCollector(Doc).OfClass(GetType(Family))
  4.                 Dim trTN As TreeNode = TN.Nodes.Add("Типоразмеры")
  5.                 For Each FM As Family In coll
  6.                     For Each idSymbol As Object In FM.GetFamilySymbolIds
  7.                         Dim FamSym As FamilySymbol = Doc.GetElement(idSymbol)
  8.                         Try
  9.                             Dim gsNTN2 As TreeNode = trTN.Nodes.Add(FamSym.Name.ToString & " (" & FamSym.Id.ToString & ")")
  10.                             gsNTN2.Tag = FamSym.Id.ToString
  11.                         Catch ex As Exception
  12.                         End Try
  13.                     Next
  14.                 Next
  15.             Catch ex As Exception
  16.                 MsgBox(ex.Message)
  17.             End Try

То есть вместо этого



Я в итоге получил это





2. Затем я должен либо удалить все типоразмеры из семейства или создать новый типоразмер. Пока планирую достигнуть результата по удалению.
« Последнее редактирование: 22-06-2017, 11:03:40 от Пашин Евгений »