Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Ярослав от 02-04-2015, 18:49:28

Название: Параметры по типоразмеру
Отправлено: Ярослав от 02-04-2015, 18:49:28
Здравствуйте можно ли как то изменять параметры, у которых тип по типоразмеру семейства???
Название: Re: Параметры по типоразмеру
Отправлено: Александр Игнатович от 03-04-2015, 06:07:34
День добрый!

Да, также как и для параметров любого экземпляра. Только сначала нужно получить сам типоразмер, например, типоразмер элемента elem

Код - C# [Выбрать]
  1. doc.GetElement(elem.GetTypeId())

Либо найти нужные типоразмеры с помощью FilteredElementCollector
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 08:01:28
Саша, а ты действительно понял вопрос Ярослава?
Понять фразу
у которых тип по типоразмеру семейства
я так и не смог. Ярослав, поясните.

Если же действительно нужно изменить параметр типоразмера, то Александр прав. Параметры можно изменять у любого класса типа Element. Класс Element является базовым классом для класса типоразмера - ElementType.
Название: Re: Параметры по типоразмеру
Отправлено: Александр Игнатович от 03-04-2015, 08:17:25
Конечно, на 100% я не уверен, но примерно в такой формулировке вопросы уже слышал.
Видимо, это проистекает из-за Revit-овского окошка свойств параметра с переключалкой тип/экземпляр
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 08:34:04
здравствуйте!
Извините что был не корректен.
Я имел ввиду параметры у которых тип параметра "Типоразмер семейства":
http://knowledge.autodesk.com/support/revit-products/learn-explore/caas/CloudHelp/cloudhelp/2015/RUS/Revit-Customize/files/GUID-921F7A15-D191-4F75-8243-4989C482E253-htm.html (http://knowledge.autodesk.com/support/revit-products/learn-explore/caas/CloudHelp/cloudhelp/2015/RUS/Revit-Customize/files/GUID-921F7A15-D191-4F75-8243-4989C482E253-htm.html) седьмой пункт предпоследняя стока в табличке.
Спасибо за понимание.
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 08:39:40
Ярослав,
Спасибо за пояснение.
Да, конечно, можно. StorageType у таких параметров равен ElementId. Т.е. вам нужно записать ElementId нужного типоразмера с помощью метода Parameter.Set(ElementId id)
Название: Re: Параметры по типоразмеру
Отправлено: Александр Игнатович от 03-04-2015, 08:40:29
Ну да, был не прав :-)

Виктор вперед успел ответить :-)
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 09:14:45
А можно не через ElementId а через его имя(значение). Просто у меня в зависимости от  string значения одного параметра должно приниматся значение второго(того у которого тип "Типоразмер семейства").
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 09:18:16
Ярослав, Можно конечно попробовать через Parameter.SetValueString, но честно говоря не знаю, сработает ли это в случае, если тип параметра ElementId. В любом случае, это не очень хорошая идея.
Простой пример. Что если есть два типоразмера (различных семейств), у которых одинаковое название? Так что по Id - самый надежный способ.
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 10:18:06
Ну что то никак оно у меня не идет.
Значение не получает ни через Id  ни через SetValueString.
Но оно находит нужный параметр но значение ему не писваевает посмотрите что тут не так??
Код - C# [Выбрать]
  1.   var collector = new FilteredElementCollector(doc, view.Id);
  2.    var sht = collector.OfCategory(BuiltInCategory.OST_TitleBlocks)
  3.                         .WhereElementIsNotElementType().FirstElement();
  4.     int zna = 100445;// ето ID значения параметра
  5.     var pr = sht.GetParameters("Строка 1 подпись");
  6.     foreach (Parameter parame in pr)
  7.      {
  8.         parame.Set(zna);
  9.      }
  10.  
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 10:26:44
Ярослав,
Переменная zna имеет тип int, а значит, вызывается метод Parameter.Set(int value), вместо Parameter.Set(ElementId id)
Нужно передавать именно ElementId.
Код - C# [Выбрать]
  1. var zna = new ElementId(100445);
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 10:28:27
Ярослав,
Параметр Строка 1 подпись действительно имеет тип ElementId? Название у него не очень подходит для этого, поэтому есть сомнения.
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 10:34:47
Заработало!! Спасибо!!
А если использовать SetValueString
то что нужно присвоить zna? просто string?
string zna = "значение";
???
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 10:40:27
Если SetValueString, то
Код - C# [Выбрать]
  1. var zna = "Название типоразмера, имеющего идентификатор 100445";
  2.  foreach (Parameter parame in pr)
  3.      {
  4.         parame.SetValueString(zna);
  5.      }
  6.  
