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

07/12/2013

Изменение рабочего набора элемента

Мы уже обсуждали как можно получить текущий рабочий набор у отдельного элемента либо с помощью встроенного параметра ELEM_PARTITION_PARAM, или более легким способом с помощью метода Document.GetWorksetId.

Это еще один пример того, что одно и тоже свойство можно получить как с помощью параметра элемента, так и с помощью отдельного метода или свойства, помимо того, что мы недавно обсуждали в статье Изменение типа Видового экрана.

Однако хоть Revit API и содержит отдельное свойство для определения рабочего набора элемента, отдельного метода для изменения рабочего набора нет.

Вопрос: Свойство Element.WorksetId доступно только для чтения.

Мне же нужно изменить рабочий набор для определенного элемента.

Это возможно сделать с помощью API?

Ответ: Да, возможно. Изменить рабочий набор можно с помощью встроенного параметра ELEM_PARTITION_PARAM.

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

Код - C#: [Выделить]
  1.         public MyClass()
  2.         {
  3.             Reference r = uidoc.Selection.PickObject(ObjectType.Element);
  4.             Element e = doc.GetElement(r.ElementId);
  5.  
  6.             if (e == null)
  7.                 return;
  8.  
  9.             // Смотрим текущий рабочий набор элемента
  10.             WorksetId wid = e.WorksetId;
  11.  
  12.             TaskDialog.Show("Идентификатор рабочего набора", wid.ToString());
  13.  
  14.             // находим встроенный параметр с идентификатором рабочего набора
  15.             Parameter wsparam = e.get_Parameter(
  16.               BuiltInParameter.ELEM_PARTITION_PARAM);
  17.  
  18.             if (wsparam == null)
  19.                 return;
  20.  
  21.             // Находим все пользовательские рабочие наборы
  22.  
  23.             FilteredWorksetCollector worksets
  24.               = new FilteredWorksetCollector(doc)
  25.                 .OfKind(WorksetKind.UserWorkset);
  26.  
  27.             using (Transaction tx = new Transaction(doc))
  28.             {
  29.                 tx.Start("Изменение рабочего набора");
  30.  
  31.                 foreach (Workset ws in worksets)
  32.                 {
  33.                     wsparam.Set(ws.Id.IntegerValue);
  34.                 }
  35.  
  36.                 tx.Commit();
  37.             }
  38.             wid = e.WorksetId;
  39.  
  40.             // Новый рабочий набор
  41.             TaskDialog.Show("Идентификатор рабочего набора", wid.ToString());
  42.         }

Спасибо Филу Ксиа (Phil Xia) за подсказку!

Источник: http://thebuildingcoder.typepad.com/blog/2013/01/change-element-workset.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=386

Опубликовано 07.12.2013
Отредактировано 07.12.2013 в 08:12:36