Navisworks (DWG) to Revit: Best strategy?

Hi Speckle team and community,

I was giving a go at the new beta in Navisworks, and I have a few questions when importing from Revit, in particular from Navisworks

I tried to import some geometry coming from NWC (the original file was a DWG, the elements in Navisworks will be highlighted per layers), and this is what comes out of the transfer process:

  1. It looks like they’re Directshape import, right? Is there a way I can reassign a name to those elements, rather than being named with the Stream GUID?
  2. What’s the best workflow to get this separaretd in individual blocks? They originally were 3d block references.

Thanks for any suggestions!

1 Like

I would go through the Dynamo route. Currently, our Revit connector receives the geometry and doesn’t care much about the metadata. (Yes, we are planning to change this behavior)

So what I’d recommend you to do is receive your data in Dynamo and customize it according to your needs. You’ll have access to all the parameters coming from Navis and you can create families from your block geometry using it. Lemme know if you need any help with that.

hi @gokermu,
thanks for the support. I sensed that it might be Revit as it’s structured now so I didn’t give much effort in it, it would be good in the future to be able to edit or select the objects in the Project Browser, as a minimum, so users can edit and manipulate what it’s been received.

For the Dynamo route, I was trying before, and it’s not clear to me once I acquired the data from the stream, how to manipulate it in Dynamo…

this is an attempt I did with a single object, I can share the commit with you to see if it’s a geometry that can be imported, and how shall I proceed (I took a look at the documentation, not sure how to continue after saving the data).

Object | Speckle



I did a test from Rhino to Dynamo to see if my Speckle is working and seems to import basic geometry (Brep, Meshes and Polylines) as highlighted in the Documentation.

I wonder what’s the best way to acquire an object from Navisworks in Dynamo then. Is it maybe the original format of the import in Nwc?
any hint or idea on this is welcome. I can do some test with other files imported in NWCs to compare different File types within Navisworks.


1 Like

Well it totally depends on what you want to achieve. Each option has its own advantages and disadvantages. If you want to quickly see the geometry with correct name and category, Direct Shapes are great for that. But if you have 1000 instances of the same geometry then it becomes a bit heavy.

Here is an example for the DirectShape route:

Receive Navis as DS with Category.dyn (23.0 KB)

Creating families from received geometry is another route you can take. But in that case, the creation process is more time-consuming. You need to create the family and load it into the project and place it in its correct place.

Can you explain what your goal is with this workflow?

Thanks for exploring this workflow. :pray: We’re definitely receptive to what you need that isn’t yet supported. :beers:

The “special” feature of Navisworks is that no matter the source, You end up with very few primitive types - Lines, Points & Solid (Mesh)

All the logic it applies to make it so performant is to reduce all geometry to these super-decimated types.

The structure of the tree of objects you can see (currently Elements > Elements > Elements) that various properties hang onto at different levels varies by source software.

There is more we can do on the alphabeta roadmap around making some of this deeply nested object structure more legible, but it relies on what is available for us to consume. The eventual leaf node will always be one of those primitives for now.

hi @gokermu,
thanks for the input. I think my mistake was pointing to the wrong list element (“displayValue”).
At the moment my goal is to convert some existing information I received from NWD (where the information is being saved and we cannot retrieve the original format) in format that can be used in Revit. Sometime I won’t receive an ifc, and dwgs are hard to handle in Revit, so this approach will be benificial.
Given the different structure of the files, I’d like to split the objects at least in different layers with basic information about them, so if I can capture the elements as direct shape is good.

Thanks for the assistance!


hi @jonathon,
my pleasure, thanks for working on these tools, I see the potential across different systems, so I’m exploring the different solution I can provide to my team.
At the moment I’m interested in exchanging all the potential information from NWD to other formats. As you said, depending on the original format type, I might get different data or outputs to extract.

It would be nice maybe for the future for the NWD connector to understand what original format/structure is using, and how this can be feed to other programs.


1 Like

In this first alpha release, the structure of the objects in a commit mirrors the Selection Tree absolutely faithfully. I have had about 8 different ideas for strategies around how best to use the Navisworks Speckle output for data analysis. Some good, some bad.

So with your help, and others, we are in a learning mode so we can assist real workflow needs rather than standing still and handwaving


I have just added some options, not for data, but for location coordination

It will arrive soon in 2.12, I can’t wait to see if it helps out.


@jonathon ,
thanks for the support on this development.
My only feedback is that depending on the tree structure I select, the elements are coming as a whole object and single piece of geometry. Since in some scenario I’d have Revit families or Autocad blocks (see screenshot below), it would be nice to pick the tree heriarchy maybe?


