Visual LISP, AutoLISP and General Customization
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Filter Selection by Linetype (or Lineweight)

7 REPLIES 7
SOLVED
Reply
Message 1 of 8
hamza_itani
323 Views, 7 Replies

Filter Selection by Linetype (or Lineweight)

I need help with an AutoCAD LISP that correctly identifies the linetype of a selected object, but fails to include objects with their linetype set to "ByLayer" that match the linetype at their layer level. Can you modify the lisp so it selects objects appearing with a certain linetype, whether directly assigned or via their layer, ensuring all relevant objects are included in the selection set?

Thanks

 

 

(defun c:FLT2 (/ ent obj layerName linetype ss ltypeFilter activeDoc layers)
  (vl-load-com)

  ;; Prompt user to select an object and determine its linetype
  (setq ent (car (entsel "\nSelect an object to determine its linetype: ")))
  (if (not ent)
    (progn
      (princ "No object selected. Exiting.")
      (exit)
    )
  )

  ;; Get the object and check linetype
  (setq obj (vlax-ename->vla-object ent))
  (setq linetype (vla-get-Linetype obj))

  ;; If linetype is by layer, retrieve from layer
  (setq activeDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  (setq layers (vla-get-Layers activeDoc))
  (if (= linetype "ByLayer")
    (progn
      (setq layerName (vla-get-Layer obj))
      (setq obj (vla-item layers layerName))
      (setq linetype (vla-get-Linetype obj))
    )
  )

  ;; Inform the user of the linetype
  (princ (strcat "\nThe linetype of the selected object is: " linetype))

  ;; Construct the selection filter
  (setq ltypeFilter (list (cons 6 linetype)))

  ;; Prompt user to make a selection set filtered by linetype
  (setq ss (ssget ltypeFilter))
  (if (not ss)
    (princ "\nNo objects found with the same linetype.")
    (progn
      (sssetfirst nil ss)
      (princ (strcat "\nFiltered selection set by linetype: " linetype))
    )
  )
  (princ)
)

 

 

 

7 REPLIES 7
Message 2 of 8
komondormrex
in reply to: hamza_itani

check this

 

 

(defun c:all_linetype (/ linetype_ename linetype layer_linetype linetype linetype_sset linetype_list)
	(setq linetype_ename (car (entsel "\nSelect an object to determine its linetype: ")))
	(if linetype_ename
		(progn
			(if (null (setq linetype (cdr (assoc 6 (entget linetype_ename)))))
				(setq linetype (vla-get-linetype (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
														   (cdr (assoc 8 (entget linetype_ename)))
												 )
							   )
				)
			)
			(princ (strcat "\n\n\"" linetype "\" is selected linetype")) 
			(vlax-map-collection (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
				'(lambda (layer) (if (and (= (strcase linetype) (strcase (vla-get-linetype layer)))
									 	  (not (member (vla-get-name layer) layer_linetype))
									 )
										(setq layer_linetype (append layer_linetype (list (vla-get-name layer))))
								 )
				 )
			)
			(setq linetype_sset (ssget "_x" (append (list '(-4 . "<or") 
														   		(cons 6 linetype) 
												  	)
												  	(if layer_linetype
														(list
															(cons 8 (apply 'strcat (cdr (apply 'append (mapcar '(lambda (layer) (list "," layer)) layer_linetype)))))  
														)
												  	)
											   	   '((-4 . "or>"))
										    )
							    )
				 linetype_list (vl-remove-if-not '(lambda (ename) (or (null (assoc 6 (entget ename)))
																	  (= (strcase linetype) (strcase (cdr (assoc 6 (entget ename)))))
																  )
				 								  ) 
												  (vl-remove-if 'listp (mapcar 'cadr (ssnamex linetype_sset))))
				 linetype_sset (ssadd)
			)
			(foreach ename linetype_list (ssadd ename linetype_sset)) 
			(sssetfirst nil linetype_sset)
		)
	)
	(princ)
)

 

 

