3D вид скрыть категорию

Автор Тема: 3D вид скрыть категорию  (Прочитано 2437 раз)

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

Оффлайн sdv79Автор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
3D вид скрыть категорию
« : 16-03-2019, 09:48:31 »
Создал программно "3D вид электрика". Подскажите, как скрывать категории кроме электрики?

Отмечено как Решение sdv79 18-03-2019, 09:30:20

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: 3D вид скрыть категорию
« Ответ #1 : 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. }

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: 3D вид скрыть категорию
« Ответ #2 : 16-03-2019, 15:30:24 »
А я бы от обратного пошел. Есть список категорий, которые должны быть видимы, так и передать их View.IsolateCategoriesTemporary. Дальше выполнить проверку методом, аналогичным приведенному Александром HasTemplateInCurrentView. Если текущему виду не назначен шаблон, то вызвать метод View.ConvertTemporaryHideIsolateToPermanent.

Оффлайн sdv79Автор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Re: 3D вид скрыть категорию
« Ответ #3 : 18-03-2019, 09:35:15 »
Коллеги, спасибо!. Вариант от Modis помогло как готовое решение. Александр Игнатович - я пока не на столько хорошо знаком с Revit API, чтобы опробовать ваше предложение.
 :)

Оффлайн sdv79Автор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Re: 3D вид скрыть категорию
« Ответ #4 : 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.  
« Последнее редактирование: 20-03-2019, 18:38:50 от Александр Ривилис »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: 3D вид скрыть категорию
« Ответ #5 : 20-03-2019, 18:09:44 »
Так вы коллектором собираете элементы категории OST_ElectricalEquipment. Вам нужно передать методу IsolateCategoriesTemporary id-шки категорий самих:

Код - C# [Выбрать]
  1. var categoriesList = new List<ElementId> { new ElementId(BuiltInCategory.OST_ElectricalEquipment) };

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: 3D вид скрыть категорию
« Ответ #6 : 20-03-2019, 18:40:57 »
sdv79,
Напоминаю о правиле форматирования кода на нашем форуме. Читайте у меня в подписи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение