BetaThe ClashFree public beta is open. Free 15-day trial, Revit 2023–2027.Get your invite →
  1. ClashFree
  2. Blog
  3. Who gives way
Who gives way

Why the pipe moves, not the duct

Because the pipe is the cheaper change. When a 50 mm water pipe crosses an 800 mm supply duct, either one can be rerouted, but two elbows on the pipe cost 0.5 and two fittings on the duct cost 6, plus an airflow and pressure re-check. ClashFree prices every change by system class and size, and the cheaper change gives way.

Feasible is not the question

Put a small domestic water pipe through a large supply duct and ask a coordinator which one moves. The answer comes back before you finish the sentence: the pipe. Not because the duct cannot move. In most ceiling voids there is room to drop the duct too. The pipe moves because moving it is cheap and moving the duct is not.

That instinct is easy for a person and invisible to geometry. A router that only asks "is there a path?" finds two answers here, and both clear the clash. The part that matters is what each change costs and who has to re-check something afterwards.

Two panels. A: the pipe drops 280 mm under the duct with two 45 degree elbows. B: the duct drops instead and the pipe stays. ceiling lineceiling line DUCT 800×400 PIPE DN50 −280 mm, 2 × 45° DUCT 800×400 PIPE DN50 −280 mm, 2 fittings A · MOVE THE PIPE2 elbows on DN50 domestic water · cost 0.5 B · MOVE THE DUCT2 fittings on 800 mm supply duct · cost 6
Both fixes clear the clash. Only one of them is cheap, and only B needs the HVAC engineer to re-check airflow and pressure. Section through the crossing; the duct runs into the page, so its fittings in B sit along its length, outside this view.

For years the industry answer has been a give-way list by category: conduit and cable tray give way to pipe, pipe to duct, small duct to large duct, everything to gravity drainage. ClashFree used one too. It gets the common case right and fails in exactly the cases that cost money. It cannot tell a 300 mm chilled-water main from a 50 mm pipe, a sprinkler branch from a domestic one, or a 900 mm cable tray from a 100 mm one. And it says nothing about what the change will cost once you make it.

Every run has a system class

So ClashFree replaced the list with a table of system classes. Every pipe, duct, conduit and tray in your model resolves to one, from its category, its system classification and its size, and, where Revit has no classification for it, from words in the system name (a "smoke" duct, a "steam" pipe). Each class carries three kinds of knowledge:

  • Change costs. What a typical change on this kind of run disrupts, and multipliers on the cost of each fitting, each millimetre of added length and each new high or low point.
  • Sensitivity tags. Which changes need an engineer's re-check: pressure_loss on ducts, hydraulic_calc on sprinklers, head_loss on water, fall on sloped lines, rated on life-safety systems, bend_radius on cable tray.
  • Hands off. Whether ClashFree may move it at all. In the base table only gravity drainage is hands off; a project can add more.
ClassChange costFittings costRe-check
Gravity drainagehands offnever movedfall
Smoke extract duct32.5 ×pressure_loss, rated
Kitchen exhaust duct32.5 ×, high/low points 3 ×pressure_loss, grease, rated
Medical gas pipe31 ×rated
Sprinkler pipe2.52.5 ×, high/low points 2 ×hydraulic_calc
Air duct (supply, return, exhaust)22 ×pressure_loss
Condensate, steam21 ×fall
Hydronic pipe (heating, chilled water)1.51 ×, high/low points 1.5 ×head_loss
Domestic water, other pipe11 ×head_loss
Cable tray11.5 ×bend_radius
Conduit0.50.5 ×bends

These are start values from general practice, shipped as such and calibrated against real fixes. They are data, not prompt text: you can read them, a project can override them, and the evaluation suite guards them.

Size scales the cost

A class says what kind of run it is. Size says how much of it you are moving. ClashFree multiplies the class's change cost by a size factor: the run's size divided by 200 mm, held between 0.5 and 3. A 50 mm pipe sits on the floor at 0.5; a 600 mm duct or larger sits on the ceiling at 3.

disruption = class change cost × clamp(size ÷ 200 mm, 0.5, 3)

Chart of disruption against run size for five classes; a 50 mm water pipe sits at 0.5 and an 800 mm air duct at 6, twelve times more 0246 02004006008001000 run size, mm disruption sprinkler · 2.5 air duct · 2 hydronic · 1.5 pipe, tray · 1 conduit · 0.5 the 800 mm duct costs 12 × the DN50 pipe DN50 water · 0.5 800 duct · 6
Disruption by class and size. Flat below 100 mm, rising to 600 mm, flat above. The two dots are the pair in the drawing above.

