Here's a revised version that seems to work pretty well. You can select individual points, or multiple window/crossing selections....each window/crossing will be sorted within itself only, so if you select, by window, points 5-9, then select, by window, points 1-4, and use a staring number for the trees of 21, then pt 5 will be 21 and pt 1 will be tree 26. Make sense?
(defun c:addtreenums (/ ss ctr idx ent pt desc)
(vl-load-com)
(defun getss_by_order (ss / idx newss ent poly enames)
(setq idx -1
newss (ssadd)
)
(while (setq ent (ssnamex ss (setq idx (1+ idx))))
(if (or (= (caar ent) 2)
(= (caar ent) 3)
)
(progn
(if (not poly)
(progn
(setq poly (cadr ent))
(setq enames (list (cadar ent)))
)
;else
(if (equal poly (cadr (ssnamex ss (1+ idx))))
(setq enames (append enames (list (cadar ent))))
;;else add the items to the newss
(progn
(setq enames (append enames (list (cadar ent))))
(foreach e (reverse enames)
(ssadd e newss)
)
(setq poly nil
enames nil
)
)
)
)
)
;else
(ssadd (cadar ent) newss)
)
)
newss
)
(if (and (setq ss (ssget '((0 . "AECC_COGO_POINT"))))
(not (initget 7))
(setq ctr (getint "\nStarting tree #: "))
)
(progn
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(setq ss (getss_by_order ss))
(setq idx -1)
(while (setq ent (ssname ss (setq idx (1+ idx))))
(setq pt (vlax-ename->vla-object ent)
desc (vlax-get pt 'rawdescription)
)
(vlax-put pt 'rawdescription (strcat desc (itoa ctr)))
(setq ctr (1+ ctr))
)
(vla-endundomark doc)
)
)
(princ)
)