Understanding SpatialElementFromToCalculationPoints – what are they even for?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
tl;dr
SpatialElementFromToCalculationPoints seem to behave like a legacy feature whose original purpose has been lost.
Is there any actual practical benefit to using SpatialElementFromToCalculationPoints?
When these points are disabled, how does Revit determine FromRoom and ToRoom?
Is there any downside to turning off BuiltInParameter.ROOM_CALCULATION_POINT for all door families?
Long version
I'm trying to understand the real purpose and behavior of SpatialElementFromToCalculationPoints in door families. After digging through the API and running a number of tests, I’m not convinced they are very reliable - or even useful - in practice. I’d appreciate clarification from anyone who knows the intended design or internal algorithm.
1. Behavior when SpatialElementFromToCalculationPoints are disabled
If the calculation points are turned off in the family (so FamilyInstance.HasSpatialElementFromToCalculationPoints == false), Revit still assigns FromRoom and ToRoom.
With these points disabled:
You can manually swap FromRoom and ToRoom in a schedule, without affecting the door swing.
Or you can programmatically call FamilyInstance.FlipFromToRoom().
For comparison:
If calculation points are enabled and you swap them in a schedule, Revit will flip/mirror the family instance itself - without visual feedback, across dozens/hundreds of instances, even if the elements are pinned (!!!). This seems very risky and counterintuitive.
So far, disabled calculation points appear less dangerous and more flexible.
2. “More reliable” assignment? I'm not convinced
I’ve often seen the claim that SpatialElementFromToCalculationPoints provide "more reliable" room assignments because they tie the result to the door swing direction.
However, this only works if all of the following are true:
the family was modeled "the right way"
the calculation points were never flipped/rotated inside the family (but then: why would there even be a UI and API endpoint for doing so?)
every version of every door family uses consistent conventions
the points stay within valid room volumes in all situations
Given all the ways families are authored in real-world projects, this is not a safe assumption.
Also: the points are set for each family and cannot be overridden per-instance. If they could, they would be much more useful - a default behaviour would be defined in the Family, edge cases could be remedied for each FamilyInstance if needed. As-is I'd have to create copies of each Family for each edgecase - why no, thank you.
3. Sidenote: Odd default behavior and offsets
Opening default Revit door families:
Their calculation point offsets seem arbitrary (2.325 ft [~708.6 mm] on one side of the wall, 1.675 ft [~510.7 mm] on the other side)
Resetting them by toggling the parameter sets them to 1 ft on each side, symmetrical
The default Z value is 0, which makes them highly susceptible to edge cases (sloped floors, raised thresholds, rooms with level offsets, double-height rooms, openings, etc.)
I cannot find any documentation that explains:
why these distances were chosen
why they differ between sides
why Z=0 is used consistently
4. How are FromRoom / ToRoom computed when the points are disabled?
Tests suggest Revit uses a fallback logic that looks something like:
a point offset 1.5 ft (~45.7 mm) normal to the host wall centerline
at roughly half the door height (much more sensible than Z=0 to me)
This produces much more stable behavior in my tests compared to the hardcoded family points.
Can anyone confirm or deny that this is the built-in algorithm?
If so, why is it undocumented? Well, at least, I wasn't able to find documentation on this.
SpatialElementFromToCalculationPoints seem to behave like a legacy feature whose original purpose has been lost.
5. I’m considering removing calculation points from all door families
It appears safer and more flexible to simply disable the calculation points (BuiltInParameter.ROOM_CALCULATION_POINT = False):
No unintended flipping of families through schedules.
No dependency on poorly configured family geometry.
More predictable and robust fallback room assignment.
Are there any real reasons not to do this?
Is there any modern workflow in which SpatialElementFromToCalculationPoints are necessary or beneficial?
Thanks in advance for any insights. Documentation or internal knowledge would be especially appreciated.