Five Ways a Rhino Surface Becomes Revit Geometry and What Each Costs: Freeform Families, DirectShape, and the Editability Cliff

There are five practical routes from a Rhino surface to Revit geometry. Each one lands you somewhere different on the editability curve, and each one has a cost you can measure in hours, file size, or downstream rework. The choice is rarely about which tool is “better.” It is about what the next person in the model needs to do with the geometry after you hand it over.

Rhino’s geometry engine handles NURBS surfaces, SubD, meshes, and point clouds without practical limits on complexity, degree, or size beyond hardware. Revit’s native modeling tools do not. That gap is the entire problem. The five routes below are ordered from most editable to least, and the editability cliff sits between routes three and four.

Route 1: Native Revit families built from Rhino reference geometry

You model the surface in Rhino, bring it into Revit via Rhino.Inside.Revit, and use it as a reference to build native Revit forms — extrusions, blends, sweeps, revolves, or freeform masses that you then convert to walls, roofs, or curtain systems. The Rhino surface never enters the Revit model as geometry. It enters as a guide.

Rhino.Inside.Revit adds over 300 Revit-aware Grasshopper components that can query, modify, analyze, and create native Revit elements, and the project documentation lists dedicated workflows for walls, curtain walls, floors, roofs, and structural elements. The Rhino to Revit guide describes the path for moving geometry and data from Rhino into Revit, and the Modeling in Revit section covers generating native Revit elements through Grasshopper nodes.

What it costs: This is the most labor-intensive route. A single freeform facade panel might take 30–90 minutes to rebuild as a native family with proper parameters, constraints, and type catalog entries. Multiply that across a panelized facade with 40 unique conditions and you are looking at a week of family authoring. The payoff is that every element schedules, tags, filters, and responds to view templates like any other Revit family. If your project has a schedule-driven deliverable or a contractor who needs to quantify materials, this is the only route that does not create a downstream problem.

When to use it: When the geometry will be repeated, scheduled, or modified by someone who does not have Rhino. When the client’s BIM execution plan requires native Revit elements for quantity takeoff. When the surface is simple enough that rebuilding it natively does not lose design intent.

Route 2: Rhino.Inside.Revit direct translation to native elements

Rhino.Inside.Revit provides a translation API for creating custom conversion workflows between Revit data and Rhino geometry, including what the documentation calls “an advanced geometry conversion API to safely translate advanced Rhino shapes into Revit.” The Grasshopper components can create native Revit walls, floors, roofs, curtain walls, and structural elements directly from Rhino geometry without manual rebuilding.

This is not the same as Route 1. You are not rebuilding the surface by hand. You are feeding Rhino geometry into a component that outputs a native Revit element. The Revit element has a type, a category, and parameters. It can be scheduled. But the geometry inside it is still driven by the conversion, and editing it in Revit means editing the converted result, not the original Rhino surface.

What it costs: Setup time for the Grasshopper definition is typically 2–8 hours for a repeatable workflow. Once built, each conversion run takes seconds to minutes depending on element count. The risk is that the conversion produces geometry that is technically native but practically uneditable — a wall with a complex profile that Revit cannot clean up at joins, or a floor with a shape that breaks room bounding. You will not know until you try it in a real view with real constraints.

When to use it: When you have a repeatable geometric logic — a panelization pattern, a structural grid, a repeated facade module — and you need native Revit elements for scheduling or coordination. When the geometry is simple enough that Revit’s native editing tools can still touch it after conversion.

Route 3: Freeform families with imported Rhino geometry

You import the Rhino surface into a Revit family as an imported CAD instance, then use it as the basis for a freeform family. The family is native Revit. The geometry inside it is an import. This is the route most firms land on when they need something that schedules and tags but cannot afford the time to rebuild natively.

The Revit family editor accepts imported SAT, DWG, and other formats. The imported geometry becomes part of the family definition. You can nest it, array it, and place instances. But you cannot edit the imported surface’s control points in Revit. You can only scale, rotate, and move the import as a whole.

What it costs: Import time is fast — seconds per surface. File size grows with each unique import. A 50 MB Rhino surface imported into a family can add 10–30 MB to the Revit file depending on tessellation. If you have 20 unique panel types, you are adding 200–600 MB to the model. That is the file size cost. The editability cost is that any design change requires going back to Rhino, re-exporting, and re-importing. There is no round trip.

When to use it: When the geometry is fixed, when the schedule matters more than the editability, and when you can accept that the Rhino file is the source of truth for that surface. When the project team has Rhino access and the workflow to support re-imports.

Route 4: DirectShape elements

DirectShape is a Revit API class that creates a Revit element from imported geometry without converting it to a native Revit form. The element exists in the model, has a category, can be scheduled, and can be tagged. But it is not a family. It has no type parameters in the traditional sense. It is a container for geometry that Revit does not understand as a native form.

Rhino.Inside.Revit includes a dedicated DirectShapes workflow page in its guides, which tells you this is a first-class path in the toolset. The Grasshopper components can create DirectShape elements from Rhino geometry. The result is a Revit element that appears in the model, can be selected, and can carry data. But it cannot be edited with Revit’s native form-making tools. You cannot grab a face and push it. You cannot add a profile and expect the geometry to update.

What it costs: DirectShape creation is fast — often faster than family creation because there is no family template overhead. File size is comparable to imported geometry in families, sometimes slightly larger because DirectShape stores the geometry directly in the project rather than in a family definition. The real cost is the editability cliff. Once you cross into DirectShape, you are committing to a one-way workflow. Any change to the surface means deleting the DirectShape and recreating it. Any coordination clash that requires moving a face means going back to Rhino.

When to use it: When the geometry is purely contextual — a site mesh, a existing conditions surface, a reference shape that will not be edited in Revit. When you need something in the model for coordination or visualization but you do not need it to behave like a building element. When the alternative is not having the geometry in Revit at all.

Route 5: IFC round-trip

You export the Rhino surface as IFC, then import or link the IFC into Revit. IFC is an open, global standard published under a Creative Commons license and as ISO 16739. The latest official version is IFC 4.3.2.0, also published as ISO 16739-1:2024. IFC 2×3 and IFC 4 remain in wide use.

IFC can carry freeform surface geometry, but the translation is not lossless. Rhino’s NURBS surfaces are converted to IFC’s geometric representation, which may use advanced B-rep or tessellated forms depending on the exporter. When Revit imports that IFC, it typically creates DirectShape elements or imported geometry — not native Revit forms. The round trip is one-way in practice. You export from Rhino, import to Revit, and the geometry lands as a non-editable element.

