The FamilyItemFactory class provides the ability to create form elements in families, such as extrusions, revolutions, sweeps, and blends. See the section on 3D Sketch for more information on these 3D sketch forms.
The following example demonstrates how to create a new Extrusion element. It creates a simple rectangular profile and then moves the newly created Extrusion to a new location.
Code Region: Creating a new Extrusion |
private Extrusion CreateExtrusion(Autodesk.Revit.DB.Document document, SketchPlane sketchPlane) { Extrusion rectExtrusion = null; // make sure we have a family document if (true == document.IsFamilyDocument) { // define the profile for the extrusion CurveArrArray curveArrArray = new CurveArrArray(); CurveArray curveArray1 = new CurveArray(); CurveArray curveArray2 = new CurveArray(); CurveArray curveArray3 = new CurveArray(); // create a rectangular profile XYZ p0 = XYZ.Zero; XYZ p1 = new XYZ(10, 0, 0); XYZ p2 = new XYZ(10, 10, 0); XYZ p3 = new XYZ(0, 10, 0); Line line1 = Line.CreateBound(p0, p1); Line line2 = Line.CreateBound(p1, p2); Line line3 = Line.CreateBound(p2, p3); Line line4 = Line.CreateBound(p3, p0); curveArray1.Append(line1); curveArray1.Append(line2); curveArray1.Append(line3); curveArray1.Append(line4); curveArrArray.Append(curveArray1); // create solid rectangular extrusion rectExtrusion = document.FamilyCreate.NewExtrusion(true, curveArrArray, sketchPlane, 10); if (null != rectExtrusion) { // move extrusion to proper place XYZ transPoint1 = new XYZ(-16, 0, 0); ElementTransformUtils.MoveElement(document, rectExtrusion.Id, transPoint1); } else { throw new Exception("Create new Extrusion failed."); } } else { throw new Exception("Please open a Family document before invoking this command."); } return rectExtrusion; } |
The following sample shows how to create a new Sweep from a solid ovoid profile in a Family Document.
Code Region: Creating a new Sweep |
private Sweep CreateSweep(Autodesk.Revit.DB.Document document, SketchPlane sketchPlane) { Sweep sweep = null; // make sure we have a family document if (true == document.IsFamilyDocument) { // Define a profile for the sweep CurveArrArray arrarr = new CurveArrArray(); CurveArray arr = new CurveArray(); // Create an ovoid profile XYZ pnt1 = new XYZ(0, 0, 0); XYZ pnt2 = new XYZ(2, 0, 0); XYZ pnt3 = new XYZ(1, 1, 0); arr.Append(Arc.Create(pnt2, 1.0d, 0.0d, 180.0d, XYZ.BasisX, XYZ.BasisY)); arr.Append(Arc.Create(pnt1, pnt3, pnt2)); arrarr.Append(arr); SweepProfile profile = document.Application.Create.NewCurveLoopsProfile(arrarr); // Create a path for the sweep XYZ pnt4 = new XYZ(10, 0, 0); XYZ pnt5 = new XYZ(0, 10, 0); Curve curve = Line.CreateBound(pnt4, pnt5); CurveArray curves = new CurveArray(); curves.Append(curve); // create a solid ovoid sweep sweep = document.FamilyCreate.NewSweep(true, curves, sketchPlane, profile, 0, ProfilePlaneLocation.Start); if (null != sweep) { // move to proper place XYZ transPoint1 = new XYZ(11, 0, 0); ElementTransformUtils.MoveElement(document, sweep.Id, transPoint1); } else { throw new Exception("Failed to create a new Sweep."); } } else { throw new Exception("Please open a Family document before invoking this command."); } return sweep; } |
Figure 50: Ovoid sweep created by previous example
The FreeFormElement class allows for the creation of non-parametric geometry created from an input solid outline. A FreeFormElement can participate in joins and void cuts with other combinable elements. Planar faces of the element can be offset interactively and programmatically in the face normal direction.After creating a new form in a family, you may want to change the subcategory for the form. For example, you may have a Door family and want to create multiple subcategories of doors and assign different subcategories to different door types in your family.
The following example shows how to create a new subcategory, assign it a material, and then assign the subcategory to a form.
Code Region: Assigning a subcategory |
public void AssignSubCategory(Document document, GenericForm extrusion) { // create a new subcategory Category cat = document.OwnerFamily.FamilyCategory; Category subCat = document.Settings.Categories.NewSubcategory(cat, "NewSubCat"); // create a new material and assign it to the subcategory ElementId materialId = Material.Create(document, "Wood Material"); subCat.Material = document.GetElement(materialId) as Material; // assign the subcategory to the element extrusion.Subcategory = subCat; } |