Ok watch this space.
Ok 1st problem the gas connections are in layer 0 thats a problem as may get wrong objects, so I have done you a bonus lisp to draw objects. 1st step is have layers for your services GAS WATER ELEC SEWER, as some else said its sloppy drafting.
This lisp you offset an existing pline, then just pick points and it will draw a 90 line to the pline. Press enter to stop then erase dummy offset.
(defun c:perps ( / ent pt1 pt2 obj dist)
(setq oldsnap (getvar 'osmode))
(setvar 'osmode 512)
(setq ent (entsel "\nPick pline "))
(setq pt1 (cadr ent))
(setq obj (vlax-ename->vla-object (car ent)))
(setq dist (distance pt1 (setq pt2 (getpoint pt1 "\nPick offset point "))))
(command "offset" dist (car ent) pt2 "")
(setvar 'clayer (cdr (assoc 8 (entget ent))))
(while (setq pt1 (getpoint "\nPick point Enter to stop "))
(setq pt2 (vlax-curve-getclosestpointto obj pt1))
(command "line" pt1 pt2 "")
)
(princ)
)
(defun c:CHX ( / alg-ang ang angdir ch co-ord d1 d2 end ent old oldaunits oldsnap pt start)
(defun alg-ang (obj pnt)
(+ (/ pi 2.0) (angle '(0. 0. 0.)
(vlax-curve-getfirstderiv
obj
(vlax-curve-getparamatpoint
obj
pnt
)
)
)
)
)
(setq oldsnap (getvar 'osmode))
(setvar 'osmode 0)
(setq oldaunits (getvar 'aunits))
(setvar 'aunits 3)
(setq oldangdir (getvar 'angdir))
(setvar 'angdir 0)
(setq txtsz (getreal "\nEnter textsize "))
(setq ent (entsel "\nPIck pline near end "))
(setq pt (cadr ent))
(setq co-ord (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car ent)))))
(setq obj (vlax-ename->vla-object (car ent)))
(setq start (vlax-curve-getstartPoint obj))
(setq end (vlax-curve-getendPoint obj))
(setq d1 (distance pt start))
(setq d2 (distance pt end))
(if (> d1 d2)
(command "pedit" ent "R" "")
)
(setvar 'textstyle "standard")
(setvar 'osmode 0)
(setq ch (getint "\nEnter start chainage "))
(setvar 'clayer "Station Reference")
(setq ang (alg-ang obj (vlax-curve-getstartPoint obj)))
(command "text" (vlax-curve-getstartPoint obj) txtsz ang (strcat (rtos (/ ch 100.0) 2 0) "+00"))
(setq ang (alg-ang obj (vlax-curve-getendPoint obj)))
(setq len (vlax-get obj 'length))
(setq pre (fix (/ (+ len ch) 100.0)))
(setq suf (* (- (/ (+ len ch) 100) pre) 100.0))
(command "text" (vlax-curve-getendPoint obj) txtsz ang (strcat (rtos pre 2 0) "+" (rtos suf 2 0)))
(setq lay (cdr (assoc 8 (entget (car (entsel "\nSelect an object for crossing layer "))))))
(setq ss (ssget (list (cons 0 "LINE")(cons 8 lay))))
(repeat (setq x (sslength ss))
(setq objx (vlax-ename->vla-object (ssname ss (setq x (1- x)))))
(setq pt (vlax-invoke obj 'intersectWith objX acExtendNone))
(setq ang (alg-ang obj pt))
(setq len (+ ch (vlax-curve-getdistatpoint obj pt)))
(setq pre (fix (/ len 100.0)))
(setq suf (* (- (/ len 100) pre) 100.0))
(command "text" pt txtsz ang (strcat (rtos pre 2 0) "+" (rtos suf 2 0)))
)
(setvar 'osmode oldsnap)
(setvar 'aunits oldaunits)
(setvar 'angdir oldangdir)
(princ)
)
(c:chx)