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);
try
{
UpdaterRegistry.RegisterUpdater(updater);
UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), new ElementClassFilter(typeof(FamilyInstance)), Element.GetChangeTypeElementAddition());
UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), new ElementClassFilter(typeof(FamilyInstance)), Element.GetChangeTypeGeometry());
}
catch{}
}
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)
{
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));
}
else if (ctr == 2)
{
fi.get_Parameter("point2x").Set(Math.Round(position.X,3));
fi.get_Parameter("point2y").Set(Math.Round(position.Y,3));
fi.get_Parameter("point2z").Set(Math.Round(position.Z,3));
}
ctr++;
}
}
}
}
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?
Yes, that seems possible. You might find my Revit API video course at bitly.com/revitapi to be very helpful with this project. It includes lectures on parameters and excel output.
thank you, i will have to invest!
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(“point2x”).Set(Math.Round(position.X,3));
fi.get_Parameter(“point2y”).Set(Math.Round(position.Y,3)); fi.get_Parameter(“point2z”).Set(Math.Round(position.Z,3));
nO I HAVE NOT
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
Cound you please share it
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.
Got it thanks