Handle edges to/from descendants

This commit is contained in:
Júlio César Batista 2022-12-03 09:38:08 -08:00
parent 9776d856fa
commit e53c97ebec
No known key found for this signature in database
GPG key ID: 10C4B861BF314878
28 changed files with 1849 additions and 341 deletions

View file

@ -37,7 +37,10 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte
continue
}
sd := layoutSequenceDiagram(g, obj)
sd, err := layoutSequenceDiagram(g, obj)
if err != nil {
return err
}
obj.Children = make(map[string]*d2graph.Object)
obj.ChildrenArray = nil
obj.Box = geo.NewBox(nil, sd.getWidth(), sd.getHeight())
@ -73,7 +76,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte
}
// layoutSequenceDiagram finds the edges inside the sequence diagram and performs the layout on the object descendants
func layoutSequenceDiagram(g *d2graph.Graph, obj *d2graph.Object) *sequenceDiagram {
func layoutSequenceDiagram(g *d2graph.Graph, obj *d2graph.Object) (*sequenceDiagram, error) {
var edges []*d2graph.Edge
for _, edge := range g.Edges {
// both Src and Dst must be inside the sequence diagram
@ -83,8 +86,8 @@ func layoutSequenceDiagram(g *d2graph.Graph, obj *d2graph.Object) *sequenceDiagr
}
sd := newSequenceDiagram(obj.ChildrenArray, edges)
sd.layout()
return sd
err := sd.layout()
return sd, err
}
func getLayoutEdges(g *d2graph.Graph, toRemove map[*d2graph.Edge]struct{}) ([]*d2graph.Edge, map[string]int) {

View file

@ -180,14 +180,17 @@ func TestSpansSequenceDiagram(t *testing.T) {
Shape: d2graph.Scalar{Value: shape.PERSON_TYPE},
}
a_t1 := a.EnsureChild([]string{"t1"})
a_t1.Box = geo.NewBox(nil, 100, 100)
a_t1.Attributes = d2graph.Attributes{
Shape: d2graph.Scalar{Value: shape.DIAMOND_TYPE},
Label: d2graph.Scalar{Value: "label"},
}
a_t2 := a.EnsureChild([]string{"t2"})
a_t2.Box = geo.NewBox(nil, 100, 100)
b := g.Root.EnsureChild([]string{"b"})
b.Box = geo.NewBox(nil, 30, 30)
b_t1 := b.EnsureChild([]string{"t1"})
b_t1.Box = geo.NewBox(nil, 100, 100)
g.Edges = []*d2graph.Edge{
{
@ -303,9 +306,11 @@ func TestNestedSequenceDiagrams(t *testing.T) {
a.Box = geo.NewBox(nil, 100, 100)
a.Attributes.Shape = d2graph.Scalar{Value: shape.PERSON_TYPE}
a_t1 := a.EnsureChild([]string{"t1"})
a_t1.Box = geo.NewBox(nil, 100, 100)
b := container.EnsureChild([]string{"b"})
b.Box = geo.NewBox(nil, 30, 30)
b_t1 := b.EnsureChild([]string{"t1"})
b_t1.Box = geo.NewBox(nil, 100, 100)
c := g.Root.EnsureChild([]string{"c"})
c.Box = geo.NewBox(nil, 100, 100)
@ -419,3 +424,54 @@ func TestSelfEdges(t *testing.T) {
t.Fatalf("expected route height to be %.f5, got %.5f", MIN_MESSAGE_DISTANCE, route[3].Y-route[0].Y)
}
}
func TestSequenceToDescendant(t *testing.T) {
g := d2graph.NewGraph(nil)
g.Root.Attributes.Shape = d2graph.Scalar{Value: d2target.ShapeSequenceDiagram}
a := g.Root.EnsureChild([]string{"a"})
a.Box = geo.NewBox(nil, 100, 100)
a.Attributes = d2graph.Attributes{
Shape: d2graph.Scalar{Value: shape.PERSON_TYPE},
}
a_t1 := a.EnsureChild([]string{"t1"})
a_t1.Box = geo.NewBox(nil, 16, 80)
g.Edges = []*d2graph.Edge{
{
Src: a,
Dst: a_t1,
Index: 0,
}, {
Src: a_t1,
Dst: a,
Index: 0,
},
}
ctx := log.WithTB(context.Background(), t, nil)
Layout(ctx, g, func(ctx context.Context, g *d2graph.Graph) error {
return nil
})
route1 := g.Edges[0].Route
if len(route1) != 4 {
t.Fatal("expected route with 4 points")
}
if route1[0].X != a.Center().X {
t.Fatal("expected route to start at `a` lifeline")
}
if route1[3].X != a_t1.TopLeft.X+a_t1.Width {
t.Fatal("expected route to end at `a.t1` right side")
}
route2 := g.Edges[1].Route
if len(route2) != 4 {
t.Fatal("expected route with 4 points")
}
if route2[0].X != a_t1.TopLeft.X+a_t1.Width {
t.Fatal("expected route to start at `a.t1` right side")
}
if route2[3].X != a.Center().X {
t.Fatal("expected route to end at `a` lifeline")
}
}

View file

@ -4,6 +4,7 @@ import (
"fmt"
"math"
"sort"
"strings"
"oss.terrastruct.com/util-go/go2"
@ -26,9 +27,8 @@ type sequenceDiagram struct {
objectRank map[*d2graph.Object]int
// keep track of the first and last message of a given actor/span
// the message rank is the order in which it appears from top to bottom
minMessageRank map[*d2graph.Object]int
maxMessageRank map[*d2graph.Object]int
firstMessage map[*d2graph.Object]*d2graph.Edge
lastMessage map[*d2graph.Object]*d2graph.Edge
messageYStep float64
actorXStep float64
@ -42,8 +42,8 @@ func newSequenceDiagram(actors []*d2graph.Object, messages []*d2graph.Edge) *seq
spans: nil,
lifelines: nil,
objectRank: make(map[*d2graph.Object]int),
minMessageRank: make(map[*d2graph.Object]int),
maxMessageRank: make(map[*d2graph.Object]int),
firstMessage: make(map[*d2graph.Object]*d2graph.Edge),
lastMessage: make(map[*d2graph.Object]*d2graph.Edge),
messageYStep: MIN_MESSAGE_DISTANCE,
actorXStep: MIN_ACTOR_DISTANCE,
maxActorHeight: 0.,
@ -76,17 +76,27 @@ func newSequenceDiagram(actors []*d2graph.Object, messages []*d2graph.Edge) *seq
}
}
for rank, message := range sd.messages {
for _, message := range sd.messages {
sd.messageYStep = math.Max(sd.messageYStep, float64(message.LabelDimensions.Height))
sd.setMinMaxMessageRank(message.Src, rank)
sd.setMinMaxMessageRank(message.Dst, rank)
// ensures that long labels, spanning over multiple actors, don't make for large gaps between actors
// by distributing the label length across the actors rank difference
rankDiff := math.Abs(float64(sd.objectRank[message.Src]) - float64(sd.objectRank[message.Dst]))
if rankDiff != 0 {
// rankDiff = 0 for self edges
distributedLabelWidth := float64(message.LabelDimensions.Width) / rankDiff
sd.actorXStep = math.Max(sd.actorXStep, distributedLabelWidth+HORIZONTAL_PAD)
}
sd.lastMessage[message.Src] = message
if _, exists := sd.firstMessage[message.Src]; !exists {
sd.firstMessage[message.Src] = message
}
sd.lastMessage[message.Dst] = message
if _, exists := sd.firstMessage[message.Dst]; !exists {
sd.firstMessage[message.Dst] = message
}
}
sd.messageYStep += VERTICAL_PAD
@ -98,21 +108,15 @@ func newSequenceDiagram(actors []*d2graph.Object, messages []*d2graph.Edge) *seq
return sd
}
func (sd *sequenceDiagram) setMinMaxMessageRank(actor *d2graph.Object, rank int) {
if minRank, exists := sd.minMessageRank[actor]; exists {
sd.minMessageRank[actor] = go2.IntMin(minRank, rank)
} else {
sd.minMessageRank[actor] = rank
}
sd.maxMessageRank[actor] = go2.IntMax(sd.maxMessageRank[actor], rank)
}
func (sd *sequenceDiagram) layout() {
func (sd *sequenceDiagram) layout() error {
sd.placeActors()
if err := sd.routeMessages(); err != nil {
return err
}
sd.placeSpans()
sd.routeMessages()
sd.adjustRouteEndpoints()
sd.addLifelineEdges()
return nil
}
// placeActors places actors bottom aligned, side by side
@ -210,12 +214,21 @@ func (sd *sequenceDiagram) placeSpans() {
// finds the position if there are messages to this span
minMessageY := math.Inf(1)
if minRank, exists := sd.minMessageRank[span]; exists {
minMessageY = sd.getMessageY(minRank)
if firstMessage, exists := sd.firstMessage[span]; exists {
// needs to check Src/Dst because of self-edges or edges to/from descendants
if span == firstMessage.Src {
minMessageY = firstMessage.Route[0].Y
} else {
minMessageY = firstMessage.Route[len(firstMessage.Route)-1].Y
}
}
maxMessageY := math.Inf(-1)
if maxRank, exists := sd.maxMessageRank[span]; exists {
maxMessageY = sd.getMessageY(maxRank)
if lastMessage, exists := sd.lastMessage[span]; exists {
if span == lastMessage.Src {
maxMessageY = lastMessage.Route[0].Y
} else {
maxMessageY = lastMessage.Route[len(lastMessage.Route)-1].Y
}
}
// if it is the same as the child top left, add some padding
@ -237,40 +250,36 @@ func (sd *sequenceDiagram) placeSpans() {
}
}
// routeMessages routes horizontal edges (messages) from Src to Dst
func (sd *sequenceDiagram) routeMessages() {
for rank, message := range sd.messages {
// routeMessages routes horizontal edges (messages) from Src to Dst lifeline (actor/span center)
// in another step, routes are adjusted to spans borders when necessary
func (sd *sequenceDiagram) routeMessages() error {
startY := sd.maxActorHeight + sd.messageYStep
for _, message := range sd.messages {
message.ZIndex = 2
isLeftToRight := message.Src.TopLeft.X < message.Dst.TopLeft.X
var startX, endX float64
if startCenter := getCenter(message.Src); startCenter != nil {
startX = startCenter.X
} else {
return fmt.Errorf("could not find center of %s", message.Src.AbsID())
}
if endCenter := getCenter(message.Dst); endCenter != nil {
endX = endCenter.X
} else {
return fmt.Errorf("could not find center of %s", message.Dst.AbsID())
}
isLeftToRight := startX < endX
isToDescendant := strings.HasPrefix(message.Dst.AbsID(), message.Src.AbsID())
isFromDescendant := strings.HasPrefix(message.Src.AbsID(), message.Dst.AbsID())
isSelfMessage := message.Src == message.Dst
// finds the proper anchor point based on the message direction
var startX, endX float64
if sd.isActor(message.Src) {
startX = message.Src.Center().X
} else if isLeftToRight {
startX = message.Src.TopLeft.X + message.Src.Width
} else {
startX = message.Src.TopLeft.X
}
if isSelfMessage {
endX = startX
} else if sd.isActor(message.Dst) {
endX = message.Dst.Center().X
} else if isLeftToRight {
endX = message.Dst.TopLeft.X
} else {
endX = message.Dst.TopLeft.X + message.Dst.Width
}
startY := sd.getMessageY(rank)
if isSelfMessage {
if isSelfMessage || isToDescendant || isFromDescendant {
midX := startX + MIN_MESSAGE_DISTANCE
endY := startY + MIN_MESSAGE_DISTANCE
message.Route = []*geo.Point{
geo.NewPoint(startX, startY),
geo.NewPoint(startX+MIN_MESSAGE_DISTANCE, startY),
geo.NewPoint(startX+MIN_MESSAGE_DISTANCE, startY+MIN_MESSAGE_DISTANCE),
geo.NewPoint(startX, startY+MIN_MESSAGE_DISTANCE),
geo.NewPoint(midX, startY),
geo.NewPoint(midX, endY),
geo.NewPoint(endX, endY),
}
} else {
message.Route = []*geo.Point{
@ -278,9 +287,10 @@ func (sd *sequenceDiagram) routeMessages() {
geo.NewPoint(endX, startY),
}
}
startY += sd.messageYStep
if message.Attributes.Label.Value != "" {
if isSelfMessage {
if isSelfMessage || isFromDescendant || isToDescendant {
message.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
} else if isLeftToRight {
message.LabelPosition = go2.Pointer(string(label.OutsideTopCenter))
@ -290,11 +300,39 @@ func (sd *sequenceDiagram) routeMessages() {
}
}
}
return nil
}
func (sd *sequenceDiagram) getMessageY(rank int) float64 {
// +1 so that the first message has the top padding for its label
return ((float64(rank) + 1.) * sd.messageYStep) + sd.maxActorHeight
func getCenter(obj *d2graph.Object) *geo.Point {
if obj == nil {
return nil
} else if obj.TopLeft != nil {
return obj.Center()
}
return getCenter(obj.Parent)
}
// adjustRouteEndpoints adjust the first and last points of message routes when they are spans
// routeMessages() will route to the actor lifelife as a reference point and this function
// adjust to span width when necessary
func (sd *sequenceDiagram) adjustRouteEndpoints() {
for _, message := range sd.messages {
route := message.Route
if !sd.isActor(message.Src) {
if sd.objectRank[message.Src] <= sd.objectRank[message.Dst] {
route[0].X += message.Src.Width / 2.
} else {
route[0].X -= message.Src.Width / 2.
}
}
if !sd.isActor(message.Dst) {
if sd.objectRank[message.Src] < sd.objectRank[message.Dst] {
route[len(route)-1].X -= message.Dst.Width / 2.
} else {
route[len(route)-1].X += message.Dst.Width / 2.
}
}
}
}
func (sd *sequenceDiagram) isActor(obj *d2graph.Object) bool {
@ -308,8 +346,7 @@ func (sd *sequenceDiagram) getWidth() float64 {
}
func (sd *sequenceDiagram) getHeight() float64 {
// the layout is always placed starting at 0, so the height is just the last message
return sd.getMessageY(len(sd.messages))
return sd.lifelines[0].Route[1].Y
}
func (sd *sequenceDiagram) shift(tl *geo.Point) {

View file

@ -1325,6 +1325,16 @@ s -> t`,
z -> y
z -> z: hello
`,
}, {
name: "sequence_diagram_self_edges",
script: `shape: sequence_diagram
a -> a: a self edge here
a -> b: between actors
b -> b.1: to descendant
b.1 -> b.1.2: to deeper descendant
b.1.2 -> b: to parent
b -> a.1.2: actor
a.1 -> b.3`,
},
}

View file

@ -1590,7 +1590,7 @@
},
{
"x": 76.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1629,7 +1629,7 @@
},
{
"x": 485,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1668,7 +1668,7 @@
},
{
"x": 937.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1707,7 +1707,7 @@
},
{
"x": 1404.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1746,7 +1746,7 @@
},
{
"x": 1849,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1785,7 +1785,7 @@
},
{
"x": 2279,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1824,7 +1824,7 @@
},
{
"x": 2686,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1863,7 +1863,7 @@
},
{
"x": 3093,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1902,7 +1902,7 @@
},
{
"x": 3516,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1941,7 +1941,7 @@
},
{
"x": 3939,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1980,7 +1980,7 @@
},
{
"x": 4346,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2019,7 +2019,7 @@
},
{
"x": 4753,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2058,7 +2058,7 @@
},
{
"x": 5172.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2097,7 +2097,7 @@
},
{
"x": 5608.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2136,7 +2136,7 @@
},
{
"x": 6034,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2175,7 +2175,7 @@
},
{
"x": 6448.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2214,7 +2214,7 @@
},
{
"x": 6868.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2253,7 +2253,7 @@
},
{
"x": 7314.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2292,7 +2292,7 @@
},
{
"x": 7753,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2331,7 +2331,7 @@
},
{
"x": 8190,
"y": 2834
"y": 2784
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 991 KiB

After

Width:  |  Height:  |  Size: 991 KiB

View file

@ -1590,7 +1590,7 @@
},
{
"x": 76.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1629,7 +1629,7 @@
},
{
"x": 485,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1668,7 +1668,7 @@
},
{
"x": 937.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1707,7 +1707,7 @@
},
{
"x": 1404.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1746,7 +1746,7 @@
},
{
"x": 1849,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1785,7 +1785,7 @@
},
{
"x": 2279,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1824,7 +1824,7 @@
},
{
"x": 2686,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1863,7 +1863,7 @@
},
{
"x": 3093,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1902,7 +1902,7 @@
},
{
"x": 3516,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1941,7 +1941,7 @@
},
{
"x": 3939,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -1980,7 +1980,7 @@
},
{
"x": 4346,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2019,7 +2019,7 @@
},
{
"x": 4753,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2058,7 +2058,7 @@
},
{
"x": 5172.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2097,7 +2097,7 @@
},
{
"x": 5608.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2136,7 +2136,7 @@
},
{
"x": 6034,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2175,7 +2175,7 @@
},
{
"x": 6448.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2214,7 +2214,7 @@
},
{
"x": 6868.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2253,7 +2253,7 @@
},
{
"x": 7314.5,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2292,7 +2292,7 @@
},
{
"x": 7753,
"y": 2834
"y": 2784
}
],
"animated": false,
@ -2331,7 +2331,7 @@
},
{
"x": 8190,
"y": 2834
"y": 2784
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 991 KiB

After

Width:  |  Height:  |  Size: 991 KiB

View file

@ -1265,7 +1265,7 @@
},
{
"x": 75,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1304,7 +1304,7 @@
},
{
"x": 500,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1343,7 +1343,7 @@
},
{
"x": 925,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1382,7 +1382,7 @@
},
{
"x": 1343,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1421,7 +1421,7 @@
},
{
"x": 1766,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1460,7 +1460,7 @@
},
{
"x": 2194.5,
"y": 1490
"y": 1440
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 332 KiB

After

Width:  |  Height:  |  Size: 332 KiB

View file

@ -1265,7 +1265,7 @@
},
{
"x": 75,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1304,7 +1304,7 @@
},
{
"x": 500,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1343,7 +1343,7 @@
},
{
"x": 925,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1382,7 +1382,7 @@
},
{
"x": 1343,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1421,7 +1421,7 @@
},
{
"x": 1766,
"y": 1490
"y": 1440
}
],
"animated": false,
@ -1460,7 +1460,7 @@
},
{
"x": 2194.5,
"y": 1490
"y": 1440
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 332 KiB

After

Width:  |  Height:  |  Size: 332 KiB

View file

@ -0,0 +1,658 @@
{
"name": "",
"shapes": [
{
"id": "a",
"type": "",
"pos": {
"x": 0,
"y": 50
},
"width": 150,
"height": 169,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#E3E9FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 12,
"labelHeight": 26,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "b",
"type": "",
"pos": {
"x": 400,
"y": 52
},
"width": 150,
"height": 167,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#E3E9FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 13,
"labelHeight": 26,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "b.1",
"type": "rectangle",
"pos": {
"x": 469,
"y": 673
},
"width": 12,
"height": 228,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#EDF0FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 24,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 15,
"labelHeight": 36,
"zIndex": 1,
"level": 2
},
{
"id": "b.1.2",
"type": "rectangle",
"pos": {
"x": 465,
"y": 803
},
"width": 20,
"height": 82,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#F7F8FE",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 13,
"labelHeight": 26,
"zIndex": 1,
"level": 3
},
{
"id": "a.1",
"type": "rectangle",
"pos": {
"x": 69,
"y": 967
},
"width": 12,
"height": 178,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#EDF0FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 24,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 15,
"labelHeight": 36,
"zIndex": 1,
"level": 2
},
{
"id": "a.1.2",
"type": "rectangle",
"pos": {
"x": 65,
"y": 983
},
"width": 20,
"height": 80,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#F7F8FE",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 13,
"labelHeight": 26,
"zIndex": 1,
"level": 3
},
{
"id": "b.3",
"type": "rectangle",
"pos": {
"x": 469,
"y": 1113
},
"width": 12,
"height": 80,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#EDF0FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 13,
"labelHeight": 26,
"zIndex": 1,
"level": 2
}
],
"connections": [
{
"id": "(a -> a)[0]",
"src": "a",
"srcArrow": "none",
"srcLabel": "",
"dst": "a",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "a self edge here",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 103,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 75,
"y": 349
},
{
"x": 155,
"y": 349
},
{
"x": 155,
"y": 429
},
{
"x": 75,
"y": 429
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(a -> b)[0]",
"src": "a",
"srcArrow": "none",
"srcLabel": "",
"dst": "b",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "between actors",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 102,
"labelHeight": 21,
"labelPosition": "OUTSIDE_TOP_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 75,
"y": 479
},
{
"x": 475,
"y": 479
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(b -> b.1)[0]",
"src": "b",
"srcArrow": "none",
"srcLabel": "",
"dst": "b.1",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "to descendant",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 94,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 475,
"y": 609
},
{
"x": 555,
"y": 609
},
{
"x": 555,
"y": 689
},
{
"x": 481,
"y": 689
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "b.(1 -> 1.2)[0]",
"src": "b.1",
"srcArrow": "none",
"srcLabel": "",
"dst": "b.1.2",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "to deeper descendant",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 143,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 481,
"y": 739
},
{
"x": 555,
"y": 739
},
{
"x": 555,
"y": 819
},
{
"x": 485,
"y": 819
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(b.1.2 -> b)[0]",
"src": "b.1.2",
"srcArrow": "none",
"srcLabel": "",
"dst": "b",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "to parent",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 62,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 485,
"y": 869
},
{
"x": 555,
"y": 869
},
{
"x": 555,
"y": 949
},
{
"x": 475,
"y": 949
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(b -> a.1.2)[0]",
"src": "b",
"srcArrow": "none",
"srcLabel": "",
"dst": "a.1.2",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "actor",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 36,
"labelHeight": 21,
"labelPosition": "OUTSIDE_BOTTOM_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 475,
"y": 999
},
{
"x": 85,
"y": 999
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(a.1 -> b.3)[0]",
"src": "a.1",
"srcArrow": "none",
"srcLabel": "",
"dst": "b.3",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"route": [
{
"x": 81,
"y": 1129
},
{
"x": 469,
"y": 1129
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(a -- )[0]",
"src": "a",
"srcArrow": "none",
"srcLabel": "",
"dst": "a-lifeline-end-2251863791",
"dstArrow": "none",
"dstLabel": "",
"opacity": 1,
"strokeDash": 8,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"route": [
{
"x": 75,
"y": 219
},
{
"x": 75,
"y": 1209
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
},
{
"id": "(b -- )[0]",
"src": "b",
"srcArrow": "none",
"srcLabel": "",
"dst": "b-lifeline-end-668380428",
"dstArrow": "none",
"dstLabel": "",
"opacity": 1,
"strokeDash": 8,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"route": [
{
"x": 475,
"y": 219
},
{
"x": 475,
"y": 1209
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
}
]
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 472 KiB

View file

@ -0,0 +1,658 @@
{
"name": "",
"shapes": [
{
"id": "a",
"type": "",
"pos": {
"x": 0,
"y": 50
},
"width": 150,
"height": 169,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#E3E9FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "a",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 12,
"labelHeight": 26,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "b",
"type": "",
"pos": {
"x": 400,
"y": 52
},
"width": 150,
"height": 167,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#E3E9FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "b",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 13,
"labelHeight": 26,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"zIndex": 0,
"level": 1
},
{
"id": "b.1",
"type": "rectangle",
"pos": {
"x": 469,
"y": 673
},
"width": 12,
"height": 228,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#EDF0FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 24,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 15,
"labelHeight": 36,
"zIndex": 1,
"level": 2
},
{
"id": "b.1.2",
"type": "rectangle",
"pos": {
"x": 465,
"y": 803
},
"width": 20,
"height": 82,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#F7F8FE",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 13,
"labelHeight": 26,
"zIndex": 1,
"level": 3
},
{
"id": "a.1",
"type": "rectangle",
"pos": {
"x": 69,
"y": 967
},
"width": 12,
"height": 178,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#EDF0FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 24,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 15,
"labelHeight": 36,
"zIndex": 1,
"level": 2
},
{
"id": "a.1.2",
"type": "rectangle",
"pos": {
"x": 65,
"y": 983
},
"width": 20,
"height": 80,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#F7F8FE",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 13,
"labelHeight": 26,
"zIndex": 1,
"level": 3
},
{
"id": "b.3",
"type": "rectangle",
"pos": {
"x": 469,
"y": 1113
},
"width": 12,
"height": 80,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#EDF0FD",
"stroke": "#0D32B2",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"fields": null,
"methods": null,
"columns": null,
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 13,
"labelHeight": 26,
"zIndex": 1,
"level": 2
}
],
"connections": [
{
"id": "(a -> a)[0]",
"src": "a",
"srcArrow": "none",
"srcLabel": "",
"dst": "a",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "a self edge here",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 103,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 75,
"y": 349
},
{
"x": 155,
"y": 349
},
{
"x": 155,
"y": 429
},
{
"x": 75,
"y": 429
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(a -> b)[0]",
"src": "a",
"srcArrow": "none",
"srcLabel": "",
"dst": "b",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "between actors",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 102,
"labelHeight": 21,
"labelPosition": "OUTSIDE_TOP_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 75,
"y": 479
},
{
"x": 475,
"y": 479
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(b -> b.1)[0]",
"src": "b",
"srcArrow": "none",
"srcLabel": "",
"dst": "b.1",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "to descendant",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 94,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 475,
"y": 609
},
{
"x": 555,
"y": 609
},
{
"x": 555,
"y": 689
},
{
"x": 481,
"y": 689
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "b.(1 -> 1.2)[0]",
"src": "b.1",
"srcArrow": "none",
"srcLabel": "",
"dst": "b.1.2",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "to deeper descendant",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 143,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 481,
"y": 739
},
{
"x": 555,
"y": 739
},
{
"x": 555,
"y": 819
},
{
"x": 485,
"y": 819
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(b.1.2 -> b)[0]",
"src": "b.1.2",
"srcArrow": "none",
"srcLabel": "",
"dst": "b",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "to parent",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 62,
"labelHeight": 21,
"labelPosition": "INSIDE_MIDDLE_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 485,
"y": 869
},
{
"x": 555,
"y": 869
},
{
"x": 555,
"y": 949
},
{
"x": 475,
"y": 949
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(b -> a.1.2)[0]",
"src": "b",
"srcArrow": "none",
"srcLabel": "",
"dst": "a.1.2",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "actor",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 36,
"labelHeight": 21,
"labelPosition": "OUTSIDE_BOTTOM_CENTER",
"labelPercentage": 0,
"route": [
{
"x": 475,
"y": 999
},
{
"x": 85,
"y": 999
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(a.1 -> b.3)[0]",
"src": "a.1",
"srcArrow": "none",
"srcLabel": "",
"dst": "b.3",
"dstArrow": "triangle",
"dstLabel": "",
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"route": [
{
"x": 81,
"y": 1129
},
{
"x": 469,
"y": 1129
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 2
},
{
"id": "(a -- )[0]",
"src": "a",
"srcArrow": "none",
"srcLabel": "",
"dst": "a-lifeline-end-2251863791",
"dstArrow": "none",
"dstLabel": "",
"opacity": 1,
"strokeDash": 8,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"route": [
{
"x": 75,
"y": 219
},
{
"x": 75,
"y": 1209
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
},
{
"id": "(b -- )[0]",
"src": "b",
"srcArrow": "none",
"srcLabel": "",
"dst": "b-lifeline-end-668380428",
"dstArrow": "none",
"dstLabel": "",
"opacity": 1,
"strokeDash": 8,
"strokeWidth": 2,
"stroke": "#0D32B2",
"label": "",
"fontSize": 16,
"fontFamily": "DEFAULT",
"language": "",
"color": "#676C7E",
"italic": true,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0,
"labelPosition": "",
"labelPercentage": 0,
"route": [
{
"x": 475,
"y": 219
},
{
"x": 475,
"y": 1209
}
],
"animated": false,
"tooltip": "",
"icon": null,
"zIndex": 0
}
]
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 472 KiB

View file

@ -619,7 +619,7 @@
},
{
"x": 81.5,
"y": 1718
"y": 1668
}
],
"animated": false,
@ -658,7 +658,7 @@
},
{
"x": 555,
"y": 1718
"y": 1668
}
],
"animated": false,
@ -697,7 +697,7 @@
},
{
"x": 1022,
"y": 1718
"y": 1668
}
],
"animated": false,
@ -736,7 +736,7 @@
},
{
"x": 1489,
"y": 1718
"y": 1668
}
],
"animated": false,
@ -775,7 +775,7 @@
},
{
"x": 1982,
"y": 1718
"y": 1668
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 474 KiB

After

Width:  |  Height:  |  Size: 474 KiB

View file

@ -619,7 +619,7 @@
},
{
"x": 81.5,
"y": 1718
"y": 1668
}
],
"animated": false,
@ -658,7 +658,7 @@
},
{
"x": 555,
"y": 1718
"y": 1668
}
],
"animated": false,
@ -697,7 +697,7 @@
},
{
"x": 1022,
"y": 1718
"y": 1668
}
],
"animated": false,
@ -736,7 +736,7 @@
},
{
"x": 1489,
"y": 1718
"y": 1668
}
],
"animated": false,
@ -775,7 +775,7 @@
},
{
"x": 1982,
"y": 1718
"y": 1668
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 474 KiB

After

Width:  |  Height:  |  Size: 474 KiB

View file

@ -1193,7 +1193,7 @@
},
{
"x": 75,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1232,7 +1232,7 @@
},
{
"x": 500,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1271,7 +1271,7 @@
},
{
"x": 925,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1310,7 +1310,7 @@
},
{
"x": 1343,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1349,7 +1349,7 @@
},
{
"x": 1766,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1388,7 +1388,7 @@
},
{
"x": 2194.5,
"y": 2010
"y": 1960
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 476 KiB

After

Width:  |  Height:  |  Size: 476 KiB

View file

@ -1193,7 +1193,7 @@
},
{
"x": 75,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1232,7 +1232,7 @@
},
{
"x": 500,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1271,7 +1271,7 @@
},
{
"x": 925,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1310,7 +1310,7 @@
},
{
"x": 1343,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1349,7 +1349,7 @@
},
{
"x": 1766,
"y": 2010
"y": 1960
}
],
"animated": false,
@ -1388,7 +1388,7 @@
},
{
"x": 2194.5,
"y": 2010
"y": 1960
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 476 KiB

After

Width:  |  Height:  |  Size: 476 KiB

View file

@ -48,7 +48,7 @@
"y": 314
},
"width": 2293,
"height": 2046,
"height": 1996,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -87,7 +87,7 @@
"y": 264
},
"width": 2393,
"height": 2146,
"height": 2096,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -126,7 +126,7 @@
"y": 317
},
"width": 2293,
"height": 2041,
"height": 1991,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -162,10 +162,10 @@
"type": "queue",
"pos": {
"x": 558,
"y": 2510
"y": 2460
},
"width": 2493,
"height": 1491,
"height": 1441,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -201,10 +201,10 @@
"type": "sequence_diagram",
"pos": {
"x": 668,
"y": 2560
"y": 2510
},
"width": 2293,
"height": 1391,
"height": 1341,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -240,7 +240,7 @@
"type": "",
"pos": {
"x": 668,
"y": 2653
"y": 2603
},
"width": 150,
"height": 128,
@ -279,7 +279,7 @@
"type": "",
"pos": {
"x": 1068,
"y": 2655
"y": 2605
},
"width": 160,
"height": 126,
@ -318,7 +318,7 @@
"type": "",
"pos": {
"x": 1478,
"y": 2655
"y": 2605
},
"width": 186,
"height": 126,
@ -357,7 +357,7 @@
"type": "",
"pos": {
"x": 1914,
"y": 2641
"y": 2591
},
"width": 150,
"height": 140,
@ -396,7 +396,7 @@
"type": "",
"pos": {
"x": 2314,
"y": 2655
"y": 2605
},
"width": 197,
"height": 126,
@ -435,7 +435,7 @@
"type": "",
"pos": {
"x": 2761,
"y": 2655
"y": 2605
},
"width": 200,
"height": 126,
@ -1778,7 +1778,7 @@
"type": "",
"pos": {
"x": 3612,
"y": 3193
"y": 3118
},
"width": 172,
"height": 126,
@ -1817,7 +1817,7 @@
"type": "rectangle",
"pos": {
"x": 2847,
"y": 2895
"y": 2845
},
"width": 28,
"height": 80,
@ -1855,7 +1855,7 @@
"type": "rectangle",
"pos": {
"x": 1975,
"y": 2879
"y": 2829
},
"width": 28,
"height": 698,
@ -1893,7 +1893,7 @@
"type": "rectangle",
"pos": {
"x": 1971,
"y": 2895
"y": 2845
},
"width": 36,
"height": 162,
@ -1931,7 +1931,7 @@
"type": "rectangle",
"pos": {
"x": 1557,
"y": 2993
"y": 2943
},
"width": 28,
"height": 340,
@ -1969,7 +1969,7 @@
"type": "rectangle",
"pos": {
"x": 1553,
"y": 3009
"y": 2959
},
"width": 36,
"height": 308,
@ -2007,7 +2007,7 @@
"type": "rectangle",
"pos": {
"x": 1549,
"y": 3025
"y": 2975
},
"width": 44,
"height": 162,
@ -2045,7 +2045,7 @@
"type": "rectangle",
"pos": {
"x": 1134,
"y": 3107
"y": 3057
},
"width": 28,
"height": 388,
@ -2083,7 +2083,7 @@
"type": "rectangle",
"pos": {
"x": 1130,
"y": 3123
"y": 3073
},
"width": 36,
"height": 356,
@ -2121,7 +2121,7 @@
"type": "rectangle",
"pos": {
"x": 1126,
"y": 3139
"y": 3089
},
"width": 44,
"height": 324,
@ -2159,7 +2159,7 @@
"type": "rectangle",
"pos": {
"x": 1122,
"y": 3155
"y": 3105
},
"width": 52,
"height": 292,
@ -2197,7 +2197,7 @@
"type": "rectangle",
"pos": {
"x": 2398,
"y": 3351
"y": 3301
},
"width": 28,
"height": 420,
@ -2235,7 +2235,7 @@
"type": "rectangle",
"pos": {
"x": 2394,
"y": 3367
"y": 3317
},
"width": 36,
"height": 388,
@ -2273,7 +2273,7 @@
"type": "rectangle",
"pos": {
"x": 2390,
"y": 3383
"y": 3333
},
"width": 44,
"height": 356,
@ -2311,7 +2311,7 @@
"type": "rectangle",
"pos": {
"x": 2386,
"y": 3399
"y": 3349
},
"width": 52,
"height": 324,
@ -2349,7 +2349,7 @@
"type": "rectangle",
"pos": {
"x": 2382,
"y": 3415
"y": 3365
},
"width": 60,
"height": 292,
@ -2387,7 +2387,7 @@
"type": "rectangle",
"pos": {
"x": 729,
"y": 3545
"y": 3495
},
"width": 28,
"height": 80,
@ -2425,7 +2425,7 @@
"type": "rectangle",
"pos": {
"x": 2847,
"y": 3805
"y": 3755
},
"width": 28,
"height": 80,
@ -3597,7 +3597,19 @@
"route": [
{
"x": 3697.5,
"y": 2360
"y": 2310
},
{
"x": 3697.5,
"y": 2350
},
{
"x": 3697.5,
"y": 2370
},
{
"x": 3697.5,
"y": 2385
},
{
"x": 3697.5,
@ -3605,23 +3617,11 @@
},
{
"x": 3697.5,
"y": 2420
"y": 2591.5
},
{
"x": 3697.5,
"y": 2435
},
{
"x": 3697.5,
"y": 2450
},
{
"x": 3697.5,
"y": 2646.5
},
{
"x": 3697.5,
"y": 3192.5
"y": 3117.5
}
],
"isCurve": true,
@ -3657,31 +3657,31 @@
"route": [
{
"x": 1196.5,
"y": 2358.5
"y": 2308.5
},
{
"x": 1196.5,
"y": 2399.7
"y": 2349.7
},
{
"x": 1196.5,
"y": 2420
"y": 2370
},
{
"x": 1196.5,
"y": 2435
"y": 2385
},
{
"x": 1196.5,
"y": 2450
"y": 2400
},
{
"x": 1204.7,
"y": 2520
"x": 1205.1,
"y": 2470
},
{
"x": 1237.5,
"y": 2560
"x": 1239.5,
"y": 2510
}
],
"isCurve": true,
@ -3737,35 +3737,35 @@
},
{
"x": 2433,
"y": 478.6
"y": 473.6
},
{
"x": 2433,
"y": 800.5
"y": 788
},
{
"x": 2433,
"y": 1122.4
"y": 1102.4
},
{
"x": 2433,
"y": 1551.6
"y": 1521.6
},
{
"x": 2433,
"y": 1873.5
"y": 1836
},
{
"x": 2433,
"y": 2195.4
"y": 2150.4
},
{
"x": 2433,
"y": 2470
"y": 2420
},
{
"x": 2433,
"y": 2510
"y": 2460
}
],
"isCurve": true,
@ -3801,11 +3801,11 @@
"route": [
{
"x": 2847,
"y": 2911
"y": 2861
},
{
"x": 2007,
"y": 2911
"y": 2861
}
],
"animated": false,
@ -3840,11 +3840,11 @@
"route": [
{
"x": 1971,
"y": 3041
"y": 2991
},
{
"x": 1593,
"y": 3041
"y": 2991
}
],
"animated": false,
@ -3879,11 +3879,11 @@
"route": [
{
"x": 1549,
"y": 3171
"y": 3121
},
{
"x": 1174,
"y": 3171
"y": 3121
}
],
"animated": false,
@ -3918,11 +3918,11 @@
"route": [
{
"x": 1975,
"y": 3301
"y": 3251
},
{
"x": 1589,
"y": 3301
"y": 3251
}
],
"animated": false,
@ -3957,11 +3957,11 @@
"route": [
{
"x": 1174,
"y": 3431
"y": 3381
},
{
"x": 2382.5,
"y": 3431
"y": 3381
}
],
"animated": false,
@ -3996,11 +3996,11 @@
"route": [
{
"x": 757,
"y": 3561
"y": 3511
},
{
"x": 1975,
"y": 3561
"y": 3511
}
],
"animated": false,
@ -4035,11 +4035,11 @@
"route": [
{
"x": 2382.5,
"y": 3691
"y": 3641
},
{
"x": 743,
"y": 3691
"y": 3641
}
],
"animated": false,
@ -4074,11 +4074,11 @@
"route": [
{
"x": 743,
"y": 3821
"y": 3771
},
{
"x": 2847,
"y": 3821
"y": 3771
}
],
"animated": false,
@ -4117,7 +4117,7 @@
},
{
"x": 2626,
"y": 2360
"y": 2310
}
],
"animated": false,
@ -4156,7 +4156,7 @@
},
{
"x": 3051,
"y": 2360
"y": 2310
}
],
"animated": false,
@ -4195,7 +4195,7 @@
},
{
"x": 3476,
"y": 2360
"y": 2310
}
],
"animated": false,
@ -4234,7 +4234,7 @@
},
{
"x": 3894,
"y": 2360
"y": 2310
}
],
"animated": false,
@ -4273,7 +4273,7 @@
},
{
"x": 4317,
"y": 2360
"y": 2310
}
],
"animated": false,
@ -4312,7 +4312,7 @@
},
{
"x": 4745.5,
"y": 2360
"y": 2310
}
],
"animated": false,
@ -4351,7 +4351,7 @@
},
{
"x": 125,
"y": 2358
"y": 2308
}
],
"animated": false,
@ -4390,7 +4390,7 @@
},
{
"x": 550,
"y": 2358
"y": 2308
}
],
"animated": false,
@ -4429,7 +4429,7 @@
},
{
"x": 975,
"y": 2358
"y": 2308
}
],
"animated": false,
@ -4468,7 +4468,7 @@
},
{
"x": 1393,
"y": 2358
"y": 2308
}
],
"animated": false,
@ -4507,7 +4507,7 @@
},
{
"x": 1816,
"y": 2358
"y": 2308
}
],
"animated": false,
@ -4546,7 +4546,7 @@
},
{
"x": 2244.5,
"y": 2358
"y": 2308
}
],
"animated": false,
@ -4581,11 +4581,11 @@
"route": [
{
"x": 743,
"y": 2781
"y": 2731
},
{
"x": 743,
"y": 3951
"y": 3851
}
],
"animated": false,
@ -4620,11 +4620,11 @@
"route": [
{
"x": 1148,
"y": 2781
"y": 2731
},
{
"x": 1148,
"y": 3951
"y": 3851
}
],
"animated": false,
@ -4659,11 +4659,11 @@
"route": [
{
"x": 1571,
"y": 2781
"y": 2731
},
{
"x": 1571,
"y": 3951
"y": 3851
}
],
"animated": false,
@ -4698,11 +4698,11 @@
"route": [
{
"x": 1989,
"y": 2781
"y": 2731
},
{
"x": 1989,
"y": 3951
"y": 3851
}
],
"animated": false,
@ -4737,11 +4737,11 @@
"route": [
{
"x": 2412.5,
"y": 2781
"y": 2731
},
{
"x": 2412.5,
"y": 3951
"y": 3851
}
],
"animated": false,
@ -4776,11 +4776,11 @@
"route": [
{
"x": 2861,
"y": 2781
"y": 2731
},
{
"x": 2861,
"y": 3951
"y": 3851
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 498 KiB

After

Width:  |  Height:  |  Size: 498 KiB

View file

@ -48,7 +48,7 @@
"y": 364
},
"width": 2293,
"height": 2046,
"height": 1996,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -87,7 +87,7 @@
"y": 291
},
"width": 2443,
"height": 2191,
"height": 2141,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -126,7 +126,7 @@
"y": 366
},
"width": 2293,
"height": 2041,
"height": 1991,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -162,10 +162,10 @@
"type": "queue",
"pos": {
"x": 2325,
"y": 2592
"y": 2542
},
"width": 2443,
"height": 1541,
"height": 1491,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -201,10 +201,10 @@
"type": "sequence_diagram",
"pos": {
"x": 2400,
"y": 2667
"y": 2617
},
"width": 2293,
"height": 1391,
"height": 1341,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
@ -240,7 +240,7 @@
"type": "",
"pos": {
"x": 2400,
"y": 2760
"y": 2710
},
"width": 150,
"height": 128,
@ -279,7 +279,7 @@
"type": "",
"pos": {
"x": 2800,
"y": 2762
"y": 2712
},
"width": 160,
"height": 126,
@ -318,7 +318,7 @@
"type": "",
"pos": {
"x": 3210,
"y": 2762
"y": 2712
},
"width": 186,
"height": 126,
@ -357,7 +357,7 @@
"type": "",
"pos": {
"x": 3646,
"y": 2748
"y": 2698
},
"width": 150,
"height": 140,
@ -396,7 +396,7 @@
"type": "",
"pos": {
"x": 4046,
"y": 2762
"y": 2712
},
"width": 197,
"height": 126,
@ -435,7 +435,7 @@
"type": "",
"pos": {
"x": 4493,
"y": 2762
"y": 2712
},
"width": 200,
"height": 126,
@ -1778,7 +1778,7 @@
"type": "",
"pos": {
"x": 1073,
"y": 2592
"y": 2542
},
"width": 172,
"height": 126,
@ -1817,7 +1817,7 @@
"type": "rectangle",
"pos": {
"x": 4579,
"y": 3002
"y": 2952
},
"width": 28,
"height": 80,
@ -1855,7 +1855,7 @@
"type": "rectangle",
"pos": {
"x": 3707,
"y": 2986
"y": 2936
},
"width": 28,
"height": 698,
@ -1893,7 +1893,7 @@
"type": "rectangle",
"pos": {
"x": 3703,
"y": 3002
"y": 2952
},
"width": 36,
"height": 162,
@ -1931,7 +1931,7 @@
"type": "rectangle",
"pos": {
"x": 3289,
"y": 3100
"y": 3050
},
"width": 28,
"height": 340,
@ -1969,7 +1969,7 @@
"type": "rectangle",
"pos": {
"x": 3285,
"y": 3116
"y": 3066
},
"width": 36,
"height": 308,
@ -2007,7 +2007,7 @@
"type": "rectangle",
"pos": {
"x": 3281,
"y": 3132
"y": 3082
},
"width": 44,
"height": 162,
@ -2045,7 +2045,7 @@
"type": "rectangle",
"pos": {
"x": 2866,
"y": 3214
"y": 3164
},
"width": 28,
"height": 388,
@ -2083,7 +2083,7 @@
"type": "rectangle",
"pos": {
"x": 2862,
"y": 3230
"y": 3180
},
"width": 36,
"height": 356,
@ -2121,7 +2121,7 @@
"type": "rectangle",
"pos": {
"x": 2858,
"y": 3246
"y": 3196
},
"width": 44,
"height": 324,
@ -2159,7 +2159,7 @@
"type": "rectangle",
"pos": {
"x": 2854,
"y": 3262
"y": 3212
},
"width": 52,
"height": 292,
@ -2197,7 +2197,7 @@
"type": "rectangle",
"pos": {
"x": 4130,
"y": 3458
"y": 3408
},
"width": 28,
"height": 420,
@ -2235,7 +2235,7 @@
"type": "rectangle",
"pos": {
"x": 4126,
"y": 3474
"y": 3424
},
"width": 36,
"height": 388,
@ -2273,7 +2273,7 @@
"type": "rectangle",
"pos": {
"x": 4122,
"y": 3490
"y": 3440
},
"width": 44,
"height": 356,
@ -2311,7 +2311,7 @@
"type": "rectangle",
"pos": {
"x": 4118,
"y": 3506
"y": 3456
},
"width": 52,
"height": 324,
@ -2349,7 +2349,7 @@
"type": "rectangle",
"pos": {
"x": 4114,
"y": 3522
"y": 3472
},
"width": 60,
"height": 292,
@ -2387,7 +2387,7 @@
"type": "rectangle",
"pos": {
"x": 2461,
"y": 3652
"y": 3602
},
"width": 28,
"height": 80,
@ -2425,7 +2425,7 @@
"type": "rectangle",
"pos": {
"x": 4579,
"y": 3912
"y": 3862
},
"width": 28,
"height": 80,
@ -3587,11 +3587,11 @@
"route": [
{
"x": 1158.5,
"y": 2409.5
"y": 2359.5
},
{
"x": 1158.5,
"y": 2592
"y": 2542
}
],
"animated": false,
@ -3626,11 +3626,11 @@
"route": [
{
"x": 3546.5,
"y": 2407
"y": 2357
},
{
"x": 3546.5,
"y": 2667
"y": 2617
}
],
"animated": false,
@ -3677,15 +3677,15 @@
},
{
"x": 4778,
"y": 2537
"y": 2487
},
{
"x": 3556.5,
"y": 2537
"y": 2487
},
{
"x": 3556.5,
"y": 2592
"y": 2542
}
],
"animated": false,
@ -3720,11 +3720,11 @@
"route": [
{
"x": 4579,
"y": 3018
"y": 2968
},
{
"x": 3739,
"y": 3018
"y": 2968
}
],
"animated": false,
@ -3759,11 +3759,11 @@
"route": [
{
"x": 3703,
"y": 3148
"y": 3098
},
{
"x": 3325,
"y": 3148
"y": 3098
}
],
"animated": false,
@ -3798,11 +3798,11 @@
"route": [
{
"x": 3281,
"y": 3278
"y": 3228
},
{
"x": 2906,
"y": 3278
"y": 3228
}
],
"animated": false,
@ -3837,11 +3837,11 @@
"route": [
{
"x": 3707,
"y": 3408
"y": 3358
},
{
"x": 3321,
"y": 3408
"y": 3358
}
],
"animated": false,
@ -3876,11 +3876,11 @@
"route": [
{
"x": 2906,
"y": 3538
"y": 3488
},
{
"x": 4114.5,
"y": 3538
"y": 3488
}
],
"animated": false,
@ -3915,11 +3915,11 @@
"route": [
{
"x": 2489,
"y": 3668
"y": 3618
},
{
"x": 3707,
"y": 3668
"y": 3618
}
],
"animated": false,
@ -3954,11 +3954,11 @@
"route": [
{
"x": 4114.5,
"y": 3798
"y": 3748
},
{
"x": 2475,
"y": 3798
"y": 3748
}
],
"animated": false,
@ -3993,11 +3993,11 @@
"route": [
{
"x": 2475,
"y": 3928
"y": 3878
},
{
"x": 4579,
"y": 3928
"y": 3878
}
],
"animated": false,
@ -4036,7 +4036,7 @@
},
{
"x": 87,
"y": 2410
"y": 2360
}
],
"animated": false,
@ -4075,7 +4075,7 @@
},
{
"x": 512,
"y": 2410
"y": 2360
}
],
"animated": false,
@ -4114,7 +4114,7 @@
},
{
"x": 937,
"y": 2410
"y": 2360
}
],
"animated": false,
@ -4153,7 +4153,7 @@
},
{
"x": 1355,
"y": 2410
"y": 2360
}
],
"animated": false,
@ -4192,7 +4192,7 @@
},
{
"x": 1778,
"y": 2410
"y": 2360
}
],
"animated": false,
@ -4231,7 +4231,7 @@
},
{
"x": 2206.5,
"y": 2410
"y": 2360
}
],
"animated": false,
@ -4270,7 +4270,7 @@
},
{
"x": 2475,
"y": 2407
"y": 2357
}
],
"animated": false,
@ -4309,7 +4309,7 @@
},
{
"x": 2900,
"y": 2407
"y": 2357
}
],
"animated": false,
@ -4348,7 +4348,7 @@
},
{
"x": 3325,
"y": 2407
"y": 2357
}
],
"animated": false,
@ -4387,7 +4387,7 @@
},
{
"x": 3743,
"y": 2407
"y": 2357
}
],
"animated": false,
@ -4426,7 +4426,7 @@
},
{
"x": 4166,
"y": 2407
"y": 2357
}
],
"animated": false,
@ -4465,7 +4465,7 @@
},
{
"x": 4594.5,
"y": 2407
"y": 2357
}
],
"animated": false,
@ -4500,11 +4500,11 @@
"route": [
{
"x": 2475,
"y": 2888
"y": 2838
},
{
"x": 2475,
"y": 4058
"y": 3958
}
],
"animated": false,
@ -4539,11 +4539,11 @@
"route": [
{
"x": 2880,
"y": 2888
"y": 2838
},
{
"x": 2880,
"y": 4058
"y": 3958
}
],
"animated": false,
@ -4578,11 +4578,11 @@
"route": [
{
"x": 3303,
"y": 2888
"y": 2838
},
{
"x": 3303,
"y": 4058
"y": 3958
}
],
"animated": false,
@ -4617,11 +4617,11 @@
"route": [
{
"x": 3721,
"y": 2888
"y": 2838
},
{
"x": 3721,
"y": 4058
"y": 3958
}
],
"animated": false,
@ -4656,11 +4656,11 @@
"route": [
{
"x": 4144.5,
"y": 2888
"y": 2838
},
{
"x": 4144.5,
"y": 4058
"y": 3958
}
],
"animated": false,
@ -4695,11 +4695,11 @@
"route": [
{
"x": 4593,
"y": 2888
"y": 2838
},
{
"x": 4593,
"y": 4058
"y": 3958
}
],
"animated": false,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 498 KiB

After

Width:  |  Height:  |  Size: 498 KiB