Создание цветовой области, похожей на область маскировки
Вопрос: Как можно программно создать область маскировки?
Ответ: К сожалению, в текущей версии API этого сделать нельзя.
Но есть и хорошая новость. В Revit 2013 API добавилась возможность создавать цветовую область.
Класс FilledRegion был расширен и теперь есть возможность создать новую цветовую область, получить ее границы и задать заливку.
Тем не менее, явного способа создать область маскировки не существует. Единственное, что мы можем сделать похожее, так это создать цветовую область с помощью статического метода FillRegion.Create. Но нужно учитывать, что цветовая область - это не совсем то же самое, что и область маскировки. Цветовая область имеет заливку, которая может быть изменена. Область маскировки статическая и поменять ее тип нельзя. Но если задать цветовой области сплошную заливку, то она будет выглядеть как область маскировки.
Ниже представлен пример команды для создания цветовой области со сплошной заливкой:
- [Transaction(TransactionMode.Manual)]
- public class Command : IExternalCommand
- {
- public Result Execute(
- ExternalCommandData commandData,
- ref string message,
- ElementSet elements)
- {
- UIApplication uiapp = commandData.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Application app = uiapp.Application;
- Document doc = uidoc.Document;
- Selection sel = uidoc.Selection;
- List<XYZ> pointsForBoundaries = new List<XYZ>();
- bool cancel = false;
- while (!cancel)
- {
- try
- {
- var point = sel.PickPoint
- (string.Format("Выберите не менее 3-х точек. Выбрано {0} точек. Нажмите ESC для завершения", pointsForBoundaries.Count));
- pointsForBoundaries.Add(point);
- }
- catch (Exception)
- {
- if (pointsForBoundaries.Count<3)
- return Result.Cancelled;
- cancel = true;
- }
- }
- // для того чтобы создать закрытую область, последнюю точку совместим с первой
- pointsForBoundaries.Add(pointsForBoundaries[0]);
- CurveLoop curveLoop = new CurveLoop();
- for (int i = 0; i < pointsForBoundaries.Count-1; i++)
- {
- Line line = Line.CreateBound(pointsForBoundaries[i], pointsForBoundaries[i + 1]);
- curveLoop.Append(line);
- }
- //Ищем сплошную заливку
- FilteredElementCollector fillPatternElementCollector =
- new FilteredElementCollector(doc);
- var fillPatternIds =
- fillPatternElementCollector
- .OfClass(typeof (FillPatternElement))
- .Cast<FillPatternElement>()
- .Where(fpe => fpe.GetFillPattern().IsSolidFill)
- .Select(fpe=>fpe.Id);
- // можно сделать проверку, есть ли сплшная заливка и создать ее при необходимости
- // ищем тип цветовой области со сплошной заливкой
- FilteredElementCollector collector = new FilteredElementCollector(doc);
- var fillRegionTypeWithSolidPattern =
- collector
- .OfClass(typeof (FilledRegionType))
- .Cast<FilledRegionType>()
- .FirstOrDefault(frt => fillPatternIds.Contains(frt.FillPatternId));
- // так же можно сделать доп. проверку что есть тип со сплошной заливкой
- List<CurveLoop> profileloops
- = new List<CurveLoop>();
- profileloops.Add(curveLoop);
- using (var t = new Transaction(doc, "Создание цветовой области"))
- {
- t.Start();
- var filledRegion = FilledRegion.Create(doc,
- fillRegionTypeWithSolidPattern.Id,
- uidoc.ActiveView.Id,
- profileloops);
- t.Commit();
- }
- return Result.Succeeded;
- }
- }
Источник: 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