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

13/12/2013

Создание цветовой области, похожей на область маскировки

Вопрос: Как можно программно создать область маскировки?

Ответ: К сожалению, в текущей версии API этого сделать нельзя.

Но есть и хорошая новость. В Revit 2013 API добавилась возможность создавать цветовую область.

Класс FilledRegion был расширен и теперь есть возможность создать новую цветовую область, получить ее границы и задать заливку.

Тем не менее, явного способа создать область маскировки не существует. Единственное, что мы можем сделать похожее, так это создать цветовую область с помощью статического метода FillRegion.Create. Но нужно учитывать, что цветовая область - это не совсем то же самое, что и область маскировки. Цветовая область имеет заливку, которая может быть изменена. Область маскировки статическая и поменять ее тип нельзя. Но если задать цветовой области сплошную заливку, то она будет выглядеть как область маскировки.

Ниже представлен пример команды для создания цветовой области со сплошной заливкой:

Код - C#: [Выделить]
  1.     [Transaction(TransactionMode.Manual)]
  2.     public class Command : IExternalCommand
  3.     {
  4.         public Result Execute(
  5.           ExternalCommandData commandData,
  6.           ref string message,
  7.           ElementSet elements)
  8.         {
  9.             UIApplication uiapp = commandData.Application;
  10.             UIDocument uidoc = uiapp.ActiveUIDocument;
  11.             Application app = uiapp.Application;
  12.             Document doc = uidoc.Document;       
  13.  
  14.             Selection sel = uidoc.Selection;
  15.            
  16.             List<XYZ> pointsForBoundaries = new List<XYZ>();
  17.  
  18.             bool cancel = false;
  19.  
  20.             while (!cancel)
  21.             {
  22.                 try
  23.                 {
  24.                     var point = sel.PickPoint
  25.                         (string.Format("Выберите не менее 3-х точек. Выбрано {0} точек. Нажмите ESC для завершения", pointsForBoundaries.Count));
  26.                     pointsForBoundaries.Add(point);
  27.                 }
  28.                 catch (Exception)
  29.                 {
  30.                     if (pointsForBoundaries.Count<3)
  31.                         return Result.Cancelled;
  32.                     cancel = true;
  33.                 }
  34.             }
  35.  
  36.             // для того чтобы создать закрытую область, последнюю точку совместим с первой
  37.             pointsForBoundaries.Add(pointsForBoundaries[0]);
  38.  
  39.             CurveLoop curveLoop = new CurveLoop();
  40.             for (int i = 0; i < pointsForBoundaries.Count-1; i++)
  41.             {
  42.                 Line line = Line.CreateBound(pointsForBoundaries[i], pointsForBoundaries[i + 1]);
  43.                 curveLoop.Append(line);
  44.             }
  45.  
  46.             //Ищем сплошную заливку
  47.             FilteredElementCollector fillPatternElementCollector =
  48.                 new FilteredElementCollector(doc);
  49.             var fillPatternIds =
  50.                 fillPatternElementCollector
  51.                     .OfClass(typeof (FillPatternElement))
  52.                     .Cast<FillPatternElement>()
  53.                     .Where(fpe => fpe.GetFillPattern().IsSolidFill)
  54.                     .Select(fpe=>fpe.Id);
  55.  
  56.             // можно сделать проверку, есть ли сплшная заливка и создать ее при необходимости
  57.  
  58.             // ищем тип цветовой области со сплошной заливкой
  59.             FilteredElementCollector collector = new FilteredElementCollector(doc);
  60.  
  61.             var fillRegionTypeWithSolidPattern =
  62.                 collector
  63.                     .OfClass(typeof (FilledRegionType))
  64.                     .Cast<FilledRegionType>()
  65.                     .FirstOrDefault(frt => fillPatternIds.Contains(frt.FillPatternId));
  66.  
  67.             // так же можно сделать доп. проверку что есть тип со сплошной заливкой
  68.  
  69.             List<CurveLoop> profileloops
  70.                 = new List<CurveLoop>();
  71.             profileloops.Add(curveLoop);
  72.  
  73.             using (var t = new Transaction(doc, "Создание цветовой области"))
  74.             {
  75.                 t.Start();
  76.  
  77.                 var filledRegion = FilledRegion.Create(doc,
  78.                     fillRegionTypeWithSolidPattern.Id,                   
  79.                     uidoc.ActiveView.Id,
  80.                     profileloops);
  81.  
  82.                 t.Commit();
  83.             }
  84.  
  85.  
  86.             return Result.Succeeded;
  87.         }
  88.     }

 

 

Источник: http://thebuildingcoder.typepad.com/blog/2013/07/create-a-filled-region-to-use-as-a-mask.html

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

Опубликовано 13.12.2013