Jump to content

Ignore empty DCL input boxes when performing extrude multiple objects.


dimka

Recommended Posts

I have multiple objects that are closed polylines and need to enter the extrude value through the DCL interface. Some of the input boxes are left empty/blank, meaning some of object I don’t want to extrude.
When I want to extrude, the script will stop when it encounters a blank or 0 value. How can I write a script to skip the blank input box?

Due to limited skill, I am very basic lisp experience and DCL to complete this lisp. I hope everyone can help, thank you

 

this is the lisp

(defun c:3dext1 ()

(setq AR "arlayer")	;AR	
(setq CO "colayer") 	;CO
(setq FR "frlayer")	;FR 
    (dcl_3dextr)
    (princ)
)

(defun dcl_3dextr ( )
    (setq dcl_id_PARA (load_dialog "3Dextr.dcl"))
  (if (not (new_dialog "dextr" dcl_id_PARA))
  (exit)
  )

    (set_tile "arval" "")
    (set_tile "coval" "")
    (set_tile "frval" "")	

    (action_tile "accept-ht" "(get_1ht) (done_dialog 1)")
	(action_tile "cancel" "(done_dialog)")

    (setq dd (start_dialog))
    (cond 
	((= dd 1) (main-extru))
    )

	  (unload_dialog dcl_id_PARA)	
)

(defun get_1ht ()
    (setq arh (atof (get_tile "arval")))
    (setq coh (atof (get_tile "coval")))
    (setq frh (atof (get_tile "frval")))
)

(defun main-extru (/)
 	(command "_.view" "_swiso" )		
	(command "_.zoom" "_extents")	

       (command "_.LAYER" "_T" AR "_S" AR "_F" "*" "")				
       (command "_.extrude" "all" "" arh )			
       (command "_.LAYER" "_T" CO "_S" CO "_F" "*" "")	
       (command "_.extrude" "all" "" coh )											
		(command "_.LAYER" "_T" FR "_S" FR "_F" "*" "")
       (command "_.extrude" "all" "" frh )	

 (princ)
) ;_ defun

DCL here

 dextr : dialog { label = "extrude by val" ;
 
		:row {
		: edit_box {key = "arval"; label = "a"; edit_width = 3; value = "000";}		
		: edit_box {key = "coval"; label = "c"; edit_width = 3; value = "000";}		
		: edit_box {key = "frval"; label = "f"; edit_width = 3; value = "000";}	

	: button {
	label = "OK";
	key = "accept-ht";
	width = 12;
	fixed_width = true;
	mnemonic = "O";
	}
 
	: button {
	label = "Cancel";
	key = "cancel";
	width = 12;
	fixed_width = true;
	mnemonic = "C";
	is_cancel = true;
  	}

	
				  }
}

 

 

Link to comment
Share on other sites

You'll need to use a conditional statement, such as an if or cond statement to test whether the supplied extrusion height is present and numerical prior to performing the extrude operation. I would suggest using the distof function in place of atof to perform the conversion from a string to a float, as this function will return nil if the supplied string is not numerical.

 

You can then implement a test such as the following:

(if arh
    (progn
        (command "_.-layer" ...)
        (command "_.extrude" ...)
        ...
    )
)
(if coh
    (progn
        (command "_.-layer" ...)
        (command "_.extrude" ...)
        ...
    )
)
...

 

Edited by Lee Mac
Link to comment
Share on other sites

  • 1 month later...
On 2/17/2021 at 12:20 AM, Lee Mac said:

(if arh (progn (command "_.-layer" ...) (command "_.extrude" ...) ... ) )

(cond
	((< arh "0")	nil )	
	((> arh "0")	(command "_.extrude" "all" "" arh ))	)

   ...  
	..

Thank you for your advice. Finally, I used cond to avoid this problem.

Link to comment
Share on other sites

13 hours ago, dimka said:

(cond
	((< arh "0")	nil )	
	((> arh "0")	(command "_.extrude" "all" "" arh ))	)

   ...  
	..

Thank you for your advice. Finally, I used cond to avoid this problem.

 

You're welcome!

 

Since you're only taking action if 'arh' is greater than zero in string format*, the above could be written as:

(if (< "0" arh) (command "_.extrude" "_all" "" arh))

*Consider either converting the value to an integer or using the not equal operator '/=' since, whilst it is possible to compare strings in this manner, the strings will be compared on a character-by-character basis comparing the ASCII code for each character, which may not yield an expected result - e.g. (< "10" "2") would return True.

Edited by Lee Mac
  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...