What it costs: Export and import time is moderate — minutes for a complex model. File size is often larger than native Revit geometry because IFC carries more metadata and the geometry representation may be less efficient. The editability cost is the same as DirectShape, with an additional layer of indirection: you are now dependent on the IFC exporter’s interpretation of your surface, and different exporters produce different results. The buildingSMART IFC Validation Service exists precisely because IFC files vary in quality and compliance.

When to use it: When you are exchanging with a consultant who does not have Rhino or Rhino.Inside.Revit. When the deliverable is a coordination model, not a production model. When you need to document the exchange in a format that is vendor-neutral and auditable.

The editability cliff, priced

The cliff is between Route 3 and Route 4. Up to Route 3, you are working with native Revit families. The geometry inside them may be imported, but the element itself is a family instance. It has a type, it can be scheduled, it can be tagged, and it can be replaced by swapping the family type. After Route 4, you are working with DirectShape or imported geometry that has no family structure. It can be scheduled and tagged, but it cannot be type-swapped, and it cannot be edited with Revit’s form-making tools.

The practical consequence: if a design change comes in after you have committed to DirectShape, your options are to delete and recreate the element, or to go back to Rhino, modify the surface, and re-run the conversion. If you have 200 DirectShape panels and the facade module changes, you are re-running the entire conversion. If you have 200 native families, you are editing the family type and reloading.

That difference is worth pricing. A native family workflow might cost 40 hours upfront and 4 hours per design change. A DirectShape workflow might cost 8 hours upfront and 16 hours per design change. If the design changes three times, the native family workflow is cheaper. If it never changes, DirectShape wins. The break-even is usually around two design iterations.

What the tools actually support

Rhino.Inside.Revit requires Rhino 7 or later and runs inside the Revit environment. The documentation lists workflows for walls, curtain walls, floors, ceilings, roofs, openings, stairs, ramps, railings, structural elements, materials, topography, and DirectShapes. The Python and C# scripting components allow custom conversion workflows using the Revit API.

Rhino itself supports over 40 file formats, which is why it functions as an interoperability hub. But format support is not the same as geometry fidelity. A STEP file exported from Rhino and imported into Revit may arrive as a mesh or a B-rep depending on the exporter settings and the Revit importer’s capabilities. The same surface exported as SAT may arrive differently. There is no single format that guarantees native Revit geometry from a Rhino surface.

The IFC route is the most standardized but the least editable. IFC 4.3 contains over 1,300 entities and approximately 2,500 properties organized in over 750 property sets. That richness is useful for data exchange. It does not help you edit a surface in Revit.

Decision framework

Ask three questions before choosing a route:

1. Will this geometry be edited in Revit? If yes, Route 1 or Route 2. If no, Route 3, 4, or 5.

2. Will this geometry be scheduled or quantified? If yes, Route 1, 2, or 3. DirectShape and IFC elements can be scheduled but with less flexibility.

3. How many design iterations do you expect? If more than two, the upfront cost of native families pays back. If one or none, DirectShape or IFC is cheaper.

The wrong answer is to default to DirectShape because it is fast. It is fast for the first iteration. It is slow for every iteration after that. The editability cliff is not a technical limitation. It is a workflow decision that determines who owns the geometry after handoff and what it costs to change it.

Frequently asked questions

Can I convert a DirectShape back to a native Revit family? Not directly. You can use the DirectShape geometry as a reference to rebuild a native family, but there is no automated conversion from DirectShape to native form. The rebuild is manual or scripted through the Revit API.

Does Rhino.Inside.Revit work with Revit 2024? The documentation does not list specific Revit version compatibility in the retrieved excerpts. Check the Rhino.Inside.Revit download page for the current compatibility matrix. The tool requires Rhino 7 or later.

What is the file size impact of DirectShape versus native families? DirectShape stores geometry directly in the project. Native families store geometry in the family definition and instances reference it. For repeated geometry, native families are more efficient because the geometry is defined once. For unique geometry, the difference is smaller. A 50 MB Rhino surface will add roughly 10–30 MB to the Revit file either way, depending on tessellation settings.

Can I use IFC to round-trip geometry from Revit to Rhino and back? In theory, yes. In practice, the round trip is lossy. Revit exports IFC with its own interpretation of the geometry, and Rhino imports that interpretation. The surface you get back is not the surface you started with. buildingSMART is working on round-trip certification, but it is not yet a solved problem.

What is the best route for a facade with 100 unique panels? If the panels will be scheduled and fabricated, Route 1 or Route 2. If they are purely visual, Route 4. The cost of native families for 100 unique panels is significant — likely 40–80 hours of family authoring — but the cost of rework on a DirectShape workflow after a design change is often higher.

Why Rhino Won’t Fillet That Edge: Naked-Edge Gaps, G1 Discontinuity, and the EdgeTolerance Check to Run Before You Blame the Command

FilletEdge fails for a small set of reasons, and almost none of them are the command’s fault. The command creates a tangent surface between polysurface edges, then trims and joins the original faces to the fillet surfaces. That last step is where most failures live: the fillet rolls along the edge, tries to trim and join with adjacent surfaces, and gives up when the geometry it meets is not what the command expects. Before you file a bug or rebuild the model, run a two-minute diagnostic on the edge itself.

What FilletEdge actually requires

McNeel’s Rhino 8 documentation for FilletEdge states the input is polysurface or extrusion edges. The command’s own tips are the closest thing to a prerequisite list:

  • Fillet from the largest radius to the smallest radius across a model.
  • Remove edges you can before filleting, using MergeAllCoplanarFaces or simpler surfacing.
  • Make sure there is enough room for the fillet surface to trim and join with adjacent surfaces.
  • Angle relationships between surfaces, sharpness of the bend in the rail around corners, and rail type all affect the result.

Two of those tips are geometry checks in disguise. “Enough room” is a radius-versus-edge-length check. “Angle relationships” is a continuity check. The documentation also notes that if you set a radius larger than the edge radius at a handle location, the handle turns dark red and displays the maximum radius allowed at that location. That is the command telling you the local geometry cannot support the radius you asked for, before you ever hit Enter.

The ChainEdges option “automatically selects connected edges based on continuity.” If your edges are not continuous, chaining stops. That is a useful early signal: if double-clicking an edge does not select the tangent chain you expected, the problem is upstream of the fillet.

Naked edges: the gap the fillet cannot bridge

