也试试这个,主要是从上面的代码中借用的
-
- (defun C:HORBEND(/ acsp adoc allset ang cr cs_lst da en end_lst i ip p1 p2 p3 pt sset ta tmp tp)
- ; credits to BIGAL
- ;local defuns
- ; Convert value in radians to degrees
- (defun rtd (a)
- (* 180.0 (/ a pi))
- )
- (prompt "\n\t Select number of circles within the terminal port: ")
- (if (setq sset (ssget '((0 . "circle") (40 . 100.0))))
- (progn
- (setq cs_lst nil
- end_lst nil
- )
- (or adoc (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
- (or acsp (setq acsp (vla-get-block (vla-get-activelayout adoc))))
- (while
- (setq en (ssname sset 0))
- (setq pt (reverse (cdr (reverse (cdr (assoc 10 (entget en))))))
- tmp (list pt en)
- cs_lst (cons tmp cs_lst)
- )
- (ssdel en sset)
- )
- (setq cs_lst (vl-sort cs_lst '(lambda (a b) (> (cadar a) (cadar b)))))
- (prompt "\n\t Select circles to connect to selected just at one side: ")
- (setq allset (ssget '((0 . "circle") (40 . 100.0))))
- (foreach item cs_lst
- (ssdel (cadr item)
- allset
- )
- )
- (while
- (setq cr (ssname allset 0))
- (setq pt (reverse (cdr (reverse (cdr (assoc 10 (entget cr))))))
- tmp (list pt cr)
- end_lst (cons tmp end_lst)
- )
- (ssdel cr allset)
- )
- (if (/= (length cs_lst) (length end_lst))
- (progn
- (alert "Different numbers of start and and points")
- (exit)
- (princ)
- )
- )
- (setq end_lst (vl-sort end_lst '(lambda (a b) (> (cadar a) (cadar b)))))
- (setq i 0)
- (repeat (length cs_lst)
- (setq p1 (car (nth i cs_lst))
- p3 (car (nth i end_lst))
- p2 (list (car p3) (cadr p1))
- ang (angle p3 p1)
- da (rtd ang)
- ta
- (cond ((< 0. da 90.)
- (/ pi 4))
- ((< 90. da 180.)
- (* 0.75 pi))
- ((< 180. da 270.)
- (* pi 1.25))
- ((< 270. da 360.)
- (* pi 1.75))
- )
- tp (polar p3 ta (* 2 (getvar 'viewsize)))
- ip (inters p1 p2 p3 tp nil)
- )
- (vlax-invoke acsp 'addlightweightpolyline (apply 'append (list p1 ip p3)))
- (setq i (1+ i))
- )
- )
- )
- (princ)
- )
- (prompt "\n --- Start command with HORBEND ---")
- (prin1)
- (or (vl-load-com) )
- (princ)
~'J'~ |