Message 3 of 8
hamza_itani
in reply to: komondormrex

Thank you very much!
Message 4 of 8
hamza_itani
in reply to: komondormrex

Using the same approach, is it possible to modify this to filter selection according to lineweight instead of linetype?

Thanks again!

 

Edit:

I got this far, but I still need it to determine LWDEFAULT to get the default lineweight from the active drawing,
then modify selection criteria: When "-3" (default) or "-2" (byblock)  values are selected, treat these as equivalent to LWDEFAULT.

 

 

(defun c:FLW (/ lineweight_ename lineweight layer_lineweight lineweight_sset lineweight_list)
  (setq lineweight_ename (car (entsel "\nSelect an object to determine its lineweight: ")))
  (if lineweight_ename
    (progn
      (setq lineweight (cdr (assoc 370 (entget lineweight_ename))))
      (if (= lineweight nil)
        (setq lineweight (vla-get-Lineweight
                          (vla-item
                           (vla-get-layers
                            (vla-get-activedocument
                             (vlax-get-acad-object)))
                           (cdr (assoc 8 (entget lineweight_ename)))))))
      (princ (strcat "\n\n\"" (itoa lineweight) "\" is the selected lineweight"))
      (setq layer_lineweight nil)
      (vlax-map-collection
       (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
       (function (lambda (layer)
                   (if (= lineweight (vla-get-Lineweight layer))
                     (setq layer_lineweight
                           (append layer_lineweight (list (vla-get-name layer))))))))
      (setq lineweight_sset
            (ssget
             (append
              (list '(-4 . "<or") '(-4 . "<and") '(0 . "*") (cons 370 lineweight) '(-4 . "and>"))
              (if layer_lineweight
                  (list '(-4 . "<and") '(0 . "*")
                        (cons 8 (apply 'strcat
                                       (cdr (apply 'append
                                                   (mapcar (function (lambda (layer)
                                                                       (list "," layer)))
                                                           layer_lineweight)))))
                        '(-4 . "and>"))
                  nil)
              '((-4 . "or>")))))
      (setq lineweight_list
            (vl-remove-if-not
             (function (lambda (ename)
                         (or (null (assoc 370 (entget ename)))
                             (= lineweight (cdr (assoc 370 (entget ename)))))))
             (vl-remove-if 'listp (mapcar 'cadr (ssnamex lineweight_sset)))))
      (foreach ename lineweight_list
        (ssadd ename lineweight_sset))
      (sssetfirst nil lineweight_sset)
      )
    )
  (princ)
)

 

 

 

Message 5 of 8
komondormrex
in reply to: hamza_itani

here is mine

 

(defun c:all_lineweight (/ lw_assoc lineweight_ename lineweight layer_lineweight lineweight lineweight_sset lineweight_list)
	(setq lw_assoc '((-1 . "ByLayer") (-2 . "ByBlock") (-3 . "Default"))
		  lineweight_ename (car (entsel "\nSelect an object to determine its lineweight: "))
	)
	(if lineweight_ename
		(progn
			(if (null (setq lineweight (cdr (assoc 370 (entget lineweight_ename)))))
				(setq lineweight (vla-get-lineweight (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
														   	   (cdr (assoc 8 (entget lineweight_ename)))
												 	 )
							     )
				)
			)
			(princ (strcat "\n\n\"" (if (assoc lineweight lw_assoc) (cdr (assoc lineweight lw_assoc)) (vl-princ-to-string (* lineweight 1e-2))) "\" is selected lineweight"))
			(vlax-map-collection (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
				'(lambda (layer) (if (and (= lineweight (vla-get-lineweight layer))
									 	  (not (member (vla-get-name layer) layer_lineweight))
									 )
										(setq layer_lineweight (append layer_lineweight (list (vla-get-name layer))))
								 )
				 )
			)
			(setq lineweight_sset (ssget "_x" (append (list '(-4 . "<or")
													 	  		(cons 370 lineweight)
												  	  )
												  	  (if layer_lineweight
															(list
																(cons 8 (apply 'strcat (cdr (apply 'append (mapcar '(lambda (layer) (list "," layer)) layer_lineweight)))))
															)
												  		)
											   	   	 '((-4 . "or>"))
										      )
							      )
				 lineweight_list (vl-remove-if-not '(lambda (ename) (or (null (assoc 370 (entget ename)))
																	  	(= lineweight (cdr (assoc 370 (entget ename))))
																    )
				 								    )
												    (vl-remove-if 'listp (mapcar 'cadr (ssnamex lineweight_sset)))
								 )
				 lineweight_sset (ssadd)
			)
			(foreach ename lineweight_list (ssadd ename lineweight_sset))
			(sssetfirst nil lineweight_sset)
		)
	)
	(princ)
)

 

Message 6 of 8
hamza_itani
in reply to: komondormrex

Can you combine the 3 values: "-3" (default) and "-2" (byblock) and "#" (lwdefault) and treat them as one?

So the lisp initially checks for (getvar "lwdefault") value, and if user picks an object of any of the above 3 values, it filters the selection to include all 3?

So in simple terms i need to select everything that visually has the same lineweight, regardless of whether it's set as "default" or "byblock".

Message 7 of 8
komondormrex
in reply to: hamza_itani

like that?

 

(defun c:all_lineweight (/ lineweight_ename lineweight layer_lineweight lineweight lineweight_sset lineweight_list lineweight_value_list)
	(setq lineweight_ename (car (entsel "\nSelect an object to determine its lineweight: ")))
		(if lineweight_ename
		(progn
			(if (null (setq lineweight (cdr (assoc 370 (entget lineweight_ename)))))
				(setq lineweight (vla-get-lineweight (vla-item (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
														   	   (cdr (assoc 8 (entget lineweight_ename)))
												 	 )
							     )
				)
			)
			(if (member lineweight '(-2 -3)) (setq lineweight_value_list (list -2 -3 (getvar 'lwdefault)))
											 (if (= lineweight (getvar 'lwdefault))
													(setq lineweight_value_list (list -2 -3 (getvar 'lwdefault)))
											 		(setq lineweight_value_list (list lineweight))
											 )
			)
			(princ (strcat "\n\n\"" (vl-princ-to-string (* (last lineweight_value_list) 1e-2)) "\" is selected lineweight"))
			(vlax-map-collection (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
				'(lambda (layer) (if (and (member (vla-get-lineweight layer) lineweight_value_list)
									 	  (not (member (vla-get-name layer) layer_lineweight))
									 )
										(setq layer_lineweight (append layer_lineweight (list (vla-get-name layer))))
								 )
				 )
			)
			(setq lineweight_sset (ssget "_x" (append (list '(-4 . "<or")
																'(-4 . "<or")
													  )
													  (mapcar '(lambda (lweight) (cons 370 lweight)) lineweight_value_list)
													  (list '(-4 . "or>"))
												  	  (if layer_lineweight
															(list
																(cons 8 (apply 'strcat (cdr (apply 'append (mapcar '(lambda (layer) (list "," layer)) layer_lineweight)))))
															)
												  	  )
											   	   	 '((-4 . "or>"))
										      )
							      )
				 lineweight_list (vl-remove-if-not '(lambda (ename) (or (null (assoc 370 (entget ename)))
																	  	(= lineweight (cdr (assoc 370 (entget ename))))
																		(member (cdr (assoc 370 (entget ename))) lineweight_value_list)
																    )
				 								    )
												    (vl-remove-if 'listp (mapcar 'cadr (ssnamex lineweight_sset)))
								 )
				 lineweight_sset (ssadd)
			)
			(foreach ename lineweight_list (ssadd ename lineweight_sset))
			(sssetfirst nil lineweight_sset)
		)
	)
	(princ)
)

 

Message 8 of 8
hamza_itani
in reply to: komondormrex

Yes, this is exactly what I needed. Thank you so much for your help!

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report

”Boost