Multileader tag's counter

Multileader tag's counter

F.Camargo
Advisor Advisor
525 Views
9 Replies
Message 1 of 10

Multileader tag's counter

F.Camargo
Advisor
Advisor

Hello everyone!
How are you?

 

Is it possible to create a list to count a specific tag in my multileader?

FCamargo_0-1741175069226.png

e.g

8 = 1

9 = 1

10 = 1

Or somenthing like that.

 

Thanks

Fabricio

 

0 Likes
Accepted solutions (3)
526 Views
9 Replies
Replies (9)
Message 2 of 10

Moshe-A
Mentor
Mentor
Accepted solution

@F.Camargo  hi,

 

the answer is yes

 

(defun c:mlctr (/ ss ename elist val eitem nitem lst)
 (if (setq ss (ssget '((0 . "multileader")))) 
  (progn
   (foreach ename (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
    (setq elist (entget ename))
    (setq val (atoi (cdr (assoc '302 (reverse elist)))))

    (if (null (setq eitem (assoc val lst)))
     (setq lst (cons (list val 1) lst))
     (progn
      (setq lst (vl-remove eitem lst))
      (setq nitem (list (car eitem) (1+ (cadr eitem))))
      (setq lst (cons nitem lst))
     ); progn
    ); if
   ); foreach

   (foreach item (vl-sort lst (function (lambda (e0 e1) (< (car e0) (car e1)))))
    (prompt (strcat "\n" (itoa (car item)) " = " (itoa (cadr item))))
   )
  ); progn
 ); if

  
 (princ)
)

 

 

 

Message 3 of 10

ВeekeeCZ
Consultant
Consultant

Or by tag name...

 

(Defun c:listofattvalues ( / s g l lg lv k)
  
  (and (setq s (ssget '((0 . "MULTILEADER"))))
       (setq g (getstring "tag: "))
       (setq l (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
       (setq lg (mapcar '(lambda (e) (vl-remove-if '(lambda (p) (/= (car p) 330)) (member (assoc 344 (entget e)) (entget e)))) l))
       (setq lg (apply 'append (mapcar '(lambda (x) (mapcar '(lambda (y) (cdr (assoc 2 (entget (cdr y)))) )x)) lg)))
       (setq lv (mapcar 'cdr (apply 'append (mapcar '(lambda (e) (vl-remove-if '(lambda (p) (/= (car p) 302)) (member (assoc 344 (entget e)) (entget e)))) l))))
       (setq l (mapcar 'cons lg lv))
       (setq l (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) g)) l)))
       (foreach e l (setq k (if (setq a (assoc e k))
			      (subst (cons e (1+ (cdr a))) a k)
			      (cons (cons e 1) k))))
       (setq k (vl-sort k '(lambda (e1 e2) (< (car e1) (car e2)))))
       )
  k
  )

 

Message 4 of 10

F.Camargo
Advisor
Advisor

Awesome!!! Fantastic.

Thank you

0 Likes
Message 5 of 10

F.Camargo
Advisor
Advisor

Thank for the help!

When I input the tag like number 8, its return nil.

Am i doing something wrong?

0 Likes
Message 6 of 10

ВeekeeCZ
Consultant
Consultant
Accepted solution

You apparently use wrong terminology.

Attributes have names called TAGs and it's values. If you explode your MLEADER so you get an access to block, you can use EATTEDIT to reveal att description.

 

eekeeCZ_0-1741182058436.png

 

Or can use the Properties Palette.

 

eekeeCZ_1-1741182342921.png

 

 

Sort the atts by tags makes only sense if you have more attributes than 1.

Message 7 of 10

komondormrex
Mentor
Mentor
Accepted solution

hey you there,

check this yet another even vlaxed one.

;***********************************************************************************************************************************************************

(defun parse_list (_list / unique_list old_member)
	(foreach _member _list (if (not (member _member unique_list)) (setq unique_list (append unique_list (list _member)))))
	(setq unique_list (mapcar '(lambda (_member) (cons _member 0)) unique_list))
	(foreach _member _list
		(if (setq old_member (assoc _member unique_list))
				(setq unique_list (subst (cons (car old_member) (1+ (cdr old_member))) old_member unique_list))
		)
	)
)

;***********************************************************************************************************************************************************

(defun get_mleaders (/ mleader_sset mleader_list )
	(prompt "\nPick \"_TagCircle\" mleaders to count by attribute value...")
	(if (setq mleader_sset (ssget '((0 . "multileader"))))
		(setq mleader_list (parse_list 
								(mapcar '(lambda (mleader) (vlax-map-collection (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) 
																						  "_TagCircle"
																			    )
															'(lambda (object) (if (= "AcDbAttributeDefinition" (vla-get-objectname object)) 
																				(setq att_id (vla-get-objectid object))
																			  )
															 )
														   )
														   (vla-getblockattributevalue mleader att_id)
										 )
										 (vl-remove-if-not '(lambda (mleader) (= "_TagCircle" (vla-get-contentblockname mleader)))
				   					   					  		(mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex mleader_sset))))
									   	 )
							    )
				   		   )
		)
    )
)

;***********************************************************************************************************************************************************

(defun c:count_mleader nil
	(terpri)
	(mapcar '(lambda (mleader) (princ (strcat "\"" (car mleader) "\" = " (itoa (cdr mleader)))) (terpri))
			 (get_mleaders)
	)
	(princ)
)

;***********************************************************************************************************************************************************
Message 8 of 10

F.Camargo
Advisor
Advisor

Worked fine!!

Thank you so much.

0 Likes
Message 9 of 10

F.Camargo
Advisor
Advisor

Impressive guys!!

you are awesome!!!

0 Likes
Message 10 of 10

Sea-Haven
Mentor
Mentor

Check your other post also at The Swamp.

 

Supported by Bricscad V25 is short code, the USIL & DSIL are tag names. Sorry not in Acad.

(setq blkent (car (entsel "\nPick leader ")))
(setq il1 (atof  (getpropertyvalue blkent "USIL~BlockAttribute")))
(setq il2 (atof  (getpropertyvalue blkent "DSIL~BlockAttribute")))

 

 

0 Likes