Поиск параметров семейства

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

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

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Добрый день, уважаемые форумчане. Подскажите пожалуйста, немного запутался. Как получить и изменять параметры открытого документа семейства?
Если семейство открыто в проекте, то я это делаю так:
Код - C# [Выбрать]
  1. FilteredElementCollector FamilyS = new FilteredElementCollector(doc)
  2.                                                       .OfClass(typeof(FamilySymbol));
  3. foreach (FamilySymbol FS in FamilyS)
  4. {
  5.    foreach (Parameter P in FS.Parameters)
  6.    {
  7.       if (P.Definition.Name == "Мой параметр")
  8.       {
  9.             //что-то делаю с параметром
  10.       }
  11.   }
  12. }
  13.  

А если открытый документ(doc) - это семейство, то ведь doc.Parameters - такого нету. Я пробовал делать следующее:
Код - C# [Выбрать]
  1. FilteredElementCollector ParamElem = new FilteredElementCollector(familyDoc)
  2.                                                          .OfClass(typeof(ParameterElement));
  3. foreach (ParameterElement PE in ParamElem)
  4. {
  5.       if (PE.Name == "Мой параметр")
  6.       {
  7.        //Находит мой параметр,
  8.        //но методов для изменения параметра в PE нету
  9.       }
  10.       foreach (Parameter P in PE.Parameters)
  11.       {
  12.           if (P.Definition.Name == "Мой параметр")
  13.           {
  14.            //не находит мой параметр
  15.          }
  16.     }
  17. }
  18.  

Потом, делал так:
Код - C# [Выбрать]
  1. FamilyManager FM = familyDoc.FamilyManager;
  2. foreach (FamilyParameter FamilyP in FM.Parameters)
  3. {
  4.     if (FamilyP.Definition.Name =="Мой параметр")
  5.       {
  6.        //Находит мой параметр,
  7.        //но методов для изменения параметра в FamilyP нету
  8.       }
  9.      foreach (Parameter P in FamilyP.AssociatedParameters)
  10.      {
  11.           if (P.Definition.Name == "Мой параметр")
  12.           {
  13.               //не находит мой параметр
  14.           }
  15.      }
  16. }
  17.  

Собственно, это все мои изыскания.
« Последнее редактирование: 04-04-2018, 12:07:27 от Pabloa »

Отмечено как Решение Павел Тер-Микаэлян 04-04-2018, 14:26:29

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Поиск параметров семейства
« Ответ #2 : 04-04-2018, 13:37:18 »
Спасибо за ответ!
Я понял, что параметры в семействе получаются для конкретного типоразмера:
Код - C# [Выбрать]
  1. FamilyManager FM = familyDoc.FamilyManager;
  2. foreach (FamilyParameter FamilyP in FM.Parameters)
  3. {
  4.     if (FamilyP.Definition.Name == "Мой параметр")
  5.    {
  6.       //типоразмеры
  7.       foreach (FamilyType FamilyT in FM.Types)
  8.       {
  9.            if (FamilyT.HasValue(FamilyP))
  10.            {
  11.                //Значение параметра
  12.                string value = FamilyT.AsValueString(FamilyP);
  13.                switch (FamilyP.StorageType)
  14.                {
  15.                    case StorageType.Double:
  16.                         value = FamilyT.AsDouble(FamilyP).ToString();
  17.                         break;
  18.                    case StorageType.ElementId:
  19.                         ElementId id = FamilyT.AsElementId(FamilyP);
  20.                         value = id.IntegerValue.ToString();
  21.                         break;
  22.                    case StorageType.Integer:
  23.                         value = FamilyT.AsInteger(FamilyP).ToString();
  24.                         break;
  25.                    case StorageType.String:
  26.                         value = FamilyT.AsString(FamilyP);
  27.                         break;
  28.                }
  29.               //Значение параметра для каждого типоразмера
  30.               Debug.Print(value);
  31.            }
  32.        }
  33.    }
  34. }
  35.  

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Поиск параметров семейства
« Ответ #3 : 04-04-2018, 14:03:16 »
Но ведь тогда параметры и изменяться должны для конкретного типоразмера?
А метод FamilyManager.Set не принимает на вход типоразмер, только параметр. Запустил такой код:
Код - C# [Выбрать]
  1. FamilyManager FM = familyDoc.FamilyManager;
  2. foreach (FamilyParameter FamilyP in FM.Parameters)
  3. {
  4.     if (FamilyP.Definition.Name == "Мой параметр")
  5.    {
  6.         using (Transaction t = new Transaction(familyDoc, "Ред. парам."))
  7.              {
  8.                   t.Start();
  9.                   FM.Set(FamilyP, "");
  10.                   t.Commit();
  11.             }
  12.    }
  13. }
  14.  

И он поменял значение параметра только в одном типоразмере. А как тогда в остальных менять?

Оффлайн Павел Тер-МикаэлянАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: Поиск параметров семейства
« Ответ #4 : 04-04-2018, 14:27:30 »
Понял, что для корректировки параметра каждого типоразмера нужно дополнительно устанавливать текущий типоразмер в семействе.
Код - C# [Выбрать]
  1. FamilyManager FM = familyDoc.FamilyManager;
  2. foreach (FamilyParameter FamilyP in FM.Parameters)
  3. {
  4.     if (FamilyP.Definition.Name == "Мой параметр")
  5.    {
  6.        foreach (FamilyType FamilyT in FM.Types)
  7.       {
  8.          using (Transaction t = new Transaction(familyDoc, "Ред. парам."))
  9.          {
  10.                       t.Start();
  11.                       FM.CurrentType = FamilyT;
  12.                       FM.Set(FamilyP, "");
  13.                       t.Commit();
  14.          }
  15.       }
  16.    }
  17. }
  18.