Exemplo n.º 1
0
        public static BuildingElement MergeBuildingElement(this BuildingElement element1, BuildingElement element2)
        {
            BuildingElement rtnElement = null;

            if (element1.Area() > element2.Area())
            {
                rtnElement = element2.Copy();
            }
            else
            {
                rtnElement = element1.Copy();
            }

            rtnElement.ExtendedProperties.Remove(rtnElement.ContextProperties());

            //Move any properties over which need to be merged between the two elements... Currently only adjacent spaces
            BuildingElementContextProperties masterProperties = new BuildingElementContextProperties();

            BuildingElementContextProperties mergeToProps = (element1.ContextProperties() as BuildingElementContextProperties);

            if (mergeToProps != null)
            {
                masterProperties.Colour          = mergeToProps.Colour;
                masterProperties.ConnectedSpaces = new List <string>(mergeToProps.ConnectedSpaces);
                masterProperties.IsAir           = mergeToProps.IsAir;
                masterProperties.IsGround        = mergeToProps.IsGround;
                masterProperties.Reversed        = mergeToProps.Reversed;
            }

            BuildingElementContextProperties mergeProps = (element2.ContextProperties() as BuildingElementContextProperties);

            if (mergeProps == null)
            {
                mergeProps = new BuildingElementContextProperties(); //Hopefully this will never be needed...
            }
            if (mergeProps.ConnectedSpaces.Count > 0)
            {
                if (masterProperties.ConnectedSpaces.Count == 1)
                {
                    masterProperties.ConnectedSpaces.Add(mergeProps.ConnectedSpaces.Where(x => x != "-1").FirstOrDefault());
                }
                else
                {
                    masterProperties.ConnectedSpaces[masterProperties.ConnectedSpaces.IndexOf("-1")] = mergeProps.ConnectedSpaces.Where(x => x != "-1").FirstOrDefault();
                }
            }

            rtnElement.ExtendedProperties.Add(masterProperties);
            return(rtnElement);
        }
Exemplo n.º 2
0
        public static List <BuildingElement> Split(this BuildingElement elementToSplit, List <Line> cuttingLines)
        {
            if (elementToSplit == null || cuttingLines.Count == 0)
            {
                return new List <BuildingElement> {
                           elementToSplit
                }
            }
            ;

            List <BuildingElement> splitElements = new List <BuildingElement> {
                elementToSplit
            };

            foreach (Line l in cuttingLines)
            {
                List <BuildingElement> elementsToSplit = new List <BuildingElement>(splitElements);

                foreach (BuildingElement be in elementsToSplit)
                {
                    Polyline        elementToSplitCrv = be.PanelCurve.ICollapseToPolyline(BH.oM.Geometry.Tolerance.Angle);
                    List <Point>    cuttingPnts       = elementToSplitCrv.LineIntersections(l, true);
                    List <Polyline> cutLines          = elementToSplitCrv.SplitAtPoints(cuttingPnts);
                    if (cutLines.Count == 1)
                    {
                        continue;
                    }

                    splitElements.Remove(be);
                    foreach (Polyline pLine in cutLines)
                    {
                        if (!pLine.IsLinear())
                        {
                            //Only do this for non-straight line cuts
                            List <Point> ctrlPts = pLine.IControlPoints();
                            ctrlPts.Add(ctrlPts[0]); //Close the polyline
                            Polyline completeCrv = BH.Engine.Geometry.Create.Polyline(ctrlPts);

                            BuildingElement cpy = elementToSplit.Copy();
                            cpy.PanelCurve = completeCrv;
                            cpy.CustomData = new Dictionary <string, object>(elementToSplit.CustomData);
                            splitElements.Add(cpy);
                        }
                    }
                }
            }

            return(splitElements);
        }