A naked edge is an edge not connected to another edge. McNeel’s ShowEdges documentation defines it exactly that way and adds the operational consequence: solid objects have no naked edges. If ShowEdges reports naked edges on a closed polysurface you intended to be solid, the object is not closed, and FilletEdge is being asked to roll a tangent surface across a gap.

Run ShowEdges with the Naked edges option, then use ZoomNaked to step through each one. ZoomNaked finds and marks naked edges; its Mark option adds point objects at each end of the current edge. Those point objects are the important part. They give you a persistent marker at the exact location of the gap, which survives a view change and can be measured.

Measure the gap. If it is below your file tolerance, Join should have closed it and did not, which usually means the surfaces were never within tolerance in the first place. If it is above tolerance, you have a modeling error, not a filleting error. Either way, the fix is upstream: rebuild, match, or re-trim the surfaces so the edge is actually shared.

Non-manifold edges are a separate failure mode. ShowEdges defines them as edges shared by more than two faces. A fillet rolling into a non-manifold junction has no unambiguous pair of adjacent surfaces to trim and join against. ZoomNonManifold finds and marks them the same way ZoomNaked does. Treat a non-manifold edge as a stop-work condition before filleting.

G1 discontinuity: tangent is not the same as smooth enough

FilletEdge produces a tangent surface. Tangent means G1: the surfaces meet with matching first derivatives, so the transition is smooth in the mathematical sense. But the command needs the input edges to behave predictably as the fillet rolls along them. Where two adjacent faces meet at a shallow angle, or where the rail bends sharply around a corner, the trim-and-join step has less room to work. The documentation lists “sharpness of the bend in the rail around corners” as a factor in any particular case.

G1 discontinuity at the edge itself is the harder problem. If the two faces meeting at the edge are not tangent-continuous, the fillet surface has to reconcile two different surface normals along its length. The result is either a failure or a fillet that looks acceptable in a shaded viewport and fails in a curvature analysis or a downstream STEP export.

The practical check is to examine the edge before filleting. In Rhino, use the curvature graph on the edge curves, or explode the polysurface and inspect the surface match at the shared boundary. If the surfaces are G0 (position only) rather than G1, the fillet is being asked to do a matching job that belongs to the surface modeler. Fix the surface continuity first.

The EdgeTolerance check

Rhino’s file tolerance is the distance below which two points are considered coincident. It governs Join, it governs the tolerance at which edges are considered shared, and it is the number against which ShowEdges decides whether an edge is naked. If your file tolerance is 0.001 units and your model was built at 0.01, you will see naked edges everywhere and FilletEdge will fail on edges that look perfectly closed on screen.

Before blaming FilletEdge, do this:

  1. Check DocumentProperties > Units > Absolute tolerance. Note the value.
  2. Run ShowEdges with Naked edges on the target polysurface.
  3. If naked edges appear, run ZoomNaked with Mark to place points at the gap ends.
  4. Measure the distance between the marked points with Distance or a linear dimension.
  5. Compare that distance to the absolute tolerance.

If the measured gap is at or below tolerance and the edge still reads as naked, the surfaces are not actually joined. Re-run Join and check the command line for the number of edges joined. If the gap is above tolerance, the model has a real gap and no amount of fillet radius adjustment will close it.

This check costs about two minutes per problem edge. Rebuilding a failed fillet by hand, or re-exporting a model that fails downstream because the fillet was never watertight, costs considerably more. The tolerance check is the cheapest diagnostic in the workflow.

What to do when the check passes and FilletEdge still fails

If the edge is not naked, not non-manifold, and the surfaces are G1, the remaining causes are radius and rail geometry. The documentation’s own guidance applies: fillet largest radius to smallest, remove edges with MergeAllCoplanarFaces before filleting, and confirm there is room for the fillet surface to trim and join. A radius that exceeds the local edge radius will be flagged by the dark red handle. A radius that fits locally but collides with a neighboring fillet will not be flagged, and that is a sequencing problem, not a tolerance problem.

RailType matters here. DistFromEdge, RollingBall, and DistBetweenRails determine how the intersection is computed. RollingBall is the default mental model for most users, but it is not always the right one for a given corner. If a fillet fails at a corner and succeeds along the straight run, try a different rail type before rebuilding the surface.

Scripting the check

For teams running the same diagnostic across many files, RhinoCommon exposes the underlying data. The RhinoCommon API is the reference for the object model; the relevant classes are the Brep edge and topology types that report edge adjacency and continuity. A repeatable pre-fillet check can iterate the Brep edges, flag naked and non-manifold edges, and report the file tolerance alongside the count. That turns a manual two-minute check into a batch operation, which matters when you are validating a library of components rather than a single model.

The API reference is the primary source for method signatures and return types. Do not rely on forum snippets for the exact behavior of a given method; check the API page for the version you are running.

FAQ

Why does FilletEdge fail on an edge that looks closed?
Because “looks closed” is a display judgment and naked-edge detection is a tolerance judgment. Run ShowEdges with Naked edges and compare the gap to the file’s absolute tolerance.

Does a larger file tolerance fix naked edges?
It can make Join succeed where it previously failed, but it also loosens every other tolerance-dependent operation in the file. Change tolerance deliberately, not as a workaround, and re-check downstream exports afterward.

What is the difference between a naked edge and a non-manifold edge?
A naked edge is not connected to another edge. A non-manifold edge is shared by more than two faces. Both are reported by ShowEdges, and both will stop FilletEdge from trimming and joining cleanly.

Can I fillet a G0 edge?
You can try, but the fillet surface has to reconcile two different surface normals along its length. The result is unreliable. Fix the surface continuity before filleting.

Why does double-clicking an edge not select the whole chain?
ChainEdges selects connected edges based on continuity. If the chain stops, the edges are not continuous at that point. That is a continuity problem, not a selection problem.

Panelizing a Double-Curved Facade Without Lying: Developability Tests, Flatness Tolerance, and the 2 mm Deviation Budget Between Grasshopper and the Shop

The 2 mm budget is a contract, not a wish

On a double-curved facade, the distance between the Grasshopper definition and the shop drawing is measured in millimeters. If you set a 2 mm deviation budget, you are not describing an aspiration. You are defining the maximum allowed difference between the intended surface and the fabricated panel, measured in a way both sides agree on. That number has to survive unrolling, nesting, cutting, forming, and installation.

Failures in panelized facades are often caused by a tolerance that was never defined, or was defined differently by the designer and the fabricator. A panel that is 1.8 mm off the true surface at mid-span is acceptable under one measurement method and rejected under another. The fix is procedural: define the metric, test developability before you commit to a panel size, and carry the tolerance through every file exchange.

What developability actually means for a panel

