{"record":{"id":"cdcb8f93afa30d3c","repo":"d2lang/d2","slug":"dimensions-for-edge-label-v-not-found","errorCode":null,"errorMessage":"dimensions for edge label %#v not found","messagePattern":"dimensions for edge label %#v not found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"d2graph/d2graph.go","lineNumber":1708,"sourceCode":"\n\t\tvar dims *d2target.TextDimensions\n\t\tif edge.Language == \"latex\" {\n\t\t\twidth, height, err := d2latex.Measure(edge.Text().Text)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdims = d2target.NewTextDimensions(width, height)\n\t\t} else if edge.Language == \"markdown\" {\n\t\t\tvar err error\n\t\t\tdims, err = getMarkdownDimensions(mtexts, ruler, edge.Text(), usedFont, monoFontFamily)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tdims = GetTextDimensions(mtexts, ruler, edge.Text(), usedFont)\n\t\t}\n\t\tif dims == nil {\n\t\t\treturn fmt.Errorf(\"dimensions for edge label %#v not found\", edge.Text())\n\t\t}\n\n\t\tedge.LabelDimensions = *dims\n\t}\n\treturn nil\n}\n\nfunc (g *Graph) Texts() []*d2target.MText {\n\tvar texts []*d2target.MText\n\n\tcapsLock := g.Theme != nil && g.Theme.SpecialRules.CapsLock\n\n\tfor _, obj := range g.Objects {\n\t\tif obj.Label.Value != \"\" {\n\t\t\tobj.ApplyTextTransform()\n\t\t\ttext := obj.Text()\n\t\t\tif capsLock && !strings.EqualFold(obj.Shape.Value, d2target.ShapeCode) {\n\t\t\t\tif obj.Language != \"latex\" && !obj.Style.NoneTextTransform() {","sourceCodeStart":1690,"sourceCodeEnd":1726,"githubUrl":"https://github.com/d2lang/d2/blob/0d69dca6f532ceaeacd615d35d1eaa41a238ffdb/d2graph/d2graph.go#L1690-L1726","documentation":"During edge sizing, an edge's label (or its label icon path) must have known dimensions. When the label isn't an icon requiring special handling, GetTextDimensions is used; a nil result — text absent from mtexts and no ruler measurement possible — fails edge dimension computation with this error.","triggerScenarios":"Rendering a graph where an edge has a non-empty label whose MText is missing from mtexts and ruler is nil or hasn't measured that label's text/font/size; edges with `label` set but measurement pass skipped or stale.","commonSituations":"Edge labels added/edited after mtexts were generated; embedded usage with nil ruler; custom fonts/styles (bold/italic edge labels) whose variants aren't loaded; hand-built graphs in custom tooling bypassing graph.SetText.","solutions":["Pass a non-nil, fully font-loaded textmeasure.Ruler to SetDimensions so edge labels are measured on demand","Regenerate mtexts via graph.SetText after any edge label change","Ensure the label's exact MText (text, font size, family, style flags) is present in mtexts","For icon labels, confirm the label_ icon path branch ran (dims come from image sizing, not text measurement)"],"exampleFix":"// before\nerr := graph.SetDimensions(mtexts, nil, fontFamily, mono) // edge labels unmeasurable\n// after\nruler, _ := textmeasure.NewRuler()\nruler.InitFonts(d2fonts.D2Fonts)\nerr := graph.SetDimensions(mtexts, ruler, fontFamily, mono)","handlingStrategy":"validation","validationCode":"ruler, _ := textmeasure.NewRuler()\nruler.InitFonts(d2fonts.D2Fonts)\nfor _, edge := range graph.Edges {\n    if edge.LabelDimensions.Width == 0 && edge.Text() != nil && strings.TrimSpace(edge.Text().Text) != \"\" {\n        found := false\n        for _, mt := range mtexts { if mt.Text == edge.Text().Text { found = true; break } }\n        if !found { return fmt.Errorf(\"unmeasured edge label: %q\", edge.Text().Text) }\n    }\n}\nerr := graph.SetDimensions(mtexts, ruler, fontFamily, monoFontFamily)","typeGuard":"func edgeLabelMeasured(edge *d2graph.Edge, mtexts []*d2target.MText) bool {\n    t := edge.Text()\n    if t == nil || strings.TrimSpace(t.Text) == \"\" { return true }\n    for _, mt := range mtexts {\n        if mt.Text == t.Text && mt.FontSize == t.FontSize { return true }\n    }\n    return false\n}","tryCatchPattern":"if err := graph.SetDimensions(mtexts, ruler, fontFamily, mono); err != nil {\n    if strings.Contains(err.Error(), \"dimensions for edge label\") {\n        mtexts = graph.SetText(ruler, fontFamily)\n        err = graph.SetDimensions(mtexts, ruler, fontFamily, mono)\n    }\n    return err\n}","preventionTips":["Regenerate mtexts after adding or editing edge labels","Always pass a font-loaded ruler; edge labels with styles (bold/italic) need those variants loaded","Set edge labels through the d2 compiler so label texts are registered","Pre-check edgeLabelMeasured for all edges before calling SetDimensions with a nil ruler"],"tags":["go","d2","text-measurement","edges"],"backgroundTag":"text-dimensions-not-found","analyzedSha":"0d69dca6f532ceaeacd615d35d1eaa41a238ffdb","analyzedAt":"2026-08-31T12:19:21.182Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}