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

ADN Club => Revit API => Тема начата: sdv79 от 16-03-2019, 09:48:31

Название: 3D вид скрыть категорию
Отправлено: sdv79 от 16-03-2019, 09:48:31
Создал программно "3D вид электрика". Подскажите, как скрывать категории кроме электрики?
Название: Re: 3D вид скрыть категорию
Отправлено: Александр Пекшев aka Modis от 16-03-2019, 10:34:00
Код - C# [Выбрать]
  1. /// <summary>Скрыть указанную категорию с текущего вида</summary>
  2. /// <param name="commandData"></param>
  3. /// <param name="cat">Категория</param>
  4. /// <param name="name">Имя категории, отображаемое в транзакции</param>
  5. public static Result HideCategory(ExternalCommandData commandData, BuiltInCategory cat, string name)
  6. {
  7.     try
  8.     {
  9.         if (HasTemplateInCurrentView(commandData))
  10.             return Result.Cancelled;
  11.         var doc = commandData.Application.ActiveUIDocument.Document;
  12.         Category category = doc.Settings.Categories.get_Item(cat);
  13.         if (category?.get_Visible(doc.ActiveView) == true)
  14.             using (var tr = new Transaction(doc, Language.GetItem(LangItem, "Hide") + " " + Language.GetItem(LangItem, name)))
  15.             {
  16.                 tr.Start();
  17.                 category.set_Visible(doc.ActiveView, false);
  18.                 tr.Commit();
  19.             }
  20.         return Result.Succeeded;
  21.     }
  22.     catch (Exception exception)
  23.     {
  24.         ExceptionBox.Show(exception);
  25.         return Result.Failed;
  26.     }
  27. }
  28. /// <summary>
  29. /// Проверка текущего вида на наличие примененного шаблона вида
  30. /// </summary>
  31. /// <param name="commandData"></param>
  32. /// <returns></returns>
  33. private static bool HasTemplateInCurrentView(ExternalCommandData commandData)
  34. {
  35.     var view = commandData.View;
  36.     if (!view.IsTemplate && view.ViewTemplateId != ElementId.InvalidElementId)
  37.     {
  38.         // Невозможно изменить настройки видимости для категории на текущем виде, так как к виду применен шаблон вида
  39.         MessageBox.Show(Language.GetItem(LangItem, "m1"), MessageBoxIcon.Close);
  40.         return true;
  41.     }
  42.  
  43.     return false;
  44. }
Название: Re: 3D вид скрыть категорию
Отправлено: Александр Игнатович от 16-03-2019, 15:30:24
А я бы от обратного пошел. Есть список категорий, которые должны быть видимы, так и передать их View.IsolateCategoriesTemporary. Дальше выполнить проверку методом, аналогичным приведенному Александром HasTemplateInCurrentView. Если текущему виду не назначен шаблон, то вызвать метод View.ConvertTemporaryHideIsolateToPermanent.
Название: Re: 3D вид скрыть категорию
Отправлено: sdv79 от 18-03-2019, 09:35:15
Коллеги, спасибо!. Вариант от Modis помогло как готовое решение. Александр Игнатович - я пока не на столько хорошо знаком с Revit API, чтобы опробовать ваше предложение.
 :)
Название: Re: 3D вид скрыть категорию
Отправлено: sdv79 от 20-03-2019, 18:01:31
Код не отключает элементы. Подскажите где ошибка.
Код - C# [Выбрать]
  1. var elems = new FilteredElementCollector(doc)
  2.                                     .OfCategory(BuiltInCategory.OST_ElectricalEquipment)
  3.                                     .OfType<Category>()
  4.                                     .Select(x => x.Id)
  5.                                     .ToList();
  6.  
  7. using (Transaction t = new Transaction(doc))
  8.                 {
  9.                     t.Start("Создание 3D вида");
  10.                     var v3d = View3D.CreateIsometric(doc, vft3d.Id);
  11.                     v3d.Name = nameView;
  12.                     v3d.IsolateCategoriesTemporary(elems);
  13.                     t.Commit();
  14.                 }
  15.  
Название: Re: 3D вид скрыть категорию
Отправлено: Александр Игнатович от 20-03-2019, 18:09:44
Так вы коллектором собираете элементы категории OST_ElectricalEquipment. Вам нужно передать методу IsolateCategoriesTemporary id-шки категорий самих:

Код - C# [Выбрать]
  1. var categoriesList = new List<ElementId> { new ElementId(BuiltInCategory.OST_ElectricalEquipment) };
Название: Re: 3D вид скрыть категорию
Отправлено: Александр Ривилис от 20-03-2019, 18:40:57
sdv79,
Напоминаю о правиле форматирования кода на нашем форуме. Читайте у меня в подписи.