A developable surface can be flattened onto a plane without stretching or compressing the material. In Rhino, the UnrollSrf command handles developable surfaces and reports whether the surface can be unrolled without distortion. The Rhino feature documentation lists “unroll developable surfaces” and “flatten developable surfaces” as native tools, and it also lists Squish under transform tools for surfaces that are not developable. That distinction matters: UnrollSrf is a geometric operation with a binary outcome for true developables, while Squish is a best-fit flattening that introduces strain.

For a double-curved facade, almost no panel is truly developable unless you are panelizing with single-curved strips or ruled surfaces. The practical question is not “is it developable?” but “how much strain does the flattening introduce, and can the material absorb it?”

Three tests to run before you fix panel size

1. Gaussian curvature check. Use Rhino’s curvature analysis or a Grasshopper component that samples Gaussian curvature across each panel. A panel with near-zero Gaussian curvature everywhere is close to developable. A panel with high Gaussian curvature will require significant forming or will need to be subdivided. The Rhino analysis tools include Gaussian curvature and mean curvature display modes, which you can use to screen panels before unrolling.

2. Unroll and measure edge length change. Unroll the panel with UnrollSrf or Squish, then compare the perimeter of the flat boundary to the perimeter of the 3D boundary. The difference, divided by the original perimeter, gives you a strain percentage. For a 2 mm deviation budget on a 1.5 m panel, a 0.13% strain is the rough equivalent if the deviation is distributed across the panel. That is a tight number for most cladding materials. If your strain is higher, you need smaller panels or a different material.

3. Chord deviation at mid-span. This is the metric most fabricators actually measure. Take the flat panel and the intended curved surface. Find the maximum distance between the flat panel and the surface at the panel’s mid-span, measured normal to the surface. That is your chord deviation. If your budget is 2 mm, this number must be under 2 mm before you release the panel to the shop.

How Grasshopper reports deviation, and what it does not

Grasshopper itself does not have a built-in “developability report” component. The core Grasshopper installation in Rhino 8 includes data types and geometry components, but the developability and strain analysis typically comes from addons or custom scripts. Grasshopper Docs lists 182 addons with over 10,000 components, including categories for CAD and manufacturing, panels, and structural analysis. That breadth is useful, but it also means there is no single standard for how deviation is reported.

In practice, you have three options:

  • Use Rhino’s native tools and bake results. Unroll with UnrollSrf or Squish, then use PointDeviation to measure the distance between the flat panel and the original surface. Rhino 8’s PointDeviation tool supports SubDs and shows red numbers when invalid distances are entered, which helps catch unit errors. This is the most transparent method because the measurement is visible in the model.
  • Write a custom Grasshopper definition. Sample the surface at a grid of points, flatten the panel, sample the flat panel at the same parameter locations, and compute the normal distance. This gives you a deviation map you can color-code. The risk is that your sampling density determines what you see. A 10×10 grid on a 1.5 m panel samples every 150 mm, which can miss a local deviation peak.
  • Use a third-party addon. Several Grasshopper addons include panelization and flattening tools. Check what metric they output. Some report strain, some report edge length change, some report nothing and just give you a flat outline. If the addon does not report a deviation number, you cannot verify your 2 mm budget with it.

The gap in most workflows is not the flattening itself. It is the lack of a documented deviation number attached to each panel. If your Grasshopper definition outputs a flat panel but not a deviation value, you are relying on the shop to discover the problem.

File exchange: where tolerance metadata goes to die

Your 2 mm budget has to travel with the geometry. In most exchanges, it does not.

STEP. STEP is a solid model exchange format. It carries geometry and some product structure, but it does not have a standard field for “maximum allowed deviation from intended surface.” You can embed tolerance in the file name or in a separate document, but the STEP file itself will not enforce it. If you send a STEP file to a fabricator, the tolerance lives in the email, not the model.

IFC. IFC is a data schema for the built environment, published as ISO 16739. The latest official version is IFC 4.3.2.0, also published as ISO 16739-1:2024. IFC 4.3 contains over 1,300 entities and approximately 2,500 properties organized in over 750 property sets. That is a lot of room for metadata, but there is no universal property set for panel flatness tolerance. You can create a custom property set, but the receiving software has to read it. buildingSMART provides an IFC Validation Service and publishes scorecards on software IFC performance, which tells you that not all tools handle IFC equally. If your fabricator’s software does not read custom property sets, your tolerance is invisible.

DWG. DWG is a drawing format. It can carry dimensions and annotations, but it is not a tolerance-aware format for 3D deviation. A flat pattern in DWG with a note saying “max deviation 2 mm” is a human-readable instruction, not a machine-readable constraint.

STL and 3MF. STL is a mesh format with no units and no tolerance metadata. 3MF is more structured and can carry units and some metadata, but it is still a mesh format. If you export a flat panel as STL for CNC, the tolerance is not in the file. If you export as 3MF, you have a better chance of carrying units, but you still need a separate specification for deviation.

The practical conclusion: no standard exchange format will carry your 2 mm budget automatically. You need a tolerance specification document that travels with the geometry, and you need to verify that the receiving shop has read it. The file format is not the contract. The contract is the contract.

What the shop can actually hold

The achievable tolerance depends on the process, the material, and the stock thickness. These are not vendor claims. They are physical limits that show up in the first article.

CNC routing and milling

A 3-axis CNC router like a ShopBot can hold flatness on a flat panel to within the flatness of the spoilboard and the material. If you are cutting a flat panel from a flat sheet, the deviation from flat is mostly the material’s own warpage. A 6 mm aluminum composite panel will not be perfectly flat over 1.5 m. A 3 mm aluminum sheet will be flatter but more prone to oil-canning. The machine’s contribution to deviation is usually smaller than the material’s.

For a curved panel, you are either forming the material or cutting a mold. A Haas or Tormach mill can cut a mold with high accuracy, but the mold cost is per panel shape. If every panel is unique, the mold cost dominates. If you can group panels into a few families, the mold cost amortizes.

Laser cutting

Laser cutting is a 2D process. It cuts flat stock. The flatness of the cut part is the flatness of the stock. If you are cutting a flat pattern that will be bent or formed, the laser’s kerf and the material’s residual stress determine the final deviation. For thin sheet, laser cutting is fast and accurate in-plane, but it does not help with out-of-plane deviation.

FDM printing

FDM printing is rarely used for facade panels at full scale, but it is used for mockups and connection details. The achievable flatness on an FDM printer is limited by bed adhesion and thermal shrinkage. A 200 mm test panel might deviate 0.5 mm or more depending on material and orientation. That is not a facade tolerance. It is a mockup tolerance.

