2024 Method
Changes 4
M

ItemFactoryBase.NewFamilyInstance

Description:
Inserts a new instance of a family onto a face referenced by the input Reference instance, using a line on that face for its position, and a type/symbol.
Remarks:
Use this method to insert one family instance on a face of another element, using a line on the face to define the position and direction of the new symbol.

The type/symbol that is used must be loaded into the document before this method is called. Families and their symbols can be loaded using the Document.LoadFamily or Document.LoadFamilySymbol methods.

The host object must support insertion of instances, otherwise this method will fail. If the instance fails to be created an exception may be thrown.

Note: if the created family instance includes nested instances, the API framework will automatically regenerate the document during this method call.

public FamilyInstance NewFamilyInstance(
	Reference reference,
	Line position,
	FamilySymbol symbol
)
Return Value nullNothingnullptr An instance of the new object if creation was successful, otherwise null Nothing nullptr a null reference ( Nothing in Visual Basic) .
public void PlaceStiffenerOnWallFaceRef(Autodesk.Revit.DB.Document doc)
{
    FilteredElementCollector wallCollector = new FilteredElementCollector(doc);
    wallCollector.OfClass(typeof(Wall));
    Wall wall = wallCollector.FirstElement() as Wall;

    // The structural stiffeners family type is compatible with line-based face placement
    FilteredElementCollector fsCollector = new FilteredElementCollector(doc);
    fsCollector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralStiffener);
    FamilySymbol stiffenerSymbol = fsCollector.FirstElement() as FamilySymbol;

    // Get side face of wall
    IList<Reference> sideFaces = HostObjectUtils.GetSideFaces(wall, ShellLayerType.Exterior);
    Reference sideFaceRef = sideFaces[0];

    // Generate line for path
    Face face = wall.GetGeometryObjectFromReference(sideFaceRef) as Face;
    BoundingBoxUV bbox = face.GetBoundingBox();
    UV lowerLeft = bbox.Min;
    UV upperRight = bbox.Max;
    double deltaU = upperRight.U - lowerLeft.U;
    double deltaV = upperRight.V - lowerLeft.V;
    double vOffset = deltaV * 0.60; // 60% up the wall face

    UV firstPoint = lowerLeft + new UV(deltaU * 0.20, vOffset);
    UV lastPoint = lowerLeft + new UV(deltaU * 0.80, vOffset);

    Line line = Line.CreateBound(face.Evaluate(firstPoint), face.Evaluate(lastPoint));

    doc.Create.NewFamilyInstance(sideFaceRef, line, stiffenerSymbol);
}