Interoperability in Practice: Migrating 1200 CAD Blocks to Revit in 60 Seconds with Rhino.Inside

In daily design practice, we often encounter situations where the BIM process clashes with the reality of archival or industry documentation based on the DWG format. We receive technological backgrounds, surveys, or architectural concepts containing hundreds, and often thousands, of blocks. Each of these represents a specific piece of equipment and frequently holds assigned CAD attributes that are crucial for the subsequent design process. As engineers, we face a dilemma: treat this file as a “dead” graphic background, or attempt a manual conversion prone to human error—inserting block after block, family after family, rewriting and populating parameters. Both solutions are inefficient from the perspective of information management and team workflow.

Here, the technological paradox of the Autodesk environment reveals itself. Although Revit is a powerful database tool, its native mechanisms for interpreting geometry from DWG/DXF files are limited and often lead to “polluting” the project with redundant line styles or unstable geometry. Attempts to automate the import process through pure Dynamo, while possible, often face performance barriers when reading raw CAD geometry or require the use of custom packages, which complicates script maintenance within the office.

In this area, Rhino.Inside.Revit (RIR) proves its value as a cross-platform “Swiss Army knife.” Rhino, being an environment naturally adapted to handle any NURBS, Mesh, and CAD geometry, can flawlessly and instantly interpret the structure of DWG files. By utilizing RIR, we do not import files into Revit; instead, we use the Rhino engine for precise data extraction (geometry and attributes) and then the Revit API to generate native families.


The case study presented in the attached video material illustrates the migration process of over 1200 CAD blocks, distributed across a dozen definitions, in less than a minute. The algorithm, implemented in Grasshopper, performs geometric and informational tasks simultaneously. The key element here is a Python-written module—”Smart Collector”—which analyzes block definitions, normalizes their insertion points (solving the frequent issue of geometric centers being offset relative to insertion points in CAD), and extracts their geometry and attributes.

The script generates lightweight Bounding Box objects for 3D views and symbolic lines for 2D plans. This way, we create “placeholder” type families—lightweight, parametric objects that do not burden the model while carrying a full informational load. This prevents model performance degradation, which is a typical consequence of importing CAD geometry directly into families.

In parallel, the transfer of non-geometric data takes place. Block attributes are mapped and written into instance parameters in Revit. This eliminates the risk of human error, which is inevitable when rewriting values manually. Crucially, such prepared placeholder families possess correct naming and categorization, allowing for their instant, systemic replacement with target, detailed manufacturer families at a later design stage, without losing entered data or positions.

Implementing Rhino.Inside.Revit in this scenario is not just a matter of script execution speed. It is primarily a shift in the philosophy of working with external data. Instead of importing unmanageable flat drawings, we build a bridge that allows us to maintain Revit model hygiene by using native objects while fully utilizing the resources provided in the DWG format.