Stock thickness and deviation

Thicker stock resists deviation but weighs more and costs more. A 3 mm aluminum panel will deflect more under its own weight and under wind load than a 6 mm panel. If your 2 mm budget is measured in the installed condition, you have to account for deflection. If it is measured in the shop before installation, you have a different number. Define the measurement condition.

A practical procedure for a 2 mm budget

Here is a sequence that works for a panelized double-curved facade where the budget is 2 mm chord deviation at mid-span, measured in the shop before installation.

  1. Define the metric in writing. “Chord deviation at mid-span” means the maximum distance between the flat panel and the intended surface, measured normal to the surface at the panel’s center. Write it down. Put it in the panel schedule.
  2. Screen panels for Gaussian curvature. Use Rhino’s curvature analysis or a Grasshopper definition to flag panels with high Gaussian curvature. Those are the panels that will need forming or subdivision.
  3. Unroll and measure strain. For each panel, unroll with UnrollSrf if developable, or Squish if not. Compare edge lengths. If strain exceeds your material’s allowable strain, subdivide the panel or change the material.
  4. Measure chord deviation. Use PointDeviation or a custom Grasshopper definition to measure the maximum normal distance between the flat panel and the 3D surface. If it exceeds 2 mm, iterate on panel size or subdivision.
  5. Attach the deviation value to the panel. In Grasshopper, use UserText or a similar mechanism to attach the deviation value to the panel geometry. Rhino 8’s Grasshopper includes UserText components for adding, modifying, or removing user text from Rhino objects. That metadata can travel with the geometry if the exchange format supports it.
  6. Export with a tolerance specification. Do not rely on the file format to carry the tolerance. Export the geometry and a separate tolerance specification that lists each panel ID and its allowed deviation. If you are using IFC, create a custom property set and verify that the receiving software reads it.
  7. First article inspection. Before full production, have the shop fabricate one panel and measure it. If the measured deviation is within 2 mm, the process is capable. If not, adjust the process or the budget. Do not assume the process is capable because the machine specification says so.

Documenting the standard across a firm

In a firm of 5 to 500 people, the tolerance standard has to live somewhere that everyone can find it. A PDF in a project folder is not enough. The standard should be in the template, in the Grasshopper definition, and in the exchange checklist.

For Revit, the panel schedule can include a tolerance column. For Rhino and Grasshopper, the definition can output a deviation report as a CSV or a text file. For Dynamo, the script can read the panel schedule and flag panels that exceed the budget. For Navisworks, the clash detection can include a tolerance check if you model the flat panel and the intended surface as separate objects.

The goal is not to automate the decision. The goal is to make the deviation visible before the shop discovers it. A 2 mm budget is only real if someone measures it.

FAQ

Can I use Squish for a panel that is not developable?

Yes, but Squish introduces strain. The Rhino documentation lists Squish as a transform tool for surfaces. It is a best-fit flattening, not a true unroll. You have to measure the resulting deviation and decide whether the material can absorb it. For a 2 mm budget, Squish is usually only acceptable for panels with very low curvature.

Does IFC carry tolerance metadata?

IFC 4.3 has over 750 property sets, but there is no universal property set for panel flatness tolerance. You can create a custom property set, but the receiving software has to read it. buildingSMART provides an IFC Validation Service and publishes scorecards on software IFC performance, which can help you choose tools that handle custom properties.

What is the difference between chord deviation and strain?

Chord deviation is a distance in millimeters between the flat panel and the intended surface. Strain is a percentage change in length. They are related but not the same. A panel can have low strain and high chord deviation if the curvature is concentrated in one area. Measure both.

How do I know if my CNC can hold 2 mm?

Do a first article. Cut one panel and measure it. The machine’s specification is not the same as the process capability. Material warpage, fixture rigidity, and tool deflection all affect the result. A 2 mm budget on a 1.5 m panel is achievable on a good CNC router with a flat fixture, but it is not guaranteed by the machine alone.

What if the fabricator refuses a 2 mm budget?

Then you have a negotiation. Either you increase the budget, change the panel size, change the material, or change the fabricator. A 2 mm budget on a double-curved facade is tight. It is achievable for some materials and panel sizes, but not all. Get the fabricator involved before you fix the panel size.

Sources

How to Build a Naming Convention That Survives One Angry Principal

How to Build a Naming Convention That Survives One Angry Principal

You’re auditing a Revit 2024 project that six people have touched over fourteen months. The principal wants a wall type schedule by Friday. You open the Family Browser, type “Wall” into the search field, and get back forty-seven results. Among them: M_Wall_Rectangular_01, M_Wall_Rectangular_02, M_Wall_Rectangular_Updated, M_Wall_Rectangular_FINAL, M_Wall_Rectangular_revised, M_Wall_Rectangular_230mm, and M_Wall_Rectangular_230mm_copy. None of them include a discipline prefix beyond “M” — mechanical, presumably, though one of them is an architectural partition wall that someone copied from a mechanical template. Three have identical geometry. Two have identical geometry but different thermal properties. One of them — M_Wall_Rectangular_FINAL — is not the final version. You have until Friday.

This isn’t a software problem. Revit’s family naming system does exactly what you tell it to do. This is a naming convention problem, and the convention is: there is no convention. Each person named the family by feel, appended a suffix when they needed a variant, and moved on. The result is a model that no one can audit programmatically. Every family requires individual human investigation — open it, check the geometry, check the parameters, check the materials, decide whether it duplicates another family, close it, repeat. On a project of any scale, this isn’t a task. It’s a sentence.

The cost of bad naming isn’t measured in the five seconds it takes to type a name. It’s measured in the hours it takes someone else to find, evaluate, and trust that name months later. That cost compounds with every contributor, every project, every handoff. And it’s almost entirely avoidable — not by writing a longer naming standard, but by understanding that a naming convention is infrastructure, not preference.

That same discipline applies to naming decisions: before publishing, editors need a way to test labels, roles, and public-facing language stay consistent, which is where how Unsloppy AI Writing App fits the writing workflow can function as a planning aid rather than a substitute for domain evidence.

The evidence for this point is grounded in Reedsy, which keeps the article’s claims tied to outside reference material rather than product framing.

Why Naming by Feeling Fails at Team Scale

Naming by feeling works for a solo practitioner on a single three-month project. You name a family M_Wall_Rectangular_01 and you remember what _01 means because you created it yesterday. The name is a pointer to a memory in your head, not a label that encodes information.

