From a86bfc0b9b18caf52569be32149a4c3d8f40e15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Wed, 30 Nov 2022 12:09:29 -0800 Subject: [PATCH 01/24] Rename edges -> messages --- d2layouts/d2sequence/constants.go | 14 +-- d2layouts/d2sequence/layout.go | 140 ++++++++++++++-------------- d2layouts/d2sequence/layout_test.go | 28 +++--- 3 files changed, 91 insertions(+), 91 deletions(-) diff --git a/d2layouts/d2sequence/constants.go b/d2layouts/d2sequence/constants.go index 7dc2e8798..232109345 100644 --- a/d2layouts/d2sequence/constants.go +++ b/d2layouts/d2sequence/constants.go @@ -3,22 +3,22 @@ package d2sequence // leaves at least 25 units of space on the left/right when computing the space required between actors const HORIZONTAL_PAD = 50. -// leaves at least 25 units of space on the top/bottom when computing the space required between edges +// leaves at least 25 units of space on the top/bottom when computing the space required between messages const VERTICAL_PAD = 50. const MIN_ACTOR_DISTANCE = 200. -// min vertical distance between edges -const MIN_EDGE_DISTANCE = 100. +// min vertical distance between messages +const MIN_MESSAGE_DISTANCE = 100. // default size const SPAN_WIDTH = 20. -// small pad so that edges don't touch lifelines and spans -const SPAN_EDGE_PAD = 5. +// small pad so that messages don't touch lifelines and spans +const SPAN_MESSAGE_PAD = 5. // as the spans start getting nested, their size grows const SPAN_DEPTH_GROW_FACTOR = 10. -// when a span has a single edge -const MIN_SPAN_HEIGHT = MIN_EDGE_DISTANCE / 2. +// when a span has a single messages +const MIN_SPAN_HEIGHT = MIN_MESSAGE_DISTANCE / 2. diff --git a/d2layouts/d2sequence/layout.go b/d2layouts/d2sequence/layout.go index b77037d60..23d195ba0 100644 --- a/d2layouts/d2sequence/layout.go +++ b/d2layouts/d2sequence/layout.go @@ -17,9 +17,9 @@ func Layout(ctx context.Context, g *d2graph.Graph) (err error) { sd := &sequenceDiagram{ graph: g, objectRank: make(map[*d2graph.Object]int), - minEdgeRank: make(map[*d2graph.Object]int), - maxEdgeRank: make(map[*d2graph.Object]int), - edgeYStep: MIN_EDGE_DISTANCE, + minMessageRank: make(map[*d2graph.Object]int), + maxMessageRank: make(map[*d2graph.Object]int), + messageYStep: MIN_MESSAGE_DISTANCE, actorXStep: MIN_ACTOR_DISTANCE, maxActorHeight: 0., } @@ -27,7 +27,7 @@ func Layout(ctx context.Context, g *d2graph.Graph) (err error) { sd.init() sd.placeActors() sd.placeSpans() - sd.routeEdges() + sd.routeMessages() sd.addLifelineEdges() return nil @@ -36,27 +36,27 @@ func Layout(ctx context.Context, g *d2graph.Graph) (err error) { type sequenceDiagram struct { graph *d2graph.Graph - edges []*d2graph.Edge - actors []*d2graph.Object - spans []*d2graph.Object + messages []*d2graph.Edge + actors []*d2graph.Object + spans []*d2graph.Object // can be either actors or spans // rank: left to right position of actors/spans (spans have the same rank as their parents) objectRank map[*d2graph.Object]int - // keep track of the first and last edge of a given actor - // the edge rank is the order in which it appears from top to bottom - minEdgeRank map[*d2graph.Object]int - maxEdgeRank 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 - edgeYStep float64 + messageYStep float64 actorXStep float64 maxActorHeight float64 } func (sd *sequenceDiagram) init() { - sd.edges = make([]*d2graph.Edge, len(sd.graph.Edges)) - copy(sd.edges, sd.graph.Edges) + sd.messages = make([]*d2graph.Edge, len(sd.graph.Edges)) + copy(sd.messages, sd.graph.Edges) queue := make([]*d2graph.Object, len(sd.graph.Root.ChildrenArray)) copy(queue, sd.graph.Root.ChildrenArray) @@ -79,31 +79,31 @@ func (sd *sequenceDiagram) init() { queue = append(queue, obj.ChildrenArray...) } - for rank, edge := range sd.edges { - sd.edgeYStep = math.Max(sd.edgeYStep, float64(edge.LabelDimensions.Height)) + for rank, message := range sd.messages { + sd.messageYStep = math.Max(sd.messageYStep, float64(message.LabelDimensions.Height)) - sd.setMinMaxEdgeRank(edge.Src, rank) - sd.setMinMaxEdgeRank(edge.Dst, rank) + 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[edge.Src]) - float64(sd.objectRank[edge.Dst])) - distributedLabelWidth := float64(edge.LabelDimensions.Width) / rankDiff + rankDiff := math.Abs(float64(sd.objectRank[message.Src]) - float64(sd.objectRank[message.Dst])) + distributedLabelWidth := float64(message.LabelDimensions.Width) / rankDiff sd.actorXStep = math.Max(sd.actorXStep, distributedLabelWidth+HORIZONTAL_PAD) } sd.maxActorHeight += VERTICAL_PAD - sd.edgeYStep += VERTICAL_PAD + sd.messageYStep += VERTICAL_PAD } -func (sd *sequenceDiagram) setMinMaxEdgeRank(actor *d2graph.Object, rank int) { - if minRank, exists := sd.minEdgeRank[actor]; exists { - sd.minEdgeRank[actor] = go2.IntMin(minRank, rank) +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.minEdgeRank[actor] = rank + sd.minMessageRank[actor] = rank } - sd.maxEdgeRank[actor] = go2.IntMax(sd.maxEdgeRank[actor], rank) + sd.maxMessageRank[actor] = go2.IntMax(sd.maxMessageRank[actor], rank) } // placeActors places actors bottom aligned, side by side @@ -126,7 +126,7 @@ func (sd *sequenceDiagram) placeActors() { // │ // │ func (sd *sequenceDiagram) addLifelineEdges() { - endY := sd.getEdgeY(len(sd.edges)) + endY := sd.getMessageY(len(sd.messages)) for _, actor := range sd.actors { actorBottom := actor.Center() actorBottom.Y = actor.TopLeft.Y + actor.Height @@ -171,10 +171,10 @@ func (sd *sequenceDiagram) placeSpans() { } // places spans from most to least nested - // the order is important because the only way a child span exists is if there'e an edge to it - // however, the parent span might not have an edge to it and then its position is based on the child position - // or, there can be edge to it, but it comes after the child one meaning the top left position is still based on the child - // and not on its own edge + // the order is important because the only way a child span exists is if there'e an message to it + // however, the parent span might not have a message to it and then its position is based on the child position + // or, there can be a message to it, but it comes after the child one meaning the top left position is still based on the child + // and not on its own message spanFromMostNested := make([]*d2graph.Object, len(sd.spans)) copy(spanFromMostNested, sd.spans) sort.SliceStable(spanFromMostNested, func(i, j int) bool { @@ -189,28 +189,28 @@ func (sd *sequenceDiagram) placeSpans() { maxChildY = math.Max(maxChildY, child.TopLeft.Y+child.Height) } - // finds the position if there are edges to this span - minEdgeY := math.Inf(1) - if minRank, exists := sd.minEdgeRank[span]; exists { - minEdgeY = sd.getEdgeY(minRank) + // 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) } - maxEdgeY := math.Inf(-1) - if maxRank, exists := sd.maxEdgeRank[span]; exists { - maxEdgeY = sd.getEdgeY(maxRank) + maxMessageY := math.Inf(-1) + if maxRank, exists := sd.maxMessageRank[span]; exists { + maxMessageY = sd.getMessageY(maxRank) } // if it is the same as the child top left, add some padding - minY := math.Min(minEdgeY, minChildY) + minY := math.Min(minMessageY, minChildY) if minY == minChildY { minY -= SPAN_DEPTH_GROW_FACTOR } else { - minY -= SPAN_EDGE_PAD + minY -= SPAN_MESSAGE_PAD } - maxY := math.Max(maxEdgeY, maxChildY) + maxY := math.Max(maxMessageY, maxChildY) if maxY == maxChildY { maxY += SPAN_DEPTH_GROW_FACTOR } else { - maxY += SPAN_EDGE_PAD + maxY += SPAN_MESSAGE_PAD } height := math.Max(maxY-minY, MIN_SPAN_HEIGHT) @@ -221,57 +221,57 @@ func (sd *sequenceDiagram) placeSpans() { } } -// routeEdges routes horizontal edges from Src to Dst -func (sd *sequenceDiagram) routeEdges() { - for rank, edge := range sd.edges { - isLeftToRight := edge.Src.TopLeft.X < edge.Dst.TopLeft.X +// routeMessages routes horizontal edges (messages) from Src to Dst +func (sd *sequenceDiagram) routeMessages() { + for rank, message := range sd.messages { + isLeftToRight := message.Src.TopLeft.X < message.Dst.TopLeft.X - // finds the proper anchor point based on the edge direction + // finds the proper anchor point based on the message direction var startX, endX float64 - if sd.isActor(edge.Src) { - startX = edge.Src.Center().X + if sd.isActor(message.Src) { + startX = message.Src.Center().X } else if isLeftToRight { - startX = edge.Src.TopLeft.X + edge.Src.Width + startX = message.Src.TopLeft.X + message.Src.Width } else { - startX = edge.Src.TopLeft.X + startX = message.Src.TopLeft.X } - if sd.isActor(edge.Dst) { - endX = edge.Dst.Center().X + if sd.isActor(message.Dst) { + endX = message.Dst.Center().X } else if isLeftToRight { - endX = edge.Dst.TopLeft.X + endX = message.Dst.TopLeft.X } else { - endX = edge.Dst.TopLeft.X + edge.Dst.Width + endX = message.Dst.TopLeft.X + message.Dst.Width } if isLeftToRight { - startX += SPAN_EDGE_PAD - endX -= SPAN_EDGE_PAD + startX += SPAN_MESSAGE_PAD + endX -= SPAN_MESSAGE_PAD } else { - startX -= SPAN_EDGE_PAD - endX += SPAN_EDGE_PAD + startX -= SPAN_MESSAGE_PAD + endX += SPAN_MESSAGE_PAD } - edgeY := sd.getEdgeY(rank) - edge.Route = []*geo.Point{ - geo.NewPoint(startX, edgeY), - geo.NewPoint(endX, edgeY), + messageY := sd.getMessageY(rank) + message.Route = []*geo.Point{ + geo.NewPoint(startX, messageY), + geo.NewPoint(endX, messageY), } - if edge.Attributes.Label.Value != "" { + if message.Attributes.Label.Value != "" { if isLeftToRight { - edge.LabelPosition = go2.Pointer(string(label.OutsideTopCenter)) + message.LabelPosition = go2.Pointer(string(label.OutsideTopCenter)) } else { - // the label will be placed above the edge because the orientation is based on the edge normal vector - edge.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter)) + // the label will be placed above the message because the orientation is based on the edge normal vector + message.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter)) } } } } -func (sd *sequenceDiagram) getEdgeY(rank int) float64 { - // +1 so that the first edge has the top padding for its label - return ((float64(rank) + 1.) * sd.edgeYStep) + sd.maxActorHeight +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 (sd *sequenceDiagram) isActor(obj *d2graph.Object) bool { diff --git a/d2layouts/d2sequence/layout_test.go b/d2layouts/d2sequence/layout_test.go index 26d88f9fe..9647e4932 100644 --- a/d2layouts/d2sequence/layout_test.go +++ b/d2layouts/d2sequence/layout_test.go @@ -92,19 +92,19 @@ func TestBasicSequenceDiagram(t *testing.T) { } if edge.Src.TopLeft.X < edge.Dst.TopLeft.X { // left to right - if edge.Route[0].X != edge.Src.Center().X+SPAN_EDGE_PAD { + if edge.Route[0].X != edge.Src.Center().X+SPAN_MESSAGE_PAD { t.Fatalf("expected edge[%d] x to be at the actor center", i) } - if edge.Route[1].X != edge.Dst.Center().X-SPAN_EDGE_PAD { + if edge.Route[1].X != edge.Dst.Center().X-SPAN_MESSAGE_PAD { t.Fatalf("expected edge[%d] x to be at the actor center", i) } } else { - if edge.Route[0].X != edge.Src.Center().X-SPAN_EDGE_PAD { + if edge.Route[0].X != edge.Src.Center().X-SPAN_MESSAGE_PAD { t.Fatalf("expected edge[%d] x to be at the actor center", i) } - if edge.Route[1].X != edge.Dst.Center().X+SPAN_EDGE_PAD { + if edge.Route[1].X != edge.Dst.Center().X+SPAN_MESSAGE_PAD { t.Fatalf("expected edge[%d] x to be at the actor center", i) } } @@ -208,8 +208,8 @@ func TestSpansSequenceDiagram(t *testing.T) { t.Fatalf("expected a.t1 and b.t1 to have the same height, got %.5f and %.5f", a_t1.Height, b_t1.Height) } - // Y diff of the 2 first edges - expectedHeight := g.Edges[1].Route[0].Y - g.Edges[0].Route[0].Y + (2 * SPAN_EDGE_PAD) + // Y diff of the 2 first messages + expectedHeight := g.Edges[1].Route[0].Y - g.Edges[0].Route[0].Y + (2 * SPAN_MESSAGE_PAD) if a_t1.Height != expectedHeight { t.Fatalf("expected a.t1 height to be %.5f, got %.5f", expectedHeight, a_t1.Height) } @@ -231,20 +231,20 @@ func TestSpansSequenceDiagram(t *testing.T) { if a_t1.TopLeft.Y != b_t1.TopLeft.Y { t.Fatal("expected a.t1 and b.t1 to be placed at the same Y") } - if a_t1.TopLeft.Y != g.Edges[0].Route[0].Y-SPAN_EDGE_PAD { - t.Fatal("expected a.t1 to be placed at the same Y of the first edge") + if a_t1.TopLeft.Y != g.Edges[0].Route[0].Y-SPAN_MESSAGE_PAD { + t.Fatal("expected a.t1 to be placed at the same Y of the first message") } // check routes - if g.Edges[0].Route[0].X != a_t1.TopLeft.X+a_t1.Width+SPAN_EDGE_PAD { - t.Fatal("expected the first edge to start on a.t1 top right X") + if g.Edges[0].Route[0].X != a_t1.TopLeft.X+a_t1.Width+SPAN_MESSAGE_PAD { + t.Fatal("expected the first message to start on a.t1 top right X") } - if g.Edges[0].Route[1].X != b_t1.TopLeft.X-SPAN_EDGE_PAD { - t.Fatal("expected the first edge to end on b.t1 top left X") + if g.Edges[0].Route[1].X != b_t1.TopLeft.X-SPAN_MESSAGE_PAD { + t.Fatal("expected the first message to end on b.t1 top left X") } - if g.Edges[2].Route[1].X != b.Center().X-SPAN_EDGE_PAD { - t.Fatal("expected the third edge to end on b.t1 center X") + if g.Edges[2].Route[1].X != b.Center().X-SPAN_MESSAGE_PAD { + t.Fatal("expected the third message to end on b.t1 center X") } } From e533aeeed5c1e30460d6e5b91af554ecbdc870f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Wed, 30 Nov 2022 14:01:16 -0800 Subject: [PATCH 02/24] Add nested test --- d2layouts/d2sequence/layout.go | 4 ++ d2layouts/d2sequence/layout_test.go | 58 +++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/d2layouts/d2sequence/layout.go b/d2layouts/d2sequence/layout.go index 23d195ba0..0f965b50f 100644 --- a/d2layouts/d2sequence/layout.go +++ b/d2layouts/d2sequence/layout.go @@ -13,6 +13,10 @@ import ( "oss.terrastruct.com/d2/lib/shape" ) +func Layout2(ctx context.Context, g *d2graph.Graph, layoutFn func(ctx context.Context, g *d2graph.Graph) error) error { + return nil +} + func Layout(ctx context.Context, g *d2graph.Graph) (err error) { sd := &sequenceDiagram{ graph: g, diff --git a/d2layouts/d2sequence/layout_test.go b/d2layouts/d2sequence/layout_test.go index 9647e4932..388f538f1 100644 --- a/d2layouts/d2sequence/layout_test.go +++ b/d2layouts/d2sequence/layout_test.go @@ -5,6 +5,7 @@ import ( "testing" "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2target" "oss.terrastruct.com/d2/lib/geo" "oss.terrastruct.com/d2/lib/label" "oss.terrastruct.com/d2/lib/log" @@ -248,3 +249,60 @@ func TestSpansSequenceDiagram(t *testing.T) { t.Fatal("expected the third message to end on b.t1 center X") } } + +func TestNestedSequenceDiagrams(t *testing.T) { + // ┌─────┐ ┌─────┐ + // │ a │ │ b │ + // └──┬──┘ └──┬──┘ + // ├┐────────────────────►┌┤ + // t1 ││ ││ t1 + // ├┘◄────────────────────└┤ + g := d2graph.NewGraph(nil) + container := g.Root.EnsureChild([]string{"container"}) + container.Attributes.Shape = d2graph.Scalar{Value: d2target.ShapeSequenceDiagram} + a := container.EnsureChild([]string{"a"}) + a.Box = geo.NewBox(nil, 100, 100) + a.Attributes.Shape = d2graph.Scalar{Value: shape.PERSON_TYPE} + a_t1 := a.EnsureChild([]string{"t1"}) + b := container.EnsureChild([]string{"b"}) + b.Box = geo.NewBox(nil, 30, 30) + b_t1 := b.EnsureChild([]string{"t1"}) + + c := g.Root.EnsureChild([]string{"c"}) + c.Attributes.Shape = d2graph.Scalar{Value: d2target.ShapeSquare} + + sdEdge1, err := g.Root.Connect(a_t1.AbsIDArray(), b_t1.AbsIDArray(), false, true, "sequence diagram edge 1") + if err != nil { + t.Fatal(err) + } + sdEdge2, err := g.Root.Connect(b_t1.AbsIDArray(), a_t1.AbsIDArray(), false, true, "sequence diagram edge 2") + if err != nil { + t.Fatal(err) + } + + edge1, err := g.Root.Connect(container.AbsIDArray(), c.AbsIDArray(), false, false, "edge 1") + if err != nil { + t.Fatal(err) + } + + layoutFn := func(ctx context.Context, g *d2graph.Graph) error { + for _, edge := range g.Edges { + if edge == sdEdge1 || edge == sdEdge2 { + t.Fatal("expected to have removed all sequence diagram edges from graph") + } + } + if g.Edges[0] != edge1 { + t.Fatal("expected graph edge to be in the graph") + } + return nil + } + + ctx := log.WithTB(context.Background(), t, nil) + if err = Layout2(ctx, g, layoutFn); err != nil { + t.Fatal(err) + } + + if len(g.Edges) != 3 { + t.Fatal("expected graph to have all edges after layout") + } +} From 30cd28fd39c4197b1c8334d0903301b024e1b6b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Wed, 30 Nov 2022 16:11:02 -0800 Subject: [PATCH 03/24] Handle nested sequence diagrams --- d2layouts/d2sequence/layout.go | 204 ++++++++++++++++++++++------ d2layouts/d2sequence/layout_test.go | 60 ++++++-- 2 files changed, 213 insertions(+), 51 deletions(-) diff --git a/d2layouts/d2sequence/layout.go b/d2layouts/d2sequence/layout.go index 92d3dae22..f2f715a1a 100644 --- a/d2layouts/d2sequence/layout.go +++ b/d2layouts/d2sequence/layout.go @@ -5,44 +5,109 @@ import ( "fmt" "math" "sort" + "strings" "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2target" "oss.terrastruct.com/d2/lib/geo" "oss.terrastruct.com/d2/lib/go2" "oss.terrastruct.com/d2/lib/label" "oss.terrastruct.com/d2/lib/shape" ) -func Layout2(ctx context.Context, g *d2graph.Graph, layoutFn func(ctx context.Context, g *d2graph.Graph) error) error { +func Layout2(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Context, g *d2graph.Graph) error) error { + // new graph objects without sequence diagram objects and their replacement (rectangle node) + newObjects := make([]*d2graph.Object, 0, len(g.Objects)) + edgesToRemove := make(map[*d2graph.Edge]struct{}) + + sequenceDiagrams := make(map[*d2graph.Object]*sequenceDiagram) + + objChildrenArray := make(map[*d2graph.Object][]*d2graph.Object) + + queue := make([]*d2graph.Object, 1, len(g.Objects)) + queue[0] = g.Root + for len(queue) > 0 { + obj := queue[0] + queue = queue[1:] + + newObjects = append(newObjects, obj) + if obj.Attributes.Shape.Value == d2target.ShapeSequenceDiagram { + // TODO: should update obj.References too? + + // clean current children and keep a backup to restore them later + obj.Children = make(map[string]*d2graph.Object) + objChildrenArray[obj] = obj.ChildrenArray + obj.ChildrenArray = nil + // creates a mock rectangle so that layout considers this size + sdMock := obj.EnsureChild([]string{"sequence_diagram"}) + sdMock.Attributes.Shape.Value = d2target.ShapeRectangle + sdMock.Attributes.Label.Value = "" + newObjects = append(newObjects, sdMock) + + var messages []*d2graph.Edge + for _, edge := range g.Edges { + if strings.HasPrefix(edge.Src.AbsID(), obj.AbsID()) && strings.HasPrefix(edge.Dst.AbsID(), obj.AbsID()) { + edgesToRemove[edge] = struct{}{} + messages = append(messages, edge) + } + } + + sd := newSequenceDiagram(objChildrenArray[obj], messages) + sd.layout() + sdMock.Box = geo.NewBox(nil, sd.getWidth(), sd.getHeight()) + sequenceDiagrams[obj] = sd + } else { + queue = append(queue, obj.ChildrenArray...) + } + } + + newEdges := make([]*d2graph.Edge, 0, len(g.Edges)-len(edgesToRemove)) + for _, edge := range g.Edges { + if _, exists := edgesToRemove[edge]; !exists { + newEdges = append(newEdges, edge) + } + } + + g.Objects = newObjects + g.Edges = newEdges + + if err := layout(ctx, g); err != nil { + return err + } + + // restores objects & edges + for edge := range edgesToRemove { + g.Edges = append(g.Edges, edge) + } + for obj, children := range objChildrenArray { + sdMock := obj.ChildrenArray[0] + sequenceDiagrams[obj].shift(sdMock.TopLeft) + obj.Children = make(map[string]*d2graph.Object) + for _, child := range children { + g.Objects = append(g.Objects, child) + obj.Children[child.ID] = child + } + obj.ChildrenArray = children + + for _, edge := range sequenceDiagrams[obj].lifelines { + g.Edges = append(g.Edges, edge) + } + } + return nil } func Layout(ctx context.Context, g *d2graph.Graph) (err error) { - sd := &sequenceDiagram{ - graph: g, - objectRank: make(map[*d2graph.Object]int), - minMessageRank: make(map[*d2graph.Object]int), - maxMessageRank: make(map[*d2graph.Object]int), - messageYStep: MIN_MESSAGE_DISTANCE, - actorXStep: MIN_ACTOR_DISTANCE, - maxActorHeight: 0., - } - - sd.init() - sd.placeActors() - sd.placeSpans() - sd.routeMessages() - sd.addLifelineEdges() - + sd := newSequenceDiagram(nil, nil) + sd.layout() return nil } type sequenceDiagram struct { - graph *d2graph.Graph - - messages []*d2graph.Edge - actors []*d2graph.Object - spans []*d2graph.Object + messages []*d2graph.Edge + lifelines []*d2graph.Edge + actors []*d2graph.Object + spans []*d2graph.Object // can be either actors or spans // rank: left to right position of actors/spans (spans have the same rank as their parents) @@ -58,29 +123,38 @@ type sequenceDiagram struct { maxActorHeight float64 } -func (sd *sequenceDiagram) init() { - sd.messages = make([]*d2graph.Edge, len(sd.graph.Edges)) - copy(sd.messages, sd.graph.Edges) +func newSequenceDiagram(actors []*d2graph.Object, messages []*d2graph.Edge) *sequenceDiagram { + sd := &sequenceDiagram{ + messages: messages, + actors: actors, + spans: nil, + lifelines: nil, + objectRank: make(map[*d2graph.Object]int), + minMessageRank: make(map[*d2graph.Object]int), + maxMessageRank: make(map[*d2graph.Object]int), + messageYStep: MIN_MESSAGE_DISTANCE, + actorXStep: MIN_ACTOR_DISTANCE, + maxActorHeight: 0., + } - queue := make([]*d2graph.Object, len(sd.graph.Root.ChildrenArray)) - copy(queue, sd.graph.Root.ChildrenArray) - for len(queue) > 0 { - obj := queue[0] - queue = queue[1:] + for rank, actor := range actors { + sd.objectRank[actor] = rank + sd.maxActorHeight = math.Max(sd.maxActorHeight, actor.Height) + + queue := make([]*d2graph.Object, len(actor.ChildrenArray)) + copy(queue, actor.ChildrenArray) + for len(queue) > 0 { + span := queue[0] + queue = queue[1:] - if sd.isActor(obj) { - sd.actors = append(sd.actors, obj) - sd.objectRank[obj] = len(sd.actors) - sd.maxActorHeight = math.Max(sd.maxActorHeight, obj.Height) - } else { // spans are always rectangles and have no labels - obj.Attributes.Label = d2graph.Scalar{Value: ""} - obj.Attributes.Shape = d2graph.Scalar{Value: shape.SQUARE_TYPE} - sd.spans = append(sd.spans, obj) - sd.objectRank[obj] = sd.objectRank[obj.Parent] - } + span.Attributes.Label = d2graph.Scalar{Value: ""} + span.Attributes.Shape = d2graph.Scalar{Value: shape.SQUARE_TYPE} + sd.spans = append(sd.spans, span) + sd.objectRank[span] = rank - queue = append(queue, obj.ChildrenArray...) + queue = append(queue, span.ChildrenArray...) + } } for rank, message := range sd.messages { @@ -98,6 +172,8 @@ func (sd *sequenceDiagram) init() { sd.maxActorHeight += VERTICAL_PAD sd.messageYStep += VERTICAL_PAD + + return sd } func (sd *sequenceDiagram) setMinMaxMessageRank(actor *d2graph.Object, rank int) { @@ -110,6 +186,13 @@ func (sd *sequenceDiagram) setMinMaxMessageRank(actor *d2graph.Object, rank int) sd.maxMessageRank[actor] = go2.IntMax(sd.maxMessageRank[actor], rank) } +func (sd *sequenceDiagram) layout() { + sd.placeActors() + sd.placeSpans() + sd.routeMessages() + sd.addLifelineEdges() +} + // placeActors places actors bottom aligned, side by side func (sd *sequenceDiagram) placeActors() { x := 0. @@ -136,7 +219,7 @@ func (sd *sequenceDiagram) addLifelineEdges() { actorBottom.Y = actor.TopLeft.Y + actor.Height actorLifelineEnd := actor.Center() actorLifelineEnd.Y = endY - sd.graph.Edges = append(sd.graph.Edges, &d2graph.Edge{ + sd.lifelines = append(sd.lifelines, &d2graph.Edge{ Attributes: d2graph.Attributes{ Style: d2graph.Style{ StrokeDash: &d2graph.Scalar{Value: "10"}, @@ -280,5 +363,40 @@ func (sd *sequenceDiagram) getMessageY(rank int) float64 { } func (sd *sequenceDiagram) isActor(obj *d2graph.Object) bool { - return obj.Parent == sd.graph.Root + // TODO: map to avoid looping around every time? + for _, actor := range sd.actors { + if actor == obj { + return true + } + } + return false +} + +func (sd *sequenceDiagram) getWidth() float64 { + // the layout is always placed starting at 0, so the width is just the last actor + lastActor := sd.actors[len(sd.actors)-1] + return lastActor.TopLeft.X + lastActor.Width +} + +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)) +} + +func (sd *sequenceDiagram) shift(tl *geo.Point) { + allObjects := append([]*d2graph.Object{}, sd.actors...) + allObjects = append(allObjects, sd.spans...) + for _, obj := range allObjects { + obj.TopLeft.X += tl.X + obj.TopLeft.Y += tl.Y + } + + allEdges := append([]*d2graph.Edge{}, sd.messages...) + allEdges = append(allEdges, sd.lifelines...) + for _, edge := range allEdges { + for _, p := range edge.Route { + p.X += tl.X + p.Y += tl.Y + } + } } diff --git a/d2layouts/d2sequence/layout_test.go b/d2layouts/d2sequence/layout_test.go index 9d7abc9fa..1c4f24c78 100644 --- a/d2layouts/d2sequence/layout_test.go +++ b/d2layouts/d2sequence/layout_test.go @@ -257,15 +257,18 @@ func TestSpansSequenceDiagram(t *testing.T) { } func TestNestedSequenceDiagrams(t *testing.T) { - // ┌─────┐ ┌─────┐ - // │ a │ │ b │ - // └──┬──┘ └──┬──┘ - // ├┐────────────────────►┌┤ - // t1 ││ ││ t1 - // ├┘◄────────────────────└┤ + // ┌────────────────────────────────────────┐ + // | ┌─────┐ container ┌─────┐ | + // | │ a │ │ b │ | ┌─────┐ + // | └──┬──┘ └──┬──┘ ├────edge1───┤ c │ + // | ├┐───────sdEdge1──────►┌┤ | └─────┘ + // | t1 ││ ││ t1 | + // | ├┘◄──────sdEdge2───────└┤ | + // └────────────────────────────────────────┘ g := d2graph.NewGraph(nil) container := g.Root.EnsureChild([]string{"container"}) container.Attributes.Shape = d2graph.Scalar{Value: d2target.ShapeSequenceDiagram} + container.Box = geo.NewBox(nil, 500, 500) a := container.EnsureChild([]string{"a"}) a.Box = geo.NewBox(nil, 100, 100) a.Attributes.Shape = d2graph.Scalar{Value: shape.PERSON_TYPE} @@ -275,6 +278,7 @@ func TestNestedSequenceDiagrams(t *testing.T) { b_t1 := b.EnsureChild([]string{"t1"}) c := g.Root.EnsureChild([]string{"c"}) + c.Box = geo.NewBox(nil, 100, 100) c.Attributes.Shape = d2graph.Scalar{Value: d2target.ShapeSquare} sdEdge1, err := g.Root.Connect(a_t1.AbsIDArray(), b_t1.AbsIDArray(), false, true, "sequence diagram edge 1") @@ -292,6 +296,23 @@ func TestNestedSequenceDiagrams(t *testing.T) { } layoutFn := func(ctx context.Context, g *d2graph.Graph) error { + // 4 because it replaces all `container` children with a rectangle for layout + if len(g.Objects) != 4 { + t.Fatal("expected only diagram objects for layout") + } + for _, obj := range g.Objects { + if obj == a || obj == a_t1 || obj == b || obj == b_t1 { + t.Fatal("expected to have removed all sequence diagram objects") + } + } + if len(container.ChildrenArray) != 1 { + t.Fatalf("expected only 1 `container` child, got %d", len(container.ChildrenArray)) + } + + if len(container.Children) != len(container.ChildrenArray) { + t.Fatal("container children mismatch") + } + for _, edge := range g.Edges { if edge == sdEdge1 || edge == sdEdge2 { t.Fatal("expected to have removed all sequence diagram edges from graph") @@ -300,6 +321,18 @@ func TestNestedSequenceDiagrams(t *testing.T) { if g.Edges[0] != edge1 { t.Fatal("expected graph edge to be in the graph") } + + // just set some position as if it had been properly placed + for _, obj := range g.Objects { + if obj != g.Root { + obj.TopLeft = geo.NewPoint(0, 0) + } + } + + for _, edge := range g.Edges { + edge.Route = []*geo.Point{geo.NewPoint(1, 1)} + } + return nil } @@ -308,7 +341,18 @@ func TestNestedSequenceDiagrams(t *testing.T) { t.Fatal(err) } - if len(g.Edges) != 3 { - t.Fatal("expected graph to have all edges after layout") + if len(g.Edges) != 5 { + t.Fatal("expected graph to have all edges and lifelines after layout") + } + + for _, obj := range g.Objects { + if obj != g.Root && obj.TopLeft == nil { + t.Fatal("expected to have placed all objects") + } + } + for _, edge := range g.Edges { + if len(edge.Route) == 0 { + t.Fatal("expected to have routed all edges") + } } } From 7f26540d646f2420304a7131d45e1012f866f1d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 10:33:20 -0800 Subject: [PATCH 04/24] Layout sequence diagrams before running the layout engine --- d2.go | 22 +++++++++++++++------- d2layouts/d2sequence/layout.go | 18 +++++++++--------- d2layouts/d2sequence/layout_test.go | 10 ++++------ 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/d2.go b/d2.go index d6fdfe8a2..8331ee456 100644 --- a/d2.go +++ b/d2.go @@ -9,6 +9,7 @@ import ( "oss.terrastruct.com/d2/d2compiler" "oss.terrastruct.com/d2/d2exporter" "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2layouts/d2sequence" "oss.terrastruct.com/d2/d2renderers/textmeasure" "oss.terrastruct.com/d2/d2target" ) @@ -39,14 +40,11 @@ func Compile(ctx context.Context, input string, opts *CompileOptions) (*d2target return nil, err } - if opts.Layout != nil { - err = opts.Layout(ctx, g) - } else if os.Getenv("D2_LAYOUT") == "dagre" && dagreLayout != nil { - err = dagreLayout(ctx, g) + if layout, err := getLayout(opts); err == nil { + if err := d2sequence.Layout2(ctx, g, layout); err != nil { + return nil, err + } } else { - err = errors.New("no available layout") - } - if err != nil { return nil, err } @@ -54,5 +52,15 @@ func Compile(ctx context.Context, input string, opts *CompileOptions) (*d2target return diagram, err } +func getLayout(opts *CompileOptions) (func(context.Context, *d2graph.Graph) error, error) { + if opts.Layout != nil { + return opts.Layout, nil + } else if os.Getenv("D2_LAYOUT") == "dagre" && dagreLayout != nil { + return dagreLayout, nil + } else { + return nil, errors.New("no available layout") + } +} + // See c.go var dagreLayout func(context.Context, *d2graph.Graph) error diff --git a/d2layouts/d2sequence/layout.go b/d2layouts/d2sequence/layout.go index f2f715a1a..9c31ac915 100644 --- a/d2layouts/d2sequence/layout.go +++ b/d2layouts/d2sequence/layout.go @@ -16,6 +16,9 @@ import ( ) func Layout2(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Context, g *d2graph.Graph) error) error { + oldObjects := g.Objects + oldEdges := g.Edges + // new graph objects without sequence diagram objects and their replacement (rectangle node) newObjects := make([]*d2graph.Object, 0, len(g.Objects)) edgesToRemove := make(map[*d2graph.Edge]struct{}) @@ -30,7 +33,9 @@ func Layout2(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Cont obj := queue[0] queue = queue[1:] - newObjects = append(newObjects, obj) + if obj != g.Root { + newObjects = append(newObjects, obj) + } if obj.Attributes.Shape.Value == d2target.ShapeSequenceDiagram { // TODO: should update obj.References too? @@ -76,22 +81,17 @@ func Layout2(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Cont } // restores objects & edges - for edge := range edgesToRemove { - g.Edges = append(g.Edges, edge) - } + g.Edges = oldEdges + g.Objects = oldObjects for obj, children := range objChildrenArray { sdMock := obj.ChildrenArray[0] sequenceDiagrams[obj].shift(sdMock.TopLeft) obj.Children = make(map[string]*d2graph.Object) for _, child := range children { - g.Objects = append(g.Objects, child) obj.Children[child.ID] = child } obj.ChildrenArray = children - - for _, edge := range sequenceDiagrams[obj].lifelines { - g.Edges = append(g.Edges, edge) - } + g.Edges = append(g.Edges, sequenceDiagrams[obj].lifelines...) } return nil diff --git a/d2layouts/d2sequence/layout_test.go b/d2layouts/d2sequence/layout_test.go index 1c4f24c78..2fcf61ad0 100644 --- a/d2layouts/d2sequence/layout_test.go +++ b/d2layouts/d2sequence/layout_test.go @@ -296,8 +296,8 @@ func TestNestedSequenceDiagrams(t *testing.T) { } layoutFn := func(ctx context.Context, g *d2graph.Graph) error { - // 4 because it replaces all `container` children with a rectangle for layout - if len(g.Objects) != 4 { + // 3 because it replaces all `container` children with a rectangle for layout + if len(g.Objects) != 3 { t.Fatal("expected only diagram objects for layout") } for _, obj := range g.Objects { @@ -324,9 +324,7 @@ func TestNestedSequenceDiagrams(t *testing.T) { // just set some position as if it had been properly placed for _, obj := range g.Objects { - if obj != g.Root { - obj.TopLeft = geo.NewPoint(0, 0) - } + obj.TopLeft = geo.NewPoint(0, 0) } for _, edge := range g.Edges { @@ -346,7 +344,7 @@ func TestNestedSequenceDiagrams(t *testing.T) { } for _, obj := range g.Objects { - if obj != g.Root && obj.TopLeft == nil { + if obj.TopLeft == nil { t.Fatal("expected to have placed all objects") } } From 21083910e59bbc88b19bd2751dbec6080c57af05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 11:47:27 -0800 Subject: [PATCH 05/24] Rename to Layout --- cmd/d2/main.go | 6 ------ d2.go | 8 +++----- d2layouts/d2sequence/layout.go | 8 +------- d2layouts/d2sequence/layout_test.go | 28 +++++++++++++++++++++++++--- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/cmd/d2/main.go b/cmd/d2/main.go index 063783e37..b1f5d5e3d 100644 --- a/cmd/d2/main.go +++ b/cmd/d2/main.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "os" "os/exec" "path/filepath" "strings" @@ -14,7 +13,6 @@ import ( "github.com/spf13/pflag" "oss.terrastruct.com/d2" - "oss.terrastruct.com/d2/d2layouts/d2sequence" "oss.terrastruct.com/d2/d2plugin" "oss.terrastruct.com/d2/d2renderers/d2svg" "oss.terrastruct.com/d2/d2renderers/textmeasure" @@ -191,10 +189,6 @@ func compile(ctx context.Context, ms *xmain.State, isWatching bool, plugin d2plu } layout := plugin.Layout - // TODO: remove, this is just a feature flag to test sequence diagrams as we work on them - if os.Getenv("D2_SEQUENCE") == "1" { - layout = d2sequence.Layout - } d, err := d2.Compile(ctx, string(input), &d2.CompileOptions{ Layout: layout, Ruler: ruler, diff --git a/d2.go b/d2.go index 8331ee456..afa8085fa 100644 --- a/d2.go +++ b/d2.go @@ -40,11 +40,9 @@ func Compile(ctx context.Context, input string, opts *CompileOptions) (*d2target return nil, err } - if layout, err := getLayout(opts); err == nil { - if err := d2sequence.Layout2(ctx, g, layout); err != nil { - return nil, err - } - } else { + if layout, err := getLayout(opts); err != nil { + return nil, err + } else if err := d2sequence.Layout(ctx, g, layout); err != nil { return nil, err } diff --git a/d2layouts/d2sequence/layout.go b/d2layouts/d2sequence/layout.go index 9c31ac915..858b5a5a5 100644 --- a/d2layouts/d2sequence/layout.go +++ b/d2layouts/d2sequence/layout.go @@ -15,7 +15,7 @@ import ( "oss.terrastruct.com/d2/lib/shape" ) -func Layout2(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Context, g *d2graph.Graph) error) error { +func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Context, g *d2graph.Graph) error) error { oldObjects := g.Objects oldEdges := g.Edges @@ -97,12 +97,6 @@ func Layout2(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Cont return nil } -func Layout(ctx context.Context, g *d2graph.Graph) (err error) { - sd := newSequenceDiagram(nil, nil) - sd.layout() - return nil -} - type sequenceDiagram struct { messages []*d2graph.Edge lifelines []*d2graph.Edge diff --git a/d2layouts/d2sequence/layout_test.go b/d2layouts/d2sequence/layout_test.go index 2fcf61ad0..cd017f38d 100644 --- a/d2layouts/d2sequence/layout_test.go +++ b/d2layouts/d2sequence/layout_test.go @@ -26,6 +26,7 @@ func TestBasicSequenceDiagram(t *testing.T) { // ◄───────────────────────┤ // │ │ g := d2graph.NewGraph(nil) + g.Root.Attributes.Shape = d2graph.Scalar{Value: d2target.ShapeSequenceDiagram} n1 := g.Root.EnsureChild([]string{"n1"}) n1.Box = geo.NewBox(nil, 100, 100) n2 := g.Root.EnsureChild([]string{"n2"}) @@ -58,7 +59,17 @@ func TestBasicSequenceDiagram(t *testing.T) { nEdges := len(g.Edges) ctx := log.WithTB(context.Background(), t, nil) - Layout(ctx, g) + Layout(ctx, g, func(ctx context.Context, g *d2graph.Graph) error { + // just set some position as if it had been properly placed + for _, obj := range g.Objects { + obj.TopLeft = geo.NewPoint(0, 0) + } + + for _, edge := range g.Edges { + edge.Route = []*geo.Point{geo.NewPoint(1, 1)} + } + return nil + }) // asserts that actors were placed in the expected x order and at y=0 actors := []*d2graph.Object{ @@ -158,6 +169,7 @@ func TestSpansSequenceDiagram(t *testing.T) { // t2 ││ │ // ├┘◄─────────────────────┤ 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{ @@ -190,7 +202,17 @@ func TestSpansSequenceDiagram(t *testing.T) { } ctx := log.WithTB(context.Background(), t, nil) - Layout(ctx, g) + Layout(ctx, g, func(ctx context.Context, g *d2graph.Graph) error { + // just set some position as if it had been properly placed + for _, obj := range g.Objects { + obj.TopLeft = geo.NewPoint(0, 0) + } + + for _, edge := range g.Edges { + edge.Route = []*geo.Point{geo.NewPoint(1, 1)} + } + return nil + }) // check properties if a.Attributes.Shape.Value != shape.PERSON_TYPE { @@ -335,7 +357,7 @@ func TestNestedSequenceDiagrams(t *testing.T) { } ctx := log.WithTB(context.Background(), t, nil) - if err = Layout2(ctx, g, layoutFn); err != nil { + if err = Layout(ctx, g, layoutFn); err != nil { t.Fatal(err) } From 8d79f28412f8b3f4358a84e32d44ac94f84d13d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 13:27:53 -0800 Subject: [PATCH 06/24] Split sequence diagram and layout --- d2layouts/d2sequence/layout.go | 355 ++++----------------------------- 1 file changed, 39 insertions(+), 316 deletions(-) diff --git a/d2layouts/d2sequence/layout.go b/d2layouts/d2sequence/layout.go index 858b5a5a5..8356e1a64 100644 --- a/d2layouts/d2sequence/layout.go +++ b/d2layouts/d2sequence/layout.go @@ -2,39 +2,44 @@ package d2sequence import ( "context" - "fmt" - "math" - "sort" "strings" "oss.terrastruct.com/d2/d2graph" "oss.terrastruct.com/d2/d2target" "oss.terrastruct.com/d2/lib/geo" - "oss.terrastruct.com/d2/lib/go2" - "oss.terrastruct.com/d2/lib/label" - "oss.terrastruct.com/d2/lib/shape" ) +// Layout identifies and layouts sequence diagrams within a graph +// first, it traverses the graph from Root and once it finds an object of shape `sequence_diagram` +// it replaces the children with a rectangle with id `sequence_diagram`, collects all edges coming to this node and +// flag the edges to be removed. Then, using the children and the edges, it lays out the sequence diagram and +// sets the dimensions of the rectangle `sequence_diagram` rectangle. +// Once all nodes were processed, it continues to run the layout engine without the sequence diagram nodes and edges. +// Then it restores all objects with their proper layout engine and sequence diagram positions func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Context, g *d2graph.Graph) error) error { + // keeps the current graph state oldObjects := g.Objects oldEdges := g.Edges - // new graph objects without sequence diagram objects and their replacement (rectangle node) - newObjects := make([]*d2graph.Object, 0, len(g.Objects)) + // new graph objects + g.Objects = make([]*d2graph.Object, 0, len(g.Objects)) + // edges flagged to be removed (these are internal edges of the sequence diagrams) edgesToRemove := make(map[*d2graph.Edge]struct{}) - + // store the sequence diagram related to a given node sequenceDiagrams := make(map[*d2graph.Object]*sequenceDiagram) - + // keeps the reference of the children of a given node objChildrenArray := make(map[*d2graph.Object][]*d2graph.Object) - queue := make([]*d2graph.Object, 1, len(g.Objects)) + // goes from root and travers all descendants + queue := make([]*d2graph.Object, 1, len(oldObjects)) queue[0] = g.Root for len(queue) > 0 { obj := queue[0] queue = queue[1:] + // root is not part of g.Objects, so we can't add it here if obj != g.Root { - newObjects = append(newObjects, obj) + g.Objects = append(g.Objects, obj) } if obj.Attributes.Shape.Value == d2target.ShapeSequenceDiagram { // TODO: should update obj.References too? @@ -47,25 +52,28 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte sdMock := obj.EnsureChild([]string{"sequence_diagram"}) sdMock.Attributes.Shape.Value = d2target.ShapeRectangle sdMock.Attributes.Label.Value = "" - newObjects = append(newObjects, sdMock) - var messages []*d2graph.Edge + // find the edges that belong to this sequence diagra + var edges []*d2graph.Edge for _, edge := range g.Edges { + // both Src and Dst must be inside the sequence diagram if strings.HasPrefix(edge.Src.AbsID(), obj.AbsID()) && strings.HasPrefix(edge.Dst.AbsID(), obj.AbsID()) { edgesToRemove[edge] = struct{}{} - messages = append(messages, edge) + edges = append(edges, edge) } } - sd := newSequenceDiagram(objChildrenArray[obj], messages) + sd := newSequenceDiagram(objChildrenArray[obj], edges) sd.layout() sdMock.Box = geo.NewBox(nil, sd.getWidth(), sd.getHeight()) sequenceDiagrams[obj] = sd } else { + // only move to children if the parent is not a sequence diagram queue = append(queue, obj.ChildrenArray...) } } + // removes the edges newEdges := make([]*d2graph.Edge, 0, len(g.Edges)-len(edgesToRemove)) for _, edge := range g.Edges { if _, exists := edgesToRemove[edge]; !exists { @@ -73,9 +81,16 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte } } - g.Objects = newObjects - g.Edges = newEdges + // objToIndex := make(map[*d2graph.Object]int) + // for i, obj := range oldObjects { + // objToIndex[obj] = i + // } + // sort.Slice(g.Objects, func(i, j int) bool { + // return objToIndex[g.Objects[i]] < objToIndex[g.Objects[j]] + // }) + + g.Edges = newEdges if err := layout(ctx, g); err != nil { return err } @@ -83,314 +98,22 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte // restores objects & edges g.Edges = oldEdges g.Objects = oldObjects + for obj, children := range objChildrenArray { + // shift the sequence diagrams as they are always placed at (0, 0) sdMock := obj.ChildrenArray[0] sequenceDiagrams[obj].shift(sdMock.TopLeft) + + // restore children obj.Children = make(map[string]*d2graph.Object) for _, child := range children { obj.Children[child.ID] = child } obj.ChildrenArray = children + + // add lifeline edges g.Edges = append(g.Edges, sequenceDiagrams[obj].lifelines...) } return nil } - -type sequenceDiagram struct { - messages []*d2graph.Edge - lifelines []*d2graph.Edge - actors []*d2graph.Object - spans []*d2graph.Object - - // can be either actors or spans - // rank: left to right position of actors/spans (spans have the same rank as their parents) - 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 - - messageYStep float64 - actorXStep float64 - maxActorHeight float64 -} - -func newSequenceDiagram(actors []*d2graph.Object, messages []*d2graph.Edge) *sequenceDiagram { - sd := &sequenceDiagram{ - messages: messages, - actors: actors, - spans: nil, - lifelines: nil, - objectRank: make(map[*d2graph.Object]int), - minMessageRank: make(map[*d2graph.Object]int), - maxMessageRank: make(map[*d2graph.Object]int), - messageYStep: MIN_MESSAGE_DISTANCE, - actorXStep: MIN_ACTOR_DISTANCE, - maxActorHeight: 0., - } - - for rank, actor := range actors { - sd.objectRank[actor] = rank - sd.maxActorHeight = math.Max(sd.maxActorHeight, actor.Height) - - queue := make([]*d2graph.Object, len(actor.ChildrenArray)) - copy(queue, actor.ChildrenArray) - for len(queue) > 0 { - span := queue[0] - queue = queue[1:] - - // spans are always rectangles and have no labels - span.Attributes.Label = d2graph.Scalar{Value: ""} - span.Attributes.Shape = d2graph.Scalar{Value: shape.SQUARE_TYPE} - sd.spans = append(sd.spans, span) - sd.objectRank[span] = rank - - queue = append(queue, span.ChildrenArray...) - } - } - - for rank, 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])) - distributedLabelWidth := float64(message.LabelDimensions.Width) / rankDiff - sd.actorXStep = math.Max(sd.actorXStep, distributedLabelWidth+HORIZONTAL_PAD) - } - - sd.maxActorHeight += VERTICAL_PAD - sd.messageYStep += VERTICAL_PAD - - 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() { - sd.placeActors() - sd.placeSpans() - sd.routeMessages() - sd.addLifelineEdges() -} - -// placeActors places actors bottom aligned, side by side -func (sd *sequenceDiagram) placeActors() { - x := 0. - for _, actors := range sd.actors { - yOffset := sd.maxActorHeight - actors.Height - actors.TopLeft = geo.NewPoint(x, yOffset) - x += actors.Width + sd.actorXStep - actors.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter)) - } -} - -// addLifelineEdges adds a new edge for each actor in the graph that represents the its lifeline -// ┌──────────────┐ -// │ actor │ -// └──────┬───────┘ -// │ -// │ lifeline -// │ -// │ -func (sd *sequenceDiagram) addLifelineEdges() { - endY := sd.getMessageY(len(sd.messages)) - for _, actor := range sd.actors { - actorBottom := actor.Center() - actorBottom.Y = actor.TopLeft.Y + actor.Height - actorLifelineEnd := actor.Center() - actorLifelineEnd.Y = endY - sd.lifelines = append(sd.lifelines, &d2graph.Edge{ - Attributes: d2graph.Attributes{ - Style: d2graph.Style{ - StrokeDash: &d2graph.Scalar{Value: "10"}, - Stroke: actor.Attributes.Style.Stroke, - StrokeWidth: actor.Attributes.Style.StrokeWidth, - }, - }, - Src: actor, - SrcArrow: false, - Dst: &d2graph.Object{ - ID: actor.ID + fmt.Sprintf("-lifeline-end-%d", go2.StringToIntHash(actor.ID+"-lifeline-end")), - }, - DstArrow: false, - Route: []*geo.Point{actorBottom, actorLifelineEnd}, - }) - } -} - -// placeSpans places spans over the object lifeline -// ┌──────────┐ -// │ actor │ -// └────┬─────┘ -// ┌─┴──┐ -// │ │ -// |span| -// │ │ -// └─┬──┘ -// │ -// lifeline -// │ -func (sd *sequenceDiagram) placeSpans() { - // quickly find the span center X - rankToX := make(map[int]float64) - for _, actor := range sd.actors { - rankToX[sd.objectRank[actor]] = actor.Center().X - } - - // places spans from most to least nested - // the order is important because the only way a child span exists is if there'e an message to it - // however, the parent span might not have a message to it and then its position is based on the child position - // or, there can be a message to it, but it comes after the child one meaning the top left position is still based on the child - // and not on its own message - spanFromMostNested := make([]*d2graph.Object, len(sd.spans)) - copy(spanFromMostNested, sd.spans) - sort.SliceStable(spanFromMostNested, func(i, j int) bool { - return spanFromMostNested[i].Level() > spanFromMostNested[j].Level() - }) - for _, span := range spanFromMostNested { - // finds the position based on children - minChildY := math.Inf(1) - maxChildY := math.Inf(-1) - for _, child := range span.ChildrenArray { - minChildY = math.Min(minChildY, child.TopLeft.Y) - maxChildY = math.Max(maxChildY, child.TopLeft.Y+child.Height) - } - - // 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) - } - maxMessageY := math.Inf(-1) - if maxRank, exists := sd.maxMessageRank[span]; exists { - maxMessageY = sd.getMessageY(maxRank) - } - - // if it is the same as the child top left, add some padding - minY := math.Min(minMessageY, minChildY) - if minY == minChildY { - minY -= SPAN_DEPTH_GROW_FACTOR - } else { - minY -= SPAN_MESSAGE_PAD - } - maxY := math.Max(maxMessageY, maxChildY) - if maxY == maxChildY { - maxY += SPAN_DEPTH_GROW_FACTOR - } else { - maxY += SPAN_MESSAGE_PAD - } - - height := math.Max(maxY-minY, MIN_SPAN_HEIGHT) - // -2 because the actors count as level 1 making the first level span getting 2*SPAN_DEPTH_GROW_FACTOR - width := SPAN_WIDTH + (float64(span.Level()-2) * SPAN_DEPTH_GROW_FACTOR) - x := rankToX[sd.objectRank[span]] - (width / 2.) - span.Box = geo.NewBox(geo.NewPoint(x, minY), width, height) - span.ZIndex = 1 - } -} - -// routeMessages routes horizontal edges (messages) from Src to Dst -func (sd *sequenceDiagram) routeMessages() { - for rank, message := range sd.messages { - isLeftToRight := message.Src.TopLeft.X < message.Dst.TopLeft.X - - // 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 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 - } - - if isLeftToRight { - startX += SPAN_MESSAGE_PAD - endX -= SPAN_MESSAGE_PAD - } else { - startX -= SPAN_MESSAGE_PAD - endX += SPAN_MESSAGE_PAD - } - - messageY := sd.getMessageY(rank) - message.Route = []*geo.Point{ - geo.NewPoint(startX, messageY), - geo.NewPoint(endX, messageY), - } - - if message.Attributes.Label.Value != "" { - if isLeftToRight { - message.LabelPosition = go2.Pointer(string(label.OutsideTopCenter)) - } else { - // the label will be placed above the message because the orientation is based on the edge normal vector - message.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter)) - } - } - } -} - -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 (sd *sequenceDiagram) isActor(obj *d2graph.Object) bool { - // TODO: map to avoid looping around every time? - for _, actor := range sd.actors { - if actor == obj { - return true - } - } - return false -} - -func (sd *sequenceDiagram) getWidth() float64 { - // the layout is always placed starting at 0, so the width is just the last actor - lastActor := sd.actors[len(sd.actors)-1] - return lastActor.TopLeft.X + lastActor.Width -} - -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)) -} - -func (sd *sequenceDiagram) shift(tl *geo.Point) { - allObjects := append([]*d2graph.Object{}, sd.actors...) - allObjects = append(allObjects, sd.spans...) - for _, obj := range allObjects { - obj.TopLeft.X += tl.X - obj.TopLeft.Y += tl.Y - } - - allEdges := append([]*d2graph.Edge{}, sd.messages...) - allEdges = append(allEdges, sd.lifelines...) - for _, edge := range allEdges { - for _, p := range edge.Route { - p.X += tl.X - p.Y += tl.Y - } - } -} From 2841b8b9fa491bf74527f3af95255d0608349806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 13:39:48 -0800 Subject: [PATCH 07/24] Keep g.Objects in order --- d2layouts/d2sequence/layout.go | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/d2layouts/d2sequence/layout.go b/d2layouts/d2sequence/layout.go index 8356e1a64..87e5e0147 100644 --- a/d2layouts/d2sequence/layout.go +++ b/d2layouts/d2sequence/layout.go @@ -21,8 +21,8 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte oldObjects := g.Objects oldEdges := g.Edges - // new graph objects - g.Objects = make([]*d2graph.Object, 0, len(g.Objects)) + // flag objects to keep to avoid having to flag all descendants of sequence diagram to be removed + objectsToKeep := make(map[*d2graph.Object]struct{}) // edges flagged to be removed (these are internal edges of the sequence diagrams) edgesToRemove := make(map[*d2graph.Edge]struct{}) // store the sequence diagram related to a given node @@ -38,9 +38,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte queue = queue[1:] // root is not part of g.Objects, so we can't add it here - if obj != g.Root { - g.Objects = append(g.Objects, obj) - } + objectsToKeep[obj] = struct{}{} if obj.Attributes.Shape.Value == d2target.ShapeSequenceDiagram { // TODO: should update obj.References too? @@ -52,6 +50,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte sdMock := obj.EnsureChild([]string{"sequence_diagram"}) sdMock.Attributes.Shape.Value = d2target.ShapeRectangle sdMock.Attributes.Label.Value = "" + objectsToKeep[sdMock] = struct{}{} // find the edges that belong to this sequence diagra var edges []*d2graph.Edge @@ -81,15 +80,17 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte } } - // objToIndex := make(map[*d2graph.Object]int) - // for i, obj := range oldObjects { - // objToIndex[obj] = i - // } - - // sort.Slice(g.Objects, func(i, j int) bool { - // return objToIndex[g.Objects[i]] < objToIndex[g.Objects[j]] - // }) + // done this way (by flagging objects) instead of appending to `queue` + // because appending in that order would change the order of g.Objects which + // could lead to layout changes (as the order of the objects might be important for the underlying engine) + newObjects := make([]*d2graph.Object, 0, len(objectsToKeep)) + for _, obj := range g.Objects { + if _, exists := objectsToKeep[obj]; exists { + newObjects = append(newObjects, obj) + } + } + g.Objects = newObjects g.Edges = newEdges if err := layout(ctx, g); err != nil { return err From 3684a1e7709bd66c5b05dc3a01a6f17f58e0b7e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 13:40:19 -0800 Subject: [PATCH 08/24] Add sequence diagram --- d2layouts/d2sequence/sequence_diagram.go | 311 +++++++++++++++++++++++ 1 file changed, 311 insertions(+) create mode 100644 d2layouts/d2sequence/sequence_diagram.go diff --git a/d2layouts/d2sequence/sequence_diagram.go b/d2layouts/d2sequence/sequence_diagram.go new file mode 100644 index 000000000..685743fc9 --- /dev/null +++ b/d2layouts/d2sequence/sequence_diagram.go @@ -0,0 +1,311 @@ +package d2sequence + +import ( + "fmt" + "math" + "sort" + + "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/lib/geo" + "oss.terrastruct.com/d2/lib/go2" + "oss.terrastruct.com/d2/lib/label" + "oss.terrastruct.com/d2/lib/shape" +) + +type sequenceDiagram struct { + messages []*d2graph.Edge + lifelines []*d2graph.Edge + actors []*d2graph.Object + spans []*d2graph.Object + + // can be either actors or spans + // rank: left to right position of actors/spans (spans have the same rank as their parents) + 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 + + messageYStep float64 + actorXStep float64 + maxActorHeight float64 +} + +func newSequenceDiagram(actors []*d2graph.Object, messages []*d2graph.Edge) *sequenceDiagram { + sd := &sequenceDiagram{ + messages: messages, + actors: actors, + spans: nil, + lifelines: nil, + objectRank: make(map[*d2graph.Object]int), + minMessageRank: make(map[*d2graph.Object]int), + maxMessageRank: make(map[*d2graph.Object]int), + messageYStep: MIN_MESSAGE_DISTANCE, + actorXStep: MIN_ACTOR_DISTANCE, + maxActorHeight: 0., + } + + for rank, actor := range actors { + sd.objectRank[actor] = rank + sd.maxActorHeight = math.Max(sd.maxActorHeight, actor.Height) + + queue := make([]*d2graph.Object, len(actor.ChildrenArray)) + copy(queue, actor.ChildrenArray) + for len(queue) > 0 { + span := queue[0] + queue = queue[1:] + + // spans are always rectangles and have no labels + span.Attributes.Label = d2graph.Scalar{Value: ""} + span.Attributes.Shape = d2graph.Scalar{Value: shape.SQUARE_TYPE} + sd.spans = append(sd.spans, span) + sd.objectRank[span] = rank + + queue = append(queue, span.ChildrenArray...) + } + } + + for rank, 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])) + distributedLabelWidth := float64(message.LabelDimensions.Width) / rankDiff + sd.actorXStep = math.Max(sd.actorXStep, distributedLabelWidth+HORIZONTAL_PAD) + } + + sd.maxActorHeight += VERTICAL_PAD + sd.messageYStep += VERTICAL_PAD + + 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() { + sd.placeActors() + sd.placeSpans() + sd.routeMessages() + sd.addLifelineEdges() +} + +// placeActors places actors bottom aligned, side by side +func (sd *sequenceDiagram) placeActors() { + x := 0. + for _, actors := range sd.actors { + yOffset := sd.maxActorHeight - actors.Height + actors.TopLeft = geo.NewPoint(x, yOffset) + x += actors.Width + sd.actorXStep + actors.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter)) + } +} + +// addLifelineEdges adds a new edge for each actor in the graph that represents the its lifeline +// ┌──────────────┐ +// │ actor │ +// └──────┬───────┘ +// │ +// │ lifeline +// │ +// │ +func (sd *sequenceDiagram) addLifelineEdges() { + endY := sd.getMessageY(len(sd.messages)) + for _, actor := range sd.actors { + actorBottom := actor.Center() + actorBottom.Y = actor.TopLeft.Y + actor.Height + actorLifelineEnd := actor.Center() + actorLifelineEnd.Y = endY + sd.lifelines = append(sd.lifelines, &d2graph.Edge{ + Attributes: d2graph.Attributes{ + Style: d2graph.Style{ + StrokeDash: &d2graph.Scalar{Value: "10"}, + Stroke: actor.Attributes.Style.Stroke, + StrokeWidth: actor.Attributes.Style.StrokeWidth, + }, + }, + Src: actor, + SrcArrow: false, + Dst: &d2graph.Object{ + ID: actor.ID + fmt.Sprintf("-lifeline-end-%d", go2.StringToIntHash(actor.ID+"-lifeline-end")), + }, + DstArrow: false, + Route: []*geo.Point{actorBottom, actorLifelineEnd}, + }) + } +} + +// placeSpans places spans over the object lifeline +// ┌──────────┐ +// │ actor │ +// └────┬─────┘ +// ┌─┴──┐ +// │ │ +// |span| +// │ │ +// └─┬──┘ +// │ +// lifeline +// │ +func (sd *sequenceDiagram) placeSpans() { + // quickly find the span center X + rankToX := make(map[int]float64) + for _, actor := range sd.actors { + rankToX[sd.objectRank[actor]] = actor.Center().X + } + + // places spans from most to least nested + // the order is important because the only way a child span exists is if there'e an message to it + // however, the parent span might not have a message to it and then its position is based on the child position + // or, there can be a message to it, but it comes after the child one meaning the top left position is still based on the child + // and not on its own message + spanFromMostNested := make([]*d2graph.Object, len(sd.spans)) + copy(spanFromMostNested, sd.spans) + sort.SliceStable(spanFromMostNested, func(i, j int) bool { + return spanFromMostNested[i].Level() > spanFromMostNested[j].Level() + }) + for _, span := range spanFromMostNested { + // finds the position based on children + minChildY := math.Inf(1) + maxChildY := math.Inf(-1) + for _, child := range span.ChildrenArray { + minChildY = math.Min(minChildY, child.TopLeft.Y) + maxChildY = math.Max(maxChildY, child.TopLeft.Y+child.Height) + } + + // 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) + } + maxMessageY := math.Inf(-1) + if maxRank, exists := sd.maxMessageRank[span]; exists { + maxMessageY = sd.getMessageY(maxRank) + } + + // if it is the same as the child top left, add some padding + minY := math.Min(minMessageY, minChildY) + if minY == minChildY { + minY -= SPAN_DEPTH_GROW_FACTOR + } else { + minY -= SPAN_MESSAGE_PAD + } + maxY := math.Max(maxMessageY, maxChildY) + if maxY == maxChildY { + maxY += SPAN_DEPTH_GROW_FACTOR + } else { + maxY += SPAN_MESSAGE_PAD + } + + height := math.Max(maxY-minY, MIN_SPAN_HEIGHT) + // -2 because the actors count as level 1 making the first level span getting 2*SPAN_DEPTH_GROW_FACTOR + width := SPAN_WIDTH + (float64(span.Level()-2) * SPAN_DEPTH_GROW_FACTOR) + x := rankToX[sd.objectRank[span]] - (width / 2.) + span.Box = geo.NewBox(geo.NewPoint(x, minY), width, height) + span.ZIndex = 1 + } +} + +// routeMessages routes horizontal edges (messages) from Src to Dst +func (sd *sequenceDiagram) routeMessages() { + for rank, message := range sd.messages { + isLeftToRight := message.Src.TopLeft.X < message.Dst.TopLeft.X + + // 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 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 + } + + if isLeftToRight { + startX += SPAN_MESSAGE_PAD + endX -= SPAN_MESSAGE_PAD + } else { + startX -= SPAN_MESSAGE_PAD + endX += SPAN_MESSAGE_PAD + } + + messageY := sd.getMessageY(rank) + message.Route = []*geo.Point{ + geo.NewPoint(startX, messageY), + geo.NewPoint(endX, messageY), + } + + if message.Attributes.Label.Value != "" { + if isLeftToRight { + message.LabelPosition = go2.Pointer(string(label.OutsideTopCenter)) + } else { + // the label will be placed above the message because the orientation is based on the edge normal vector + message.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter)) + } + } + } +} + +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 (sd *sequenceDiagram) isActor(obj *d2graph.Object) bool { + // TODO: map to avoid looping around every time? + for _, actor := range sd.actors { + if actor == obj { + return true + } + } + return false +} + +func (sd *sequenceDiagram) getWidth() float64 { + // the layout is always placed starting at 0, so the width is just the last actor + lastActor := sd.actors[len(sd.actors)-1] + return lastActor.TopLeft.X + lastActor.Width +} + +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)) +} + +func (sd *sequenceDiagram) shift(tl *geo.Point) { + allObjects := append([]*d2graph.Object{}, sd.actors...) + allObjects = append(allObjects, sd.spans...) + for _, obj := range allObjects { + obj.TopLeft.X += tl.X + obj.TopLeft.Y += tl.Y + } + + allEdges := append([]*d2graph.Edge{}, sd.messages...) + allEdges = append(allEdges, sd.lifelines...) + for _, edge := range allEdges { + for _, p := range edge.Route { + p.X += tl.X + p.Y += tl.Y + } + } +} From d3316c7961a829a62e88d57974156120d1fe40eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 13:56:47 -0800 Subject: [PATCH 09/24] Add sequence diagram e2etests --- e2etests/stable_test.go | 167 + .../dagre/board.exp.json | 1472 +++++ .../dagre/sketch.exp.svg | 24 + .../elk/board.exp.json | 1472 +++++ .../elk/sketch.exp.svg | 24 + .../dagre/board.exp.json | 787 +++ .../dagre/sketch.exp.svg | 31 + .../elk/board.exp.json | 787 +++ .../elk/sketch.exp.svg | 31 + .../dagre/board.exp.json | 1400 +++++ .../dagre/sketch.exp.svg | 31 + .../sequence_diagram_span/elk/board.exp.json | 1400 +++++ .../sequence_diagram_span/elk/sketch.exp.svg | 31 + .../sequence_diagrams/dagre/board.exp.json | 4816 +++++++++++++++++ .../sequence_diagrams/dagre/sketch.exp.svg | 31 + .../sequence_diagrams/elk/board.exp.json | 4711 ++++++++++++++++ .../sequence_diagrams/elk/sketch.exp.svg | 31 + 17 files changed, 17246 insertions(+) create mode 100644 e2etests/testdata/stable/sequence_diagram_nested_span/dagre/board.exp.json create mode 100644 e2etests/testdata/stable/sequence_diagram_nested_span/dagre/sketch.exp.svg create mode 100644 e2etests/testdata/stable/sequence_diagram_nested_span/elk/board.exp.json create mode 100644 e2etests/testdata/stable/sequence_diagram_nested_span/elk/sketch.exp.svg create mode 100644 e2etests/testdata/stable/sequence_diagram_simple/dagre/board.exp.json create mode 100644 e2etests/testdata/stable/sequence_diagram_simple/dagre/sketch.exp.svg create mode 100644 e2etests/testdata/stable/sequence_diagram_simple/elk/board.exp.json create mode 100644 e2etests/testdata/stable/sequence_diagram_simple/elk/sketch.exp.svg create mode 100644 e2etests/testdata/stable/sequence_diagram_span/dagre/board.exp.json create mode 100644 e2etests/testdata/stable/sequence_diagram_span/dagre/sketch.exp.svg create mode 100644 e2etests/testdata/stable/sequence_diagram_span/elk/board.exp.json create mode 100644 e2etests/testdata/stable/sequence_diagram_span/elk/sketch.exp.svg create mode 100644 e2etests/testdata/stable/sequence_diagrams/dagre/board.exp.json create mode 100644 e2etests/testdata/stable/sequence_diagrams/dagre/sketch.exp.svg create mode 100644 e2etests/testdata/stable/sequence_diagrams/elk/board.exp.json create mode 100644 e2etests/testdata/stable/sequence_diagrams/elk/sketch.exp.svg diff --git a/e2etests/stable_test.go b/e2etests/stable_test.go index f75a8d6e3..87e6cfd39 100644 --- a/e2etests/stable_test.go +++ b/e2etests/stable_test.go @@ -1043,6 +1043,173 @@ size XXXL -> custom 64: custom 48 { style.font-size: 48 } `, + }, { + name: "sequence_diagram_simple", + script: `shape: sequence_diagram + +alice: "Alice\nline\nbreaker" { + shape: person + style.stroke: red +} +bob: "Bob" { + shape: person + style.stroke-width: 5 +} +db: { + shape: cylinder +} +queue: { + shape: queue +} +service: "an\nodd\nservice\nwith\na\nname\nin\nmultiple lines" + +alice -> bob: "Authentication Request" +bob -> service: "make request for something that is quite far away and requires a really long label to take all the space between the objects" +service -> db: "validate credentials" +db -> service: { + style.stroke-dash: 4 +} +service -> bob: { + style.stroke-dash: 4 +} +bob -> alice: "Authentication Response" +alice -> bob: "Another authentication Request" +bob -> queue: "do it later" +queue -> bob: "stored" { + style.stroke-dash: 3 + style.stroke-width: 5 + style.stroke: green +} + +bob -> alice: "Another authentication Response"`, + }, { + name: "sequence_diagram_span", + script: `shape: sequence_diagram + +scorer.t -> itemResponse.t: getItem() +scorer.t <- itemResponse.t: item + +scorer.t -> item.t1: getRubric() +scorer.t <- item.t1: rubric + +scorer.t -> essayRubric.t: applyTo(essayResp) +itemResponse -> essayRubric.t.c +essayRubric.t.c -> concept.t: match(essayResponse) +scorer <- essayRubric.t: score + +scorer.t -> itemOutcome.t1: new +scorer.t -> item.t2: getNormalMinimum() +scorer.t -> item.t3: getNormalMaximum() + +scorer.t -> itemOutcome.t2: setScore(score) +scorer.t -> itemOutcome.t3: setFeedback(missingConcepts)`, + }, { + name: "sequence_diagram_nested_span", + script: `shape: sequence_diagram + +scorer: { + stroke: red + stroke-width: 5 +} + +scorer.abc: { + fill: yellow + stroke-width: 7 +} + +scorer -> itemResponse.a: { + stroke-width: 10 +} +itemResponse.a -> item.a.b +item.a.b -> essayRubric.a.b.c +essayRubric.a.b.c -> concept.a.b.c.d +item.a -> essayRubric.a.b +concept.a.b.c.d -> itemOutcome.a.b.c.d.e + +scorer.abc -> item.a + +itemOutcome.a.b.c.d.e -> scorer +scorer -> itemResponse.c`, + }, { + name: "sequence_diagrams", + script: `a_shape.shape: circle +a_sequence: { + shape: sequence_diagram + + scorer.t -> itemResponse.t: getItem() + scorer.t <- itemResponse.t: item + + scorer.t -> item.t1: getRubric() + scorer.t <- item.t1: rubric + + scorer.t -> essayRubric.t: applyTo(essayResp) + itemResponse -> essayRubric.t.c + essayRubric.t.c -> concept.t: match(essayResponse) + scorer <- essayRubric.t: score + + scorer.t <-> itemOutcome.t1: new + scorer.t <-> item.t2: getNormalMinimum() + scorer.t -> item.t3: getNormalMaximum() + + scorer.t -- itemOutcome.t2: setScore(score) + scorer.t -- itemOutcome.t3: setFeedback(missingConcepts) +} + +another: { + sequence: { + shape: sequence_diagram + + # scoped edges + scorer.t -> itemResponse.t: getItem() + scorer.t <- itemResponse.t: item + + scorer.t -> item.t1: getRubric() + scorer.t <- item.t1: rubric + + scorer.t -> essayRubric.t: applyTo(essayResp) + itemResponse -> essayRubric.t.c + essayRubric.t.c -> concept.t: match(essayResponse) + scorer <- essayRubric.t: score + + scorer.t -> itemOutcome.t1: new + scorer.t <-> item.t2: getNormalMinimum() + scorer.t -> item.t3: getNormalMaximum() + + scorer.t -> itemOutcome.t2: setScore(score) + scorer.t -> itemOutcome.t3: setFeedback(missingConcepts) + } +} + +a_shape -> a_sequence +a_shape -> another.sequence +a_sequence -> sequence +another.sequence <-> finally.sequence +a_shape -- finally + + +finally: { + shape: queue + sequence: { + shape: sequence_diagram + # items appear in this order + scorer + concept + essayRubric + item + itemOutcome + itemResponse + } +} + +# full path edges +finally.sequence.itemResponse.a -> finally.sequence.item.a.b +finally.sequence.item.a.b -> finally.sequence.essayRubric.a.b.c +finally.sequence.essayRubric.a.b.c -> finally.sequence.concept.a.b.c.d +finally.sequence.item.a -> finally.sequence.essayRubric.a.b +finally.sequence.concept.a.b.c.d -> finally.sequence.itemOutcome.a.b.c.d.e +finally.sequence.scorer.abc -> finally.sequence.item.a +finally.sequence.itemOutcome.a.b.c.d.e -> finally.sequence.scorer +finally.sequence.scorer -> finally.sequence.itemResponse.c`, }, } diff --git a/e2etests/testdata/stable/sequence_diagram_nested_span/dagre/board.exp.json b/e2etests/testdata/stable/sequence_diagram_nested_span/dagre/board.exp.json new file mode 100644 index 000000000..61003c046 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_nested_span/dagre/board.exp.json @@ -0,0 +1,1472 @@ +{ + "name": "", + "shapes": [ + { + "id": "scorer", + "type": "", + "pos": { + "x": 0, + "y": 50 + }, + "width": 179, + "height": 141, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 5, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "red", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "scorer", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 79, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "scorer.abc", + "type": "rectangle", + "pos": { + "x": 79, + "y": 1236 + }, + "width": 20, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 7, + "borderRadius": 0, + "fill": "yellow", + "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": 31, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemResponse", + "type": "", + "pos": { + "x": 379, + "y": 50 + }, + "width": 270, + "height": 141, + "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": "itemResponse", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 170, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "itemResponse.a", + "type": "rectangle", + "pos": { + "x": 504, + "y": 336 + }, + "width": 20, + "height": 160, + "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 + }, + { + "id": "item", + "type": "", + "pos": { + "x": 849, + "y": 50 + }, + "width": 157, + "height": 141, + "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": "item", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 57, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "item.a", + "type": "rectangle", + "pos": { + "x": 917, + "y": 476 + }, + "width": 20, + "height": 770, + "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": "item.a.b", + "type": "rectangle", + "pos": { + "x": 912, + "y": 486 + }, + "width": 30, + "height": 160, + "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": "essayRubric", + "type": "", + "pos": { + "x": 1206, + "y": 50 + }, + "width": 245, + "height": 141, + "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": "essayRubric", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 145, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "essayRubric.a", + "type": "rectangle", + "pos": { + "x": 1318, + "y": 616 + }, + "width": 20, + "height": 340, + "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": "essayRubric.a.b", + "type": "rectangle", + "pos": { + "x": 1313, + "y": 626 + }, + "width": 30, + "height": 320, + "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": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 15, + "labelHeight": 31, + "zIndex": 1, + "level": 3 + }, + { + "id": "essayRubric.a.b.c", + "type": "rectangle", + "pos": { + "x": 1308, + "y": 636 + }, + "width": 40, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 4 + }, + { + "id": "concept", + "type": "", + "pos": { + "x": 1651, + "y": 50 + }, + "width": 200, + "height": 141, + "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": "concept", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 100, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "concept.a", + "type": "rectangle", + "pos": { + "x": 1741, + "y": 756 + }, + "width": 20, + "height": 370, + "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": "concept.a.b", + "type": "rectangle", + "pos": { + "x": 1736, + "y": 766 + }, + "width": 30, + "height": 350, + "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": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 15, + "labelHeight": 31, + "zIndex": 1, + "level": 3 + }, + { + "id": "concept.a.b.c", + "type": "rectangle", + "pos": { + "x": 1731, + "y": 776 + }, + "width": 40, + "height": 330, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "concept.a.b.c.d", + "type": "rectangle", + "pos": { + "x": 1726, + "y": 786 + }, + "width": 50, + "height": 310, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 14, + "labelHeight": 26, + "zIndex": 1, + "level": 5 + }, + { + "id": "itemOutcome", + "type": "", + "pos": { + "x": 2051, + "y": 50 + }, + "width": 265, + "height": 141, + "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": "itemOutcome", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 165, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "itemOutcome.a", + "type": "rectangle", + "pos": { + "x": 2173, + "y": 1046 + }, + "width": 20, + "height": 390, + "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": "itemOutcome.a.b", + "type": "rectangle", + "pos": { + "x": 2168, + "y": 1056 + }, + "width": 30, + "height": 370, + "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": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 15, + "labelHeight": 31, + "zIndex": 1, + "level": 3 + }, + { + "id": "itemOutcome.a.b.c", + "type": "rectangle", + "pos": { + "x": 2163, + "y": 1066 + }, + "width": 40, + "height": 350, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "itemOutcome.a.b.c.d", + "type": "rectangle", + "pos": { + "x": 2158, + "y": 1076 + }, + "width": 50, + "height": 330, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "itemOutcome.a.b.c.d.e", + "type": "rectangle", + "pos": { + "x": 2153, + "y": 1086 + }, + "width": 60, + "height": 310, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 6 + }, + { + "id": "itemResponse.c", + "type": "rectangle", + "pos": { + "x": 504, + "y": 1536 + }, + "width": 20, + "height": 50, + "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": "(scorer -> itemResponse.a)[0]", + "src": "scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse.a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 10, + "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": 94.5, + "y": 341 + }, + { + "x": 499, + "y": 341 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemResponse.a -> item.a.b)[0]", + "src": "itemResponse.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.a.b", + "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": 529, + "y": 491 + }, + { + "x": 907.5, + "y": 491 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(item.a.b -> essayRubric.a.b.c)[0]", + "src": "item.a.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric.a.b.c", + "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": 947.5, + "y": 641 + }, + { + "x": 1303.5, + "y": 641 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(essayRubric.a.b.c -> concept.a.b.c.d)[0]", + "src": "essayRubric.a.b.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept.a.b.c.d", + "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": 1353.5, + "y": 791 + }, + { + "x": 1721, + "y": 791 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(item.a -> essayRubric.a.b)[0]", + "src": "item.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric.a.b", + "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": 942.5, + "y": 941 + }, + { + "x": 1308.5, + "y": 941 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(concept.a.b.c.d -> itemOutcome.a.b.c.d.e)[0]", + "src": "concept.a.b.c.d", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome.a.b.c.d.e", + "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": 1781, + "y": 1091 + }, + { + "x": 2148.5, + "y": 1091 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.abc -> item.a)[0]", + "src": "scorer.abc", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.a", + "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": 104.5, + "y": 1241 + }, + { + "x": 912.5, + "y": 1241 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemOutcome.a.b.c.d.e -> scorer)[0]", + "src": "itemOutcome.a.b.c.d.e", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer", + "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": 2148.5, + "y": 1391 + }, + { + "x": 94.5, + "y": 1391 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer -> itemResponse.c)[0]", + "src": "scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse.c", + "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": 94.5, + "y": 1541 + }, + { + "x": 499, + "y": 1541 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer -- )[0]", + "src": "scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "strokeWidth": 5, + "stroke": "red", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 89.5, + "y": 191 + }, + { + "x": 89.5, + "y": 1691 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemResponse -- )[0]", + "src": "itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 514, + "y": 191 + }, + { + "x": 514, + "y": 1691 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(item -- )[0]", + "src": "item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 927.5, + "y": 191 + }, + { + "x": 927.5, + "y": 1691 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(essayRubric -- )[0]", + "src": "essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1328.5, + "y": 191 + }, + { + "x": 1328.5, + "y": 1691 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(concept -- )[0]", + "src": "concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1751, + "y": 191 + }, + { + "x": 1751, + "y": 1691 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemOutcome -- )[0]", + "src": "itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2183.5, + "y": 191 + }, + { + "x": 2183.5, + "y": 1691 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + } + ] +} diff --git a/e2etests/testdata/stable/sequence_diagram_nested_span/dagre/sketch.exp.svg b/e2etests/testdata/stable/sequence_diagram_nested_span/dagre/sketch.exp.svg new file mode 100644 index 000000000..6c954c961 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_nested_span/dagre/sketch.exp.svg @@ -0,0 +1,24 @@ + +scoreritemResponseitemessayRubricconceptitemOutcome \ No newline at end of file diff --git a/e2etests/testdata/stable/sequence_diagram_nested_span/elk/board.exp.json b/e2etests/testdata/stable/sequence_diagram_nested_span/elk/board.exp.json new file mode 100644 index 000000000..ea7c579c9 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_nested_span/elk/board.exp.json @@ -0,0 +1,1472 @@ +{ + "name": "", + "shapes": [ + { + "id": "scorer", + "type": "", + "pos": { + "x": 12, + "y": 62 + }, + "width": 179, + "height": 141, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 5, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "red", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "scorer", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 79, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "scorer.abc", + "type": "rectangle", + "pos": { + "x": 91, + "y": 1248 + }, + "width": 20, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 7, + "borderRadius": 0, + "fill": "yellow", + "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": 31, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemResponse", + "type": "", + "pos": { + "x": 391, + "y": 62 + }, + "width": 270, + "height": 141, + "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": "itemResponse", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 170, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "itemResponse.a", + "type": "rectangle", + "pos": { + "x": 516, + "y": 348 + }, + "width": 20, + "height": 160, + "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 + }, + { + "id": "item", + "type": "", + "pos": { + "x": 861, + "y": 62 + }, + "width": 157, + "height": 141, + "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": "item", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 57, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "item.a", + "type": "rectangle", + "pos": { + "x": 929, + "y": 488 + }, + "width": 20, + "height": 770, + "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": "item.a.b", + "type": "rectangle", + "pos": { + "x": 924, + "y": 498 + }, + "width": 30, + "height": 160, + "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": "essayRubric", + "type": "", + "pos": { + "x": 1218, + "y": 62 + }, + "width": 245, + "height": 141, + "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": "essayRubric", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 145, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "essayRubric.a", + "type": "rectangle", + "pos": { + "x": 1330, + "y": 628 + }, + "width": 20, + "height": 340, + "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": "essayRubric.a.b", + "type": "rectangle", + "pos": { + "x": 1325, + "y": 638 + }, + "width": 30, + "height": 320, + "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": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 15, + "labelHeight": 31, + "zIndex": 1, + "level": 3 + }, + { + "id": "essayRubric.a.b.c", + "type": "rectangle", + "pos": { + "x": 1320, + "y": 648 + }, + "width": 40, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 4 + }, + { + "id": "concept", + "type": "", + "pos": { + "x": 1663, + "y": 62 + }, + "width": 200, + "height": 141, + "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": "concept", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 100, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "concept.a", + "type": "rectangle", + "pos": { + "x": 1753, + "y": 768 + }, + "width": 20, + "height": 370, + "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": "concept.a.b", + "type": "rectangle", + "pos": { + "x": 1748, + "y": 778 + }, + "width": 30, + "height": 350, + "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": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 15, + "labelHeight": 31, + "zIndex": 1, + "level": 3 + }, + { + "id": "concept.a.b.c", + "type": "rectangle", + "pos": { + "x": 1743, + "y": 788 + }, + "width": 40, + "height": 330, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "concept.a.b.c.d", + "type": "rectangle", + "pos": { + "x": 1738, + "y": 798 + }, + "width": 50, + "height": 310, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 14, + "labelHeight": 26, + "zIndex": 1, + "level": 5 + }, + { + "id": "itemOutcome", + "type": "", + "pos": { + "x": 2063, + "y": 62 + }, + "width": 265, + "height": 141, + "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": "itemOutcome", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 165, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "itemOutcome.a", + "type": "rectangle", + "pos": { + "x": 2185, + "y": 1058 + }, + "width": 20, + "height": 390, + "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": "itemOutcome.a.b", + "type": "rectangle", + "pos": { + "x": 2180, + "y": 1068 + }, + "width": 30, + "height": 370, + "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": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 15, + "labelHeight": 31, + "zIndex": 1, + "level": 3 + }, + { + "id": "itemOutcome.a.b.c", + "type": "rectangle", + "pos": { + "x": 2175, + "y": 1078 + }, + "width": 40, + "height": 350, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "itemOutcome.a.b.c.d", + "type": "rectangle", + "pos": { + "x": 2170, + "y": 1088 + }, + "width": 50, + "height": 330, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "itemOutcome.a.b.c.d.e", + "type": "rectangle", + "pos": { + "x": 2165, + "y": 1098 + }, + "width": 60, + "height": 310, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 6 + }, + { + "id": "itemResponse.c", + "type": "rectangle", + "pos": { + "x": 516, + "y": 1548 + }, + "width": 20, + "height": 50, + "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": "(scorer -> itemResponse.a)[0]", + "src": "scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse.a", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 10, + "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": 106.5, + "y": 353 + }, + { + "x": 511, + "y": 353 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemResponse.a -> item.a.b)[0]", + "src": "itemResponse.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.a.b", + "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": 541, + "y": 503 + }, + { + "x": 919.5, + "y": 503 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(item.a.b -> essayRubric.a.b.c)[0]", + "src": "item.a.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric.a.b.c", + "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": 959.5, + "y": 653 + }, + { + "x": 1315.5, + "y": 653 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(essayRubric.a.b.c -> concept.a.b.c.d)[0]", + "src": "essayRubric.a.b.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept.a.b.c.d", + "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": 1365.5, + "y": 803 + }, + { + "x": 1733, + "y": 803 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(item.a -> essayRubric.a.b)[0]", + "src": "item.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric.a.b", + "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": 954.5, + "y": 953 + }, + { + "x": 1320.5, + "y": 953 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(concept.a.b.c.d -> itemOutcome.a.b.c.d.e)[0]", + "src": "concept.a.b.c.d", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome.a.b.c.d.e", + "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": 1793, + "y": 1103 + }, + { + "x": 2160.5, + "y": 1103 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.abc -> item.a)[0]", + "src": "scorer.abc", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.a", + "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": 116.5, + "y": 1253 + }, + { + "x": 924.5, + "y": 1253 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemOutcome.a.b.c.d.e -> scorer)[0]", + "src": "itemOutcome.a.b.c.d.e", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer", + "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": 2160.5, + "y": 1403 + }, + { + "x": 106.5, + "y": 1403 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer -> itemResponse.c)[0]", + "src": "scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse.c", + "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": 106.5, + "y": 1553 + }, + { + "x": 511, + "y": 1553 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer -- )[0]", + "src": "scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "strokeWidth": 5, + "stroke": "red", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 101.5, + "y": 203 + }, + { + "x": 101.5, + "y": 1703 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemResponse -- )[0]", + "src": "itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 526, + "y": 203 + }, + { + "x": 526, + "y": 1703 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(item -- )[0]", + "src": "item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 939.5, + "y": 203 + }, + { + "x": 939.5, + "y": 1703 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(essayRubric -- )[0]", + "src": "essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1340.5, + "y": 203 + }, + { + "x": 1340.5, + "y": 1703 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(concept -- )[0]", + "src": "concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1763, + "y": 203 + }, + { + "x": 1763, + "y": 1703 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemOutcome -- )[0]", + "src": "itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2195.5, + "y": 203 + }, + { + "x": 2195.5, + "y": 1703 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + } + ] +} diff --git a/e2etests/testdata/stable/sequence_diagram_nested_span/elk/sketch.exp.svg b/e2etests/testdata/stable/sequence_diagram_nested_span/elk/sketch.exp.svg new file mode 100644 index 000000000..585e5a593 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_nested_span/elk/sketch.exp.svg @@ -0,0 +1,24 @@ + +scoreritemResponseitemessayRubricconceptitemOutcome \ No newline at end of file diff --git a/e2etests/testdata/stable/sequence_diagram_simple/dagre/board.exp.json b/e2etests/testdata/stable/sequence_diagram_simple/dagre/board.exp.json new file mode 100644 index 000000000..4fa724c72 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_simple/dagre/board.exp.json @@ -0,0 +1,787 @@ +{ + "name": "", + "shapes": [ + { + "id": "alice", + "type": "person", + "pos": { + "x": 0, + "y": 130 + }, + "width": 163, + "height": 158, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "red", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "Alice\nline\nbreaker", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 63, + "labelHeight": 58, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "bob", + "type": "person", + "pos": { + "x": 480, + "y": 162 + }, + "width": 132, + "height": 126, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 5, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "Bob", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 32, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "db", + "type": "cylinder", + "pos": { + "x": 929, + "y": 162 + }, + "width": 124, + "height": 126, + "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": "db", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "queue", + "type": "queue", + "pos": { + "x": 1370, + "y": 162 + }, + "width": 149, + "height": 126, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F0F3F9", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "queue", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 49, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "service", + "type": "", + "pos": { + "x": 1836, + "y": 50 + }, + "width": 202, + "height": 238, + "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": "an\nodd\nservice\nwith\na\nname\nin\nmultiple lines", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 102, + "labelHeight": 138, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + } + ], + "connections": [ + { + "id": "(alice -> bob)[0]", + "src": "alice", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "Authentication Request", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 155, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 86.5, + "y": 438 + }, + { + "x": 541, + "y": 438 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -> service)[0]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "service", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "make request for something that is quite far away and requires a really long label to take all the space between the objects", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 801, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 551, + "y": 588 + }, + { + "x": 1932, + "y": 588 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(service -> db)[0]", + "src": "service", + "srcArrow": "none", + "srcLabel": "", + "dst": "db", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "validate credentials", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 131, + "labelHeight": 21, + "labelPosition": "OUTSIDE_BOTTOM_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 1932, + "y": 738 + }, + { + "x": 996, + "y": 738 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(db -> service)[0]", + "src": "db", + "srcArrow": "none", + "srcLabel": "", + "dst": "service", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 4, + "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": 996, + "y": 888 + }, + { + "x": 1932, + "y": 888 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(service -> bob)[0]", + "src": "service", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 4, + "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": 1932, + "y": 1038 + }, + { + "x": 551, + "y": 1038 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -> alice)[0]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "alice", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "Authentication Response", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 164, + "labelHeight": 21, + "labelPosition": "OUTSIDE_BOTTOM_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 541, + "y": 1188 + }, + { + "x": 86.5, + "y": 1188 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(alice -> bob)[1]", + "src": "alice", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "Another authentication Request", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 210, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 86.5, + "y": 1338 + }, + { + "x": 541, + "y": 1338 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -> queue)[0]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "queue", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "do it later", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 65, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 551, + "y": 1488 + }, + { + "x": 1439.5, + "y": 1488 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(queue -> bob)[0]", + "src": "queue", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 3, + "strokeWidth": 5, + "stroke": "green", + "label": "stored", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 44, + "labelHeight": 21, + "labelPosition": "OUTSIDE_BOTTOM_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 1439.5, + "y": 1638 + }, + { + "x": 551, + "y": 1638 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -> alice)[1]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "alice", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "Another authentication Response", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 219, + "labelHeight": 21, + "labelPosition": "OUTSIDE_BOTTOM_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 541, + "y": 1788 + }, + { + "x": 86.5, + "y": 1788 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(alice -- )[0]", + "src": "alice", + "srcArrow": "none", + "srcLabel": "", + "dst": "alice-lifeline-end-3851299086", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "strokeWidth": 2, + "stroke": "red", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 81.5, + "y": 288 + }, + { + "x": 81.5, + "y": 1938 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -- )[0]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob-lifeline-end-3036726343", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "strokeWidth": 5, + "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": 546, + "y": 288 + }, + { + "x": 546, + "y": 1938 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(db -- )[0]", + "src": "db", + "srcArrow": "none", + "srcLabel": "", + "dst": "db-lifeline-end-2675250554", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 991, + "y": 288 + }, + { + "x": 991, + "y": 1938 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(queue -- )[0]", + "src": "queue", + "srcArrow": "none", + "srcLabel": "", + "dst": "queue-lifeline-end-1097346683", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1444.5, + "y": 288 + }, + { + "x": 1444.5, + "y": 1938 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(service -- )[0]", + "src": "service", + "srcArrow": "none", + "srcLabel": "", + "dst": "service-lifeline-end-22863415", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1937, + "y": 288 + }, + { + "x": 1937, + "y": 1938 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + } + ] +} diff --git a/e2etests/testdata/stable/sequence_diagram_simple/dagre/sketch.exp.svg b/e2etests/testdata/stable/sequence_diagram_simple/dagre/sketch.exp.svg new file mode 100644 index 000000000..a6b609da5 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_simple/dagre/sketch.exp.svg @@ -0,0 +1,31 @@ + +AlicelinebreakerBobdbqueueanoddservicewithanameinmultiple lines Authentication Requestmake request for something that is quite far away and requires a really long label to take all the space between the objectsvalidate credentialsAuthentication ResponseAnother authentication Requestdo it later storedAnother authentication Response \ No newline at end of file diff --git a/e2etests/testdata/stable/sequence_diagram_simple/elk/board.exp.json b/e2etests/testdata/stable/sequence_diagram_simple/elk/board.exp.json new file mode 100644 index 000000000..4a098b1b7 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_simple/elk/board.exp.json @@ -0,0 +1,787 @@ +{ + "name": "", + "shapes": [ + { + "id": "alice", + "type": "person", + "pos": { + "x": 12, + "y": 142 + }, + "width": 163, + "height": 158, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "red", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "Alice\nline\nbreaker", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 63, + "labelHeight": 58, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "bob", + "type": "person", + "pos": { + "x": 492, + "y": 174 + }, + "width": 132, + "height": 126, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 5, + "borderRadius": 0, + "fill": "#E3E9FD", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "Bob", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 32, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "db", + "type": "cylinder", + "pos": { + "x": 941, + "y": 174 + }, + "width": 124, + "height": 126, + "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": "db", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 24, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "queue", + "type": "queue", + "pos": { + "x": 1382, + "y": 174 + }, + "width": 149, + "height": 126, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F0F3F9", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "queue", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 49, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "service", + "type": "", + "pos": { + "x": 1848, + "y": 62 + }, + "width": 202, + "height": 238, + "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": "an\nodd\nservice\nwith\na\nname\nin\nmultiple lines", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 102, + "labelHeight": 138, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + } + ], + "connections": [ + { + "id": "(alice -> bob)[0]", + "src": "alice", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "Authentication Request", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 155, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 98.5, + "y": 450 + }, + { + "x": 553, + "y": 450 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -> service)[0]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "service", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "make request for something that is quite far away and requires a really long label to take all the space between the objects", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 801, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 563, + "y": 600 + }, + { + "x": 1944, + "y": 600 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(service -> db)[0]", + "src": "service", + "srcArrow": "none", + "srcLabel": "", + "dst": "db", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "validate credentials", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 131, + "labelHeight": 21, + "labelPosition": "OUTSIDE_BOTTOM_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 1944, + "y": 750 + }, + { + "x": 1008, + "y": 750 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(db -> service)[0]", + "src": "db", + "srcArrow": "none", + "srcLabel": "", + "dst": "service", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 4, + "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": 1008, + "y": 900 + }, + { + "x": 1944, + "y": 900 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(service -> bob)[0]", + "src": "service", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 4, + "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": 1944, + "y": 1050 + }, + { + "x": 563, + "y": 1050 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -> alice)[0]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "alice", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "Authentication Response", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 164, + "labelHeight": 21, + "labelPosition": "OUTSIDE_BOTTOM_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 553, + "y": 1200 + }, + { + "x": 98.5, + "y": 1200 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(alice -> bob)[1]", + "src": "alice", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "Another authentication Request", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 210, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 98.5, + "y": 1350 + }, + { + "x": 553, + "y": 1350 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -> queue)[0]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "queue", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "do it later", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 65, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 563, + "y": 1500 + }, + { + "x": 1451.5, + "y": 1500 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(queue -> bob)[0]", + "src": "queue", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 3, + "strokeWidth": 5, + "stroke": "green", + "label": "stored", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 44, + "labelHeight": 21, + "labelPosition": "OUTSIDE_BOTTOM_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 1451.5, + "y": 1650 + }, + { + "x": 563, + "y": 1650 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -> alice)[1]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "alice", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "Another authentication Response", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 219, + "labelHeight": 21, + "labelPosition": "OUTSIDE_BOTTOM_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 553, + "y": 1800 + }, + { + "x": 98.5, + "y": 1800 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(alice -- )[0]", + "src": "alice", + "srcArrow": "none", + "srcLabel": "", + "dst": "alice-lifeline-end-3851299086", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "strokeWidth": 2, + "stroke": "red", + "label": "", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 0, + "labelHeight": 0, + "labelPosition": "", + "labelPercentage": 0, + "route": [ + { + "x": 93.5, + "y": 300 + }, + { + "x": 93.5, + "y": 1950 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(bob -- )[0]", + "src": "bob", + "srcArrow": "none", + "srcLabel": "", + "dst": "bob-lifeline-end-3036726343", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "strokeWidth": 5, + "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": 558, + "y": 300 + }, + { + "x": 558, + "y": 1950 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(db -- )[0]", + "src": "db", + "srcArrow": "none", + "srcLabel": "", + "dst": "db-lifeline-end-2675250554", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1003, + "y": 300 + }, + { + "x": 1003, + "y": 1950 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(queue -- )[0]", + "src": "queue", + "srcArrow": "none", + "srcLabel": "", + "dst": "queue-lifeline-end-1097346683", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1456.5, + "y": 300 + }, + { + "x": 1456.5, + "y": 1950 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(service -- )[0]", + "src": "service", + "srcArrow": "none", + "srcLabel": "", + "dst": "service-lifeline-end-22863415", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1949, + "y": 300 + }, + { + "x": 1949, + "y": 1950 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + } + ] +} diff --git a/e2etests/testdata/stable/sequence_diagram_simple/elk/sketch.exp.svg b/e2etests/testdata/stable/sequence_diagram_simple/elk/sketch.exp.svg new file mode 100644 index 000000000..886422b79 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_simple/elk/sketch.exp.svg @@ -0,0 +1,31 @@ + +AlicelinebreakerBobdbqueueanoddservicewithanameinmultiple lines Authentication Requestmake request for something that is quite far away and requires a really long label to take all the space between the objectsvalidate credentialsAuthentication ResponseAnother authentication Requestdo it later storedAnother authentication Response \ No newline at end of file diff --git a/e2etests/testdata/stable/sequence_diagram_span/dagre/board.exp.json b/e2etests/testdata/stable/sequence_diagram_span/dagre/board.exp.json new file mode 100644 index 000000000..9c24b0a10 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_span/dagre/board.exp.json @@ -0,0 +1,1400 @@ +{ + "name": "", + "shapes": [ + { + "id": "scorer", + "type": "", + "pos": { + "x": 0, + "y": 50 + }, + "width": 179, + "height": 141, + "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": "scorer", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 79, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "scorer.t", + "type": "rectangle", + "pos": { + "x": 79, + "y": 336 + }, + "width": 20, + "height": 1810, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemResponse", + "type": "", + "pos": { + "x": 379, + "y": 50 + }, + "width": 270, + "height": 141, + "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": "itemResponse", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 170, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "itemResponse.t", + "type": "rectangle", + "pos": { + "x": 504, + "y": 336 + }, + "width": 20, + "height": 160, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "item", + "type": "", + "pos": { + "x": 849, + "y": 50 + }, + "width": 157, + "height": 141, + "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": "item", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 57, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "item.t1", + "type": "rectangle", + "pos": { + "x": 917, + "y": 636 + }, + "width": 20, + "height": 160, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "essayRubric", + "type": "", + "pos": { + "x": 1206, + "y": 50 + }, + "width": 245, + "height": 141, + "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": "essayRubric", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 145, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "essayRubric.t", + "type": "rectangle", + "pos": { + "x": 1318, + "y": 936 + }, + "width": 20, + "height": 460, + "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": 13, + "labelHeight": 36, + "zIndex": 1, + "level": 2 + }, + { + "id": "essayRubric.t.c", + "type": "rectangle", + "pos": { + "x": 1313, + "y": 1086 + }, + "width": 30, + "height": 160, + "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": "concept", + "type": "", + "pos": { + "x": 1651, + "y": 50 + }, + "width": 200, + "height": 141, + "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": "concept", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 100, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "concept.t", + "type": "rectangle", + "pos": { + "x": 1741, + "y": 1236 + }, + "width": 20, + "height": 50, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemOutcome", + "type": "", + "pos": { + "x": 2051, + "y": 50 + }, + "width": 265, + "height": 141, + "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": "itemOutcome", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 165, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "itemOutcome.t1", + "type": "rectangle", + "pos": { + "x": 2173, + "y": 1536 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "item.t2", + "type": "rectangle", + "pos": { + "x": 917, + "y": 1686 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "item.t3", + "type": "rectangle", + "pos": { + "x": 917, + "y": 1836 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemOutcome.t2", + "type": "rectangle", + "pos": { + "x": 2173, + "y": 1986 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemOutcome.t3", + "type": "rectangle", + "pos": { + "x": 2173, + "y": 2136 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + } + ], + "connections": [ + { + "id": "(scorer.t -> itemResponse.t)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getItem()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 60, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 341 + }, + { + "x": 499, + "y": 341 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t <- itemResponse.t)[0]", + "src": "scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "itemResponse.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "item", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 491 + }, + { + "x": 499, + "y": 491 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> item.t1)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getRubric()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 73, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 641 + }, + { + "x": 912.5, + "y": 641 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t <- item.t1)[0]", + "src": "scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "item.t1", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "rubric", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 39, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 791 + }, + { + "x": 912.5, + "y": 791 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> essayRubric.t)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "applyTo(essayResp)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 130, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 941 + }, + { + "x": 1313.5, + "y": 941 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemResponse -> essayRubric.t.c)[0]", + "src": "itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric.t.c", + "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": 519, + "y": 1091 + }, + { + "x": 1308.5, + "y": 1091 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(essayRubric.t.c -> concept.t)[0]", + "src": "essayRubric.t.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "match(essayResponse)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 150, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 1348.5, + "y": 1241 + }, + { + "x": 1736, + "y": 1241 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer <- essayRubric.t)[0]", + "src": "scorer", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "essayRubric.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "score", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 37, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 94.5, + "y": 1391 + }, + { + "x": 1313.5, + "y": 1391 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> itemOutcome.t1)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "new", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 1541 + }, + { + "x": 2168.5, + "y": 1541 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> item.t2)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMinimum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 141, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 1691 + }, + { + "x": 912.5, + "y": 1691 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> item.t3)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMaximum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 144, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 1841 + }, + { + "x": 912.5, + "y": 1841 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> itemOutcome.t2)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setScore(score)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 101, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 1991 + }, + { + "x": 2168.5, + "y": 1991 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> itemOutcome.t3)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setFeedback(missingConcepts)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 203, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 104.5, + "y": 2141 + }, + { + "x": 2168.5, + "y": 2141 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer -- )[0]", + "src": "scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 89.5, + "y": 191 + }, + { + "x": 89.5, + "y": 2291 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemResponse -- )[0]", + "src": "itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 514, + "y": 191 + }, + { + "x": 514, + "y": 2291 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(item -- )[0]", + "src": "item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 927.5, + "y": 191 + }, + { + "x": 927.5, + "y": 2291 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(essayRubric -- )[0]", + "src": "essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1328.5, + "y": 191 + }, + { + "x": 1328.5, + "y": 2291 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(concept -- )[0]", + "src": "concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1751, + "y": 191 + }, + { + "x": 1751, + "y": 2291 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemOutcome -- )[0]", + "src": "itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2183.5, + "y": 191 + }, + { + "x": 2183.5, + "y": 2291 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + } + ] +} diff --git a/e2etests/testdata/stable/sequence_diagram_span/dagre/sketch.exp.svg b/e2etests/testdata/stable/sequence_diagram_span/dagre/sketch.exp.svg new file mode 100644 index 000000000..57f9d3041 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_span/dagre/sketch.exp.svg @@ -0,0 +1,31 @@ + +scoreritemResponseitemessayRubricconceptitemOutcome getItem() itemgetRubric()rubricapplyTo(essayResp)match(essayResponse)scorenewgetNormalMinimum()getNormalMaximum()setScore(score)setFeedback(missingConcepts) \ No newline at end of file diff --git a/e2etests/testdata/stable/sequence_diagram_span/elk/board.exp.json b/e2etests/testdata/stable/sequence_diagram_span/elk/board.exp.json new file mode 100644 index 000000000..a6586ab47 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_span/elk/board.exp.json @@ -0,0 +1,1400 @@ +{ + "name": "", + "shapes": [ + { + "id": "scorer", + "type": "", + "pos": { + "x": 12, + "y": 62 + }, + "width": 179, + "height": 141, + "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": "scorer", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 79, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "scorer.t", + "type": "rectangle", + "pos": { + "x": 91, + "y": 348 + }, + "width": 20, + "height": 1810, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemResponse", + "type": "", + "pos": { + "x": 391, + "y": 62 + }, + "width": 270, + "height": 141, + "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": "itemResponse", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 170, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "itemResponse.t", + "type": "rectangle", + "pos": { + "x": 516, + "y": 348 + }, + "width": 20, + "height": 160, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "item", + "type": "", + "pos": { + "x": 861, + "y": 62 + }, + "width": 157, + "height": 141, + "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": "item", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 57, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "item.t1", + "type": "rectangle", + "pos": { + "x": 929, + "y": 648 + }, + "width": 20, + "height": 160, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "essayRubric", + "type": "", + "pos": { + "x": 1218, + "y": 62 + }, + "width": 245, + "height": 141, + "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": "essayRubric", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 145, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "essayRubric.t", + "type": "rectangle", + "pos": { + "x": 1330, + "y": 948 + }, + "width": 20, + "height": 460, + "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": 13, + "labelHeight": 36, + "zIndex": 1, + "level": 2 + }, + { + "id": "essayRubric.t.c", + "type": "rectangle", + "pos": { + "x": 1325, + "y": 1098 + }, + "width": 30, + "height": 160, + "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": "concept", + "type": "", + "pos": { + "x": 1663, + "y": 62 + }, + "width": 200, + "height": 141, + "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": "concept", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 100, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "concept.t", + "type": "rectangle", + "pos": { + "x": 1753, + "y": 1248 + }, + "width": 20, + "height": 50, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemOutcome", + "type": "", + "pos": { + "x": 2063, + "y": 62 + }, + "width": 265, + "height": 141, + "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": "itemOutcome", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 165, + "labelHeight": 41, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "itemOutcome.t1", + "type": "rectangle", + "pos": { + "x": 2185, + "y": 1548 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "item.t2", + "type": "rectangle", + "pos": { + "x": 929, + "y": 1698 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "item.t3", + "type": "rectangle", + "pos": { + "x": 929, + "y": 1848 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemOutcome.t2", + "type": "rectangle", + "pos": { + "x": 2185, + "y": 1998 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + }, + { + "id": "itemOutcome.t3", + "type": "rectangle", + "pos": { + "x": 2185, + "y": 2148 + }, + "width": 20, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 2 + } + ], + "connections": [ + { + "id": "(scorer.t -> itemResponse.t)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getItem()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 60, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 353 + }, + { + "x": 511, + "y": 353 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t <- itemResponse.t)[0]", + "src": "scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "itemResponse.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "item", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 503 + }, + { + "x": 511, + "y": 503 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> item.t1)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getRubric()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 73, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 653 + }, + { + "x": 924.5, + "y": 653 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t <- item.t1)[0]", + "src": "scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "item.t1", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "rubric", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 39, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 803 + }, + { + "x": 924.5, + "y": 803 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> essayRubric.t)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "applyTo(essayResp)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 130, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 953 + }, + { + "x": 1325.5, + "y": 953 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemResponse -> essayRubric.t.c)[0]", + "src": "itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric.t.c", + "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": 531, + "y": 1103 + }, + { + "x": 1320.5, + "y": 1103 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(essayRubric.t.c -> concept.t)[0]", + "src": "essayRubric.t.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "match(essayResponse)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 150, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 1360.5, + "y": 1253 + }, + { + "x": 1748, + "y": 1253 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer <- essayRubric.t)[0]", + "src": "scorer", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "essayRubric.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "score", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 37, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 106.5, + "y": 1403 + }, + { + "x": 1325.5, + "y": 1403 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> itemOutcome.t1)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "new", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 1553 + }, + { + "x": 2180.5, + "y": 1553 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> item.t2)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMinimum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 141, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 1703 + }, + { + "x": 924.5, + "y": 1703 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> item.t3)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "item.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMaximum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 144, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 1853 + }, + { + "x": 924.5, + "y": 1853 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> itemOutcome.t2)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setScore(score)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 101, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 2003 + }, + { + "x": 2180.5, + "y": 2003 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer.t -> itemOutcome.t3)[0]", + "src": "scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setFeedback(missingConcepts)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 203, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 116.5, + "y": 2153 + }, + { + "x": 2180.5, + "y": 2153 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(scorer -- )[0]", + "src": "scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 101.5, + "y": 203 + }, + { + "x": 101.5, + "y": 2303 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemResponse -- )[0]", + "src": "itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 526, + "y": 203 + }, + { + "x": 526, + "y": 2303 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(item -- )[0]", + "src": "item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 939.5, + "y": 203 + }, + { + "x": 939.5, + "y": 2303 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(essayRubric -- )[0]", + "src": "essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1340.5, + "y": 203 + }, + { + "x": 1340.5, + "y": 2303 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(concept -- )[0]", + "src": "concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1763, + "y": 203 + }, + { + "x": 1763, + "y": 2303 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(itemOutcome -- )[0]", + "src": "itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2195.5, + "y": 203 + }, + { + "x": 2195.5, + "y": 2303 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + } + ] +} diff --git a/e2etests/testdata/stable/sequence_diagram_span/elk/sketch.exp.svg b/e2etests/testdata/stable/sequence_diagram_span/elk/sketch.exp.svg new file mode 100644 index 000000000..626c00fcf --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagram_span/elk/sketch.exp.svg @@ -0,0 +1,31 @@ + +scoreritemResponseitemessayRubricconceptitemOutcome getItem() itemgetRubric()rubricapplyTo(essayResp)match(essayResponse)scorenewgetNormalMinimum()getNormalMaximum()setScore(score)setFeedback(missingConcepts) \ No newline at end of file diff --git a/e2etests/testdata/stable/sequence_diagrams/dagre/board.exp.json b/e2etests/testdata/stable/sequence_diagrams/dagre/board.exp.json new file mode 100644 index 000000000..a3932632f --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagrams/dagre/board.exp.json @@ -0,0 +1,4816 @@ +{ + "name": "", + "shapes": [ + { + "id": "a_shape", + "type": "oval", + "pos": { + "x": 2265, + "y": 0 + }, + "width": 164, + "height": 164, + "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": "a_shape", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 64, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "a_sequence", + "type": "sequence_diagram", + "pos": { + "x": 2433, + "y": 264 + }, + "width": 2317, + "height": 2486, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a_sequence", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 144, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "another", + "type": "", + "pos": { + "x": 0, + "y": 264 + }, + "width": 2307, + "height": 2486, + "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": "another", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 98, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "another.sequence", + "type": "sequence_diagram", + "pos": { + "x": 40, + "y": 314 + }, + "width": 2227, + "height": 2386, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "sequence", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 101, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "finally", + "type": "queue", + "pos": { + "x": 517, + "y": 2850 + }, + "width": 2447, + "height": 1731, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F0F3F9", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "finally", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 77, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "finally.sequence", + "type": "sequence_diagram", + "pos": { + "x": 557, + "y": 2900 + }, + "width": 2367, + "height": 1631, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "sequence", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 101, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "finally.sequence.scorer", + "type": "", + "pos": { + "x": 687, + "y": 3000 + }, + "width": 158, + "height": 131, + "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": "scorer", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 58, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.concept", + "type": "", + "pos": { + "x": 1045, + "y": 3000 + }, + "width": 174, + "height": 131, + "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": "concept", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 74, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.essayRubric", + "type": "", + "pos": { + "x": 1419, + "y": 3000 + }, + "width": 206, + "height": 131, + "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": "essayRubric", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 106, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.item", + "type": "", + "pos": { + "x": 1825, + "y": 3000 + }, + "width": 143, + "height": 131, + "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": "item", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 43, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.itemOutcome", + "type": "", + "pos": { + "x": 2168, + "y": 3000 + }, + "width": 221, + "height": 131, + "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": "itemOutcome", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 121, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.itemResponse", + "type": "", + "pos": { + "x": 2589, + "y": 3000 + }, + "width": 225, + "height": 131, + "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": "itemResponse", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 125, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "a_sequence.scorer", + "type": "", + "pos": { + "x": 2483, + "y": 414 + }, + "width": 169, + "height": 136, + "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": "scorer", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 69, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.scorer.t", + "type": "rectangle", + "pos": { + "x": 2552, + "y": 695 + }, + "width": 30, + "height": 1810, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.itemResponse", + "type": "", + "pos": { + "x": 2852, + "y": 414 + }, + "width": 246, + "height": 136, + "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": "itemResponse", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 146, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.itemResponse.t", + "type": "rectangle", + "pos": { + "x": 2960, + "y": 695 + }, + "width": 30, + "height": 160, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.item", + "type": "", + "pos": { + "x": 3298, + "y": 414 + }, + "width": 149, + "height": 136, + "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": "item", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 49, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.item.t1", + "type": "rectangle", + "pos": { + "x": 3357, + "y": 995 + }, + "width": 30, + "height": 160, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.essayRubric", + "type": "", + "pos": { + "x": 3647, + "y": 414 + }, + "width": 225, + "height": 136, + "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": "essayRubric", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 125, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.essayRubric.t", + "type": "rectangle", + "pos": { + "x": 3744, + "y": 1295 + }, + "width": 30, + "height": 460, + "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": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 12, + "labelHeight": 31, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.essayRubric.t.c", + "type": "rectangle", + "pos": { + "x": 3739, + "y": 1445 + }, + "width": 40, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 4 + }, + { + "id": "a_sequence.concept", + "type": "", + "pos": { + "x": 4072, + "y": 414 + }, + "width": 186, + "height": 136, + "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": "concept", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 86, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.concept.t", + "type": "rectangle", + "pos": { + "x": 4150, + "y": 1595 + }, + "width": 30, + "height": 50, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.itemOutcome", + "type": "", + "pos": { + "x": 4458, + "y": 414 + }, + "width": 242, + "height": 136, + "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": "itemOutcome", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 142, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.itemOutcome.t1", + "type": "rectangle", + "pos": { + "x": 4564, + "y": 1895 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.item.t2", + "type": "rectangle", + "pos": { + "x": 3357, + "y": 2045 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.item.t3", + "type": "rectangle", + "pos": { + "x": 3357, + "y": 2195 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.itemOutcome.t2", + "type": "rectangle", + "pos": { + "x": 4564, + "y": 2345 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.itemOutcome.t3", + "type": "rectangle", + "pos": { + "x": 4564, + "y": 2495 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "another.sequence.scorer", + "type": "", + "pos": { + "x": 90, + "y": 417 + }, + "width": 158, + "height": 131, + "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": "scorer", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 58, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.scorer.t", + "type": "rectangle", + "pos": { + "x": 149, + "y": 693 + }, + "width": 40, + "height": 1810, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.itemResponse", + "type": "", + "pos": { + "x": 448, + "y": 417 + }, + "width": 225, + "height": 131, + "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": "itemResponse", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 125, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.itemResponse.t", + "type": "rectangle", + "pos": { + "x": 540, + "y": 693 + }, + "width": 40, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.item", + "type": "", + "pos": { + "x": 873, + "y": 417 + }, + "width": 143, + "height": 131, + "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": "item", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 43, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.item.t1", + "type": "rectangle", + "pos": { + "x": 924, + "y": 993 + }, + "width": 40, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.essayRubric", + "type": "", + "pos": { + "x": 1216, + "y": 417 + }, + "width": 206, + "height": 131, + "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": "essayRubric", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 106, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.essayRubric.t", + "type": "rectangle", + "pos": { + "x": 1299, + "y": 1293 + }, + "width": 40, + "height": 460, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.essayRubric.t.c", + "type": "rectangle", + "pos": { + "x": 1294, + "y": 1443 + }, + "width": 50, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "another.sequence.concept", + "type": "", + "pos": { + "x": 1622, + "y": 417 + }, + "width": 174, + "height": 131, + "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": "concept", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 74, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.concept.t", + "type": "rectangle", + "pos": { + "x": 1689, + "y": 1593 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.itemOutcome", + "type": "", + "pos": { + "x": 1996, + "y": 417 + }, + "width": 221, + "height": 131, + "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": "itemOutcome", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 121, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.itemOutcome.t1", + "type": "rectangle", + "pos": { + "x": 2086, + "y": 1893 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.item.t2", + "type": "rectangle", + "pos": { + "x": 924, + "y": 2043 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.item.t3", + "type": "rectangle", + "pos": { + "x": 924, + "y": 2193 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.itemOutcome.t2", + "type": "rectangle", + "pos": { + "x": 2086, + "y": 2343 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.itemOutcome.t3", + "type": "rectangle", + "pos": { + "x": 2086, + "y": 2493 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "sequence", + "type": "", + "pos": { + "x": 3505, + "y": 3653 + }, + "width": 172, + "height": 126, + "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": "sequence", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 72, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "finally.sequence.itemResponse.a", + "type": "rectangle", + "pos": { + "x": 2681, + "y": 3276 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 4 + }, + { + "id": "finally.sequence.item.a", + "type": "rectangle", + "pos": { + "x": 1876, + "y": 3266 + }, + "width": 40, + "height": 770, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.item.a.b", + "type": "rectangle", + "pos": { + "x": 1871, + "y": 3276 + }, + "width": 50, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "finally.sequence.essayRubric.a", + "type": "rectangle", + "pos": { + "x": 1502, + "y": 3406 + }, + "width": 40, + "height": 340, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.essayRubric.a.b", + "type": "rectangle", + "pos": { + "x": 1497, + "y": 3416 + }, + "width": 50, + "height": 320, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "finally.sequence.essayRubric.a.b.c", + "type": "rectangle", + "pos": { + "x": 1492, + "y": 3426 + }, + "width": 60, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 6 + }, + { + "id": "finally.sequence.concept.a", + "type": "rectangle", + "pos": { + "x": 1112, + "y": 3546 + }, + "width": 40, + "height": 370, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.concept.a.b", + "type": "rectangle", + "pos": { + "x": 1107, + "y": 3556 + }, + "width": 50, + "height": 350, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "finally.sequence.concept.a.b.c", + "type": "rectangle", + "pos": { + "x": 1102, + "y": 3566 + }, + "width": 60, + "height": 330, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 6 + }, + { + "id": "finally.sequence.concept.a.b.c.d", + "type": "rectangle", + "pos": { + "x": 1097, + "y": 3576 + }, + "width": 70, + "height": 310, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 14, + "labelHeight": 26, + "zIndex": 1, + "level": 7 + }, + { + "id": "finally.sequence.itemOutcome.a", + "type": "rectangle", + "pos": { + "x": 2258, + "y": 3836 + }, + "width": 40, + "height": 390, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.itemOutcome.a.b", + "type": "rectangle", + "pos": { + "x": 2253, + "y": 3846 + }, + "width": 50, + "height": 370, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "finally.sequence.itemOutcome.a.b.c", + "type": "rectangle", + "pos": { + "x": 2248, + "y": 3856 + }, + "width": 60, + "height": 350, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 6 + }, + { + "id": "finally.sequence.itemOutcome.a.b.c.d", + "type": "rectangle", + "pos": { + "x": 2243, + "y": 3866 + }, + "width": 70, + "height": 330, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 7 + }, + { + "id": "finally.sequence.itemOutcome.a.b.c.d.e", + "type": "rectangle", + "pos": { + "x": 2238, + "y": 3876 + }, + "width": 80, + "height": 310, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 8 + }, + { + "id": "finally.sequence.scorer.abc", + "type": "rectangle", + "pos": { + "x": 746, + "y": 4026 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 31, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.itemResponse.c", + "type": "rectangle", + "pos": { + "x": 2681, + "y": 4326 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 4 + } + ], + "connections": [ + { + "id": "a_sequence.(scorer.t -> itemResponse.t)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.itemResponse.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getItem()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 60, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 700 + }, + { + "x": 2955, + "y": 700 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t <- itemResponse.t)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.itemResponse.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "item", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 850 + }, + { + "x": 2955, + "y": 850 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -> item.t1)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.item.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getRubric()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 73, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 1000 + }, + { + "x": 3352.5, + "y": 1000 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t <- item.t1)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.item.t1", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "rubric", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 39, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 1150 + }, + { + "x": 3352.5, + "y": 1150 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -> essayRubric.t)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.essayRubric.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "applyTo(essayResp)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 130, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 1300 + }, + { + "x": 3739.5, + "y": 1300 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(itemResponse -> essayRubric.t.c)[0]", + "src": "a_sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.essayRubric.t.c", + "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": 2980, + "y": 1450 + }, + { + "x": 3734.5, + "y": 1450 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(essayRubric.t.c -> concept.t)[0]", + "src": "a_sequence.essayRubric.t.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.concept.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "match(essayResponse)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 150, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 3784.5, + "y": 1600 + }, + { + "x": 4145, + "y": 1600 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer <- essayRubric.t)[0]", + "src": "a_sequence.scorer", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.essayRubric.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "score", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 37, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2572.5, + "y": 1750 + }, + { + "x": 3739.5, + "y": 1750 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t <-> itemOutcome.t1)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.itemOutcome.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "new", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 1900 + }, + { + "x": 4559, + "y": 1900 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t <-> item.t2)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.item.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMinimum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 141, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 2050 + }, + { + "x": 3352.5, + "y": 2050 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -> item.t3)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.item.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMaximum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 144, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 2200 + }, + { + "x": 3352.5, + "y": 2200 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -- itemOutcome.t2)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.itemOutcome.t2", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setScore(score)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 101, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 2350 + }, + { + "x": 4559, + "y": 2350 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -- itemOutcome.t3)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.itemOutcome.t3", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setFeedback(missingConcepts)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 203, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2587.5, + "y": 2500 + }, + { + "x": 4559, + "y": 2500 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> itemResponse.t)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.itemResponse.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getItem()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 60, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 698 + }, + { + "x": 535.5, + "y": 698 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t <- itemResponse.t)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "another.sequence.itemResponse.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "item", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 848 + }, + { + "x": 535.5, + "y": 848 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> item.t1)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.item.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getRubric()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 73, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 998 + }, + { + "x": 919.5, + "y": 998 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t <- item.t1)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "another.sequence.item.t1", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "rubric", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 39, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 1148 + }, + { + "x": 919.5, + "y": 1148 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> essayRubric.t)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.essayRubric.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "applyTo(essayResp)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 130, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 1298 + }, + { + "x": 1294, + "y": 1298 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(itemResponse -> essayRubric.t.c)[0]", + "src": "another.sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.essayRubric.t.c", + "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": 565.5, + "y": 1448 + }, + { + "x": 1289, + "y": 1448 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(essayRubric.t.c -> concept.t)[0]", + "src": "another.sequence.essayRubric.t.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.concept.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "match(essayResponse)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 150, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 1349, + "y": 1598 + }, + { + "x": 1684, + "y": 1598 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer <- essayRubric.t)[0]", + "src": "another.sequence.scorer", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "another.sequence.essayRubric.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "score", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 37, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 174, + "y": 1748 + }, + { + "x": 1294, + "y": 1748 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> itemOutcome.t1)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.itemOutcome.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "new", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 1898 + }, + { + "x": 2081.5, + "y": 1898 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t <-> item.t2)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "another.sequence.item.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMinimum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 141, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 2048 + }, + { + "x": 919.5, + "y": 2048 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> item.t3)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.item.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMaximum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 144, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 2198 + }, + { + "x": 919.5, + "y": 2198 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> itemOutcome.t2)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.itemOutcome.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setScore(score)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 101, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 2348 + }, + { + "x": 2081.5, + "y": 2348 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> itemOutcome.t3)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.itemOutcome.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setFeedback(missingConcepts)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 203, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 194, + "y": 2498 + }, + { + "x": 2081.5, + "y": 2498 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_shape -> a_sequence)[0]", + "src": "a_shape", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence", + "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": 2429, + "y": 91 + }, + { + "x": 3358.6, + "y": 189.4 + }, + { + "x": 3591, + "y": 224 + }, + { + "x": 3591, + "y": 264 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_shape -> another.sequence)[0]", + "src": "a_shape", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence", + "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": 2265, + "y": 91 + }, + { + "x": 1375.8, + "y": 189.4 + }, + { + "x": 1153.5, + "y": 274 + }, + { + "x": 1153.5, + "y": 314 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence -> sequence)[0]", + "src": "a_sequence", + "srcArrow": "none", + "srcLabel": "", + "dst": "sequence", + "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": 3591, + "y": 2750 + }, + { + "x": 3591, + "y": 2790 + }, + { + "x": 3591, + "y": 2810 + }, + { + "x": 3591, + "y": 2825 + }, + { + "x": 3591, + "y": 2840 + }, + { + "x": 3591, + "y": 3050.5 + }, + { + "x": 3591, + "y": 3652.5 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence <-> finally.sequence)[0]", + "src": "another.sequence", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "finally.sequence", + "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": 1153.5, + "y": 2700 + }, + { + "x": 1153.5, + "y": 2740 + }, + { + "x": 1153.5, + "y": 2760 + }, + { + "x": 1153.5, + "y": 2775 + }, + { + "x": 1153.5, + "y": 2790 + }, + { + "x": 1153.5, + "y": 2860 + }, + { + "x": 1153.5, + "y": 2900 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_shape -- finally)[0]", + "src": "a_shape", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally", + "dstArrow": "none", + "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": 2347, + "y": 164 + }, + { + "x": 2347, + "y": 204 + }, + { + "x": 2347, + "y": 224 + }, + { + "x": 2347, + "y": 239 + }, + { + "x": 2347, + "y": 254 + }, + { + "x": 2347, + "y": 274 + }, + { + "x": 2347, + "y": 289 + }, + { + "x": 2347, + "y": 304 + }, + { + "x": 2347, + "y": 552.6 + }, + { + "x": 2347, + "y": 910.5 + }, + { + "x": 2347, + "y": 1268.4 + }, + { + "x": 2347, + "y": 1745.6 + }, + { + "x": 2347, + "y": 2103.5 + }, + { + "x": 2347, + "y": 2461.4 + }, + { + "x": 2347, + "y": 2710 + }, + { + "x": 2347, + "y": 2725 + }, + { + "x": 2347, + "y": 2740 + }, + { + "x": 2347, + "y": 2810 + }, + { + "x": 2347, + "y": 2850 + } + ], + "isCurve": true, + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(itemResponse.a -> item.a.b)[0]", + "src": "finally.sequence.itemResponse.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.item.a.b", + "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": 2676.5, + "y": 3281 + }, + { + "x": 1926.5, + "y": 3281 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(item.a.b -> essayRubric.a.b.c)[0]", + "src": "finally.sequence.item.a.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.essayRubric.a.b.c", + "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": 1866.5, + "y": 3431 + }, + { + "x": 1557, + "y": 3431 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(essayRubric.a.b.c -> concept.a.b.c.d)[0]", + "src": "finally.sequence.essayRubric.a.b.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.concept.a.b.c.d", + "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": 1487, + "y": 3581 + }, + { + "x": 1172, + "y": 3581 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(item.a -> essayRubric.a.b)[0]", + "src": "finally.sequence.item.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.essayRubric.a.b", + "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": 1871.5, + "y": 3731 + }, + { + "x": 1552, + "y": 3731 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(concept.a.b.c.d -> itemOutcome.a.b.c.d.e)[0]", + "src": "finally.sequence.concept.a.b.c.d", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.itemOutcome.a.b.c.d.e", + "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": 1172, + "y": 3881 + }, + { + "x": 2233.5, + "y": 3881 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(scorer.abc -> item.a)[0]", + "src": "finally.sequence.scorer.abc", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.item.a", + "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": 791, + "y": 4031 + }, + { + "x": 1871.5, + "y": 4031 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(itemOutcome.a.b.c.d.e -> scorer)[0]", + "src": "finally.sequence.itemOutcome.a.b.c.d.e", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.scorer", + "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": 2233.5, + "y": 4181 + }, + { + "x": 771, + "y": 4181 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(scorer -> itemResponse.c)[0]", + "src": "finally.sequence.scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.itemResponse.c", + "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": 771, + "y": 4331 + }, + { + "x": 2676.5, + "y": 4331 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.scorer -- )[0]", + "src": "a_sequence.scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2567.5, + "y": 550 + }, + { + "x": 2567.5, + "y": 2650 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.itemResponse -- )[0]", + "src": "a_sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2975, + "y": 550 + }, + { + "x": 2975, + "y": 2650 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.item -- )[0]", + "src": "a_sequence.item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 3372.5, + "y": 550 + }, + { + "x": 3372.5, + "y": 2650 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.essayRubric -- )[0]", + "src": "a_sequence.essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 3759.5, + "y": 550 + }, + { + "x": 3759.5, + "y": 2650 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.concept -- )[0]", + "src": "a_sequence.concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 4165, + "y": 550 + }, + { + "x": 4165, + "y": 2650 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.itemOutcome -- )[0]", + "src": "a_sequence.itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 4579, + "y": 550 + }, + { + "x": 4579, + "y": 2650 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.scorer -- )[0]", + "src": "another.sequence.scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 169, + "y": 548 + }, + { + "x": 169, + "y": 2648 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.itemResponse -- )[0]", + "src": "another.sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 560.5, + "y": 548 + }, + { + "x": 560.5, + "y": 2648 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.item -- )[0]", + "src": "another.sequence.item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 944.5, + "y": 548 + }, + { + "x": 944.5, + "y": 2648 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.essayRubric -- )[0]", + "src": "another.sequence.essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1319, + "y": 548 + }, + { + "x": 1319, + "y": 2648 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.concept -- )[0]", + "src": "another.sequence.concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1709, + "y": 548 + }, + { + "x": 1709, + "y": 2648 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.itemOutcome -- )[0]", + "src": "another.sequence.itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2106.5, + "y": 548 + }, + { + "x": 2106.5, + "y": 2648 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.scorer -- )[0]", + "src": "finally.sequence.scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 766, + "y": 3131 + }, + { + "x": 766, + "y": 4481 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.concept -- )[0]", + "src": "finally.sequence.concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1132, + "y": 3131 + }, + { + "x": 1132, + "y": 4481 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.essayRubric -- )[0]", + "src": "finally.sequence.essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1522, + "y": 3131 + }, + { + "x": 1522, + "y": 4481 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.item -- )[0]", + "src": "finally.sequence.item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1896.5, + "y": 3131 + }, + { + "x": 1896.5, + "y": 4481 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.itemOutcome -- )[0]", + "src": "finally.sequence.itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2278.5, + "y": 3131 + }, + { + "x": 2278.5, + "y": 4481 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.itemResponse -- )[0]", + "src": "finally.sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2701.5, + "y": 3131 + }, + { + "x": 2701.5, + "y": 4481 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + } + ] +} diff --git a/e2etests/testdata/stable/sequence_diagrams/dagre/sketch.exp.svg b/e2etests/testdata/stable/sequence_diagrams/dagre/sketch.exp.svg new file mode 100644 index 000000000..03e8c25b9 --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagrams/dagre/sketch.exp.svg @@ -0,0 +1,31 @@ + +a_shapea_sequenceanotherfinallysequencesequencesequencescoreritemResponseitemessayRubricconceptitemOutcomescorerconceptessayRubricitemitemOutcomeitemResponsescoreritemResponseitemessayRubricconceptitemOutcome getItem() itemgetRubric()rubricapplyTo(essayResp)match(essayResponse)scorenewgetNormalMinimum()getNormalMaximum()setScore(score)setFeedback(missingConcepts)getItem()itemgetRubric()rubricapplyTo(essayResp)match(essayResponse)scorenewgetNormalMinimum()getNormalMaximum()setScore(score)setFeedback(missingConcepts) \ No newline at end of file diff --git a/e2etests/testdata/stable/sequence_diagrams/elk/board.exp.json b/e2etests/testdata/stable/sequence_diagrams/elk/board.exp.json new file mode 100644 index 000000000..caccf64ba --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagrams/elk/board.exp.json @@ -0,0 +1,4711 @@ +{ + "name": "", + "shapes": [ + { + "id": "a_shape", + "type": "oval", + "pos": { + "x": 1155, + "y": 12 + }, + "width": 164, + "height": 164, + "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": "a_shape", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 64, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "a_sequence", + "type": "sequence_diagram", + "pos": { + "x": 12, + "y": 364 + }, + "width": 2367, + "height": 2436, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "a_sequence", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 144, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "another", + "type": "", + "pos": { + "x": 2399, + "y": 291 + }, + "width": 2427, + "height": 2581, + "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": "another", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 98, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "another.sequence", + "type": "sequence_diagram", + "pos": { + "x": 2474, + "y": 366 + }, + "width": 2277, + "height": 2431, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "sequence", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 101, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "finally", + "type": "queue", + "pos": { + "x": 2399, + "y": 2982 + }, + "width": 2427, + "height": 1831, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#F0F3F9", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "finally", + "fontSize": 28, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 77, + "labelHeight": 41, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "finally.sequence", + "type": "sequence_diagram", + "pos": { + "x": 2474, + "y": 3057 + }, + "width": 2277, + "height": 1681, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "stroke": "#0D32B2", + "shadow": false, + "3d": false, + "multiple": false, + "tooltip": "", + "link": "", + "icon": null, + "iconPosition": "", + "fields": null, + "methods": null, + "columns": null, + "label": "sequence", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 101, + "labelHeight": 36, + "labelPosition": "INSIDE_TOP_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "finally.sequence.scorer", + "type": "", + "pos": { + "x": 2549, + "y": 3182 + }, + "width": 158, + "height": 131, + "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": "scorer", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 58, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.concept", + "type": "", + "pos": { + "x": 2907, + "y": 3182 + }, + "width": 174, + "height": 131, + "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": "concept", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 74, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.essayRubric", + "type": "", + "pos": { + "x": 3281, + "y": 3182 + }, + "width": 206, + "height": 131, + "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": "essayRubric", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 106, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.item", + "type": "", + "pos": { + "x": 3687, + "y": 3182 + }, + "width": 143, + "height": 131, + "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": "item", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 43, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.itemOutcome", + "type": "", + "pos": { + "x": 4030, + "y": 3182 + }, + "width": 221, + "height": 131, + "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": "itemOutcome", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 121, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "finally.sequence.itemResponse", + "type": "", + "pos": { + "x": 4451, + "y": 3182 + }, + "width": 225, + "height": 131, + "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": "itemResponse", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 125, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "a_sequence.scorer", + "type": "", + "pos": { + "x": 87, + "y": 489 + }, + "width": 169, + "height": 136, + "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": "scorer", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 69, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.scorer.t", + "type": "rectangle", + "pos": { + "x": 156, + "y": 770 + }, + "width": 30, + "height": 1810, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.itemResponse", + "type": "", + "pos": { + "x": 456, + "y": 489 + }, + "width": 246, + "height": 136, + "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": "itemResponse", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 146, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.itemResponse.t", + "type": "rectangle", + "pos": { + "x": 564, + "y": 770 + }, + "width": 30, + "height": 160, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.item", + "type": "", + "pos": { + "x": 902, + "y": 489 + }, + "width": 149, + "height": 136, + "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": "item", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 49, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.item.t1", + "type": "rectangle", + "pos": { + "x": 961, + "y": 1070 + }, + "width": 30, + "height": 160, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.essayRubric", + "type": "", + "pos": { + "x": 1251, + "y": 489 + }, + "width": 225, + "height": 136, + "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": "essayRubric", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 125, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.essayRubric.t", + "type": "rectangle", + "pos": { + "x": 1348, + "y": 1370 + }, + "width": 30, + "height": 460, + "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": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 12, + "labelHeight": 31, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.essayRubric.t.c", + "type": "rectangle", + "pos": { + "x": 1343, + "y": 1520 + }, + "width": 40, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 4 + }, + { + "id": "a_sequence.concept", + "type": "", + "pos": { + "x": 1676, + "y": 489 + }, + "width": 186, + "height": 136, + "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": "concept", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 86, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.concept.t", + "type": "rectangle", + "pos": { + "x": 1754, + "y": 1670 + }, + "width": 30, + "height": 50, + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.itemOutcome", + "type": "", + "pos": { + "x": 2062, + "y": 489 + }, + "width": 242, + "height": 136, + "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": "itemOutcome", + "fontSize": 24, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 142, + "labelHeight": 36, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 2 + }, + { + "id": "a_sequence.itemOutcome.t1", + "type": "rectangle", + "pos": { + "x": 2168, + "y": 1970 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.item.t2", + "type": "rectangle", + "pos": { + "x": 961, + "y": 2120 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.item.t3", + "type": "rectangle", + "pos": { + "x": 961, + "y": 2270 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.itemOutcome.t2", + "type": "rectangle", + "pos": { + "x": 2168, + "y": 2420 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "a_sequence.itemOutcome.t3", + "type": "rectangle", + "pos": { + "x": 2168, + "y": 2570 + }, + "width": 30, + "height": 50, + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 3 + }, + { + "id": "another.sequence.scorer", + "type": "", + "pos": { + "x": 2549, + "y": 491 + }, + "width": 158, + "height": 131, + "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": "scorer", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 58, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.scorer.t", + "type": "rectangle", + "pos": { + "x": 2608, + "y": 767 + }, + "width": 40, + "height": 1810, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.itemResponse", + "type": "", + "pos": { + "x": 2907, + "y": 491 + }, + "width": 225, + "height": 131, + "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": "itemResponse", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 125, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.itemResponse.t", + "type": "rectangle", + "pos": { + "x": 2999, + "y": 767 + }, + "width": 40, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.item", + "type": "", + "pos": { + "x": 3332, + "y": 491 + }, + "width": 143, + "height": 131, + "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": "item", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 43, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.item.t1", + "type": "rectangle", + "pos": { + "x": 3383, + "y": 1067 + }, + "width": 40, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.essayRubric", + "type": "", + "pos": { + "x": 3675, + "y": 491 + }, + "width": 206, + "height": 131, + "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": "essayRubric", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 106, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.essayRubric.t", + "type": "rectangle", + "pos": { + "x": 3758, + "y": 1367 + }, + "width": 40, + "height": 460, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.essayRubric.t.c", + "type": "rectangle", + "pos": { + "x": 3753, + "y": 1517 + }, + "width": 50, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "another.sequence.concept", + "type": "", + "pos": { + "x": 4081, + "y": 491 + }, + "width": 174, + "height": 131, + "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": "concept", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 74, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.concept.t", + "type": "rectangle", + "pos": { + "x": 4148, + "y": 1667 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 11, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.itemOutcome", + "type": "", + "pos": { + "x": 4455, + "y": 491 + }, + "width": 221, + "height": 131, + "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": "itemOutcome", + "fontSize": 20, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 121, + "labelHeight": 31, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 3 + }, + { + "id": "another.sequence.itemOutcome.t1", + "type": "rectangle", + "pos": { + "x": 4545, + "y": 1967 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.item.t2", + "type": "rectangle", + "pos": { + "x": 3383, + "y": 2117 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.item.t3", + "type": "rectangle", + "pos": { + "x": 3383, + "y": 2267 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.itemOutcome.t2", + "type": "rectangle", + "pos": { + "x": 4545, + "y": 2417 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "another.sequence.itemOutcome.t3", + "type": "rectangle", + "pos": { + "x": 4545, + "y": 2567 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 20, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "sequence", + "type": "", + "pos": { + "x": 1110, + "y": 2982 + }, + "width": 172, + "height": 126, + "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": "sequence", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#0A0F25", + "italic": false, + "bold": true, + "underline": false, + "labelWidth": 72, + "labelHeight": 26, + "labelPosition": "INSIDE_MIDDLE_CENTER", + "zIndex": 0, + "level": 1 + }, + { + "id": "finally.sequence.itemResponse.a", + "type": "rectangle", + "pos": { + "x": 4543, + "y": 3458 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 4 + }, + { + "id": "finally.sequence.item.a", + "type": "rectangle", + "pos": { + "x": 3738, + "y": 3448 + }, + "width": 40, + "height": 770, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.item.a.b", + "type": "rectangle", + "pos": { + "x": 3733, + "y": 3458 + }, + "width": 50, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "finally.sequence.essayRubric.a", + "type": "rectangle", + "pos": { + "x": 3364, + "y": 3588 + }, + "width": 40, + "height": 340, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.essayRubric.a.b", + "type": "rectangle", + "pos": { + "x": 3359, + "y": 3598 + }, + "width": 50, + "height": 320, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "finally.sequence.essayRubric.a.b.c", + "type": "rectangle", + "pos": { + "x": 3354, + "y": 3608 + }, + "width": 60, + "height": 160, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 6 + }, + { + "id": "finally.sequence.concept.a", + "type": "rectangle", + "pos": { + "x": 2974, + "y": 3728 + }, + "width": 40, + "height": 370, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.concept.a.b", + "type": "rectangle", + "pos": { + "x": 2969, + "y": 3738 + }, + "width": 50, + "height": 350, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "finally.sequence.concept.a.b.c", + "type": "rectangle", + "pos": { + "x": 2964, + "y": 3748 + }, + "width": 60, + "height": 330, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 6 + }, + { + "id": "finally.sequence.concept.a.b.c.d", + "type": "rectangle", + "pos": { + "x": 2959, + "y": 3758 + }, + "width": 70, + "height": 310, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 14, + "labelHeight": 26, + "zIndex": 1, + "level": 7 + }, + { + "id": "finally.sequence.itemOutcome.a", + "type": "rectangle", + "pos": { + "x": 4120, + "y": 4018 + }, + "width": 40, + "height": 390, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.itemOutcome.a.b", + "type": "rectangle", + "pos": { + "x": 4115, + "y": 4028 + }, + "width": 50, + "height": 370, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 5 + }, + { + "id": "finally.sequence.itemOutcome.a.b.c", + "type": "rectangle", + "pos": { + "x": 4110, + "y": 4038 + }, + "width": 60, + "height": 350, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 12, + "labelHeight": 26, + "zIndex": 1, + "level": 6 + }, + { + "id": "finally.sequence.itemOutcome.a.b.c.d", + "type": "rectangle", + "pos": { + "x": 4105, + "y": 4048 + }, + "width": 70, + "height": 330, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 7 + }, + { + "id": "finally.sequence.itemOutcome.a.b.c.d.e", + "type": "rectangle", + "pos": { + "x": 4100, + "y": 4058 + }, + "width": 80, + "height": 310, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 8 + }, + { + "id": "finally.sequence.scorer.abc", + "type": "rectangle", + "pos": { + "x": 2608, + "y": 4208 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 31, + "labelHeight": 26, + "zIndex": 1, + "level": 4 + }, + { + "id": "finally.sequence.itemResponse.c", + "type": "rectangle", + "pos": { + "x": 4543, + "y": 4508 + }, + "width": 40, + "height": 50, + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "borderRadius": 0, + "fill": "#FFFFFF", + "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": 4 + } + ], + "connections": [ + { + "id": "a_sequence.(scorer.t -> itemResponse.t)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.itemResponse.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getItem()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 60, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 775 + }, + { + "x": 559, + "y": 775 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t <- itemResponse.t)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.itemResponse.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "item", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 925 + }, + { + "x": 559, + "y": 925 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -> item.t1)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.item.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getRubric()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 73, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 1075 + }, + { + "x": 956.5, + "y": 1075 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t <- item.t1)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.item.t1", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "rubric", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 39, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 1225 + }, + { + "x": 956.5, + "y": 1225 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -> essayRubric.t)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.essayRubric.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "applyTo(essayResp)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 130, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 1375 + }, + { + "x": 1343.5, + "y": 1375 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(itemResponse -> essayRubric.t.c)[0]", + "src": "a_sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.essayRubric.t.c", + "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": 584, + "y": 1525 + }, + { + "x": 1338.5, + "y": 1525 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(essayRubric.t.c -> concept.t)[0]", + "src": "a_sequence.essayRubric.t.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.concept.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "match(essayResponse)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 150, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 1388.5, + "y": 1675 + }, + { + "x": 1749, + "y": 1675 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer <- essayRubric.t)[0]", + "src": "a_sequence.scorer", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.essayRubric.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "score", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 37, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 176.5, + "y": 1825 + }, + { + "x": 1343.5, + "y": 1825 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t <-> itemOutcome.t1)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.itemOutcome.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "new", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 1975 + }, + { + "x": 2163, + "y": 1975 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t <-> item.t2)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "a_sequence.item.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMinimum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 141, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 2125 + }, + { + "x": 956.5, + "y": 2125 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -> item.t3)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.item.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMaximum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 144, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 2275 + }, + { + "x": 956.5, + "y": 2275 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -- itemOutcome.t2)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.itemOutcome.t2", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setScore(score)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 101, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 2425 + }, + { + "x": 2163, + "y": 2425 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "a_sequence.(scorer.t -- itemOutcome.t3)[0]", + "src": "a_sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence.itemOutcome.t3", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setFeedback(missingConcepts)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 203, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 191.5, + "y": 2575 + }, + { + "x": 2163, + "y": 2575 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> itemResponse.t)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.itemResponse.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getItem()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 60, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 772 + }, + { + "x": 2994.5, + "y": 772 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t <- itemResponse.t)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "another.sequence.itemResponse.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "item", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 922 + }, + { + "x": 2994.5, + "y": 922 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> item.t1)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.item.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getRubric()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 73, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 1072 + }, + { + "x": 3378.5, + "y": 1072 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t <- item.t1)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "another.sequence.item.t1", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "rubric", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 39, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 1222 + }, + { + "x": 3378.5, + "y": 1222 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> essayRubric.t)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.essayRubric.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "applyTo(essayResp)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 130, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 1372 + }, + { + "x": 3753, + "y": 1372 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(itemResponse -> essayRubric.t.c)[0]", + "src": "another.sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.essayRubric.t.c", + "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": 3024.5, + "y": 1522 + }, + { + "x": 3748, + "y": 1522 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(essayRubric.t.c -> concept.t)[0]", + "src": "another.sequence.essayRubric.t.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.concept.t", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "match(essayResponse)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 150, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 3808, + "y": 1672 + }, + { + "x": 4143, + "y": 1672 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer <- essayRubric.t)[0]", + "src": "another.sequence.scorer", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "another.sequence.essayRubric.t", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "score", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 37, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2633, + "y": 1822 + }, + { + "x": 3753, + "y": 1822 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> itemOutcome.t1)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.itemOutcome.t1", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "new", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 29, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 1972 + }, + { + "x": 4540.5, + "y": 1972 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t <-> item.t2)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "another.sequence.item.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMinimum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 141, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 2122 + }, + { + "x": 3378.5, + "y": 2122 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> item.t3)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.item.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "getNormalMaximum()", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 144, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 2272 + }, + { + "x": 3378.5, + "y": 2272 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> itemOutcome.t2)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.itemOutcome.t2", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setScore(score)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 101, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 2422 + }, + { + "x": 4540.5, + "y": 2422 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "another.sequence.(scorer.t -> itemOutcome.t3)[0]", + "src": "another.sequence.scorer.t", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence.itemOutcome.t3", + "dstArrow": "triangle", + "dstLabel": "", + "opacity": 1, + "strokeDash": 0, + "strokeWidth": 2, + "stroke": "#0D32B2", + "label": "setFeedback(missingConcepts)", + "fontSize": 16, + "fontFamily": "DEFAULT", + "language": "", + "color": "#676C7E", + "italic": true, + "bold": false, + "underline": false, + "labelWidth": 203, + "labelHeight": 21, + "labelPosition": "OUTSIDE_TOP_CENTER", + "labelPercentage": 0, + "route": [ + { + "x": 2653, + "y": 2572 + }, + { + "x": 4540.5, + "y": 2572 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_shape -> a_sequence)[0]", + "src": "a_shape", + "srcArrow": "none", + "srcLabel": "", + "dst": "a_sequence", + "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": 1195.5, + "y": 176 + }, + { + "x": 1195.5, + "y": 363.5 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_shape -> another.sequence)[0]", + "src": "a_shape", + "srcArrow": "none", + "srcLabel": "", + "dst": "another.sequence", + "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": 1236.5, + "y": 176 + }, + { + "x": 1236.5, + "y": 236 + }, + { + "x": 3612.5, + "y": 236 + }, + { + "x": 3612.5, + "y": 366 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence -> sequence)[0]", + "src": "a_sequence", + "srcArrow": "none", + "srcLabel": "", + "dst": "sequence", + "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": 1195.5, + "y": 2799.5 + }, + { + "x": 1195.5, + "y": 2982 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence <-> finally.sequence)[0]", + "src": "another.sequence", + "srcArrow": "triangle", + "srcLabel": "", + "dst": "finally.sequence", + "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": 3612.5, + "y": 2797 + }, + { + "x": 3612.5, + "y": 3057 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_shape -- finally)[0]", + "src": "a_shape", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally", + "dstArrow": "none", + "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": 1277.5, + "y": 176 + }, + { + "x": 1277.5, + "y": 226 + }, + { + "x": 4836, + "y": 226 + }, + { + "x": 4836, + "y": 2927 + }, + { + "x": 3622.5, + "y": 2927 + }, + { + "x": 3622.5, + "y": 2982 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(itemResponse.a -> item.a.b)[0]", + "src": "finally.sequence.itemResponse.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.item.a.b", + "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": 4538.5, + "y": 3463 + }, + { + "x": 3788.5, + "y": 3463 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(item.a.b -> essayRubric.a.b.c)[0]", + "src": "finally.sequence.item.a.b", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.essayRubric.a.b.c", + "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": 3728.5, + "y": 3613 + }, + { + "x": 3419, + "y": 3613 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(essayRubric.a.b.c -> concept.a.b.c.d)[0]", + "src": "finally.sequence.essayRubric.a.b.c", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.concept.a.b.c.d", + "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": 3349, + "y": 3763 + }, + { + "x": 3034, + "y": 3763 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(item.a -> essayRubric.a.b)[0]", + "src": "finally.sequence.item.a", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.essayRubric.a.b", + "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": 3733.5, + "y": 3913 + }, + { + "x": 3414, + "y": 3913 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(concept.a.b.c.d -> itemOutcome.a.b.c.d.e)[0]", + "src": "finally.sequence.concept.a.b.c.d", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.itemOutcome.a.b.c.d.e", + "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": 3034, + "y": 4063 + }, + { + "x": 4095.5, + "y": 4063 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(scorer.abc -> item.a)[0]", + "src": "finally.sequence.scorer.abc", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.item.a", + "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": 2653, + "y": 4213 + }, + { + "x": 3733.5, + "y": 4213 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(itemOutcome.a.b.c.d.e -> scorer)[0]", + "src": "finally.sequence.itemOutcome.a.b.c.d.e", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.scorer", + "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": 4095.5, + "y": 4363 + }, + { + "x": 2633, + "y": 4363 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "finally.sequence.(scorer -> itemResponse.c)[0]", + "src": "finally.sequence.scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "finally.sequence.itemResponse.c", + "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": 2633, + "y": 4513 + }, + { + "x": 4538.5, + "y": 4513 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.scorer -- )[0]", + "src": "a_sequence.scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 171.5, + "y": 625 + }, + { + "x": 171.5, + "y": 2725 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.itemResponse -- )[0]", + "src": "a_sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 579, + "y": 625 + }, + { + "x": 579, + "y": 2725 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.item -- )[0]", + "src": "a_sequence.item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 976.5, + "y": 625 + }, + { + "x": 976.5, + "y": 2725 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.essayRubric -- )[0]", + "src": "a_sequence.essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1363.5, + "y": 625 + }, + { + "x": 1363.5, + "y": 2725 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.concept -- )[0]", + "src": "a_sequence.concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 1769, + "y": 625 + }, + { + "x": 1769, + "y": 2725 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(a_sequence.itemOutcome -- )[0]", + "src": "a_sequence.itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2183, + "y": 625 + }, + { + "x": 2183, + "y": 2725 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.scorer -- )[0]", + "src": "another.sequence.scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2628, + "y": 622 + }, + { + "x": 2628, + "y": 2722 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.itemResponse -- )[0]", + "src": "another.sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 3019.5, + "y": 622 + }, + { + "x": 3019.5, + "y": 2722 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.item -- )[0]", + "src": "another.sequence.item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 3403.5, + "y": 622 + }, + { + "x": 3403.5, + "y": 2722 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.essayRubric -- )[0]", + "src": "another.sequence.essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 3778, + "y": 622 + }, + { + "x": 3778, + "y": 2722 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.concept -- )[0]", + "src": "another.sequence.concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 4168, + "y": 622 + }, + { + "x": 4168, + "y": 2722 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(another.sequence.itemOutcome -- )[0]", + "src": "another.sequence.itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 4565.5, + "y": 622 + }, + { + "x": 4565.5, + "y": 2722 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.scorer -- )[0]", + "src": "finally.sequence.scorer", + "srcArrow": "none", + "srcLabel": "", + "dst": "scorer-lifeline-end-3390057676", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2628, + "y": 3313 + }, + { + "x": 2628, + "y": 4663 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.concept -- )[0]", + "src": "finally.sequence.concept", + "srcArrow": "none", + "srcLabel": "", + "dst": "concept-lifeline-end-1391711018", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 2994, + "y": 3313 + }, + { + "x": 2994, + "y": 4663 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.essayRubric -- )[0]", + "src": "finally.sequence.essayRubric", + "srcArrow": "none", + "srcLabel": "", + "dst": "essayRubric-lifeline-end-1632038932", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 3384, + "y": 3313 + }, + { + "x": 3384, + "y": 4663 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.item -- )[0]", + "src": "finally.sequence.item", + "srcArrow": "none", + "srcLabel": "", + "dst": "item-lifeline-end-4102336625", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 3758.5, + "y": 3313 + }, + { + "x": 3758.5, + "y": 4663 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.itemOutcome -- )[0]", + "src": "finally.sequence.itemOutcome", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemOutcome-lifeline-end-3921917181", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 4140.5, + "y": 3313 + }, + { + "x": 4140.5, + "y": 4663 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + }, + { + "id": "(finally.sequence.itemResponse -- )[0]", + "src": "finally.sequence.itemResponse", + "srcArrow": "none", + "srcLabel": "", + "dst": "itemResponse-lifeline-end-3886259856", + "dstArrow": "none", + "dstLabel": "", + "opacity": 1, + "strokeDash": 10, + "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": 4563.5, + "y": 3313 + }, + { + "x": 4563.5, + "y": 4663 + } + ], + "animated": false, + "tooltip": "", + "icon": null, + "zIndex": 0 + } + ] +} diff --git a/e2etests/testdata/stable/sequence_diagrams/elk/sketch.exp.svg b/e2etests/testdata/stable/sequence_diagrams/elk/sketch.exp.svg new file mode 100644 index 000000000..76c35003b --- /dev/null +++ b/e2etests/testdata/stable/sequence_diagrams/elk/sketch.exp.svg @@ -0,0 +1,31 @@ + +a_shapea_sequenceanotherfinallysequencesequencesequencescoreritemResponseitemessayRubricconceptitemOutcomescorerconceptessayRubricitemitemOutcomeitemResponsescoreritemResponseitemessayRubricconceptitemOutcome getItem() itemgetRubric()rubricapplyTo(essayResp)match(essayResponse)scorenewgetNormalMinimum()getNormalMaximum()setScore(score)setFeedback(missingConcepts)getItem()itemgetRubric()rubricapplyTo(essayResp)match(essayResponse)scorenewgetNormalMinimum()getNormalMaximum()setScore(score)setFeedback(missingConcepts) \ No newline at end of file From c0e670bb2f9d8367e298061b6479efbb0c12f5ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 14:32:54 -0800 Subject: [PATCH 10/24] Fix --- d2layouts/d2sequence/sequence_diagram.go | 2 +- d2lib/d2.go | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/d2layouts/d2sequence/sequence_diagram.go b/d2layouts/d2sequence/sequence_diagram.go index 685743fc9..6276906c6 100644 --- a/d2layouts/d2sequence/sequence_diagram.go +++ b/d2layouts/d2sequence/sequence_diagram.go @@ -7,9 +7,9 @@ import ( "oss.terrastruct.com/d2/d2graph" "oss.terrastruct.com/d2/lib/geo" - "oss.terrastruct.com/d2/lib/go2" "oss.terrastruct.com/d2/lib/label" "oss.terrastruct.com/d2/lib/shape" + "oss.terrastruct.com/util-go/go2" ) type sequenceDiagram struct { diff --git a/d2lib/d2.go b/d2lib/d2.go index 54883b47d..182dd0ae3 100644 --- a/d2lib/d2.go +++ b/d2lib/d2.go @@ -9,6 +9,7 @@ import ( "oss.terrastruct.com/d2/d2compiler" "oss.terrastruct.com/d2/d2exporter" "oss.terrastruct.com/d2/d2graph" + "oss.terrastruct.com/d2/d2layouts/d2sequence" "oss.terrastruct.com/d2/d2target" "oss.terrastruct.com/d2/lib/textmeasure" ) @@ -40,9 +41,9 @@ func Compile(ctx context.Context, input string, opts *CompileOptions) (*d2target } if layout, err := getLayout(opts); err != nil { - return nil, err + return nil, nil, err } else if err := d2sequence.Layout(ctx, g, layout); err != nil { - return nil, err + return nil, nil, err } diagram, err := d2exporter.Export(ctx, g, opts.ThemeID) From 2c557a32d821426607fc3cf552f4e485ca3320e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 14:34:24 -0800 Subject: [PATCH 11/24] Changelog --- ci/release/changelogs/next.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md index 5bd2d8eb3..f026c7e6d 100644 --- a/ci/release/changelogs/next.md +++ b/ci/release/changelogs/next.md @@ -1,5 +1,7 @@ #### Features 🚀 +- Sequence diagrams are now supported. See [docs](https://d2lang.com/tour/sequence-diagrams) for more. + [#99](https://github.com/terrastruct/d2/issues/99) - Formatting of d2 scripts is supported on the CLI with the `fmt` subcommand. [#292](https://github.com/terrastruct/d2/pull/292) - Latex is now supported. See [docs](https://d2lang.com/tour/text) for more. From b2ec5970e5fba61b19b7ccfcd3e8c5fcaf4dba3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 17:11:41 -0800 Subject: [PATCH 12/24] Skip layout engine for root sequence diagrams --- d2layouts/d2sequence/layout.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/d2layouts/d2sequence/layout.go b/d2layouts/d2sequence/layout.go index 87e5e0147..85a9dfcc5 100644 --- a/d2layouts/d2sequence/layout.go +++ b/d2layouts/d2sequence/layout.go @@ -9,7 +9,7 @@ import ( "oss.terrastruct.com/d2/lib/geo" ) -// Layout identifies and layouts sequence diagrams within a graph +// Layout identifies and performs layout on sequence diagrams within a graph // first, it traverses the graph from Root and once it finds an object of shape `sequence_diagram` // it replaces the children with a rectangle with id `sequence_diagram`, collects all edges coming to this node and // flag the edges to be removed. Then, using the children and the edges, it lays out the sequence diagram and @@ -92,7 +92,10 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte g.Objects = newObjects g.Edges = newEdges - if err := layout(ctx, g); err != nil { + if g.Root.Attributes.Shape.Value == d2target.ShapeSequenceDiagram { + // don't need to run the layout engine if the root is a sequence diagram + g.Root.ChildrenArray[0].TopLeft = geo.NewPoint(0, 0) + } else if err := layout(ctx, g); err != nil { return err } From 862151273951e91a7b28af3758c64df117173aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlio=20C=C3=A9sar=20Batista?= Date: Thu, 1 Dec 2022 18:08:34 -0800 Subject: [PATCH 13/24] Handle layout with binaries --- d2layouts/d2sequence/layout.go | 73 +- e2etests/stable_test.go | 1 - .../elk/board.exp.json | 212 +-- .../elk/sketch.exp.svg | 4 +- .../elk/board.exp.json | 140 +- .../elk/sketch.exp.svg | 4 +- .../sequence_diagram_span/elk/board.exp.json | 220 +-- .../sequence_diagram_span/elk/sketch.exp.svg | 4 +- .../sequence_diagrams/dagre/board.exp.json | 1194 ++++++++--------- .../sequence_diagrams/dagre/sketch.exp.svg | 2 +- .../sequence_diagrams/elk/board.exp.json | 984 +++++++------- .../sequence_diagrams/elk/sketch.exp.svg | 2 +- 12 files changed, 1428 insertions(+), 1412 deletions(-) diff --git a/d2layouts/d2sequence/layout.go b/d2layouts/d2sequence/layout.go index 85a9dfcc5..25f299ce2 100644 --- a/d2layouts/d2sequence/layout.go +++ b/d2layouts/d2sequence/layout.go @@ -17,34 +17,29 @@ import ( // Once all nodes were processed, it continues to run the layout engine without the sequence diagram nodes and edges. // Then it restores all objects with their proper layout engine and sequence diagram positions func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Context, g *d2graph.Graph) error) error { - // keeps the current graph state - oldObjects := g.Objects - oldEdges := g.Edges - // flag objects to keep to avoid having to flag all descendants of sequence diagram to be removed objectsToKeep := make(map[*d2graph.Object]struct{}) // edges flagged to be removed (these are internal edges of the sequence diagrams) edgesToRemove := make(map[*d2graph.Edge]struct{}) // store the sequence diagram related to a given node - sequenceDiagrams := make(map[*d2graph.Object]*sequenceDiagram) + sequenceDiagrams := make(map[string]*sequenceDiagram) // keeps the reference of the children of a given node - objChildrenArray := make(map[*d2graph.Object][]*d2graph.Object) + childrenReplacement := make(map[string][]*d2graph.Object) // goes from root and travers all descendants - queue := make([]*d2graph.Object, 1, len(oldObjects)) + queue := make([]*d2graph.Object, 1, len(g.Objects)) queue[0] = g.Root for len(queue) > 0 { obj := queue[0] queue = queue[1:] - // root is not part of g.Objects, so we can't add it here objectsToKeep[obj] = struct{}{} if obj.Attributes.Shape.Value == d2target.ShapeSequenceDiagram { // TODO: should update obj.References too? // clean current children and keep a backup to restore them later obj.Children = make(map[string]*d2graph.Object) - objChildrenArray[obj] = obj.ChildrenArray + children := obj.ChildrenArray obj.ChildrenArray = nil // creates a mock rectangle so that layout considers this size sdMock := obj.EnsureChild([]string{"sequence_diagram"}) @@ -62,36 +57,47 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte } } - sd := newSequenceDiagram(objChildrenArray[obj], edges) + sd := newSequenceDiagram(children, edges) sd.layout() sdMock.Box = geo.NewBox(nil, sd.getWidth(), sd.getHeight()) - sequenceDiagrams[obj] = sd + sequenceDiagrams[sdMock.AbsID()] = sd + childrenReplacement[sdMock.AbsID()] = children } else { // only move to children if the parent is not a sequence diagram queue = append(queue, obj.ChildrenArray...) } } + if len(sequenceDiagrams) == 0 { + return layout(ctx, g) + } + // removes the edges - newEdges := make([]*d2graph.Edge, 0, len(g.Edges)-len(edgesToRemove)) + layoutEdges := make([]*d2graph.Edge, 0, len(g.Edges)-len(edgesToRemove)) + sequenceDiagramEdges := make([]*d2graph.Edge, 0, len(edgesToRemove)) for _, edge := range g.Edges { if _, exists := edgesToRemove[edge]; !exists { - newEdges = append(newEdges, edge) + layoutEdges = append(layoutEdges, edge) + } else { + sequenceDiagramEdges = append(sequenceDiagramEdges, edge) } } + g.Edges = layoutEdges // done this way (by flagging objects) instead of appending to `queue` // because appending in that order would change the order of g.Objects which // could lead to layout changes (as the order of the objects might be important for the underlying engine) - newObjects := make([]*d2graph.Object, 0, len(objectsToKeep)) + layoutObjects := make([]*d2graph.Object, 0, len(objectsToKeep)) + sequenceDiagramObjects := make([]*d2graph.Object, 0, len(g.Objects)-len(objectsToKeep)) for _, obj := range g.Objects { if _, exists := objectsToKeep[obj]; exists { - newObjects = append(newObjects, obj) + layoutObjects = append(layoutObjects, obj) + } else { + sequenceDiagramObjects = append(sequenceDiagramObjects, obj) } } + g.Objects = layoutObjects - g.Objects = newObjects - g.Edges = newEdges if g.Root.Attributes.Shape.Value == d2target.ShapeSequenceDiagram { // don't need to run the layout engine if the root is a sequence diagram g.Root.ChildrenArray[0].TopLeft = geo.NewPoint(0, 0) @@ -99,25 +105,36 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout func(ctx context.Conte return err } - // restores objects & edges - g.Edges = oldEdges - g.Objects = oldObjects + g.Edges = append(g.Edges, sequenceDiagramEdges...) + + // restores objects + // it must be this way because the objects pointer reference is lost when calling layout engines compiled in binaries + allObjects := sequenceDiagramObjects + for _, obj := range g.Objects { + if _, exists := sequenceDiagrams[obj.AbsID()]; !exists { + allObjects = append(allObjects, obj) + continue + } + // we don't want `sdMock` in `g.Objects` because they shouldn't be rendered + + // just to make it easier to read + sdMock := obj + parent := obj.Parent - for obj, children := range objChildrenArray { // shift the sequence diagrams as they are always placed at (0, 0) - sdMock := obj.ChildrenArray[0] - sequenceDiagrams[obj].shift(sdMock.TopLeft) + sequenceDiagrams[sdMock.AbsID()].shift(sdMock.TopLeft) // restore children - obj.Children = make(map[string]*d2graph.Object) - for _, child := range children { - obj.Children[child.ID] = child + parent.Children = make(map[string]*d2graph.Object) + for _, child := range childrenReplacement[sdMock.AbsID()] { + parent.Children[child.ID] = child } - obj.ChildrenArray = children + parent.ChildrenArray = childrenReplacement[sdMock.AbsID()] // add lifeline edges - g.Edges = append(g.Edges, sequenceDiagrams[obj].lifelines...) + g.Edges = append(g.Edges, sequenceDiagrams[sdMock.AbsID()].lifelines...) } + g.Objects = allObjects return nil } diff --git a/e2etests/stable_test.go b/e2etests/stable_test.go index 87e6cfd39..0d191b284 100644 --- a/e2etests/stable_test.go +++ b/e2etests/stable_test.go @@ -1046,7 +1046,6 @@ size XXXL -> custom 64: custom 48 { }, { name: "sequence_diagram_simple", script: `shape: sequence_diagram - alice: "Alice\nline\nbreaker" { shape: person style.stroke: red diff --git a/e2etests/testdata/stable/sequence_diagram_nested_span/elk/board.exp.json b/e2etests/testdata/stable/sequence_diagram_nested_span/elk/board.exp.json index ea7c579c9..61003c046 100644 --- a/e2etests/testdata/stable/sequence_diagram_nested_span/elk/board.exp.json +++ b/e2etests/testdata/stable/sequence_diagram_nested_span/elk/board.exp.json @@ -5,8 +5,8 @@ "id": "scorer", "type": "", "pos": { - "x": 12, - "y": 62 + "x": 0, + "y": 50 }, "width": 179, "height": 141, @@ -44,8 +44,8 @@ "id": "scorer.abc", "type": "rectangle", "pos": { - "x": 91, - "y": 1248 + "x": 79, + "y": 1236 }, "width": 20, "height": 50, @@ -82,8 +82,8 @@ "id": "itemResponse", "type": "", "pos": { - "x": 391, - "y": 62 + "x": 379, + "y": 50 }, "width": 270, "height": 141, @@ -121,8 +121,8 @@ "id": "itemResponse.a", "type": "rectangle", "pos": { - "x": 516, - "y": 348 + "x": 504, + "y": 336 }, "width": 20, "height": 160, @@ -159,8 +159,8 @@ "id": "item", "type": "", "pos": { - "x": 861, - "y": 62 + "x": 849, + "y": 50 }, "width": 157, "height": 141, @@ -198,8 +198,8 @@ "id": "item.a", "type": "rectangle", "pos": { - "x": 929, - "y": 488 + "x": 917, + "y": 476 }, "width": 20, "height": 770, @@ -236,8 +236,8 @@ "id": "item.a.b", "type": "rectangle", "pos": { - "x": 924, - "y": 498 + "x": 912, + "y": 486 }, "width": 30, "height": 160, @@ -274,8 +274,8 @@ "id": "essayRubric", "type": "", "pos": { - "x": 1218, - "y": 62 + "x": 1206, + "y": 50 }, "width": 245, "height": 141, @@ -313,8 +313,8 @@ "id": "essayRubric.a", "type": "rectangle", "pos": { - "x": 1330, - "y": 628 + "x": 1318, + "y": 616 }, "width": 20, "height": 340, @@ -351,8 +351,8 @@ "id": "essayRubric.a.b", "type": "rectangle", "pos": { - "x": 1325, - "y": 638 + "x": 1313, + "y": 626 }, "width": 30, "height": 320, @@ -389,8 +389,8 @@ "id": "essayRubric.a.b.c", "type": "rectangle", "pos": { - "x": 1320, - "y": 648 + "x": 1308, + "y": 636 }, "width": 40, "height": 160, @@ -427,8 +427,8 @@ "id": "concept", "type": "", "pos": { - "x": 1663, - "y": 62 + "x": 1651, + "y": 50 }, "width": 200, "height": 141, @@ -466,8 +466,8 @@ "id": "concept.a", "type": "rectangle", "pos": { - "x": 1753, - "y": 768 + "x": 1741, + "y": 756 }, "width": 20, "height": 370, @@ -504,8 +504,8 @@ "id": "concept.a.b", "type": "rectangle", "pos": { - "x": 1748, - "y": 778 + "x": 1736, + "y": 766 }, "width": 30, "height": 350, @@ -542,8 +542,8 @@ "id": "concept.a.b.c", "type": "rectangle", "pos": { - "x": 1743, - "y": 788 + "x": 1731, + "y": 776 }, "width": 40, "height": 330, @@ -580,8 +580,8 @@ "id": "concept.a.b.c.d", "type": "rectangle", "pos": { - "x": 1738, - "y": 798 + "x": 1726, + "y": 786 }, "width": 50, "height": 310, @@ -618,8 +618,8 @@ "id": "itemOutcome", "type": "", "pos": { - "x": 2063, - "y": 62 + "x": 2051, + "y": 50 }, "width": 265, "height": 141, @@ -657,8 +657,8 @@ "id": "itemOutcome.a", "type": "rectangle", "pos": { - "x": 2185, - "y": 1058 + "x": 2173, + "y": 1046 }, "width": 20, "height": 390, @@ -695,8 +695,8 @@ "id": "itemOutcome.a.b", "type": "rectangle", "pos": { - "x": 2180, - "y": 1068 + "x": 2168, + "y": 1056 }, "width": 30, "height": 370, @@ -733,8 +733,8 @@ "id": "itemOutcome.a.b.c", "type": "rectangle", "pos": { - "x": 2175, - "y": 1078 + "x": 2163, + "y": 1066 }, "width": 40, "height": 350, @@ -771,8 +771,8 @@ "id": "itemOutcome.a.b.c.d", "type": "rectangle", "pos": { - "x": 2170, - "y": 1088 + "x": 2158, + "y": 1076 }, "width": 50, "height": 330, @@ -809,8 +809,8 @@ "id": "itemOutcome.a.b.c.d.e", "type": "rectangle", "pos": { - "x": 2165, - "y": 1098 + "x": 2153, + "y": 1086 }, "width": 60, "height": 310, @@ -847,8 +847,8 @@ "id": "itemResponse.c", "type": "rectangle", "pos": { - "x": 516, - "y": 1548 + "x": 504, + "y": 1536 }, "width": 20, "height": 50, @@ -909,12 +909,12 @@ "labelPercentage": 0, "route": [ { - "x": 106.5, - "y": 353 + "x": 94.5, + "y": 341 }, { - "x": 511, - "y": 353 + "x": 499, + "y": 341 } ], "animated": false, @@ -948,12 +948,12 @@ "labelPercentage": 0, "route": [ { - "x": 541, - "y": 503 + "x": 529, + "y": 491 }, { - "x": 919.5, - "y": 503 + "x": 907.5, + "y": 491 } ], "animated": false, @@ -987,12 +987,12 @@ "labelPercentage": 0, "route": [ { - "x": 959.5, - "y": 653 + "x": 947.5, + "y": 641 }, { - "x": 1315.5, - "y": 653 + "x": 1303.5, + "y": 641 } ], "animated": false, @@ -1026,12 +1026,12 @@ "labelPercentage": 0, "route": [ { - "x": 1365.5, - "y": 803 + "x": 1353.5, + "y": 791 }, { - "x": 1733, - "y": 803 + "x": 1721, + "y": 791 } ], "animated": false, @@ -1065,12 +1065,12 @@ "labelPercentage": 0, "route": [ { - "x": 954.5, - "y": 953 + "x": 942.5, + "y": 941 }, { - "x": 1320.5, - "y": 953 + "x": 1308.5, + "y": 941 } ], "animated": false, @@ -1104,12 +1104,12 @@ "labelPercentage": 0, "route": [ { - "x": 1793, - "y": 1103 + "x": 1781, + "y": 1091 }, { - "x": 2160.5, - "y": 1103 + "x": 2148.5, + "y": 1091 } ], "animated": false, @@ -1143,12 +1143,12 @@ "labelPercentage": 0, "route": [ { - "x": 116.5, - "y": 1253 + "x": 104.5, + "y": 1241 }, { - "x": 924.5, - "y": 1253 + "x": 912.5, + "y": 1241 } ], "animated": false, @@ -1182,12 +1182,12 @@ "labelPercentage": 0, "route": [ { - "x": 2160.5, - "y": 1403 + "x": 2148.5, + "y": 1391 }, { - "x": 106.5, - "y": 1403 + "x": 94.5, + "y": 1391 } ], "animated": false, @@ -1221,12 +1221,12 @@ "labelPercentage": 0, "route": [ { - "x": 106.5, - "y": 1553 + "x": 94.5, + "y": 1541 }, { - "x": 511, - "y": 1553 + "x": 499, + "y": 1541 } ], "animated": false, @@ -1260,12 +1260,12 @@ "labelPercentage": 0, "route": [ { - "x": 101.5, - "y": 203 + "x": 89.5, + "y": 191 }, { - "x": 101.5, - "y": 1703 + "x": 89.5, + "y": 1691 } ], "animated": false, @@ -1299,12 +1299,12 @@ "labelPercentage": 0, "route": [ { - "x": 526, - "y": 203 + "x": 514, + "y": 191 }, { - "x": 526, - "y": 1703 + "x": 514, + "y": 1691 } ], "animated": false, @@ -1338,12 +1338,12 @@ "labelPercentage": 0, "route": [ { - "x": 939.5, - "y": 203 + "x": 927.5, + "y": 191 }, { - "x": 939.5, - "y": 1703 + "x": 927.5, + "y": 1691 } ], "animated": false, @@ -1377,12 +1377,12 @@ "labelPercentage": 0, "route": [ { - "x": 1340.5, - "y": 203 + "x": 1328.5, + "y": 191 }, { - "x": 1340.5, - "y": 1703 + "x": 1328.5, + "y": 1691 } ], "animated": false, @@ -1416,12 +1416,12 @@ "labelPercentage": 0, "route": [ { - "x": 1763, - "y": 203 + "x": 1751, + "y": 191 }, { - "x": 1763, - "y": 1703 + "x": 1751, + "y": 1691 } ], "animated": false, @@ -1455,12 +1455,12 @@ "labelPercentage": 0, "route": [ { - "x": 2195.5, - "y": 203 + "x": 2183.5, + "y": 191 }, { - "x": 2195.5, - "y": 1703 + "x": 2183.5, + "y": 1691 } ], "animated": false, diff --git a/e2etests/testdata/stable/sequence_diagram_nested_span/elk/sketch.exp.svg b/e2etests/testdata/stable/sequence_diagram_nested_span/elk/sketch.exp.svg index 585e5a593..6c954c961 100644 --- a/e2etests/testdata/stable/sequence_diagram_nested_span/elk/sketch.exp.svg +++ b/e2etests/testdata/stable/sequence_diagram_nested_span/elk/sketch.exp.svg @@ -2,7 +2,7 @@