I am not good as the others but try this. It will build what you want to achieve but not exactly as what was shown in the image.
Maybe other can improve the code.
(defun c:LayerLegend (/ doc lays lay laylist layname laycolor laydesc
pt x y starty rowH txtH headH colHT
col1 col2 col3 totalH
legendBlock w)
(defun GetTextWidth (txt height / doc ms txtObj minp maxp w)
(if (or (not txt) (= txt ""))
0
(progn
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq ms (vla-get-ModelSpace doc))
;; create temp text off-screen
(setq txtObj (vla-AddText ms txt (vlax-3d-point -1000 -1000 0) height))
;; initialize safearrays
(setq minp (vlax-make-safearray vlax-vbDouble '(0 . 2)))
(setq maxp (vlax-make-safearray vlax-vbDouble '(0 . 2)))
;; get bounding box safely
(vl-catch-all-apply
'(lambda ()
(vla-GetBoundingBox txtObj 'minp 'maxp)
))
;; width in X direction
(setq w (abs (- (vlax-safearray-get-element maxp 0)
(vlax-safearray-get-element minp 0))))
;; delete temp text
(vla-Delete txtObj)
w
)
)
)
(vl-load-com)
(setq rowH 8.0)
(setq txtH 2.0)
(setq headH 2.5)
(setq colHT 1.0)
(setq col1 35.0) ;; fixed column 1 width
(setq col2 50.0) ;; fixed column 2 width
(setq col3 65.0) ;; fixed column 3 width
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq lays (vla-get-Layers doc))
(setq laylist '())
(vlax-for lay lays
(setq layname (vla-get-name lay))
(setq laydesc (if (vlax-property-available-p lay 'Description)
(vla-get-description lay)
""))
;; Skip 0, Defpoints, XREF
(if (and (/= layname "0")
(/= (strcase layname) "DEFPOINTS")
(not (vl-string-search "|" layname)))
(progn
(setq laycolor (vla-get-color lay))
(setq laylist (cons (list layname laycolor laydesc) laylist))
)
)
)
(setq laylist
(vl-sort laylist
'(lambda (a b) (< (strcase (car a)) (strcase (car b))))
)
)
(if (setq legendBlock (tblsearch "BLOCK" "LAYERLEGEND_MARK"))
(command "_.erase" "B" "LAYERLEGEND_MARK" "")
)
(setq pt (getpoint "\nPick insertion point: "))
(setq x (car pt))
(setq y (cadr pt))
(setq starty y)
(setq totalH (* rowH (+ (length laylist) 1)))
(entmakex
(list '(0 . "LINE")(cons 8 "0")
(cons 10 (list x starty 0))
(cons 11 (list (+ x col1 col2 col3) starty 0))))
(entmakex (list '(0 . "TEXT")(cons 8 "0")
(cons 10 (list (+ x 3) (- y 5) 0))
(cons 40 headH)
(cons 1 "COLOR NUMBER")))
(entmakex (list '(0 . "TEXT")(cons 8 "0")
(cons 10 (list (+ x col1 3) (- y 5) 0))
(cons 40 headH)
(cons 1 "LAYER NAME")))
(entmakex (list '(0 . "TEXT")(cons 8 "0")
(cons 10 (list (+ x col1 col2 3) (- y 5) 0))
(cons 40 headH)
(cons 1 "DESCRIPTION")))
;; header bottom line
(entmakex
(list '(0 . "LINE")(cons 8 "0")
(cons 10 (list x (- y rowH) 0))
(cons 11 (list (+ x col1 col2 col3) (- y rowH) 0))))
(setq y (- y rowH))
(foreach L laylist
(setq layname (nth 0 L))
(setq laycolor (nth 1 L))
(setq laydesc (nth 2 L))
;; Color number text (1 mm) on its layer
(entmakex
(list '(0 . "TEXT")
(cons 8 layname)
(cons 10 (list (+ x 3) (+ y -2.2) 0))
(cons 40 colHT)
(cons 1 (itoa laycolor))))
;; Sample line on its layer
(entmakex
(list '(0 . "LINE")
(cons 8 layname)
(cons 10 (list (+ x 3) (- y 3) 0))
(cons 11 (list (+ x col1 -3) (- y 3) 0))))
;; Layer name text on its layer
(entmakex
(list '(0 . "TEXT")
(cons 8 layname)
(cons 10 (list (+ x col1 3) (- y 4) 0))
(cons 40 txtH)
(cons 1 layname)))
;; Description text (Layer 0)
(entmakex
(list '(0 . "TEXT")
(cons 8 "0")
(cons 10 (list (+ x col1 col2 3) (- y 4) 0))
(cons 40 txtH)
(cons 1 laydesc)))
;; Row horizontal line
(entmakex
(list '(0 . "LINE")(cons 8 "0")
(cons 10 (list x (- y rowH) 0))
(cons 11 (list (+ x col1 col2 col3) (- y rowH) 0))))
(setq y (- y rowH))
)
(entmakex (list '(0 . "LINE")(cons 8 "0")
(cons 10 (list x starty 0))
(cons 11 (list x (- starty totalH) 0))))
(entmakex (list '(0 . "LINE")(cons 8 "0")
(cons 10 (list (+ x col1) starty 0))
(cons 11 (list (+ x col1) (- starty totalH) 0))))
(entmakex (list '(0 . "LINE")(cons 8 "0")
(cons 10 (list (+ x col1 col2) starty 0))
(cons 11 (list (+ x col1 col2) (- starty totalH) 0))))
(entmakex (list '(0 . "LINE")(cons 8 "0")
(cons 10 (list (+ x col1 col2 col3) starty 0))
(cons 11 (list (+ x col1 col2 col3) (- starty totalH) 0))))
(princ)
)