re-associate edge references after nested layout
This commit is contained in:
parent
7bb56ce153
commit
2fe494f678
1 changed files with 24 additions and 8 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue