diff --git a/Environment_Engine/Modify/SetRegionGeometry.cs b/Environment_Engine/Modify/SetRegionGeometry.cs new file mode 100644 index 000000000..dbb484a16 --- /dev/null +++ b/Environment_Engine/Modify/SetRegionGeometry.cs @@ -0,0 +1,57 @@ +/* + * This file is part of the Buildings and Habitats object Model (BHoM) + * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. + * + * Each contributor holds copyright over their respective contributions. + * The project versioning (Git) records all such contribution source information. + * + * + * The BHoM is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3.0 of the License, or + * (at your option) any later version. + * + * The BHoM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this code. If not, see . + */ + +using System.ComponentModel; +using BH.oM.Base.Attributes; +using System.Collections.Generic; +using System.Linq; +using System; + +using BH.oM.Environment.Elements; + +using BH.Engine.Geometry; +using BH.oM.Geometry; +using BH.Engine.Base; +using BH.oM.Analytical.Elements; + +namespace BH.Engine.Environment +{ + public static partial class Modify + { + [Description("Match closed Polylines to Regions (e.g. Rooms/Spaces) and update geometry. Where a Region Location point exists within a closed Polyline, the Polyline will be set as the Region Perimeter value.")] + [Input("polyline", "A closed polyline representing the new Region Perimeter to be assigned.")] + [Input("region", "Original Regions where Perimeter property is to be updated.")] + [Output("region", "Regions with updated Perimeter geometry.")] + public static List SetRegionGeometry(this List polyline, List region) + { + List returnRegions = new List(); + foreach (IRegion newRegion in region) + { + Point pointinregion = newRegion.Perimeter.PointInRegion(); + Polyline newGeometry = polyline.Where(x => x.IIsContaining(new List() { pointinregion })).FirstOrDefault(); + newRegion.Perimeter = newGeometry; + returnRegions.Add(newRegion); + } + return returnRegions; + } + } +}