Cond inside cond

Cond inside cond

svucic
Advocate Advocate
1,217 Views
7 Replies
Message 1 of 8

Cond inside cond

svucic
Advocate
Advocate

Hi,

I'm wondering if it is possible to use cond inside cond like this :

 (setq add (ssadd) ss (ssadd a))

	    (setq i (sslength ss))
	    (setq temp (ssget "_WP" (_pac (ssname ss (setq i (1- i))))))

            (cond ((/= temp nil)
               		(setq i2 (sslength temp)) 
			(ssadd (ssname temp (setq i2 (1- i2))) add)
			(setq aadd add)
	   		(setq countobj (sslength aadd))

	          (cond ((= countobj 1)
               		(setq i2 (sslength temp)) 
			(ssadd (ssname temp (setq i2 (1- i2))) add)
			(setq aadd add)
	   		(setq countobj (sslength aadd))
			(sssetfirst nil add)
           		(ssget "_I")
			))

		  (cond ((> countobj 1)	
			(setq file_handle1 (open "D:\\Data1.txt" "a"))
	   		(setq enname (ssname aadd 0)) 
	   		(setq enname1 (vlax-ename->vla-object enname))
	   		(setq parbr (vla-get-textstring enname1))
	   		(setq listaprint01(list parbr))
	  		(print listaprint01  file_handle1)
			))
	    ))

	     (cond ((= temp nil)
			(setq ispis "No parcel number")
	  		 (setq file_handle1 (open "D:\\Data1.txt" "a"))
	  		 (setq listaprint001 ispis)
	   		 (print listaprint001  file_handle1)
			)
			)
0 Likes
Accepted solutions (1)
1,218 Views
7 Replies
Replies (7)
Message 2 of 8

ВeekeeCZ
Consultant
Consultant

I would say "Why not?" But this would be definitely more readable.

 

(if (setq temp (ssget "_WP" (_pac (ssname ss (setq i (1- i))))))
  (progn ; then
    ...
    )

  (progn ; else
    ...
    )
)

 

But whole code... hmm... would you explain in words what are you trying to achieve?

 

btw 

 

(if (/= temp nil) ... )
; is the same as
(if temp ... )

(if (= temp nil) ... )
; is the same as
(if (not temp) ... )

 

0 Likes
Message 3 of 8

svucic
Advocate
Advocate

No problem. The code is a modification of a code I found online. It is ment to select all obkects inside a closed polyline. I changed the code a litle bit meanwhile.

 

(defun c:SWC (/ _pac add ss i temp i2)
  ;; Select Within Curve
  ;; Alan J. Thompson, 03.31.11

  (vl-load-com)

  (defun _pac (e / l v d lst)
    (setq d (- (setq v (/ (setq l (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))) 100.))))
    (while (< (setq d (+ d v)) l)
      (setq lst (cons (trans (vlax-curve-getPointAtDist e d) 0 1) lst))
    )
  )

  
(if (setq add (ssadd) ss (ssadd a))
    (progn (repeat (setq i (sslength ss))
             (if (setq temp (ssget "_WP" (_pac (ssname ss (setq i (1- i))))))
               (repeat (setq i2 (sslength temp)) (ssadd (ssname temp (setq i2 (1- i2))) add))
             )
           )))

            (cond ((/= temp nil)               	
			(setq aadd add)
	   		(setq countobj (sslength aadd))

	          (cond ((= countobj 1)
               		(setq i2 (sslength temp)) 
			(ssadd (ssname temp (setq i2 (1- i2))) add)
			(setq aadd add)
	   		(setq countobj (sslength aadd))
			(sssetfirst nil add)
           		(ssget "_I")
			))

		  (cond ((> countobj 1)	
			(setq file_handle1 (open "D:\\Data1.txt" "a"))
	   		(setq enname (ssname aadd 0)) 
	   		(setq enname1 (vlax-ename->vla-object enname))
	   		(setq parbr (vla-get-textstring enname1))
	   		(setq listaprint01(list parbr))
	  		(print listaprint01  file_handle1)
			))
	    ))

	     (cond ((= temp nil)
			(setq ispis "No parcel nnumber")
	  		 (setq file_handle1 (open "D:\\Data1.txt" "a"))
	  		 (setq listaprint001 ispis)
	   		 (print listaprint001  file_handle1)
			)
			)

  (princ)
)
(setq add (ssadd) ss (ssadd a))