Но имейте ввиду, что если в проекте будет несколько типоразмеров с таким именем, то возможны два варианта:
1) вылетет с ошибкой
2) Revit подставит первый попавшийся типоразмер с таким именем. Не обязетельно это будет то семейство, которое вам нужно. Т.е. может в одном случае подставит верно, а в другом нет.
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 10:59:22
А вот здесь оно не хочет брать!
В проекте нет типоразмеров с таким именем и не будет.
Нужный елемент есть вложеным семейством в семейство "Основной надписи".
А при загрузке семейства "основной надписи" в разные проекты Id вложеного елемента будет оставатся таким же???
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 11:07:48
В проекте нет типоразмеров с таким именем и не будет.
Любое семейство, даже вложенное, загружается в проект в любом случае. На сколько мне известно, вложенные семейства могут не отображаться в диспетчере проекта, но они в любом случае в проекте. Вам ведь удалось присвоить типоразмер по идентификатору, значит оно есть в проекте.
А при загрузке семейства "основной надписи" в разные проекты Id вложеного елемента будет оставатся таким же???
Нет, будут разными. Id является уникальным, в рамках одного проекта. При вставке семейства, в проекте уже может существовать другой объект с этим же идентификатоом. Именно поэтому он меняется.
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 11:13:25
Вот и по этому надо по имени, так как оно будет для каждого проекта одинаковое.
А то прийдется в каждом проекте находить все параметры и  елементы типа ElementId. а с моими знаниями ето нереально!!!

Может каким то способом можно найти все имена этих елементов и их назначить?
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 11:48:19
Ярослав, не понял, имена каких элементов нужно найти?

В чем проблема, найти типоразмер по имени семейства и типоразмера? Это легко делается с помощью FilteredElementCollector. Находите типоразмер, берете его ElementId, присваиваете значение параметра.

А то прийдется в каждом проекте находить все параметры и  елементы типа ElementId
Это зачем?

Попробуйте лучше сформулировать задачу. Тогда я смогу дать направление как нужно ее решить.
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 12:03:11
Извините не могу конкретнее сформулировать не хватает слов!!
Я опишу всю задачу!
У меня есть семейство "основной надписи" у которого есть параметр "Строка 1 подпись". Значение этого параметра это загруженые в это семейство семейства подписей(типовые аннотации). При выборе нужного значения в нужном поле появляется подпись.
Цель: чтоб при вводе фамилии выбиралась нужная подпись. Фамилии выбираются из строго указаного списка, значения точно такие же как и типоразмеры подписей.
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 15:23:25
Виктор Чекалин,  как можно через FilteredElementCollector получить доступ к вложеным семействам если они не общие???
Здесь Вы получали доступ к общим семействам http://adn-cis.org/api-dlya-raboty-s-semeystvami-part-3.html (http://adn-cis.org/api-dlya-raboty-s-semeystvami-part-3.html)
что нужно добавить чтоб получить доступ к вложеным не общим?

Я нашол что эти семейства хранятся у Family Document но получить доступ к Family Document у меня не получается!!!
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 15:47:40
Ярослав, Пока проверить возможности нет, но на сколько я помню, работа с общими семействами не отличается от работы с не общими вложенными семействами с точки зрения API.
Откройте RevitLookup и попробуйте там найти семейство, которое вас интересует. Есть оно вообще, нет?
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 16:08:09
Ну через FilteredElementCollector в категории типовые аннотации выдает тоько те что загружены непосредственно в проект, вложеных оно не видит.

В RevitLookup эти елементы есть.
Но они находятся в Family Document того семейства в которое они загружены, во вкладке Family.
Как через API туда попасть?
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 16:26:20
В RevitLookup эти елементы есть.
Но они находятся в Family Document того семейства в которое они загружены, во вкладке Family.
Я имел ввиду просмотреть аннтации с помощью RеvitLookup непосредственно в проекте. ТО что они видны в FamilyDocument - это понятно

