Adaptive Reference points

I intend to change the location of an adaptive reference points.
How can we access reference points from selected adaptive family?


I tried using this node but it only retrieves the current geometry points, not the reference points.

Thank you

The reference points in the project are not elements, but parts of the element you have selected. Remember there is no way to make a reference point in the base level of an .rvt - only in an in-place family or rfa.

Sadly there are no out of the box nodes for this - I am not sure of any in packages, but this Python should work:

########################################
############## Properties ##############
########################################
__author__ = 'Jacob Small'
__version__ = '0.1.0'
__description__ = ""
__RevitBuilds__ = "2025.1"
__DynamoBuilds__ = "3.3"
__ReleaseNotes__ = "POC only - test thuroughly before implementing in productions."
__Dependancies__ = "None"
__Copyright__ = "2025, Autodesk Inc"
__License__ = "Apache 2"


########################################
### Configure the Python environment ###
########################################
### standard imports ###
import sys #add the sys class to the Python environment so we can work with the sys objects
import clr #add the CLR (common language runtime) class to the Python environment so we can work with .net libraries

### Dynamo Revit imports ###
clr.AddReference("RevitNodes") #add Dynamo's Revit nodes library to the clr
import Revit #import Dynamo's Revit node class
clr.ImportExtensions(Revit.Elements) #add the element conversion methods to the CLR
clr.ImportExtensions(Revit.GeometryConversion) #add the geometry conversion methods to the CLR
clr.AddReference("RevitServices") #add the Revit services library to the CLR
import RevitServices #import the Revit services class to the Python environment
from RevitServices.Persistence import DocumentManager #import the document manager class to the Python environment 
from RevitServices.Transactions import TransactionManager #import the transaction manager class to the Python environment 

### Revit API imports ###
clr.AddReference("RevitAPI") #add the Revit API to the CLR
import Autodesk #add the Autodesk class to the Python environment 
from Autodesk.Revit.DB import * #import every class of the Revit API to the Python environment


#########################################
###### Global variables and inputs ######
#########################################
### documents and standard variables ###
doc = DocumentManager.Instance.CurrentDBDocument #the current Revit document
### imports and unwrapping ###
elems = UnwrapElement(IN[0]) #import the adapativecomponent elements from IN[0] of the Dynamo environment and convert to native Revit elements
if not elems.__class__ == [].__class__ : list: sys.exit("\r\rThe adaptive components input must be a list of adaptive component instances.\r\r") #ensure that elems is a list, not an individual object, so that we can always prepare for a loop
pntsLists = IN[1] #import the point Lists from the Dynamo environment 
if not pntsLists.__class__ == list: list: sys.exit("\r\rThe location input must be a list of lists of points.\r\r")
if not pntsLists[0].__class__ == list: sys.exit("\r\rThe location input must be a list of lists of points.\r\r") #handle the use case where only a single list is provided


#########################################
############ Code goes here #############
#########################################
success = [] #list to contain the successfully relocated instances
errors = [] #list to contain any instances which did not have correct point counts - expand to account for other errors as needed
TransactionManager.Instance.EnsureInTransaction(doc) #start transaction
for elem, points in zip(elems,pntsLists): #for each element and point list 
    pntElemRefIds = AdaptiveComponentInstanceUtils.GetInstancePointElementRefIds(elem) #get the reference ides for the element's placement points
    pntElemRefs = [doc.GetElement(id) for id in pntElemRefIds] #get the reference point elements from the ID
    if len(pntElemRefs) != len(points): #if the point counts don't align
        errors.append([elem,"Location not set. \r\rPoints list is not sufficient - provide {0} points. \r\r".format(str(len(pntElemRefs)))]) #append to the errors list
    else: #otherwise
        [refPnt.set_Position(pnt.ToRevitType()) for refPnt, pnt in zip(pntElemRefs,points)] #set the location of the reference point to the associated point
        success.append(elem) #append the element to the success list
TransactionManager.Instance.TransactionTaskDone() #end transaction


#########################################
##### Return the results to Dynamo ######
#########################################
OUT = {"Success": success, "Errors": errors} #return a dictionary containing the successes and results.
2 Likes

hi @Jin

You can select and manipulate both Adaptive Points and ShapeHandle Points using the BriMohareb package in Dynamo for Revit.


For reference points within a family, you can retrieve all available reference points, but selecting a specific one directly isn’t possible. However, you can use the Lookup node from the same BriMohareb package to filter and identify reference points based on its index in the family.

2 Likes