Update: hopefully this isn’t premature, but here is a teaser:

This is showing three imported BREP files. These files were generated using my TopoNamingHelper class outside of freecad, using an external tester program I’ve written for development. It looks promising, though, as it appears to have resolved [u]this bug[/u]! The Three shapes, in order, are:
- Original fused shape
- re-computed fused-shape when making cylinder smaller
- re-computed fused-shape when making cylinder taller
I’ve only been able to replicate the bug in FreeCAD v0.17 by making the cylinder shorter, not taller.
Again, hopefully this isn’t too premature, I now have to integrate this into FreeCAD and ensure that the bug fix still holds true there. Even after that, though, there is still a lot of work left to do for topo naming, not the least of which is:
- Figure out how to serialize/deserialize the topo naming data tree
- Add topo naming for other BOPs, and other primitives
- Update legacy FreeCAD code to use topo naming functions in TopoShape
This is still pretty exciting though!
Edit: Here’s what the topological history data tree looks like after the third operation:
0:1 Name: Selection Root Node
--0:1:1 Name: A selected edge. Sub-node is the context Shape, Evolution = SELECTED
----0:1:1:1 , Evolution = SELECTED
------0:1:1:1:1 , Evolution = SELECTED
--------0:1:1:1:1:1 , Evolution = SELECTED
0:2 Name: Base Shape(s)
--0:2:1 Name: Tracked Shape #1
----0:2:1:2 Name: Base Shape(s)
------0:2:1:2:1 Name: Tracked Shape #1
--------0:2:1:2:1:1 Name: Result Shape(s)
----------0:2:1:2:1:1:1 Name: Created Box, Evolution = PRIMITIVE
------------0:2:1:2:1:1:1:1 Name: Generated faces
--------------0:2:1:2:1:1:1:1:1 Name: Top Face, Evolution = PRIMITIVE
--------------0:2:1:2:1:1:1:1:2 Name: Bottom Face, Evolution = PRIMITIVE
--------------0:2:1:2:1:1:1:1:3 Name: Left Face, Evolution = PRIMITIVE
--------------0:2:1:2:1:1:1:1:4 Name: Right Face, Evolution = PRIMITIVE
--------------0:2:1:2:1:1:1:1:5 Name: Front Face, Evolution = PRIMITIVE
--------------0:2:1:2:1:1:1:1:6 Name: Back Face, Evolution = PRIMITIVE
----0:2:1:3 Name: Tool Shapes(s)
------0:2:1:3:1 Name: Tracked Shape #1
--------0:2:1:3:1:1 Name: Result Shape(s)
----------0:2:1:3:1:1:1 Name: Created Cylinder, Evolution = PRIMITIVE
------------0:2:1:3:1:1:1:1 Name: Generated faces
--------------0:2:1:3:1:1:1:1:1 Name: Top Face, Evolution = PRIMITIVE
--------------0:2:1:3:1:1:1:1:2 Name: Lateral Face, Evolution = PRIMITIVE
--------------0:2:1:3:1:1:1:1:3 Name: Bottom Face, Evolution = PRIMITIVE
----0:2:1:4 Name: Result Shape(s)
------0:2:1:4:1 Name: Created Fuse Shape, Evolution = MODIFY
--------0:2:1:4:1:1 Name: Modified faces
----------0:2:1:4:1:1:1 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:2 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:3 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:4 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:5 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:6 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:7 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:8 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:9 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:10 Name: , Evolution = MODIFY
----------0:2:1:4:1:1:11 Name: , Evolution = MODIFY
------0:2:1:4:2 Name: Updated Fuse Shape, Evolution = MODIFY
--------0:2:1:4:2:1 Name: Modified faces
----------0:2:1:4:2:1:1 Name: , Evolution = MODIFY
----------0:2:1:4:2:1:2 Name: , Evolution = MODIFY
----------0:2:1:4:2:1:3 Name: , Evolution = MODIFY
----------0:2:1:4:2:1:4 Name: , Evolution = MODIFY
----------0:2:1:4:2:1:5 Name: , Evolution = MODIFY
----------0:2:1:4:2:1:6 Name: , Evolution = MODIFY
----------0:2:1:4:2:1:7 Name: , Evolution = MODIFY
----------0:2:1:4:2:1:8 Name: , Evolution = MODIFY
--0:2:2 Name: Tracked Shape #2
----0:2:2:2 Name: Base Shape(s)
------0:2:2:2:1 Name: Tracked Shape #1
--------0:2:2:2:1:1 Name: Result Shape(s)
----------0:2:2:2:1:1:1 Name: Created Box, Evolution = PRIMITIVE
------------0:2:2:2:1:1:1:1 Name: Generated faces
--------------0:2:2:2:1:1:1:1:1 Name: Top Face, Evolution = PRIMITIVE
--------------0:2:2:2:1:1:1:1:2 Name: Bottom Face, Evolution = PRIMITIVE
--------------0:2:2:2:1:1:1:1:3 Name: Left Face, Evolution = PRIMITIVE
--------------0:2:2:2:1:1:1:1:4 Name: Right Face, Evolution = PRIMITIVE
--------------0:2:2:2:1:1:1:1:5 Name: Front Face, Evolution = PRIMITIVE
--------------0:2:2:2:1:1:1:1:6 Name: Back Face, Evolution = PRIMITIVE
------0:2:2:2:2 Name: Tracked Shape #2
--------0:2:2:2:2:1 Name: Result Shape(s)
----------0:2:2:2:2:1:1 Name: Created Box, Evolution = PRIMITIVE
------------0:2:2:2:2:1:1:1 Name: Generated faces
--------------0:2:2:2:2:1:1:1:1 Name: Top Face, Evolution = PRIMITIVE
--------------0:2:2:2:2:1:1:1:2 Name: Bottom Face, Evolution = PRIMITIVE
--------------0:2:2:2:2:1:1:1:3 Name: Left Face, Evolution = PRIMITIVE
--------------0:2:2:2:2:1:1:1:4 Name: Right Face, Evolution = PRIMITIVE
--------------0:2:2:2:2:1:1:1:5 Name: Front Face, Evolution = PRIMITIVE
--------------0:2:2:2:2:1:1:1:6 Name: Back Face, Evolution = PRIMITIVE
----0:2:2:3 Name: Tool Shapes(s)
------0:2:2:3:1 Name: Tracked Shape #1
--------0:2:2:3:1:1 Name: Result Shape(s)
----------0:2:2:3:1:1:1 Name: Created Cylinder, Evolution = PRIMITIVE
------------0:2:2:3:1:1:1:1 Name: Generated faces
--------------0:2:2:3:1:1:1:1:1 Name: Top Face, Evolution = PRIMITIVE
--------------0:2:2:3:1:1:1:1:2 Name: Lateral Face, Evolution = PRIMITIVE
--------------0:2:2:3:1:1:1:1:3 Name: Bottom Face, Evolution = PRIMITIVE
----------0:2:2:3:1:1:2 Name: Updated Cylinder, Evolution = MODIFY
------------0:2:2:3:1:1:2:1 Name: Modified faces
--------------0:2:2:3:1:1:2:1:1 Name: Top Face, Evolution = MODIFY
--------------0:2:2:3:1:1:2:1:2 Name: Lateral Face, Evolution = MODIFY
--------------0:2:2:3:1:1:2:1:3 Name: Bottom Face, Evolution = MODIFY
------0:2:2:3:2 Name: Tracked Shape #2
--------0:2:2:3:2:1 Name: Result Shape(s)
----------0:2:2:3:2:1:1 Name: Created Cylinder, Evolution = PRIMITIVE
------------0:2:2:3:2:1:1:1 Name: Generated faces
--------------0:2:2:3:2:1:1:1:1 Name: Top Face, Evolution = PRIMITIVE
--------------0:2:2:3:2:1:1:1:2 Name: Lateral Face, Evolution = PRIMITIVE
--------------0:2:2:3:2:1:1:1:3 Name: Bottom Face, Evolution = PRIMITIVE
----------0:2:2:3:2:1:2 Name: Updated Cylinder, Evolution = MODIFY
------------0:2:2:3:2:1:2:1 Name: Modified faces
--------------0:2:2:3:2:1:2:1:1 Name: Top Face, Evolution = MODIFY
--------------0:2:2:3:2:1:2:1:2 Name: Lateral Face, Evolution = MODIFY
--------------0:2:2:3:2:1:2:1:3 Name: Bottom Face, Evolution = MODIFY
----------0:2:2:3:2:1:3 Name: Updated Cylinder, Evolution = MODIFY
------------0:2:2:3:2:1:3:1 Name: Modified faces
--------------0:2:2:3:2:1:3:1:1 Name: Top Face, Evolution = MODIFY
--------------0:2:2:3:2:1:3:1:2 Name: Lateral Face, Evolution = MODIFY
--------------0:2:2:3:2:1:3:1:3 Name: Bottom Face, Evolution = MODIFY
----0:2:2:4 Name: Result Shape(s)
------0:2:2:4:1 Name: Created Fuse Shape, Evolution = MODIFY
--------0:2:2:4:1:1 Name: Modified faces
----------0:2:2:4:1:1:1 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:2 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:3 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:4 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:5 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:6 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:7 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:8 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:9 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:10 Name: , Evolution = MODIFY
----------0:2:2:4:1:1:11 Name: , Evolution = MODIFY
------0:2:2:4:2 Name: Updated Fuse Shape, Evolution = MODIFY
--------0:2:2:4:2:1 Name: Modified faces
----------0:2:2:4:2:1:1 Name: , Evolution = MODIFY
----------0:2:2:4:2:1:2 Name: , Evolution = MODIFY
----------0:2:2:4:2:1:3 Name: , Evolution = MODIFY
----------0:2:2:4:2:1:4 Name: , Evolution = MODIFY
----------0:2:2:4:2:1:5 Name: , Evolution = MODIFY
----------0:2:2:4:2:1:6 Name: , Evolution = MODIFY
----------0:2:2:4:2:1:7 Name: , Evolution = MODIFY
----------0:2:2:4:2:1:8 Name: , Evolution = MODIFY
------0:2:2:4:3 Name: Updated Fuse Shape, Evolution = MODIFY
--------0:2:2:4:3:1 Name: Modified faces
----------0:2:2:4:3:1:1 Name: , Evolution = MODIFY
----------0:2:2:4:3:1:2 Name: , Evolution = MODIFY
----------0:2:2:4:3:1:3 Name: , Evolution = MODIFY
----------0:2:2:4:3:1:4 Name: , Evolution = MODIFY
----------0:2:2:4:3:1:5 Name: , Evolution = MODIFY
----------0:2:2:4:3:1:6 Name: , Evolution = MODIFY
----------0:2:2:4:3:1:7 Name: , Evolution = MODIFY
----------0:2:2:4:3:1:8 Name: , Evolution = MODIFY
0:4 Name: Result Shape(s)
--0:4:1 Name: Created Fillet Node, Evolution = MODIFY
----0:4:1:1 Name: Modified faces
------0:4:1:1:1 Name: Modified Faces, Evolution = MODIFY
------0:4:1:1:2 Name: Modified Faces, Evolution = MODIFY
------0:4:1:1:3 Name: Modified Faces, Evolution = MODIFY
------0:4:1:1:4 Name: Modified Faces, Evolution = MODIFY
----0:4:1:2 Name: Faces generated from Edge
------0:4:1:2:1 Name: Generated from Edge, Evolution = GENERATED
--0:4:2 Name: Updated Fillet Node, Evolution = MODIFY
----0:4:2:1 Name: Modified faces
------0:4:2:1:1 Name: Modified Faces, Evolution = MODIFY
------0:4:2:1:2 Name: Modified Faces, Evolution = MODIFY
------0:4:2:1:3 Name: Modified Faces, Evolution = MODIFY
------0:4:2:1:4 Name: Modified Faces, Evolution = MODIFY
----0:4:2:2 Name: Faces generated from Edge
------0:4:2:2:1 Name: Generated from Edge, Evolution = GENERATED
--0:4:3 Name: Updated Fillet Node, Evolution = MODIFY
----0:4:3:1 Name: Modified faces
------0:4:3:1:1 Name: Modified Faces, Evolution = MODIFY
------0:4:3:1:2 Name: Modified Faces, Evolution = MODIFY
------0:4:3:1:3 Name: Modified Faces, Evolution = MODIFY
------0:4:3:1:4 Name: Modified Faces, Evolution = MODIFY
----0:4:3:2 Name: Faces generated from Edge
------0:4:3:2:1 Name: Generated from Edge, Evolution = GENERATED
It is rather monstrous :-\ I’m a bit worried about what performance will look like on larger assemblies/parts, but I suppose time will tell…