Slowly getting there. This is not filleting properly some one else may find problem but it appears to be drawing shape. I just noticed an error on a single line so need to look at that as well.
Give it a try and just comment about what is not quite right.
Look at image this is how to use, go clockwise.
Work in progress.

First pick choose start, second skip, third end.

; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/trying-to-create-a-macro/td-p/13344371
; Do custom offsets by AlanH March 2025
;(defun c:btop ( / oldsnap ang ang2 cpt ent ename pt1 pt2 pt3 pt4 pt5 AH:Butts)
(defun c:btop ( / )
(defun AH:Butts (AHdef verhor butlst / fo fname x k )
(defun butval ( / l)
(setq x 1)
(repeat (length butlst)
(setq l (strcat "Rb" (rtos x 2 0)))
(if (= (get_tile l) "1" )
(setq but x)
)
(setq x (+ x 1))
)
(princ but)
)
(setq fo (open (setq fname (vl-filename-mktemp "" "" ".dcl")) "w"))
(write-line "AHbutts : dialog {" fo)
(write-line "label = \"Dog leg\" ; " fo)
(write-line ": row { " fo)
(write-line ": boxed_radio_column { " fo)
(write-line "width = 17 ; " fo)
(write-line " : radio_button { " fo)
(write-line " key = \"Rb1\"; " fo)
(write-line " label = \"Start\"; " fo)
(write-line " } " fo)
(write-line " spacer_1 ; " fo)
(write-line " : radio_button { " fo)
(write-line " key = \"Rb2\"; " fo)
(write-line " label = \"Skip\"; " fo)
(write-line " } " fo)
(write-line " spacer_1 ; " fo)
(write-line " : radio_button { " fo)
(write-line " key = \"Rb3\"; " fo)
(write-line " label = \"End\"; " fo)
(write-line " } " fo)
(write-line " spacer_1 ; " fo)
(write-line " } " fo)
(write-line " } " fo)
(write-line " spacer_1 ; " fo)
(write-line " ok_cancel ; " fo)
(write-line " } " fo)
(close fo)
(setq dcl_id (load_dialog fname))
(if (not (new_dialog "AHbutts" dcl_id) )
(exit)
)
(setq x 1)
(repeat (- (length butlst) 1)
(setq k (strcat "Rb" (rtos x 2 0)))
(if (= ahdef x)(set_tile k "1"))
(setq x (+ x 1))
)
(action_tile "accept" "(butval)(done_dialog)")
(action_tile "cancel" "(done_dialog)(exit)")
(start_dialog)
(unload_dialog dcl_id)
(vl-file-delete fname)
(if (= but nil)(setq but 1))
(princ)
)
(defun ahmidpoint (lent / start end dist obj)
(setq obj (vlax-ename->vla-object lent))
(setq start (vlax-curve-getstartPoint obj))
(setq end (vlax-curve-getEndPoint obj))
(setq dist (/ (distance start end) 2.0))
(setq mpnew (vlax-curve-getpointatdist obj dist))
(princ)
)
(defun dostart ( / )
(setq ang (angle pt1 pt2))
(setq pt3 (polar pt1 ang 3.0))
(if (= ang ang2)
(setq pt4 (polar pt3 (- ang (/ pi 2)) 0.375))
(setq pt4 (polar pt3 (+ ang (/ pi 2)) 0.375))
)
(setq pt5 (polar pt4 ang (- (distance pt1 pt2) 3.375)))
(command "pline" pt1 pt3 pt4 pt5 "")
(if (> howmany 1)
(progn
(setq entl (entlast))
(AHmidpoint entl)
(command "Fillet" entl mp)
)
)
(setq mp mpnew)
(princ)
)
(defun doskip ( / )
(setq ang (angle pt1 pt2))
(setq pt3 (polar pt1 ang 0.375))
(if (= ang2 ang)
(setq pt3 (polar pt3 (- ang (/ pi 2)) 0.375))
(setq pt3 (polar pt3 (+ ang (/ pi 2)) 0.375))
)
(setq pt4 (polar pt3 ang (- (distance pt1 pt2) (* 2 0.375))))
(command "line" Pt3 pt4 "")
(if (> howmany 1)
(progn
(setq entl (entlast))
(AHmidpoint entl)
(command "Fillet" entl mp)
)
)
(setq mp mpnew)
(princ)
)
(defun doend ( / )
(setq ang (angle pt2 pt1))
(setq pt3 (polar pt2 ang 3.0))
(if (= ang2 ang)
(setq pt4 (polar pt3 (+ ang (/ pi 2)) 0.375))
(setq pt4 (polar pt3 (- ang (/ pi 2)) 0.375))
)
(setq pt5 (polar pt4 ang (- (distance pt1 pt2) 3.375)))
(command "pline" pt2 pt3 pt4 pt5 "")
(if (> howmany 1)
(progn
(setq entl (entlast))
(AHmidpoint entl)
(command "Fillet" entl mp)
)
)
(setq mp mpnew)
(princ)
)
(setq oldsnap (getvar 'osmode))
(setvar 'osmode 0)
(setvar 'filletrad 0.0)
(if (= but nil)(setq but 1))
(setq howmany 0)
(while (setq ent (entsel "\nSelect line near start end Press Enter to exit "))
(setq ename (car ent))
(setq pt (cadr ent))
(setq pt1 (cdr (assoc 10 (entget ename))))
(setq pt2 (cdr (assoc 11 (entget ename))))
(setq ang2 (angle pt1 pt2))
(setq d1 (distance pt pt1))
(setq d2 (distance pt pt2))
(if (> d1 d2)
(setq tmp pt1
pt1 pt2
pt2 tmp)
)
(setq ans (ah:butts but "V" '("Dog leg" "Start" "Skip" "End")))
(setq hwomany (+ howmany 1))
(cond
((= but 1)(dostart))
((= but 2)(doskip))
((= but 3)(doend))
)
)
(setvar 'osmode oldsnap)
(princ)
)
(c:btop)
The reason for the pick point is that the code uses it to determine a direction for the offset. You can draw lines in any direction but it should draw correct. Sometimes if on the bottom edge of a closed shape you need to pick right side.