// 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); }