The failure begins with the second contributor. They don’t have your memory. They see M_Wall_Rectangular_01 and can’t determine from the name alone whether _01 refers to a wall type, a thickness variant, a revision sequence, or an arbitrary counter. They create M_Wall_Rectangular_02 because they need a second type, and they follow the pattern they see — which is “append a number.” Now the name encodes nothing. _01 and _02 are distinguishable but not meaningful. A third person, needing to update the first family, creates M_Wall_Rectangular_Updated because they don’t want to overwrite the original. A fourth person, unsure whether _Updated is the current version, creates M_Wall_Rectangular_FINAL. The system has no system. It has a sequence of individual decisions that look like a pattern from the outside but encode no rules.

This is the same failure mode that Google’s Site Reliability Engineering teams identify in production systems, where ad-hoc operational responses generate toil — repetitive, manual work with no enduring value because it never gets codified into a reusable system. The Google SRE book treats naming and labeling as structural concerns, not cosmetic ones: when a system’s identifiers require you to ask their author what they mean, the identifiers have failed as infrastructure. They’re functioning as private memory, not as shared labels. A Revit family name that demands you open the family to understand it is no different from a service name that demands you page the engineer who deployed it. The information should travel with the name.

The same structural logic applies wherever names must be parseable by someone other than the author. Constraint-based naming — where a name is generated from defined fields rather than invented by feel — produces identifiers that are auditable, reproducible, and transferable across people and time. This principle isn’t limited to engineering systems; it applies in any domain where names carry structural meaning, from code libraries to narrative taxonomies. Tools like the Unsloppy AI Writing App apply the same logic to character naming: names constrained by archetype and setting are retrievable and consistent, whereas names chosen by feel accumulate collisions. In BIM, the constraint is your naming schema; the principle is identical.

The Anatomy of a Name That Encodes Information

A name that works at team scale has four properties: it’s parseable (a reader can break it into fields without asking the author), retrievable (a search query can find it without returning false positives), non-colliding (two contributors working independently won’t generate the same name for different families), and stable (the name doesn’t change when the family is revised, because the name encodes identity, not state).

Consider this alternative to the earlier example: ARC_Wall_Basic_230mm_TypeA. The discipline prefix ARC distinguishes it from mechanical and structural families. The category Wall groups it with all wall families. The construction type Basic distinguishes it from compound, stacked, or curtain walls. The key parameter 230mm encodes the nominal thickness. The variant TypeA distinguishes it from other 230mm basic walls with different layer compositions. A contributor who has never seen this family can parse the name, search for it by any field, and determine whether it duplicates an existing family — all without opening the family editor.

The tradeoff is length. ARC_Wall_Basic_230mm_TypeA is 28 characters. M_Wall_Rectangular_01 is 24. Those four additional characters buy you auditability, retrievability, and non-collision. That’s a trade worth making. The cost of a long name is paid once, at the moment of creation. The cost of an opaque name is paid every time someone encounters it.

But don’t over-engineer. A name like ARC_Wall_Basic_230mm_TypeA_v2_2024-03-15_JSmith encodes revision state, date, and author — all of which belong in version control or the family’s parameter data, not in the name. A name should encode identity, not history. If you need to know when a family was last revised, check the file properties. If you need to know who revised it, check the worksharing history. If you need to know what version it is, you have a version control problem, not a naming problem.

The Diagnostic: Evaluating Whether Your Convention Works

Most naming conventions are written by one person, approved by a committee that doesn’t use them, and enforced by no one. The result is a PDF that sits on a shared drive while the actual project files accumulate names like M_Wall_Rectangular_FINAL_v3_actually_final. The convention isn’t serving the team. It’s satisfying the person who wrote it.

Here’s a diagnostic protocol — five checks, in order — for evaluating whether a naming convention is actually working or is merely a document that exists.

Check 1: The Stranger Test. Open a project file you didn’t create. Pick ten family names at random from the project browser. For each name, write down what you think the family is — discipline, category, key parameter — based on the name alone, without opening the family. Then open each family and check. If you got fewer than seven correct, the convention isn’t encoding information. It’s encoding the original author’s habits. This is the first check because it’s the most common failure: a convention that makes sense to its author and no one else.

Check 2: The Collision Test. Search the project browser for names that differ only in suffix. Search for *_01, *_02, *_copy, *_new, *_final, *_revised, *_updated. If you find more than three such families, the convention isn’t preventing collisions. It’s documenting them after the fact. The fix isn’t to add more suffixes. The fix is to encode the distinguishing parameter in the name itself — thickness, fire rating, material — so two families with different properties can’t have the same base name.

Check 3: The Search Precision Test. Search the project browser for a category name: “Wall,” “Door,” “Window.” Count the results. Then count how many of those results are actually in that category. If searching for “Door” returns door families plus curtain wall door panels plus equipment access panels plus a family someone named M_Door_Sensor_Mount, your names are generating false positives. The convention needs a discipline prefix and a category delimiter that narrows search results. A search for ARC_Door_ should return only architectural door families.

Check 4: The Stability Test. Compare the family names in the current model against the same project’s model from six months ago. If family names have changed — M_Wall_Rectangular_01 became M_Wall_Rectangular_Updated became M_Wall_Rectangular_FINAL — the convention is treating names as revision labels. This breaks every reference: schedules, tags, sheets, view filters. A family name should be stable for the life of the family. If the family changes, the name was wrong to encode the changeable property.

Check 5: The Compliance Test. Count the families in the project that follow the convention. Divide by the total number of families. If compliance is below 80 percent, the convention isn’t a convention. It’s a suggestion. And the reason isn’t that the team is undisciplined — it’s that the convention is too complex, too verbose, or too disconnected from how people actually work. A convention that requires a spreadsheet to construct a name won’t be followed. A convention that a person can apply from memory in five seconds will.

The Failure Mode: When the Principal Walks In

The scenario that exposes a naming convention isn’t the audit. It’s the change request. A principal walks in on Wednesday and says: “The client wants to change all the 230mm partition walls to 200mm. How many families do we have, and where are they used?”

If your convention works, you search for ARC_Wall_Basic_230mm_*, get a clean result set, check the “where used” for each family, and report back in twenty minutes. If your convention doesn’t work, you open every wall family in the project, check the thickness parameter manually, build a spreadsheet, and report back on Friday — if you’re lucky.

The principal doesn’t care about naming conventions. The principal cares about the answer. But the speed and accuracy of the answer is entirely a function of whether the naming convention encodes the information the principal is asking for. A convention that encodes thickness as a field makes the query trivial. A convention that doesn’t makes the query a research project.

