@ВeekeeCZ wrote:
OK, the first 4 combined. The offset-one would be dedicated, later.
Well, here is the offset-one. This one is well-made enough to cover all 5 cases. You just set offset to 0 for cases 1-4.
Accually there are 2 routines
- LineConnectOff - main routine, when it's run for 1st time it will call the LineConnestOffSet for initial offset setting.
- LineConnectOffSet - just helper routine to re-set the offset. You need this for changing the offset distance.
- You can also adjust the default setting different then 0.1.
(defun c:LineConnectOffSet (/ ss ssp ssc lsp lsc d d0 dir)
(or *lco-off*
(setq *lco-off* 0.1)) ; <--- default offset
(setq *lco-off* (cond ((getdist (strcat "\nSet offset <" (rtos *lco-off* 2 2) ">: ")))
(*lco-off*))))
; --------------------------------------------------------------------------------------------------------
(defun c:LineConnectOff (/ ss ssp ssc lsp lsc d d0 dir)
(or *lco-off*
(c:LineConnectOffSet))
(if (and (princ "\nSelect SQUAREs and other entities to connect: ")
(setq ss (ssget '((-4 . "<OR")
(0 . "CIRCLE,ARC,LINE,POINT")
(-4 . "<AND") (0 . "LWPOLYLINE") (90 . 4) (-4 . "AND>")
(-4 . "OR>"))))
(setq ssp (acet-ss-ssget-filter ss '((0 . "LWPOLYLINE"))))
(setq ssc (acet-ss-ssget-filter ss '((0 . "~LWPOLYLINE"))))
(setq lsp (mapcar '(lambda (e) (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget e))) (vl-remove-if 'listp (mapcar 'cadr (ssnamex ssp)))))
(setq lsp (mapcar '(lambda (x) (mapcar '/ (mapcar '+ (cdar x) (cdaddr x)) '(2 2))) lsp))
(setq lsc (mapcar '(lambda (e / ed) (if (= "LINE" (cdr (assoc 0 (setq ed (entget e)))))
(mapcar '/ (mapcar '+ (cdr (assoc 10 ed)) (cdr (assoc 11 ed))) '(2 2))
(cdr (assoc 10 ed))))
(vl-remove-if 'listp (mapcar 'cadr (ssnamex ssc)))))
(setq d (abs (/ (- (apply 'max (mapcar 'car lsp)) (apply 'min (mapcar 'car lsp))) ;xmax-xmin
(if (zerop (setq d0 (- (apply 'max (mapcar 'cadr lsp)) (apply 'min (mapcar 'cadr lsp))))) ;ymax-ymin
0.001
d0))))
)
(progn
(if (< 0.2 d 5)
(progn
(initget "Horizontal Vertical")
(setq dir (getkword "\nChoose an option [Horizontal/Vertical]: "))))
(if (or (= dir "Horizontal")
(> d 5))
(setq lsp (vl-sort lsp '(lambda (p q) (< (car p) (car q))))
lsc (vl-sort lsc '(lambda (p q) (< (car p) (car q))))
lsc (mapcar '(lambda (x) (mapcar '+ x (list 0
((if (minusp (- (/ (apply '+ (mapcar 'cadr lsp)) (length lsp))
(/ (apply '+ (mapcar 'cadr lsc)) (length lsc))))
+ -) 0 *lco-off*))))
lsc))
(setq lsp (vl-sort lsp '(lambda (p q) (< (cadr p) (cadr q))))
lsc (vl-sort lsc '(lambda (p q) (< (cadr p) (cadr q))))
lsc (mapcar '(lambda (x) (mapcar '+ x (list ((if (minusp (- (/ (apply '+ (mapcar 'car lsp)) (length lsp))
(/ (apply '+ (mapcar 'car lsc)) (length lsc))))
+ -) 0 *lco-off*)
0)))
lsc)))
(mapcar '(lambda (p1 p2)
(entmakex (list (cons 0 "LINE")
(cons 10 p1)
(cons 11 p2)
(cons 8 "wire"))))
lsc lsp)))
(princ)
)