Since i’m expercting to push elements only OUT of Navisworks, I guess this could be achievable (unless Speckle team is considering importing back text and number data IN Navisworks, like some SQL solutions are doing on the market at the moment, but not sure how straightforward would be).


1 Like

It is an extremely good question. I definitely hear you.

I am in learning mode about what is best right now - fair to say I have had A LOT of thoughts about it.

I agree that at ours is a legit expectation of what you might receive and at what granularity. However, I am trying to codify your request among others so to find use “patterns”. The thread above was driven about what I would selfishly need as a data analyst which wasn’t clear even myself having those needs.

The question from a Speckle point of view is answered as we are currently absolutely respecting whatever Navisworks has determined the data structure to be. I am intending to give focus to the semantics of the structure we hold before making modifications.

So, perhaps unhelpful right now, but when we’ve gathered feedback can I call on you to share wisdom considering options we come up with?

hi @jonathon,
i saw your post about Navisworks on my first search, and was comprehensive. There’s no right answer, as Navisworks can deal with tree structure in different ways. What I was trying to achieve is to group the geometry eliminating the last branch level. In my example They basically have same attributes as they’re part of a block element, just are different geometries.
I will do more test to find the best workflow, if there are any improvements in the beta, i’ll be waiting :slight_smile:

1 Like

While 1 model element of one format has a structure, even Revit elements are decimated by Navisworks differently. Groups, types, instances, inserts, categories. Each has peculiarities.

Depending on the Revit family type, properties may be sometimes on the the geometry node, the instance node or the type node. A strategy might be to smush these three levels together.

But to compound this, a single Navisworks file may also have ifc data, civil3d also included and these have different decimation strategies.

I’m working through tutorial ideas how to handle this from a data analysis point of view - I’ll keep you posted.

Hi @jonathon,
As shown previously, the data from Speckle comes into Dynamo as Dictionaries inside dictionaries and so on. It’s difficult to isolate just the geometry (or whatever data you need) without knowing the keys at each dictionary. I’ve been trying to convert the data structure into a list instead and have only gotten as far as 2 List levels. Is there an easier way of accessing certain branches of the data tree?

Thanks @J_Loay i can work something through as an example. My inclination is to do this inside a Python node. My Dynamo game is a little rusty in terms of the ecosystem of packages.

The nested branches represent the many containers in the Navisworks tree structure. Do you know if you need data properties collating from the tree to the Geometry nodes?

Sometimes there is family and type data on those not present on the Geometry.

I guess I’m asking, what is your intent for traversing this in Dynamo?

This really should’ve been raised elsewhere but I had problems with importing a model which was pushed from Navisworks into Revit. Basically nothing came through so I used the Dynamo → Directshape import as a workaround which worked well and I’m guessing that’s how Speckle brings it into Revit anyways. So really I was trying to get the geometry at this stage as a workaround.

Understood. I’m currently working on a series of tutorial content - you’ll have to bear with me in that example.

i got as far as this:

def get_leaf_node_indexes(data, indexes=[], results=[]):
    Recursive function to get all the indexes of the leaf nodes 
    in a nested dictionary.
    :param data: The nested dictionary to traverse.
    :param indexes: The list of indexes to keep track of the current node path.
    :param results: The list of leaf node indexes to return.
    :return: A list of all the indexes of the leaf nodes in the dictionary.
    if isinstance(data, dict):
        for key, value in data.items():
            new_indexes = indexes + [key]
            get_leaf_node_indexes(value, new_indexes, results)
    return results

indexes = get_leaf_node_indexes(data)

where data is the incoming navis content and indexes is the output you can use to extract the leaf nodes (geometry)

data = {
    "level1": {
        "level2a": {
            "level3a": {
                "leaf_node1": "value1"
            "level3b": "leaf_node2"
        "level2b": {
            "level3c": {
                "leaf_node3": {
                    "level4a": "leaf_node4"
        "level2c": "leaf_node5"
    "leaf_node6": "value2"
    ['level1', 'level2a', 'level3a', 'leaf_node1'],
    ['level1', 'level2a', 'level3b'],
    ['level1', 'level2b', 'level3c', 'leaf_node3', 'level4a', 'leaf_node4'],
    ['level1', 'level2c', 'leaf_node5'],

I haven’t thoroughly tested this by using that list of lists to get the value of each leaf node. Perhaps that is a starter hint for you to try yourself, it will depend on your DynamoPython cred.

In the meantime, do you recall the trouble with receiving Navis commits directly?

Apologies for the super late reply!
Thanks for help with the Python, from what I had gathered what you’ve got there is basically what I need to achieve.
As for the Navisworks issue - I would try to receive from the commit, the preview even shows in the UI but literally nothings comes through when I click receive, nor is there any update saying the number of elements successfully processed. I’ll have to try recreate the scenario and hopefully post some screenshots