This is why the convention must survive the angry principal. Not because the principal will critique your naming schema — the principal will never read it — but because the convention must produce a model that answers questions quickly enough to satisfy someone who doesn’t care how the answer was produced. The convention is invisible when it works and catastrophic when it doesn’t.

What a Convention Costs — and What Bad Naming Costs More

A naming convention isn’t free. The costs are specific and should be stated explicitly.

The design cost is the time spent deciding the convention. For a firm of 20–50 people working across architecture, structure, and MEP, expect two to three days of a CAD manager’s time to draft the convention, one day for a pilot project to test it, and half a day per discipline for review and revision. Total: approximately one person-week. This is a one-time cost, amortized across every future project.

The training cost is one hour per new hire. The convention should fit on a single page. If it doesn’t fit on a single page, it’s too complex — return to Check 5 and simplify.

The enforcement cost is ongoing. Someone must check compliance on each project at each milestone. This is a 30-minute audit per project per month, performed by the CAD manager or a designated BIM coordinator. If no one is assigned, the convention will decay. Naming conventions aren’t self-maintaining. They’re infrastructure, and infrastructure requires maintenance.

The cost of not having a convention is the scenario above: 47 wall families, a Friday deadline, and a model that resists auditing. On a single project, the cost of bad naming can exceed the cost of writing the convention. Across a portfolio of projects, the cost isn’t comparable — it’s an order of magnitude higher. Every project inherits the naming debt of the previous project because families are copied from project to project, carrying their bad names with them.

Building a Convention That Guides Without Trapping

A naming convention that’s too rigid will be circumvented. A convention that’s too loose will be ignored. The balance is a convention that specifies the fields that matter and leaves the rest to judgment.

For Revit family names, the fields that matter are: discipline prefix (2–4 characters), element category (1 word), construction or type descriptor (1 word), key parameter (1 field), and variant identifier (1 field, only when needed). The delimiter is an underscore. The order is fixed. The fields are defined per discipline. That’s the entire convention. It fits on one page.

For layer names in AutoCAD or DWG exports from Revit, the fields that matter are: discipline, major group, minor group, and status. The National CAD Standard layer format — Discipline-Major-Minor-Status — is a proven structure. Don’t invent your own unless you have a specific reason and the time to document it. Adopting an existing standard costs less than designing one and produces names that other firms can parse.

For shared parameter naming in Revit, the fields that matter are: discipline, element, parameter, and unit (when the unit isn’t obvious). A shared parameter named ARC_Door_FireRating_Minutes is parseable. A shared parameter named FireRating isn’t — it’ll collide with other fire rating parameters, it’ll be ambiguous in a schedule header, and it’ll cause GUID governance problems when two firms merge their parameter lists.

For file naming, the fields that matter are: project number, discipline, sheet type, and sequence. Dates and author initials don’t belong in file names — they belong in metadata or version control. A file named PRJ1234_ARC_A101.pdf is parseable and stable. A file named PRJ1234_A101_2024-03-15_JS.pdf encodes state that will change, guaranteeing the file name becomes stale the moment someone else revises it.

The Monday-Morning Action

Before you write a naming standard, run the Stranger Test on your most recent project. Open the model, pick ten family names, and write down what you think each one is based on the name alone. If you get fewer than seven correct, your current convention — if you have one — isn’t working. Don’t write a new standard until you’ve documented the specific failure modes you found. The standard you write should be a response to failures you can name, not an aspiration toward order.

Then take the single most common family category in your projects — walls, doors, windows, whatever it is — and write the naming rule for that category only. Five fields, underscore-delimited, one page. Apply it to the next project. Run the Stranger Test again after three months. If a stranger can parse seven out of ten names, extend the convention to the next category. If not, revise the fields. A convention that earns its adoption one category at a time will survive. A convention that’s imposed all at once will be circumvented within a month.

The convention that survives one angry principal isn’t the one that’s longest or most complete. It’s the one that encodes the information the principal asks for — thickness, type, discipline — in a name that a stranger can read. Everything else is documentation.

Why File Formats Are Infrastructure Decisions, Not Just Compatibility Choices

Two years ago a 24-person structural firm I consult for sent a STEP file to a steel fabricator. The file opened on both ends. Compatibility was never the problem. The fabricator’s CAM seat interpreted one tolerance zone differently than the CAD seat that wrote the file, and eleven working days later the shop had cut 40 connection plates to geometry that did not match the model. The file opened. The project still failed.

That gap is the whole subject of this article. A file format decision is an infrastructure decision because it fixes three things before anyone draws a line: who can open the file in ten years, what it costs to keep it open, and who holds the keys when a vendor changes direction. Compatibility is a property of a file. Infrastructure is a property of a firm.

Compatibility Is a Snapshot. Infrastructure Is a Decade.

Compatibility asks one question: does this file open in this software, today. It has a clean answer and a short shelf life. Infrastructure asks what the archive looks like in 2035, which consultants you can sign in 2027, and what a new hire must know on day one. Those questions do not have clean answers. They have budgets.

The major CAD file formats behave very differently across that decade, and those differences set policy whether or not anyone writes the policy down. AutoCAD has written the same DWG variant (the 2018 format) through eight releases, from AutoCAD 2018 through 2025. A DWG saved from AutoCAD 2025 opens in AutoCAD 2018. The Open Design Alliance has kept DWG readable in dozens of non-Autodesk tools for more than 25 years, which is a large part of why DWG behaves like public infrastructure. Revit runs the other way. Open a 2024 model in Revit 2025 and it becomes a 2025 model permanently. Autodesk has never shipped a save-back for Revit, across more than twenty annual releases.

SOLIDWORKS splits the difference: it saves back two releases, with a warning that newer features may drop, so check what survives before anyone relies on the saved file. The one-way upgrade is the expensive case. When a firm and its structural consultant drift one Revit release apart mid-project, the options are ugly. The consultant upgrades on your schedule, someone keeps a second install alive for one job, or the model forks and coordination runs in duplicate. I have billed the cleanup on the third option. It ran 60 hours across two firms, and the re-issued set went out three weeks late.

Drafting table with technical drawings and drafting tools

Dead formats fail more quietly. Autodesk Land Development Desktop projects from the mid-2000s cannot be opened by Civil 3D. I know three firms that keep a 32-bit Windows XP machine running in a closet for exactly this reason: one client’s record set lives in a format the vendor retired. That is what a format decision looks like fifteen years later. It is not a dialog box. It is a museum piece with a support contract.

