private double getIntersectsVolume(ModelItem[] mic, ObjectItem[] Micp, ModelItemCollection SItems, uint date, uint[] Start, uint[] End, int[] t)
        {
            int y = 0, i = 0, j = 0; int[] i1 = new int[mic.Length]; int[] i2 = new int[mic.Length];

            ModelItemCollection mc1 = new ModelItemCollection();
            ModelItemCollection mc2 = new ModelItemCollection();

            while (y < mic.Length && Start[t[y]] <= date)
            {
                if (End[t[y]] > date)
                {
                    mc2.Add(mic[t[y]]);
                    i2[j] = t[y]; j++;
                }

                else
                {
                    mc1.Add(mic[t[y]]);
                    i1[i] = t[y]; i++;
                }

                y++;
            }

            Array.Resize(ref i2, j); Array.Resize(ref i1, i);

            double v = 0;

            if (mc2.Count > 0)
            {
                v = v + getBiSectVolume(date, SItems, mc2, Micp, Start, i1, i2, j, false);

                if (mc1.Count > 0)
                {
                    v = v + getBiSectVolume(date, mc1, mc2, Micp, Start, i1, i2, j, true);
                }

                for (int k = 0; k < mc2.Count; k++)
                {
                    Autodesk.Navisworks.Api.Point3D bn1 = mc2[k].BoundingBox().Min;
                    Autodesk.Navisworks.Api.Point3D bx1 = mc2[k].BoundingBox().Max;

                    Autodesk.Navisworks.Api.Point3D Max =
                        new Autodesk.Navisworks.Api.Point3D((bx1.X * 0.3048), (bx1.Y * 0.3048), (bx1.Z * 0.3048));

                    Autodesk.Navisworks.Api.Point3D Min =
                        new Autodesk.Navisworks.Api.Point3D((bn1.X * 0.3048), (bn1.Y * 0.3048), (bn1.Z * 0.3048));

                    BoundingBox3D bb1 = new BoundingBox3D(Min, Max);

                    double mw = (date - Start[i2[k]]) * Micp[i2[k]].Rate;

                    if (Micp[i2[k]].Direction == ObjectItem.direction.Right)
                    {
                        Min = new Autodesk.Navisworks.Api.Point3D(Min.X + mw, Min.Y, Min.Z).Subtract(Micp[i2[k]].Protrusion.Min.ToVector3D());
                        Max = new Autodesk.Navisworks.Api.Point3D(Min.X + mw + Micp[i2[k]].Rate, Max.Y, Max.Z).Add(Micp[i2[k]].Protrusion.Max.ToVector3D());
                    }

                    else if (Micp[i2[k]].Direction == ObjectItem.direction.Left)
                    {
                        Min = new Autodesk.Navisworks.Api.Point3D(Max.X - (mw + Micp[i2[k]].Rate), Min.Y, Min.Z).Subtract(Micp[i2[k]].Protrusion.Min.ToVector3D());
                        Max = new Autodesk.Navisworks.Api.Point3D(Max.X - mw, Max.Y, Max.Z).Add(Micp[i2[k]].Protrusion.Max.ToVector3D());
                    }

                    else if (Micp[i2[k]].Direction == ObjectItem.direction.Up)
                    {
                        Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Min.Y + mw, Min.Z).Subtract(Micp[i2[k]].Protrusion.Min.ToVector3D());
                        Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Min.Y + mw + Micp[i2[k]].Rate, Max.Z).Add(Micp[i2[k]].Protrusion.Max.ToVector3D());
                    }

                    else if (Micp[i2[k]].Direction == ObjectItem.direction.Down)
                    {
                        Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Max.Y - (mw + Micp[i2[k]].Rate), Min.Z).Subtract(Micp[i2[k]].Protrusion.Min.ToVector3D());
                        Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Max.Y - mw, Max.Z).Add(Micp[i2[k]].Protrusion.Max.ToVector3D());
                    }

                    else if (Micp[i2[k]].Direction == ObjectItem.direction.Front)
                    {
                        Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Min.Y, Min.Z + mw).Subtract(Micp[i2[k]].Protrusion.Min.ToVector3D());
                        Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Max.Y, Min.Z + mw + Micp[i2[k]].Rate).Add(Micp[i2[k]].Protrusion.Max.ToVector3D());
                    }

                    else
                    {
                        Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Min.Y, Max.Z - (mw + Micp[i2[k]].Rate)).Subtract(Micp[i2[k]].Protrusion.Min.ToVector3D());
                        Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Max.Y, Max.Z - mw).Add(Micp[i2[k]].Protrusion.Max.ToVector3D());
                    }

                    BoundingBox3D BBP = new BoundingBox3D(Min, Max);

                    for (i = k + 1; i < mc2.Count; i++)
                    {
                        bn1 = mc2[i].BoundingBox().Min;
                        bx1 = mc2[i].BoundingBox().Max;

                        Max =
                            new Autodesk.Navisworks.Api.Point3D((bx1.X * 0.3048), (bx1.Y * 0.3048), (bx1.Z * 0.3048));

                        Min =
                            new Autodesk.Navisworks.Api.Point3D((bn1.X * 0.3048), (bn1.Y * 0.3048), (bn1.Z * 0.3048));

                        BoundingBox3D bb2 = new BoundingBox3D(Min, Max);

                        mw = (date - Start[i2[i]]) * Micp[i2[i]].Rate;

                        if (Micp[i2[i]].Direction == ObjectItem.direction.Right)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X + mw, Min.Y, Min.Z).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Min.X + mw + Micp[i2[i]].Rate, Max.Y, Max.Z).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else if (Micp[i2[i]].Direction == ObjectItem.direction.Left)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Max.X - (mw + Micp[i2[i]].Rate), Min.Y, Min.Z).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X - mw, Max.Y, Max.Z).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else if (Micp[i2[i]].Direction == ObjectItem.direction.Up)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Min.Y + mw, Min.Z).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Min.Y + mw + Micp[i2[i]].Rate, Max.Z).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else if (Micp[i2[i]].Direction == ObjectItem.direction.Down)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Max.Y - (mw + Micp[i2[i]].Rate), Min.Z).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Max.Y - mw, Max.Z).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else if (Micp[i2[i]].Direction == ObjectItem.direction.Front)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Min.Y, Min.Z + mw).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Max.Y, Min.Z + mw + Micp[i2[i]].Rate).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Min.Y, Max.Z - (mw + Micp[i2[i]].Rate)).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Max.Y, Max.Z - mw).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        BoundingBox3D BBP1 = new BoundingBox3D(Min, Max);

                        v = v + BBP.Intersect(bb2).Volume + BBP1.Intersect(bb1).Volume + BBP.Intersect(BBP1).Volume
                            - BBP.Intersect(bb2).Intersect(BBP1).Volume - BBP1.Intersect(bb1).Intersect(BBP).Volume;
                    }
                }
            }

            return(v);
        }
        private double getBiSectVolume(uint date, ModelItemCollection mc1, ModelItemCollection mc2, ObjectItem[] Micp, uint[] Start, int[] i1, int[] i2, int j, bool isD)
        {
            double v = 0;

            double mx = mc1[0].BoundingBox().Min.X * 0.3048; double my = mc1[0].BoundingBox().Min.Y * 0.3048; double mz = mc1[0].BoundingBox().Min.Z * 0.3048;
            double px = mc1[0].BoundingBox().Max.X * 0.3048; double py = mc1[0].BoundingBox().Max.Y * 0.3048; double pz = mc1[0].BoundingBox().Max.Z * 0.3048;

            Autodesk.Navisworks.Api.Point3D bn1;
            Autodesk.Navisworks.Api.Point3D bx1;

            for (int k = 0; k < mc1.Count; k++)
            {
                bn1 = mc1[k].BoundingBox().Min;
                bx1 = mc1[k].BoundingBox().Max;

                Autodesk.Navisworks.Api.Point3D Max =
                    new Autodesk.Navisworks.Api.Point3D((bx1.X * 0.3048), (bx1.Y * 0.3048), (bx1.Z * 0.3048));

                Autodesk.Navisworks.Api.Point3D Min =
                    new Autodesk.Navisworks.Api.Point3D((bn1.X * 0.3048), (bn1.Y * 0.3048), (bn1.Z * 0.3048));

                if (isD)
                {
                    Max = Max.Add(Micp[i1[k]].Protrusion.Max.ToVector3D());
                    Min = Min.Subtract(Micp[i1[k]].Protrusion.Min.ToVector3D());
                }

                mx = Math.Min(mx, Min.X);
                my = Math.Min(my, Min.Y);
                mz = Math.Min(mz, Min.Z);
                px = Math.Max(px, Max.X);
                py = Math.Max(py, Max.Y);
                pz = Math.Max(pz, Max.Z);
            }

            bn1 = new Autodesk.Navisworks.Api.Point3D(mx, my, mz);
            bx1 = new Autodesk.Navisworks.Api.Point3D(px, py, pz);

            BoundingBox3D bb1 = new BoundingBox3D(bn1, bx1);

            mx = mc2[0].BoundingBox().Min.X * 0.3048; my = mc2[0].BoundingBox().Min.Y * 0.3048; mz = mc2[0].BoundingBox().Min.Z * 0.3048;
            px = mc2[0].BoundingBox().Max.X * 0.3048; py = mc2[0].BoundingBox().Max.Y * 0.3048; pz = mc2[0].BoundingBox().Max.Z * 0.3048;

            for (int k = 0; k < mc2.Count; k++)
            {
                bn1 = mc2[k].BoundingBox().Min;
                bx1 = mc2[k].BoundingBox().Max;

                Autodesk.Navisworks.Api.Point3D Max =
                    new Autodesk.Navisworks.Api.Point3D((bx1.X * 0.3048), (bx1.Y * 0.3048), (bx1.Z * 0.3048)).Add(Micp[i2[k]].Protrusion.Max.ToVector3D());

                Autodesk.Navisworks.Api.Point3D Min =
                    new Autodesk.Navisworks.Api.Point3D((bn1.X * 0.3048), (bn1.Y * 0.3048), (bn1.Z * 0.3048)).Subtract(Micp[i2[k]].Protrusion.Min.ToVector3D());

                mx = Math.Min(mx, Min.X);
                my = Math.Min(my, Min.Y);
                mz = Math.Min(mz, Min.Z);
                px = Math.Max(px, Max.X);
                py = Math.Max(py, Max.Y);
                pz = Math.Max(pz, Max.Z);
            }

            bn1 = new Autodesk.Navisworks.Api.Point3D(mx, my, mz);
            bx1 = new Autodesk.Navisworks.Api.Point3D(px, py, pz);

            BoundingBox3D bb2 = new BoundingBox3D(bn1, bx1);

            if (bb1.Intersects(bb2))
            {
                BoundingBox3D intrsct = bb1.Intersect(bb2);

                List <BoundingBox3D> im = new List <BoundingBox3D>(mc1.Count);
                int i;
                for (i = 0; i < mc1.Count; i++)
                {
                    bn1 = mc1[i].BoundingBox().Min;
                    bx1 = mc1[i].BoundingBox().Max;

                    Autodesk.Navisworks.Api.Point3D Max =
                        new Autodesk.Navisworks.Api.Point3D((bx1.X * 0.3048), (bx1.Y * 0.3048), (bx1.Z * 0.3048));

                    Autodesk.Navisworks.Api.Point3D Min =
                        new Autodesk.Navisworks.Api.Point3D((bn1.X * 0.3048), (bn1.Y * 0.3048), (bn1.Z * 0.3048));

                    BoundingBox3D BBP = new BoundingBox3D(Min, Max);

                    if (BBP.Intersects(intrsct))
                    {
                        im.Add(BBP.Intersect(intrsct));
                    }
                }

                List <BoundingBox3D> wk = new List <BoundingBox3D>(mc2.Count);

                for (i = 0; i < mc2.Count; i++)
                {
                    bn1 = mc2[i].BoundingBox().Min;
                    bx1 = mc2[i].BoundingBox().Max;

                    Autodesk.Navisworks.Api.Point3D Max =
                        new Autodesk.Navisworks.Api.Point3D((bx1.X * 0.3048), (bx1.Y * 0.3048), (bx1.Z * 0.3048));

                    Autodesk.Navisworks.Api.Point3D Min =
                        new Autodesk.Navisworks.Api.Point3D((bn1.X * 0.3048), (bn1.Y * 0.3048), (bn1.Z * 0.3048));

                    BoundingBox3D BBP = new BoundingBox3D(Min.Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D()), Max.Add(Micp[i2[i]].Protrusion.Max.ToVector3D()));

                    if (BBP.Intersects(intrsct))
                    {
                        double mw = (date - Start[i2[i]]) * Micp[i2[i]].Rate;

                        if (Micp[i2[i]].Direction == ObjectItem.direction.Right)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X + mw, Min.Y, Min.Z).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Min.X + mw + Micp[i2[i]].Rate, Max.Y, Max.Z).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else if (Micp[i2[i]].Direction == ObjectItem.direction.Left)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Max.X - (mw + Micp[i2[i]].Rate), Min.Y, Min.Z).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X - mw, Max.Y, Max.Z).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else if (Micp[i2[i]].Direction == ObjectItem.direction.Up)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Min.Y + mw, Min.Z).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Min.Y + mw + Micp[i2[i]].Rate, Max.Z).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else if (Micp[i2[i]].Direction == ObjectItem.direction.Down)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Max.Y - (mw + Micp[i2[i]].Rate), Min.Z).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Max.Y - mw, Max.Z).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else if (Micp[i2[i]].Direction == ObjectItem.direction.Front)
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Min.Y, Min.Z + mw).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Max.Y, Min.Z + mw + Micp[i2[i]].Rate).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        else
                        {
                            Min = new Autodesk.Navisworks.Api.Point3D(Min.X, Min.Y, Max.Z - (mw + Micp[i2[i]].Rate)).Subtract(Micp[i2[i]].Protrusion.Min.ToVector3D());
                            Max = new Autodesk.Navisworks.Api.Point3D(Max.X, Max.Y, Max.Z - mw).Add(Micp[i2[i]].Protrusion.Max.ToVector3D());
                        }

                        BBP = new BoundingBox3D(Min, Max); wk.Add(BBP.Intersect(intrsct));
                    }
                }

                for (i = 0; i < im.Count; i++)
                {
                    for (int n = 0; n < wk.Count; n++)
                    {
                        v = v + wk[n].Intersect(im[i]).Volume;
                    }
                }
            }

            return(v);
        }