When two runs clash and both may move, the one with the lower disruption gives way. On a tie, the smaller run moves; then the class that costs less at any size; then a stable key from the model. The order of rows in your clash report never decides.

Who gives way, in six pairs

Here is the rule at work on pairs a category list gets wrong as often as right. The costs are ClashFree's base values, computed with the formula above.

ClashA costsB costsMoves
DN50 domestic water × 800 mm supply duct0.56the pipe, by 12 ×
DN300 chilled-water main × 200 mm supply duct2.252the duct: a big main outweighs a small duct
DN150 sprinkler main × DN65 domestic water1.880.5the domestic pipe: no hydraulic re-calculation
900 mm cable tray × 250 mm supply duct32.5the duct: a wide tray is costly to bend
25 mm conduit × DN40 heating pipe0.250.75the conduit, almost always
DN100 sanitary drain × anythinghands off—never the drain; the other side, or a flag

The second and fourth rows are the interesting ones. A category list says "pipe gives way to duct" and "tray gives way to duct", and both answers are wrong for these sizes. Rerouting a 300 mm insulated chilled-water main means new supports, more insulation and a pump-head question; dropping a 200 mm branch duct is two fittings. The table knows that because size is in the arithmetic.

The reason is written down

Every group in the ClashFree list carries its reason in plain text, from the same numbers:

cheaper change: 50 mm domestic water pipe costs 0.5, 800 mm air duct costs 6 (pressure_loss)

The AI receives the class facts of both runs (id, tags, costs and where each value came from) in its context, so it does not have to remember HVAC practice or invent it. Its job is to choose and explain, citing what decided: "pipe moved: a duct reroute adds a pressure_loss re-check". It may not claim that the airflow is fine afterwards; it may only repeat the tag. ClashFree simulates nothing.

What ClashFree does

At import, each clash pair is classified and the cheaper change is chosen as the mover, with the reason shown on the group. When you open the clash, the real options for that mover are listed and scored with the class's factors, so a duct's fittings cost twice a pipe's in the score too. Gravity drainage and any class your project marks hands off are never selected to move.

When the cheaper side is another trade's

ClashFree only edits runs of your trade in the host model. Linked models and other trades' elements are read-only obstacles. So when the cheaper change is on the other side, for example you are HVAC and the cheap mover is a Plumbing pipe, the group does not land in your To fix list. It goes to Coordination, with the reason, and the AI queue will not send it for your trade.

That is the right outcome: the plumber should drop the pipe, not you the duct. If you decide otherwise, you can edit the group and pick the other mover by hand. What ClashFree will not do is swap the mover silently because one side has no room; that case is flagged, naming the other side.

Tuning it for your project

Projects differ. On one hospital every sprinkler change needs the fire engineer's sign-off; on another the client names smoke-extract systems in their own language. The coordination profile has a classes section for that, in three layers: the base table, your project's file, and your own preferences.

  • A project class with a built-in id changes only the members it gives: "sprinkler_pipe": {"hands_off": "flag_owner"} makes sprinklers hands off and keeps everything else.
  • A new class needs a match that narrows (a kind, a classification, a name word or a minimum size); one that would take every run is refused when the file is read.
  • Your user preferences can change costs, never hands off. A preference never loosens what the project made hard.

Every value the AI sees carries its source, so its explanation can say "sprinkler pipe is hands off (project)".

What it does not do

The estimate at import is class-based; it does not run the router for both sides of every clash. When you open a clash, the real options and their scores replace the estimate for the moving side. If the estimate picked wrongly, say the pipe has no room at all, you see a flag naming the other side and its cost, never a silent wrong move.

And it is not an engineering calculation. A pressure_loss tag means "an HVAC engineer should look at this", not "the fan can take it". That is the line between coordination knowledge, which belongs in the tool, and engineering judgement, which stays with the engineer.

Read next: how the mover's options are scored, term by term, in Five valid fixes, one right answer, or try it on your own model in the free beta.

duct pipe clashwho gives waysystem classesMEP coordinationclash resolution

Public beta

Try it on your next clash report.

Sign up, confirm your e-mail and get your invite code and the installer straight away. Free 15-day trial, Revit 2023–2027.