public bool Intersect(ISectionFace face)
        {
            var toolBox = this.GetBound();
            var faceBox = face.GetBound();

            return(faceBox.Intersects(toolBox));
        }
        internal static AxisAlignedBox3d GetFilterBox(this ISectionFace face, double filterMargin)
        {
            switch (face.Orientation)
            {
            case Orientation.XPos:
                return(GetFilterBoxXPos(face, filterMargin));

            case Orientation.XNeg:
                return(GetFilterBoxXNeg(face, filterMargin));

            case Orientation.YPos:
                return(GetFilterBoxYPos(face, filterMargin));

            case Orientation.YNeg:
                return(GetFilterBoxYNeg(face, filterMargin));

            case Orientation.ZPos:
                return(GetFilterBoxZPos(face, filterMargin));

            case Orientation.ZNeg:
                return(GetFilterBoxZNeg(face, filterMargin));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        internal static Vector3d GetNormal(this ISectionFace face)
        {
            switch (face.Orientation)
            {
            case Orientation.XPos:
                return(new Vector3d(1.0, 0.0, 0.0));

            case Orientation.XNeg:
                return(new Vector3d(-1.0, 0.0, 0.0));

            case Orientation.YPos:
                return(new Vector3d(0.0, 1.0, 0.0));

            case Orientation.YNeg:
                return(new Vector3d(0.0, -1.0, 0.0));

            case Orientation.ZPos:
                return(new Vector3d(0.0, 0.0, 1.0));

            case Orientation.ZNeg:
                return(new Vector3d(0.0, 0.0, -1.0));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        private static AxisAlignedBox3d GetFilterBoxYNeg(ISectionFace face, double filterMargin)
        {
            var box = face.GetBound();

            box.Min.y -= filterMargin;
            box.Max.y += filterMargin;//0.1;
            box.Max.x -= filterMargin;
            box.Max.z -= filterMargin;

            return(box);
        }
        private static Segment3f[] GetSegments(ISectionFace face)
        {
            var segments = new Segment3f[12];
            var C        = new Vector3f(face.CenterX, face.CenterY, face.CenterZ);
            var X        = (Vector3f)(face.GetU() * face.SizeX / 2.0);
            var Y        = (Vector3f)(face.GetV() * face.SizeY / 2.0);

            segments[0] = new Segment3f(C - X - Y, C + X - Y);
            segments[1] = new Segment3f(C + X - Y, C + X + Y);
            segments[2] = new Segment3f(C + X + Y, C - X + Y);
            segments[3] = new Segment3f(C - X + Y, C - X - Y);

            return(segments);
        }
        internal static double GetDistance(this ISectionFace face, Vector3d pt)
        {
            var    center = new Vector3d(face.CenterX, face.CenterY, face.CenterZ);
            var    D      = pt - center;
            var    N      = face.GetNormal();
            var    U      = face.GetU();
            var    V      = face.GetV();
            var    halfW  = (face.SizeX + 5.0) / 2.0;
            var    halfH  = (face.SizeY + 5.0) / 2.0;
            var    du     = U.Dot(ref D);
            var    dv     = V.Dot(ref D);
            var    uuul   = du <= halfW;
            var    uull   = du >= -halfW;
            var    uvul   = dv <= halfH;
            var    uvll   = dv >= -halfH;
            var    nc     = N.Dot(ref D);
            double result = 0.0f;

            if (uuul && uull && uvll && uvul)
            {
                result = nc;
            }
            else if (uuul && uull)
            {
                var pc = Math.Abs(dv) - halfH;
                result = Math.Sqrt(pc * pc + nc * nc);
            }
            else if (uvll && uvul)
            {
                var pc = Math.Abs(du) - halfW;
                result = Math.Sqrt(pc * pc + nc * nc);
            }
            else
            {
                var cu = Math.Abs(du) - halfW;
                var cv = Math.Abs(dv) - halfH;

                result = Math.Sqrt(nc * nc + cu * cu + cv * cv);
            }

            return(result);
        }
        internal static AxisAlignedBox3d GetBound(this ISectionFace face)
        {
            var c = new Vector3d(face.CenterX, face.CenterY, face.CenterZ);

            switch (face.Orientation)
            {
            case Orientation.XPos:
            case Orientation.XNeg:
                return(new AxisAlignedBox3d(c, 0.0, face.SizeX / 2.0, face.SizeY / 2.0));

            case Orientation.YPos:
            case Orientation.YNeg:
                return(new AxisAlignedBox3d(c, face.SizeX / 2.0, 0.0, face.SizeY / 2.0));

            case Orientation.ZPos:
            case Orientation.ZNeg:
                return(new AxisAlignedBox3d(c, face.SizeX / 2.0, face.SizeY / 2.0, 0.0));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
 internal static void RemoveAction(this ISectionFace face, int index) => (face as SectionFaceViewModel).RemoveAction(index);