This creates a emty selection set 'add' and selection set 'ss' containing 'a' which is a entity name of the closed polyline.

 

(if (setq add (ssadd) ss (ssadd a))
    (progn (repeat (setq i (sslength ss))
             (if (setq temp (ssget "_WP" (_pac (ssname ss (setq i (1- i))))))
               (repeat (setq i2 (sslength temp)) (ssadd (ssname temp (setq i2 (1- i2))) add))
             )
           )))

So, this part selects all objects inside the polyline. When no objects are present it returns 'temp' as nil.

 

What I'm trying to do with the cond functions is :

 

-If there are no objects inside the polyline then do this

(cond ((= temp nil)
			(setq ispis "No parcel nnumber")
	  		 (setq file_handle1 (open "D:\\Data1.txt" "a"))
	  		 (setq listaprint001 ispis)
	   		 (print listaprint001  file_handle1)
			)
			)

-If there are objects then count hov many. 

(cond ((/= temp nil)               	
			(setq aadd add)
	   		(setq countobj (sslength aadd))

 

If only one then do this 

(cond ((= countobj 1)
               		(setq i2 (sslength temp)) 
			(ssadd (ssname temp (setq i2 (1- i2))) add)
			(setq aadd add)
	   		(setq countobj (sslength aadd))
			(sssetfirst nil add)
           		(ssget "_I")
			))

If more than one than do this 

(cond ((> countobj 1)	
			(setq file_handle1 (open "D:\\Data1.txt" "a"))
	   		(setq enname (ssname aadd 0)) 
	   		(setq enname1 (vlax-ename->vla-object enname))
	   		(setq parbr (vla-get-textstring enname1))
	   		(setq listaprint01(list parbr))
	  		(print listaprint01  file_handle1)
			))

 

 

 

 

0 Likes
Message 4 of 8

ВeekeeCZ
Consultant
Consultant

 

Well, try this... (untested)

 

(vl-load-com)

(defun c:SWC (/ _pac add ss i add countobj file)
   
  (defun _pac (e / l v d lst)
    (setq d (- (setq v (/ (setq l (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))) 100.))))
    (while (< (setq d (+ d v)) l)
      (setq lst (cons (trans (vlax-curve-getPointAtDist e d) 0 1) lst))))
  
  (princ "\nSelect closed curves to select object(s) within: ")
  (if (setq ss  (ssget "_+.:E:S" '((0 . "LWPOLYLINE") (70 . 1))))
    (if (setq add (ssget "_WP" (_pac (ssname ss 0))))
      (if (= 1 (setq i (sslength add)))
	(progn
	  (sssetfirst nil add)
	  (ssget "_I"))
	(if (setq file (open "D:\\Data1.txt" "a"))
	  (progn
	    (repeat i
	      (print (list (vla-get-textstring (vlax-ename->vla-object (ssname add (setq i (1- i)))))) file))
	    (close file))))
      (if (setq file (open "D:\\Data1.txt" "a"))
	(progn
	  (print "No parcel number" file)
	  (close file)))))
  (princ)
)
Message 5 of 8

svucic
Advocate
Advocate

I had t modify it a little bit. Now it works when there ar multiple objects inside but crashes when there are no objects. The error is "error: bad argument type: lselsetp nil" 

 

I guess it's because it's expecting a "add" to be a selection set and nil is returned instead.

 

 

Had to remove the 'add' from (defun c:SWC (/ _pac ss i countobj file). I also changed 

 

(setq ss  (ssget "_+.:E:S" '((0 . "LWPOLYLINE") (70 . 1))))

to

 

(setq ss  (ssadd a))

 

 

 

(defun c:SWC (/ _pac ss i countobj file)
   
  (defun _pac (e / l v d lst)
    (setq d (- (setq v (/ (setq l (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))) 100.))))
    (while (< (setq d (+ d v)) l)
      (setq lst (cons (trans (vlax-curve-getPointAtDist e d) 0 1) lst))))
  
  (princ "\nSelect closed curves to select object(s) within: ")
  ;(setq add (ssadd))
  (if (setq ss  (ssadd a))
    (if (setq add (ssget "_WP" (_pac (ssname ss 0))))
      (if (= 1 (setq i (sslength add)))
	(progn
	  (sssetfirst nil add)
	  (ssget "_I"))
	(if (setq file (open "D:\\Data1.txt" "a"))
	  
	      (print (list (vla-get-textstring (vlax-ename->vla-object (ssname add 0)))) file)
	    (close file)))
      (if (setq file (open "D:\\Data1.txt" "a"))
	(progn
	  (print "No parcel number" file)
	  (close file)))))
  (princ)
)
0 Likes
Message 6 of 8

ВeekeeCZ
Consultant
Consultant
Accepted solution

It's because you have wrong parenthesis when you're working with file.. (trying to open file which wasn't closed before)

 

;wrong

(if (setq file (open "D:\\Data1.txt" "a"))
	  (print (list (vla-get-textstring (vlax-ename->vla-object (ssname add 0)))) file)
	  (close file))

; correct

(if (setq file (open "D:\\Data1.txt" "a"))
	  (progn  ; do both 
	    (print (list (vla-get-textstring (vlax-ename->vla-object (ssname add 0)))) file)
	    (close file)))

 

Little formatted code for making the structure more obvious.

Spoiler
(defun c:SWC (/ _pac ss i countobj file)
   
  (defun _pac (e / l v d lst)
    (setq d (- (setq v (/ (setq l (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))) 100.))))
    (while (< (setq d (+ d v)) l)
      (setq lst (cons (trans (vlax-curve-getPointAtDist e d) 0 1) lst))))
  
  (princ "\nSelect closed curves to select object(s) within: ")
  ;(setq add (ssadd))
  (if (setq ss  (ssadd a))
    (if (setq add (ssget "_WP" (_pac (ssname ss 0))))
      (if (= 1 (setq i (sslength add)))
	(progn
	  ;; do stuf if ONE ENT is selected
	  (sssetfirst nil add)
	  (ssget "_I")


	  

	  ;; END OF do stuf if ONE ENT is selected
	  )
	(progn
	  ;; do stuf if MORE THAN ONE ent is selected
	  (if (setq file (open "D:\\Data1.txt" "a"))
	    (progn
	      (print (list (vla-get-textstring (vlax-ename->vla-object (ssname add 0)))) file) 
	      (close file)))


	  

	  ;; END OF do stuf if MORE THAN ONE ent is selected
	  ))
      (progn
	;; do stuf if NO ent is selected
	(if (setq file (open "D:\\Data1.txt" "a"))
	  (progn
	    (print "No parcel number" file)
	    (close file)))




	;; END OF do stuf if NO ent is selected
	)))
  (princ)
)

 

Message 7 of 8

Kent1Cooper
Consultant
Consultant

@ВeekeeCZ wrote:

 

.... 

....
  (if (setq ss  (ssget "_+.:E:S" '((0 . "LWPOLYLINE") (70 . 1))))
....

That can lead you astray.  If a Polyline is closed and linetype generation is enabled for it, the 70-code entry will be (70 . 129), and that filter won't "see" it.

 

To find closed Polylines both with and without linetype generation enabled:


(ssget [selection modes, if any] '((0 . "LWPOLYLINE") (-4 . "&") (70 . 1)))


(70 . bits):  1 = closed, 128 = linetype generation enabled;
(-4 . "&") is sort of like (logand) -- sees any value with 70 that includes the listed bit [here, 1].

Kent Cooper, AIA
Message 8 of 8

svucic
Advocate
Advocate

I'm really grateful and appreciate all the effort. This community is a great place to learn. Everyone is friendly and ready to help. Thank you guys!

0 Likes