diff --git a/d2layouts/d2dagrelayout/layout.go b/d2layouts/d2dagrelayout/layout.go index b4c26c655..709cfa7d9 100644 --- a/d2layouts/d2dagrelayout/layout.go +++ b/d2layouts/d2dagrelayout/layout.go @@ -159,7 +159,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err id := obj.AbsID() idToObj[id] = obj - height := obj.Height + width, height := obj.Width, obj.Height if obj.HasLabel() { if obj.HasOutsideBottomLabel() || obj.Icon != nil { height += float64(obj.LabelDimensions.Height) + label.PADDING @@ -168,7 +168,14 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err height += float64(obj.LabelDimensions.Height) + label.PADDING } } - loadScript += generateAddNodeLine(id, int(obj.Width), int(height)) + if obj.Style.ThreeDee != nil && obj.Style.ThreeDee.Value == "true" { + height += d2target.THREE_DEE_OFFSET + width += d2target.THREE_DEE_OFFSET + } else if obj.Style.Multiple != nil && obj.Style.Multiple.Value == "true" { + height += d2target.MULTIPLE_OFFSET + width += d2target.MULTIPLE_OFFSET + } + loadScript += generateAddNodeLine(id, int(width), int(height)) if obj.Parent != g.Root { loadScript += generateAddParentLine(id, obj.Parent.AbsID()) } @@ -258,6 +265,29 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err } } + // separate loop so all descendants are placed + for _, obj := range g.Objects { + if obj.Style.ThreeDee != nil && obj.Style.ThreeDee.Value == "true" { + // obj.TopLeft.Y += d2target.THREE_DEE_OFFSET + obj.IterDescendants(func(_, child *d2graph.Object) { + child.TopLeft.Y += d2target.THREE_DEE_OFFSET + }) + if !obj.IsContainer() { + obj.Height -= d2target.THREE_DEE_OFFSET + obj.Width -= d2target.THREE_DEE_OFFSET + } + } else if obj.Style.Multiple != nil && obj.Style.Multiple.Value == "true" { + // obj.TopLeft.Y += d2target.MULTIPLE_OFFSET + obj.IterDescendants(func(_, child *d2graph.Object) { + child.TopLeft.Y += d2target.MULTIPLE_OFFSET + }) + if !obj.IsContainer() { + obj.Height -= d2target.MULTIPLE_OFFSET + obj.Width -= d2target.MULTIPLE_OFFSET + } + } + } + for i, edge := range g.Edges { val, err := vm.RunString(fmt.Sprintf("JSON.stringify(g.edge(g.edges()[%d]))", i)) if err != nil { diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go index c6ae8ee52..ca313e2ee 100644 --- a/d2renderers/d2svg/d2svg.go +++ b/d2renderers/d2svg/d2svg.go @@ -1187,6 +1187,13 @@ func drawShape(writer io.Writer, diagramHash string, targetShape d2target.Shape, var box *geo.Box if labelPosition.IsOutside() { box = s.GetBox() + if targetShape.ThreeDee { + box.TopLeft.Y -= d2target.THREE_DEE_OFFSET + box.Width += d2target.THREE_DEE_OFFSET + } else if targetShape.Multiple { + box.TopLeft.Y -= d2target.MULTIPLE_OFFSET + box.Width += d2target.MULTIPLE_OFFSET + } } else { box = s.GetInnerBox() }