Needs error checking, but worked in my test.
(defun strlist (strexp strdel / itm )
(setq strlst nil)
(while (setq pos (vl-string-position (ascii strdel) strexp))
(setq itm (substr strexp 1 pos))
(setq strlst (append strlst (list itm)))
(setq strexp (substr strexp (+ pos 2)))
)
(setq strlst (append strlst (list strexp)))
)
;(defun read-csv ( / rdlst output)
(defun read-csv ()
(setq output nil
rdlst nil)
(setq fname (getfiled "Select a .csv file :" (getvar "dwgprefix") "csv" 16))
(setq fname (open fname "r"))
(while
(setq rdlst (read-line fname))
(setq output (cons rdlst output))
):end while
(close fname)
(mapcar (function (lambda (x)(strlist x ",")))
(reverse output)
)
)
(defun c:oln1a()
(setq OldOsmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setq adoc (vla-get-activedocument (vlax-get-acad-object))acsp (vla-get-block (vla-get-activelayout adoc)))
(setq data (read-csv))
(setq CutObject (vlax-ename->vla-object (car (entsel "\nSelect Ground Bond Line...."))))
(setq CVSdata ;= list csv (including gl's)
(mapcar (function (lambda(x)
(list (car x)
(cadr x)
)))
data));end setq CVSdata
;get all squares
(setq Squaretxtlst nil)
(setq st (ssget "_X" (list (cons 0 "INSERT")(cons 8 "Pad"))))
(vlax-for a (vla-get-activeselectionset adoc)
(vla-GetBoundingBox a 'MinPnt 'MaxPnt)
(setq SquareInsPnt (vlax-get a 'InsertionPoint))
(setq MinPt (vlax-safeArray->list minPnt))
(setq MaxPt (vlax-safeArray->list maxPnt))
(vl-cmdf "._zoom" "_E") ; needed for ssget _W, will not work if not visiable on screen
(setq SquareTxt (cdr (assoc 1 (entget (ssname (ssget "_W" minPt maxPt '((0 . "TEXT")))0)))))
(setq SquareTxtLst (append SquareTxtLst (list (cons (atoi SquareTxt) SquareInsPnt ))))
);end vlax-for
(setq CircleTxtLst nil)
(setq sc (ssget "_X" (list (cons 0 "CIRCLE")(cons 8 "Tag"))))
(vlax-for a (vla-get-activeselectionset adoc)
(setq ip (vlax-get a 'Center))
(setq rad (vlax-get a 'Radius))
(setq p1 (list (- (car ip)(* rad 3))(- (cadr ip)(* rad 3)))
p2 (list (+ (car ip)(* rad 3))(+ (cadr ip)(* rad 3)))
cp (list (car ip)(cadr ip) 0.0)
)
(setq txtstr (cdr (assoc 1 (entget (ssname (ssget "_W" p1 p2 '((0 . "TEXT"))) 0)))))
(setq CircleTxtLst (append CircleTxtLst (list (cons (atoi txtstr) ip))))
);end vlax for
(setq count 0) ; nth pointer
(setq datalen (1- (length CVSdata)))
(while (< count datalen)
(if (not (vl-position (cadr(nth count CVSdata)) '("GL" "-")))
;; Add a Wire
(progn ; no GL found
(setq SqPointer (atoi (car(nth count CVSdata))))
(setq CirPointer (atoi (cadr(nth count CVSdata))))
(setq lnobj (vlax-invoke acsp 'AddLine (cdr (assoc SqPointer Squaretxtlst))(cdr (assoc CirPointer circletxtlst))))
(vlax-put lnobj 'Layer "Wire")
(setq count (1+ count))
);end progn no GL found
;; Else Add Ground Wire
(progn ; GL found
(setq SqPointer (atoi (car(nth count CVSdata))))
(if CirPointer
(setq CirPnt1 CirPointer) ;CirPointer = last known used circle
(setq CirPnt1 1)
)
;; find next valid Wire
(setq CirPnt2 (1+ count))
(while (vl-position (cadr(nth CirPnt2 CVSdata)) '("GL" "-"))
(setq CirPnt2 (1+ CirPnt2))
)
(if (< CirPnt2 (length CVSdata))
(progn
(setq CirPnt2 (atoi (cadr (nth CirPnt2 circdata))))
(setq pt1 (cdr (assoc CirPnt1 circletxtlst))
pt2 (cdr (assoc CirPnt2 circletxtlst)))
(setq ang (angle pt1 pt2))
(setq stepcnt (- CirPnt2 CirPnt1))
(setq stepdis (/ (distance pt1 pt2) (+ stepcnt 1)))
;; Create the Ground Wire(s)
(setq idx 1)
(repeat stepcnt
(setq Cutlnobj (vlax-invoke acsp 'AddLine (cdr (assoc SqPointer Squaretxtlst))
(polar pt1 ang (* stepdis idx))
)
)
(setq InterSect (vlax-invoke CutLnObj "intersectwith" CutObject acextendnone))
(vla-delete Cutlnobj)
(setq lnobj (vlax-invoke acsp 'AddLine InterSect (cdr (assoc SqPointer Squaretxtlst))))
(vlax-put lnobj 'Layer "Wire GB")
(setq idx (+ idx 1))
(setq SqPointer (+ SqPointer 1))
)
(setq count (+ count (1- idx)))
)
(setq count (length CVSdata))
)
);end progn GL found
);end and
);end while
(setvar "OSMODE" OldOsmode)
);end defun