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

ADN Club => Revit API => Тема начата: Lis от 24-05-2023, 14:35:31

Название: Покрасить сторону Duct
Отправлено: Lis от 24-05-2023, 14:35:31
Здравствуйте. Дано следующее: Revit 2019, есть инструмент, который строит вентиляционные шахты (Duct). Есть задача: нужно, чтобы у вентиляционных шахт одна из сторон была определенного цвета (условного синего). Попытка решения: после построения пусть в команде будет изменен цвет стороны (пока не придумал как их различать, поэтому первой попавшейся -- в цикле break). Проблема: у Face нет доступного Id, решил через Reference зайти, но там хранится Duct Id, поэтому красится вся вентиляционная шахта, а не одна только сторона (правда, сама-то грань не красится почему-то, только ребра). Вопрос: кто-нибудь из тех, кто сталкивался с подобной задачей, подскажите, как с этим удалось справиться? Может в принципе подход не с той стороны выбрал? Код свой ниже привёл.
Код - C# [Выбрать]
  1. var duct = document.GetElement(ductId);
  2. var geometryElement = duct.get_Geometry(new Options { ComputeReferences = true });
  3.  
  4. foreach (var geometryObject in geometryElement)
  5. {
  6.     if (!(geometryObject is Solid solid))
  7.         continue;
  8.  
  9.     foreach (Face face in solid.Faces)
  10.     {
  11.         using (var transaction = new Transaction(document, "Подсветка"))
  12.         {
  13.             transaction.Start();
  14.  
  15.             var color = new Color(0, 0, 255);
  16.             var overrideSettings = new OverrideGraphicSettings();
  17.             overrideSettings.SetProjectionLineColor(color);
  18.             overrideSettings.SetSurfaceBackgroundPatternColor(color);
  19.             overrideSettings.SetProjectionFillColor(color);
  20.             overrideSettings.SetSurfaceForegroundPatternColor(color);
  21.             overrideSettings.SetCutForegroundPatternColor(color);
  22.             overrideSettings.SetCutFillColor(color);
  23.             overrideSettings.SetCutBackgroundPatternColor(color);
  24.  
  25.             document.ActiveView.SetElementOverrides(face.Reference.ElementId, overrideSettings);
  26.             document.Regenerate();
  27.  
  28.             transaction.Commit();
  29.         }
  30.                        
  31.         commandData.Application.ActiveUIDocument.RefreshActiveView();
  32.         break;
  33.     }
  34.  }
  35.  
Название: Re: Покрасить сторону Duct
Отправлено: Александр Пекшев aka Modis от 24-05-2023, 14:44:44
Чет вы все напутали!
SetElementOverrides - это переопределение графики на виде для элемента! То же самое, что доступно в контекстном меню в самом Ревите. А покраска граней делается через присвоения им определенных материалов. Для этого существует метод Document.Paint (https://www.revitapidocs.com/2023/9268395e-a9cb-ff79-20ab-1ed261220513.htm)
Название: Re: Покрасить сторону Duct
Отправлено: Lis от 24-05-2023, 15:21:50
Чет вы все напутали!
SetElementOverrides - это переопределение графики на виде для элемента! То же самое, что доступно в контекстном меню в самом Ревите. А покраска граней делается через присвоения им определенных материалов. Для этого существует метод Document.Paint (https://www.revitapidocs.com/2023/9268395e-a9cb-ff79-20ab-1ed261220513.htm)
Действительно, метод Paint отлично справляется с задачей. Вы спасли мне большое количество нервов, благодарю!