check the following code with limitations:
1. plines with the same color are joined, regardless of their layer.
2. there are matched plines' pairs and every pair is one in quantity.
3. every pline has no arc segment, otherwise resulting plines will be distorted.
;**************************************************************************************************************************************************
(defun reverse_coordinates (coordinates_raw_list / reversed_list)
(if coordinates_raw_list
(setq reversed_list (append
(reverse_coordinates (cddr coordinates_raw_list))
(list (car coordinates_raw_list) (cadr coordinates_raw_list))
)
)
)
reversed_list
)
;**************************************************************************************************************************************************
(defun remove_duplicates (_list / duplicateless_list)
(while _list
(if (not (member (setq list_element (car _list)) (setq _list (cdr _list))))
(setq duplicateless_list (cons list_element duplicateless_list))
)
)
duplicateless_list
)
;**************************************************************************************************************************************************
(defun join_plines (pair)
(cond
(
(= 1 (cdar pair))
(setq joined_pline_coordinates_raw_list (append (reverse_coordinates (vlax-get (vlax-ename->vla-object (cadr pair)) 'coordinates))
(vlax-get (vlax-ename->vla-object (caddr pair)) 'coordinates)
)
)
)
(
(= 2 (cdar pair))
(setq joined_pline_coordinates_raw_list (append (reverse_coordinates (vlax-get (vlax-ename->vla-object (cadr pair)) 'coordinates))
(reverse_coordinates (vlax-get (vlax-ename->vla-object (caddr pair)) 'coordinates))
)
)
)
(
(= 3 (cdar pair))
(setq joined_pline_coordinates_raw_list (append (vlax-get (vlax-ename->vla-object (cadr pair)) 'coordinates)
(vlax-get (vlax-ename->vla-object (caddr pair)) 'coordinates)
)
)
)
(
(= 4 (cdar pair))
(setq joined_pline_coordinates_raw_list (append (vlax-get (vlax-ename->vla-object (cadr pair)) 'coordinates)
(reverse_coordinates (vlax-get (vlax-ename->vla-object (caddr pair)) 'coordinates))
)
)
)
)
(entdel (caddr pair))
(vla-put-coordinates (vlax-ename->vla-object (cadr pair))
(vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 1 (length joined_pline_coordinates_raw_list)))
joined_pline_coordinates_raw_list
)
)
)
;**************************************************************************************************************************************************
(defun c:joins_pline_pairs (/ pline_color_list color_list one_color_pline_list one_color_pline min_dist_list closest_pair)
(setq pline_color_list (mapcar '(lambda (pline) (cons (getpropertyvalue pline "color") pline))
(vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "lwpolyline")))))))
color_list (remove_duplicates (mapcar 'car pline_color_list))
)
(foreach color color_list
(setq one_color_pline_list (mapcar 'cdr
(vl-remove-if-not '(lambda (pline) (equal color (car pline)))
pline_color_list
)
)
)
(while (< 1 (length one_color_pline_list))
(setq one_color_pline (car one_color_pline_list)
one_color_pline_list (cdr one_color_pline_list)
min_dist_list (mapcar '(lambda (pline) (list (car (vl-sort (list (cons (distance (vlax-curve-getstartpoint one_color_pline) (vlax-curve-getstartpoint pline)) 1)
(cons (distance (vlax-curve-getstartpoint one_color_pline) (vlax-curve-getendpoint pline)) 2)
(cons (distance (vlax-curve-getendpoint one_color_pline) (vlax-curve-getstartpoint pline)) 3)
(cons (distance (vlax-curve-getendpoint one_color_pline) (vlax-curve-getendpoint pline)) 4)
)
'(lambda (distance_1 distance_2) (< (car distance_1) (car distance_2)))
)
)
one_color_pline
pline
)
)
one_color_pline_list
)
)
(setq closest_pair (car (vl-sort min_dist_list '(lambda (distance_1 distance_2) (< (caar distance_1) (caar distance_2)))))
one_color_pline_list (vl-remove (last closest_pair) one_color_pline_list)
)
(join_plines closest_pair)
)
)
)
;**************************************************************************************************************************************************