@HR2323 hi,
Here is my 'small' contribution to this 'project' 😎
Command LTASK starts by selecting all text,mtexts and all closed polylines with 4 points
then scan for polylines with equal diagonals fetch the largest one and send it to "mbox" layer.
then scan for texts value and find the one in question and send it to "Dwg Name" layer.
now all you got left, is to learn how to use >> script pro << and you are done 😁
so easy ha? 😜
Moshe
; Layer Task
(defun c:LTASK (/ split_ss gen_sorted_areas change_layer ;local functions
ss0 ss1 ss2 areas elist text)
(defun split_ss (/ elist)
(setq ss1 (ssadd) ss2 (ssadd))
(foreach ename (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss0)))
(setq elist (entget ename))
(if (eq (cdr (assoc '0 elist)) "LWPOLYLINE")
(ssadd ename ss1)
(ssadd ename ss2)
)
); foreach
); split_ss
; generate sorted list by areas
(defun gen_sorted_areas (/ geometric eq_diag ;| local functions |;)
; return polyline 4 points
(defun geometric (ent)
(mapcar
'(lambda (i)
(vlax-curve-getPointAtParam ent i)
)
'(0 1 2 3)
); mapcar
); geometric
; is diagonals equal?
(defun eq_diag (l)
(equal (distance (car l) (caddr l))
(distance (cadr l) (cadddr l)) 1e-3) ; fuzz is 0.001
); eq_diag
; here start gen_sorted_areas
(vl-sort
(vl-remove-if
'not
(mapcar
'(lambda (ename)
(if (eq_diag (geometric ename))
(cons (vlax-curve-getArea ename) ename)
)
); lambda
(vl-remove-if 'listp (mapcar 'cadr (ssnamex ss1)))
); mapcar
); vl-remove-if
'(lambda (a0 a1) (> (car a0) (car a1)))
); vl-sort
); gen_sorted_areas
(defun change_layer (lay ent)
(if (null (tblsearch "layer" lay))
(command "._layer" "_n" lay "")
)
(command "._chprop" "_si" ent "_Layer" lay "")
); change_layer
; here start c:LTASK
(setvar "cmdecho" 0)
(command "._undo" "_begin")
(if (setq ss0 (ssget "_x" '((-4 . "<or")
(0 . "text,mtext")
(-4 . "<and") (0 . "lwpolyline") (90 . 4) (70 . 1) (-4 . "and>")
(-4 . "or>"))
)
)
(progn
(split_ss)
(setq areas (gen_sorted_areas))
(change_layer "mbox" (cdar areas))
(foreach ename (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss2)))
(setq elist (entget ename))
(setq text (cdr (assoc '1 elist)))
(if (wcmatch (strcase text) "DRAWING_NUMBER-*")
(change_layer "Dwg Name" ename)
); if
); foreach
(princ "\nSuccessfully done.")
); progn
); if
(command "._undo" "_end")
(setvar "cmdecho" 1)
(princ)
); c:LTASK