Элемент с Id 100445 это что? Идентификатор типоразмера аннотации?
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 16:39:31
В RеvitLookup  в аннотациях его нет.
элемент с Id 100445 это семейство  типа "Типовые аннотации", но оно вложено в другое семейство с меткой паметра "Строка 1 подпись".
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 16:44:40
элемент с Id 100445 это семейство  типа "Типовые аннотации"
Это значит, что семейство действительно есть в проекте, не смотря на то, что оно является вложенным.

В коде получите элемент по Id:
Код - C# [Выбрать]
  1. var element = doc.GetElement(new ElementId(100445));

Посмотрите что у него за тип:
Код - C# [Выбрать]
  1. var type = element.GetType();

Мне кажется что просто неправильно используете FilteredElementCollector
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 17:07:14
Значение type : Name Element, FullName Autodesk.Revit.DB.Element.
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 03-04-2015, 17:10:32
Ярослав, уже интересней, т.е. он не как семейство, а как элемент.
А как вынашли его идентификатор тогда?
Можете выслать семейство (или другое, с таким же поведением), я потестирую.
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 03-04-2015, 17:37:00
Все делал в строгости как вы говорили.
Вот Вам файл проекта в который загружено семейство основной надписи "Листы (рус)", в которое загружены семейства типовых аннотаций "Билоус Я" и "Пусто".
В проекте при изминении параметра "Строка 1 подпись" семейства "Листы (рус)" отображается или "Билоус Я" или "Пусто".


[вложение удалено администратором]
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 07-04-2015, 14:49:35
Ярослав, Только сейчас удалось посмотреть.

В принципе все не так уж плохо.

Параметр Строка 1 подпись имеет тип Типовые аннотации. Вам нужно, найти все элементы категории "Типовые аннотации" в проекте, затем найти по имени нужное вам и присвоить ид.
Код примерно такой:
Код - C# [Выбрать]
  1. FilteredElementCollector collector =
  2.    new FilteredElementCollector(doc);
  3. // ищем все экзепмпляры типовых аннотаций
  4. var genericAnnotations = collector
  5.                  // категории типовые аннотации
  6.                 .OfCategory(BuiltInCategory.OST_GenericAnnotation)
  7.                  // экземпляры, а не типы
  8.                 .WhereElementIsNotElementType()
  9.                 .ToElements();
  10.  
  11. var valueElement = genericAnnotations.FirstOrDefault(x=>x.Name == "Билоус Я");
  12. if (valueElement!=null){
  13.     parameter.SetValue(valueElement.Id);
  14. })
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 07-04-2015, 19:22:16
Здравствуйте Виктор!
К сожалению при данном поиске находит только "выноска с текстом" это если брать по тому файлу что я сбрасывал.
И ого ищет только в тех семействах типовых аннотаций что отображаются в Диспетчере проектов!
 
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 08-04-2015, 15:09:04
Ярослав, код я не проверял с надеждой, что здесь все очевидно. Оказалось не так.
Выходит даже не смотря на то, что элемент имеет категорию, FilteredElementCollector его не находит.
Поковыряюсь еще и возможно задав вопрос в техподдержку Autodesk.
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 09-04-2015, 13:35:31
Ярослав, так и не удалось мне получить эти семейства. Написал вопрос в техподдержку. Жду ответ.
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 09-04-2015, 18:05:28
Так вот, я тоже все что нашел, перепробовал!!
В какую сторону смотреть не знаю?!?!
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 09-04-2015, 18:08:50
Ярослав, получил ответ от техподдержки. Смотреть в сторону Revit 2016. Там появилась возможность получить доступные значения параметров, у которых тип 'Типоразмер'. Ожидать, что это будет исправлено в Revit 2015 - не стоит.
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 09-04-2015, 23:01:58
Это просто... нету слов!)
Сначала CopyNumber , теперь это.
И это я только 2 надстройки попытался написать.
Как с этим живут более продвинутые пользователи??!!
Боюсь даже дальше что нибудь загадывать, чтоб запрограммировать!
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 10-04-2015, 10:29:25
Ну если семейство подписи зделать общим то можно через FilteredElementCollector его найти.
А можно ли как то получить его ElementID?
Если использовать просто ID, он его не воспринимает.
И даже в RеvitLookup у него есть ElementID и ID.
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 10-04-2015, 10:35:54
И даже в RеvitLookup у него есть ElementID и ID.
А разве это не одно и то же?

