Set adaptive component parameters with placement point coordinates

A reader asked how to compute and schedule the placement point coordinates of adaptive component families. Here is a sample using the Parameter API and Dynamic Model Update to get and set those values.

private void Module_Startup(object sender, EventArgs e)
    AdaptivePointParamUpdater updater = new AdaptivePointParamUpdater(this.Application.ActiveAddInId);

    UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), new ElementClassFilter(typeof(FamilyInstance)), Element.GetChangeTypeElementAddition());
    UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), new ElementClassFilter(typeof(FamilyInstance)), Element.GetChangeTypeGeometry());

public class AdaptivePointParamUpdater : IUpdater
    static AddInId m_appId;
    static UpdaterId m_updaterId;
    public AdaptivePointParamUpdater(AddInId id)
        m_appId = id;
        m_updaterId = new UpdaterId(m_appId, new Guid("1BF1F6A2-4C06-42d4-97C1-D1B4EB593EFF"));
    public void Execute(UpdaterData data)
        Document doc = data.GetDocument();
        Autodesk.Revit.ApplicationServices.Application app = doc.Application;
        foreach (ElementId id in data.GetAddedElementIds())
            adaptivePointParams(data.GetDocument(), id);
        foreach (ElementId id in data.GetModifiedElementIds())
            adaptivePointParams(data.GetDocument(), id);
    public string GetAdditionalInformation(){return "Data about adaptive parameters";}
    public ChangePriority GetChangePriority(){return ChangePriority.FloorsRoofsStructuralWalls;}
     public UpdaterId GetUpdaterId(){return m_updaterId;}
    public string GetUpdaterName(){return "AdaptivePoints";}

    private void adaptivePointParams(Document doc, ElementId id)
        FamilyInstance fi = doc.GetElement(id) as FamilyInstance;
        if (fi != null && AdaptiveComponentInstanceUtils.IsAdaptiveComponentInstance(fi))
            int ctr = 1;
            foreach (ElementId elementId in AdaptiveComponentInstanceUtils.GetInstancePlacementPointElementRefIds(fi))
                ReferencePoint rp = doc.GetElement(elementId) as ReferencePoint;
                XYZ position = rp.Position;
                if (ctr == 1)
                else if (ctr == 2)

10 thoughts on “Set adaptive component parameters with placement point coordinates

  1. hi i am looking at this code, and hoping to somehow make a shared parameter i can export to excel and update the co-ordinates then re-import the excel file.

    i wish to move a family (generic model) to a specific co-ordinate.

    is this possible?

  2. could you please share me the family For XYZ and also the way you have created you schedule i have successful loded the script but i want to check how it work because i tried by my side but no result so please share with me thanks

    • Have you created these 6 parameters in for the Adaptive Components?
      fi.get_Parameter(“point1x”).Set(Math.Round(position.X,3)); fi.get_Parameter(“point1y”).Set(Math.Round(position.Y,3)); fi.get_Parameter(“point1z”).Set(Math.Round(position.Z,3));
      fi.get_Parameter(“point2y”).Set(Math.Round(position.Y,3)); fi.get_Parameter(“point2z”).Set(Math.Round(position.Z,3));

    • You need to create those 3 point1 and 3 point2 parameters in your RVT. If those parameters don’t exist then the get_Parameter will return null and the Set will fail

    • This post is more than a year old and I don’t have that RVT any more. It should be fairly straightforward for you to create it based on the code that I provided.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s