Exemplo n.º 1
0
        // implement execute method
        public override int Execute(params string[] parameters)
        {
            // current document
            Document doc = Application.ActiveDocument;
            // model items collection-1
            ModelItemCollection itemCollection = new ModelItemCollection();
            // get current selected items
            ModelItemCollection selectionItems = doc.CurrentSelection.SelectedItems;
            // get appended models
            DocumentModels models = doc.Models;

            // display message
            //string message = "";

            // each model
            foreach (Model model in models)
            {
                // collect all items from the mode1
                // add to model item collection-1
                itemCollection.AddRange(ItemsFromRoot(model));
            }

            // model item collection-2
            ModelItemCollection itemsToColor = new ModelItemCollection();

            // each item from model item collection-1
            foreach (ModelItem item1 in itemCollection)
            {
                // get item1 bounding box
                BoundingBox3D box1 = item1.BoundingBox(true);

                // each item from the current selected items
                foreach (ModelItem item2 in selectionItems)
                {
                    // get item2 bounding box
                    BoundingBox3D box2 = item2.BoundingBox(true);
                    // check intersection of box1 vs box2
                    if (box1.Intersects(box2))
                    {
                        //message += item1.DisplayName + "Intersects " + item2.DisplayName + "\n";
                        // item add to model item collection-2
                        itemsToColor.Add(item1);
                    }
                }
            }
            // change the color of model item collection-2 items
            doc.Models.OverridePermanentColor(itemsToColor, Color.Green);
            //wf.MessageBox.Show(message);
            return(0);
        }
        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);
        }