А можно ли как то получить его ElementID?
Если использовать просто ID, он его не воспринимает.
Приведите код. Что то опять не то делаете. Если получили через элемент, то взять его ID не составит проблем.
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 10-04-2015, 10:37:58
Сначала CopyNumber , теперь это.
И это я только 2 надстройки попытался написать.
Как с этим живут более продвинутые пользователи??!!
Боюсь даже дальше что нибудь загадывать, чтоб запрограммировать!
С CopyNumber я думаю это просто настолько редкий случай его использования, то никто о нем и не беспокоился.
А что касается текущей проблемы, то я бы сказал, что очень даже повезло, что в следующей версии этот недостаток уже исправили.
Название: Re: Параметры по типоразмеру
Отправлено: Виктор Чекалин от 10-04-2015, 11:21:44
Если использовать просто ID, он его не воспринимает.
Попробовал с вашим файлом по ID все замечательно работает и значение параметра меняется.
Код - C# [Выбрать]
  1.                         var selectedElements = uidoc.Selection.GetElementIds();
  2.                         var firstId = selectedElements.FirstOrDefault();
  3.  
  4.                         var element = uidoc.Document.GetElement(firstId);
  5.                        
  6.                         var param2 = element.GetParameters("Строка 2 подпись").FirstOrDefault();
  7.                         var param3 = element.GetParameters("Строка 3 подпись").FirstOrDefault();
  8.                        
  9.                         using (var t = new Transaction(uidoc.Document, "Изменение параметра"))
  10.                         {
  11.                              t.Start();
  12.                              var res1 = param2.Set(new ElementId(100445)); // меняет значение
  13.                              var res2 = param3.SetValueString("Билоус Я"); // не меняет значение
  14.                              t.Commit();
  15.                 }
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 10-04-2015, 15:07:28
Я говорил про ID подписи("Билоус Я"), а не основной надписи!
Чтоб ее найти по имени и найти ее ElementId.
НО!
У меня получилось.
Только вот как не хотелось, но пришлось подписи сделать основным семейством (теперь они доступны из "Диспечера проектов").
И :
Код - C# [Выбрать]
  1.  FilteredElementCollector coll1 = new FilteredElementCollector(doc);
  2.                         var genericAnnotations = coll1.
  3.                             OfCategory( BuiltInCategory.OST_GenericAnnotation)
  4.                            .OfClass(typeof(FamilySymbol));
  5.                         var valueElement = genericAnnotations.FirstOrDefault(x => x.Name == "Билоус Я") as FamilySymbol;
  6.                         if (valueElement != null)
  7.                         {
  8.                             ElementId elid = valueElement.Id;
  9.                             parame.Set(elid);
  10.                         }
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 10-04-2015, 15:11:34
Сначала CopyNumber , теперь это.
И это я только 2 надстройки попытался написать.
Как с этим живут более продвинутые пользователи??!!
Боюсь даже дальше что нибудь загадывать, чтоб запрограммировать!
С CopyNumber я думаю это просто настолько редкий случай его использования, то никто о нем и не беспокоился.
А что касается текущей проблемы, то я бы сказал, что очень даже повезло, что в следующей версии этот недостаток уже исправили.
Нет тут не в CopyNumber дело, а дело в том что Програма получается настолько сырая что их ГРОМКИЕ СЛОВА "Что можно сделать руками то и через API" просто не имеют смысла!
Название: Re: Параметры по типоразмеру
Отправлено: Александр Ривилис от 10-04-2015, 16:26:21
...а дело в том что Програма получается настолко сырая...

Напоминаю про пункт 3.9 Правил поведения на форуме!
Название: Re: Параметры по типоразмеру
Отправлено: Ярослав от 04-08-2015, 16:11:01
Ярослав, получил ответ от техподдержки. Смотреть в сторону Revit 2016. Там появилась возможность получить доступные значения параметров, у которых тип 'Типоразмер'. Ожидать, что это будет исправлено в Revit 2015 - не стоит.
Здравствуйте!
Подскажите в какую сторону теперь двигаться??
Как можно получить значения параметров, у которых тип "Типоразмер"??