public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
UIApplication app = commandData.Application;
UIDocument uidoc = app.ActiveUIDocument;
Document doc = uidoc.Document;
List<Element> floors = new List<Element>();
if( !Util.GetSelectedElementsOrAll(
floors, uidoc, typeof( Floor ) ) )
{
Selection sel = uidoc.Selection;
message = ( 0 < sel.GetElementIds().Count )
? "Please select some floor elements."
: "No floor elements found.";
return Result.Failed;
}
Options opt = app.Application.Create.NewGeometryOptions();
List<List<XYZ>> polygons
= CmdSlabBoundary.GetFloorBoundaryPolygons(
floors, opt );
List<List<UV>> flat_polygons
= Flatten( polygons );
int i = 0, n = flat_polygons.Count;
double[] areas = new double[n];
double a, maxArea = 0.0;
foreach( List<UV> polygon in flat_polygons )
{
a = GetSignedPolygonArea( polygon );
if( Math.Abs( maxArea ) < Math.Abs( a ) )
{
maxArea = a;
}
areas[i++] = a;
}
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 floor slab"
: "" ) );
}
using ( Transaction t = new Transaction( doc ) )
{
t.Start( "Draw Polygons" );
Creator creator = new Creator( doc );
creator.DrawPolygons( polygons );
t.Commit();
}
return Result.Succeeded;
}