Topological tracking

Hey everyone,

Actually, we had a Speckle question related to the Topsolid connector (and all futur parametric software connector) :
How to identify the topological elements of a geometry (vertex, edge, face) to keep track of the modifications in Speckle ?

Thanks for your ideas and suggestions!

@ahmedwael94 & @Tamu

Hey @Tamu - Welcome to the Speckle Community.

Are you looking to track changes to version-to-version commit in Speckle :speckle:, or is there something specific to TopSolid models you want to track?

If you can give some idea of the use case, we can better understand the limits of how to try and find a solution. :shell:

Hey @jonathon ! Thanks for your feedback.

Our question is more about the identification of topological elements of geometry.
For Example, how to know in a newer version of a Brep what Faces/Edges/Vertices have changed ?

We have a use case in TopSolid (or any design tool parametric software) described here :

  1. We receive a cube using Speckle
  2. We color one face in TopSolid
  3. We receive a new version of the cube and we want to be able to identify the same face so that the color stays

So our question is : Is there an identification mechanism for the topological elements ? Like tokens or ids ?

We added an illustration and some description in the link here : Speckle.TopSolid wiki

Hi there @Tamu!

Currently, our BREP class does not support per-feature IDs, and it may be a tricky thing to add :sweat_smile:

The brep is serialised in a monolithic json with all it’s children info converted into flat lists of values (for perfomance reasons), so even if they had IDs in Rhino, those would be lost.

But you use-case is interesting! Maybe Jonathon has some possible ideas?

I understand the question, and very much welcome any contribution @ahmedwael94 and Tomas can make :speckle: :slight_smile:

Thank you @jonathon and @AlanRynne !!
Things are way clearer for us now :raised_hands:t3:
@Tamu and I will discuss and see if we come up with something to propose soon :grin:

1 Like

Some news with some results !

We have chosen to follow the geometry of sending the identity of each faces, edges and vertices via a listing of IDs (Moniker)

"alias": {
    // List of faces with are Moniker* (sorting matters)
    "Faces": [
        "F142(s132(7),0,1)",
    ],
    // List of edges with are Moniker* (sorting matters
    "Edges": [
        "E159.1(F142(s132(7),0,1),F159(1),0)",
    ],
    // List of vertices with are Moniker* and a hash containing 
    // all the Monikers* of the faces and edges that are connected
    "Vertices": [
        {
            "Moniker": "V159(v149(5),2)",
            "Hash": "00F54800373471341CF5FE075B3768CD"
        },
    ]

// * A Moniker is the geometry modification history,
//   it can be compared to a unique identifier. 

I updated the wiki with a suggestion for the data model.

Geometry-Tracking

Data Logic

  1. Send : Sending Alias with each object with the commit
  2. Receive : Upon receiving data check if an alias exists and create the correct geometry structure

Next step !

The next challenge is to make compatibility with Revit (and the other connectors) !

Any ideas are welcome or help to debug in Revit ! :rocket:

4 Likes