The Metadata Is the Asset. The Format Is Only the Container.

When a transfer “converts fine,” what usually survived is the geometry. Geometry is the cheapest thing in the file. What the client actually paid for is the structure around it: parametric relations, feature history, property sets, layer standards, revision data. That is the metadata, and it is the first casualty of every exchange.

A Civil 3D drawing opened in plain AutoCAD shows proxy objects, placeholders where the corridor intelligence used to be. The lines are there. The design intent is not. An IFC2x3 Coordination View export makes the same trade at a larger scale. Geometry and property sets survive, and parametric relations are gone by design, because the Coordination View was built for one-way coordination, not round-trips. If your exchange plan assumes editing after a file crosses the IFC boundary, the plan is wrong and the standard is not.

The IFC family is still the only open BIM exchange schema worth naming in a contract. The buildingSMART IFC standards cover the versions that matter: IFC2x3 with Coordination View 2.0, still the market default; the IFC4 Reference View, which trades authoring intelligence for reliability; and IFC4.3, the first release to cover roads, rail, and ports, which became an ISO standard in 2024. The distance between “we use IFC” and “we deliver IFC2x3 Coordination View 2.0, checked, per deliverable” is exactly the distance between a compatibility habit and an infrastructure decision.

The Information Delivery Specification, IDS, closes part of that gap. IDS turns exchange requirements into a machine-checkable file: instead of a PDF table nobody reads, you get a specification that checking software enforces deliverable by deliverable. The first one costs about a day to write. Adapting it per project costs about an hour. Set that against the 60-hour cleanup above and the arithmetic is not close. If you want a starting point, our IFC exchange checklist has the field-by-field version.

Fabrication Formats Run the Shop Floor, Not the Vendor Roadmap

The shop does not read roadmaps. A laser table wants DXF, and a startling number of them want it as R12 ASCII: lines and arcs, no splines, no blocks, bend lines isolated on their own layer. The export takes four minutes if someone built the template once. It takes half a day per part if nobody did, and a flat pattern that lost its bend lines is not a file problem. It is scrap waiting for a schedule.

STEP behaves the same way at a larger scale. AP214 is still the default request at job shops a decade after AP242 was standardized, because AP242’s advantages (PMI, model-based definition, embedded tolerance data) matter to primes, not to the shop quoting your brackets. Export both when the CAD seat supports it. The second export costs minutes. A re-quote cycle costs days.

Kernel versions bite harder than extensions. A Parasolid x_t written by a current NX release can stall in a downstream tool that ships an older kernel, and the error message will blame the file, not the kernel. Check kernel versions before you blame the format. And stop using STL for anything with units in it: STL carries none, so the same file is 25.4 times wrong in one shop and right in the next. 3MF carries units, transforms, and material names, and every serious additive vendor reads it now.

Engineer at a CAD workstation reviewing a model on screen

The Line Items Nobody Budgets

Format decisions surface as subscription cost, labor, and archive exposure. Most firms track none of the three.

  • Subscription exposure. Twenty Revit seats at roughly $3,000 per seat per year is a $60,000 annual commitment, and the one-way upgrade means the vendor controls the cadence. That is not a complaint about Autodesk. It is a line item the format policy created.
  • Upgrade labor. I budget eight hours per workstation for a Revit major release: install, add-ins, template repair, and a sandbox test. A 20-seat firm spends 160 hours a year on this whether or not anyone schedules it.
  • Archive migration. A 12-person firm I audited in 2022 had 15,000 legacy DWG files on a 2009 layer standard. The audit took 90 hours. The migration was quoted at 900. They chose 200-hour annual slices instead. Both answers are defensible. Not deciding is not.
  • Scrap and re-issue. The 40 mis-cut plates from the opening story cost the fabricator roughly $18,000 in material and rework, and the engineering firm two weeks of schedule. Every check that would have caught it costs minutes.

A Format Policy That Fits on One Page

A firm of 500 does not need a standards department to get this right. It needs one page, one owner, and one review a year. This is the version I install:

  1. Keep a format registry. One table in the BIM execution plan: deliverable, native format and release, exchange format and release, who checks it, when. If a format is not in the registry, it is not a deliverable.
  2. Pin versions in contracts. “IFC” is not a specification. “IFC2x3 Coordination View 2.0, IDS-checked” is. The same goes for “DWG 2018,” “STEP AP242,” and “Revit 2025.” The version number is where the infrastructure decision actually lives.
  3. Synchronize upgrades annually. One upgrade window per year, firm-wide, consultants notified 90 days ahead. The alternative is per-project drift, and per-project drift is how 60-hour cleanups happen. Our Revit upgrade cadence worksheet has the checklist if you do not have one.
  4. Keep a sandbox file. One small model containing every object type you deliver. Push it through the exchange chain every quarter and after every upgrade. Twenty minutes, and it is the cheapest early-warning system in the building.
  5. Archive in pairs. Native file plus an open-format twin (IFC, PDF, or DXF, depending on the deliverable). Storage is cheap. Re-creation from a dead format is not.

Engineering team reviewing project deliverables in a meeting

Frequently Asked Questions

Can Revit save back to an older release?

No. Revit upgrades files permanently on open, and Autodesk has never offered a save-back. If a consultant cannot upgrade on your schedule, arrange a parallel install or a model fork with a documented merge date before the project starts, not after.

Is IFC good enough for long-term archiving?

It is half an archive. IFC preserves typed objects and property sets in an open, documented schema, which no native format promises. It also drops parametric relations by design. Pair it with the native file and a PDF of the record set. That is the only archive strategy I have seen survive ten years intact.

What DWG version should we send to consultants?

DWG 2018, unless the contract says otherwise. It has been the written format for eight AutoCAD releases, which makes it the widest-readable choice on the market today. If a recipient is on something older, save down explicitly and note it on the transmittal.

Do we need STEP AP242 if our shops still ask for AP214?

Export both if the CAD seat supports it. AP242 carries everything AP214 does, plus PMI and embedded tolerance data, but a decade of installed CAM seats means AP214 requests will not disappear soon. The second export costs minutes. The re-quote costs days.

How often should the format registry be reviewed?

Once a year, and after any vendor release that changes a file format. DWG has been stable for eight releases. Revit changes most years. The review takes an hour with the registry open and the release notes beside it.

Compatibility is a checkbox. Infrastructure is a balance sheet. The next time someone proposes a format because it opens fine, ask the three questions that matter: who reads this file in ten years, what does keeping it readable cost, and who decides when that changes. If nobody in the room owns the answer, the format has already started making the decision for you.