re-associate edge references after nested layout

This commit is contained in:
Gavin Nishizawa 2023-09-28 16:47:42 -07:00
parent 7bb56ce153
commit 2fe494f678
No known key found for this signature in database
GPG key ID: AE3B177777CE55CD

View file

@ -234,27 +234,43 @@ func LayoutNested(ctx context.Context, g *d2graph.Graph, graphInfo GraphInfo, co
} }
} }
idToObj := make(map[string]*d2graph.Object)
for _, o := range g.Objects {
idToObj[o.AbsID()] = o
}
// With the layout set, inject all the extracted graphs // With the layout set, inject all the extracted graphs
for _, id := range extractedOrder { for _, id := range extractedOrder {
nestedGraph := extracted[id] nestedGraph := extracted[id]
// we have to find the object by ID because coreLayout can replace the Objects in graph // we have to find the object by ID because coreLayout can replace the Objects in graph
var obj *d2graph.Object obj, exists := idToObj[id]
for _, o := range g.Objects { if !exists {
if o.AbsID() == id {
obj = o
break
}
}
if obj == nil {
return fmt.Errorf("could not find object %#v after layout", id) return fmt.Errorf("could not find object %#v after layout", id)
} }
InjectNested(obj, nestedGraph, true) InjectNested(obj, nestedGraph, true)
PositionNested(obj, nestedGraph) PositionNested(obj, nestedGraph)
} }
// update map with injected objects
for _, o := range g.Objects {
idToObj[o.AbsID()] = o
}
// Restore cross-graph edges and route them // Restore cross-graph edges and route them
g.Edges = append(g.Edges, extractedEdges...) g.Edges = append(g.Edges, extractedEdges...)
for _, e := range extractedEdges { for _, e := range extractedEdges {
// update object references
src, exists := idToObj[e.Src.AbsID()]
if !exists {
return fmt.Errorf("could not find object %#v after layout", e.Src.AbsID())
}
e.Src = src
dst, exists := idToObj[e.Dst.AbsID()]
if !exists {
return fmt.Errorf("could not find object %#v after layout", e.Dst.AbsID())
}
e.Dst = dst
// simple straight line edge routing when going across graphs // simple straight line edge routing when going across graphs
e.Route = []*geo.Point{e.Src.Center(), e.Dst.Center()} e.Route = []*geo.Point{e.Src.Center(), e.Dst.Center()}
e.TraceToShape(e.Route, 0, 1) e.TraceToShape(e.Route, 0, 1)