In a comment to “Calculating the glass in a door“, the question was posed:
“Let’s say I have a 7′ tall, full glass door. How complicated would it be to add constraints, or limits, to the area in which you want to calculate? Say I want to calculate the total are of glass between 2′ and 6′ (assuming the total glass area was greater than that).”
The place to start answering this question is with API code to create a void that eliminates the glass in the door below 2′. The image below was created with “Double-Glass 1.rfa”.

public void CreateExtrusionAndCutGlass()
{
Document doc = this.ActiveUIDocument.Document;
Autodesk.Revit.ApplicationServices.Application app = doc.Application;
// Height of the void extrusion
double height = 2;
// Four points to define corners of the rectangle to extrude
XYZ pnt1 = new XYZ(-10, -10, 0);
XYZ pnt2 = new XYZ(10, -10, 0);
XYZ pnt3 = new XYZ(10, 10, 0);
XYZ pnt4 = new XYZ(-10, 10, 0);
// Create the four lines of the rectangle
// These are internal "Line" elements, not model lines or detail lines
Line line1 = app.Create.NewLine(pnt1, pnt2, true);
Line line2 = app.Create.NewLine(pnt2, pnt3, true);
Line line3 = app.Create.NewLine(pnt3, pnt4, true);
Line line4 = app.Create.NewLine(pnt4, pnt1, true);
// Put these lines into a CurveArray
CurveArray curveArray = new CurveArray();
curveArray.Append(line1);
curveArray.Append(line2);
curveArray.Append(line3);
curveArray.Append(line4);
// Put this array into a CureArrArray (an array of CurveArrays)
// Extrusion creation uses a CureArrArray so you can extrusion multiple loops
CurveArrArray curveArrayArray = new CurveArrArray();
curveArrayArray.Append(curveArray);
// Create a plane at the origin with a normal in the up direction
XYZ planeNormal = XYZ.BasisZ;
XYZ planeOrigin = XYZ.Zero;
Plane plane = app.Create.NewPlane(planeNormal, planeOrigin);
Extrusion extrusion = null;
using (Transaction t = new Transaction(doc, "Create Extrusion"))
{
t.Start();
// Create a sketch plane to be used for the extrusion
SketchPlane sketchPlane = doc.FamilyCreate.NewSketchPlane(plane);
// Create the extrusion. The "false" specifies that it will be a void
extrusion = doc.FamilyCreate.NewExtrusion(false, curveArrayArray, sketchPlane, height);
t.Commit();
}
// Cut the other 3D elements with the new void using CombineElements and a CombinableElementArray
CombinableElementArray ceArray = new CombinableElementArray();
// Add the new void extrusion to the CombinableElementArray
ceArray.Append(extrusion);
// Add all GenericForm elements with the Glass subcategory to a CombinableElementArray
foreach (GenericForm genericForm in new FilteredElementCollector(doc).OfClass(typeof(GenericForm)).Cast<GenericForm>())
{
Category category = genericForm.Subcategory;
if (category != null && category.Name == "Glass")
{
ceArray.Append(genericForm);
}
}
using (Transaction t = new Transaction(doc, "Combine Elements"))
{
t.Start();
// Combine the elements so that the void will cut the solids
GeomCombination geomCombination = doc.CombineElements(ceArray);
t.Commit();
}
}
Like this:
Like Loading...