public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
UIApplication app = commandData.Application;
UIDocument uidoc = app.ActiveUIDocument;
Document doc = uidoc.Document;
List <Element> walls = new List <Element>();
if (!Util.GetSelectedElementsOrAll(
walls, uidoc, typeof(Wall)))
{
Selection sel = uidoc.Selection;
message = (0 < sel.GetElementIds().Count)
? "Please select some wall elements."
: "No wall elements found.";
return(Result.Failed);
}
Options opt = app.Application.Create.NewGeometryOptions();
List <List <XYZ> > polygons
= CmdWallProfile.GetWallProfilePolygons(
walls, opt);
int i = 0, n = polygons.Count;
double[] areas = new double[n];
double d, a, maxArea = 0.0;
XYZ normal;
foreach (List <XYZ> polygon in polygons)
{
GetPolygonPlane(polygon,
out normal, out d, out a);
if (Math.Abs(maxArea) < Math.Abs(a))
{
maxArea = a;
}
areas[i++] = a;
#if DEBUG
// transform the 3D polygon into a horizontal plane
// so we can use the 2D GetSignedPolygonArea() and
// compare its results with the 3D calculation.
// todo: compare the relative speed of
// transforming 3d to 2d and using 2d area
// calculation versus direct 3d area calculation.
Transform t = GetTransformToZ(normal);
List <XYZ> polygonHorizontal
= ApplyTransform(polygon, t);
List <UV> polygon2d
= CmdSlabBoundaryArea.Flatten(
polygonHorizontal);
double a2
= CmdSlabBoundaryArea.GetSignedPolygonArea(
polygon2d);
Debug.Assert(Util.IsEqual(a, a2),
"expected same area from 2D and 3D calculations");
#endif
}
Debug.Print(
"{0} boundary loop{1} found.",
n, Util.PluralSuffix(n));
for (i = 0; i < n; ++i)
{
Debug.Print(
" Loop {0} area is {1} square feet{2}",
i,
Util.RealString(areas[i]),
(areas[i].Equals(maxArea)
? ", outer loop of largest wall"
: ""));
}
Creator creator = new Creator(doc);
using (Transaction tx = new Transaction(doc))
{
tx.Start("Draw wall profile loops");
creator.DrawPolygons(polygons);
tx.Commit();
}
return(Result.Succeeded);
}