rcb007 Posted November 18 Posted November 18 Would it be possible to have a DCL that does not have an OK and Cancel Button? I took it out on the example below, I get a dialog has neither an OK nor cancel button. I am curious if I could Use the X at the top left corner to cancel out the dcl. dbda_dialog : dialog { label = "test"; : row { : column { : text { label = "Left Value:"; } : edit_box { key = "left_value"; edit_width = 10; } } : column { : text { label = "Right Value:"; } : edit_box { key = "right_value"; edit_width = 10; } } } : row { : spacer {} : button { label = "Apply Left"; key = "apply_left"; } : button { label = "Apply Right"; key = "apply_right"; } } } Quote
rlx Posted November 18 Posted November 18 short answer is no , red x is red flag you can have invisible button , I made two : one for space and one for q thing is , they probably wont work as long as focus is on one of the edit boxes. So you first click outside them if you entered something there. For the buttons it's easier , after button has done its thing , I put focus back on invisible space button (wow , is it just me or sounded that alien?) here is something to play with.. (oh that just sounded dirty , awel , a dirty mind is a joy 4ever) (defun c:test (/ dcl des left right) (cond ((not (setq dcl (vl-filename-mktemp nil nil ".dcl") des (open dcl "w"))) (princ "\nUnable to open DCL for writing.")) ((progn (foreach str (dcl-lst) (write-line str des)) (setq des (close des) dch (load_dialog dcl))(<= dch 0))(princ "\nUnable to load DCL file.")) ((not (new_dialog "dbda" dch)) (princ "\nUnable to display 'dbda' dialog.")) (t (set_tile "left_value" "Left")(action_tile "left_value" "(setq left $value)(mode_tile \"ib_ok\" 2)") (set_tile "right_value" "Right")(action_tile "right_value" "(setq right $value)(mode_tile \"ib_ok\" 2)") (action_tile "apply_left" "(alert \"Apply Left\")(mode_tile \"ib_ok\" 2)") (action_tile "apply_right" "(alert \"Apply Right\")(mode_tile \"ib_ok\" 2)") (action_tile "ib_ok" "(done_dialog)") (action_tile "ib_q" "(done_dialog)") (mode_tile "ib_ok" 2) (start_dialog)) ) (princ) ) (defun dcl-lst () (list "dbda :dialog {label=\"test\";" " : row {" " : column {: text {label=\"Left Value:\";}: edit_box {key=\"left_value\";edit_width=10;}}" " : column {: text {label=\"Right Value:\";}: edit_box {key=\"right_value\"; edit_width=10;}}" " : row {spacer;:button {label=\"Apply Left\";key=\"apply_left\";}:button {label=\"Apply Right\";key=\"apply_right\";}}" " }" " :image_button {fixed_height=true;height=0.001;color=dialog_background;is_default=true;key=\"ib_ok\";}" " :image_button {color=dialog_background;width=0.1;height=0.1;fixed_height=true;key=\"ib_q\";label=\"&q\";}" "}" ) ) Quote
Steven P Posted November 18 Posted November 18 Likewise, DCL needs to know it can close 'properly' - it wants a button. As above there are ways to hide buttons. Can I ask what you are trying to do? Quote
rcb007 Posted November 18 Author Posted November 18 The Left and Right Buttons are for executing the commands I want, but I do not want the user to select the OK button. Maybe its not a big deal to show the cancel button either. Quote
rlx Posted November 18 Posted November 18 (edited) you can let your buttons do a done_dialog and do their thing , but every dialog needs an exit strategy so assign is_default=true to those buttons , like I did for the invisible buttons only problem with this is how do you exit / cancel without doing anything. for that create a single button with is_default=true and call it 'Exit' or 'Never Mind' Edited November 18 by rlx Quote
Lee Mac Posted November 18 Posted November 18 One tile should have the is_cancel attribute for the 'x' button to remain operational; note that the same tile can have both is_default & is_cancel. 1 1 Quote
Steven P Posted November 19 Posted November 19 So if you press left or right, will that cancel the DCL? In which case have them as OK / Cancel just with a different name... but as RLX... an exit or never mind option too? 1 Quote
Lee Mac Posted November 19 Posted November 19 Note that the tile can be invisible, similar to the Help button in my TabSort program. 1 Quote
Steven P Posted November 19 Posted November 19 Using a very small height and width for the button? 1 Quote
Lee Mac Posted November 19 Posted November 19 (edited) 3 hours ago, Steven P said: Using a very small height and width for the button? Exactly - and using an image_button in place of a regular button. Edited November 19 by Lee Mac 2 Quote
Steven P Posted November 19 Posted November 19 Thanks Lee, (many years later and slowly working out how your mind works with these things) 1 Quote
rcb007 Posted November 19 Author Posted November 19 Thank you everyone for your ideas. With buttons, I have a button that I want to be able to select an object (ssget). Currently, it activates the selection but i cannot seem to get the dcl to unload so It locks up CAD. Any ideas on that possibly? (defun doButton(a) (cond ;; Button 1: Select objects and process them ((= a 1) (if (setq ss (ssget (list (cons 0 "INSERT")))) ; Check if objects are selected (progn ;; Process the selection (replace this with actual logic) (alert (strcat "Button 1 was pressed! Selected " (itoa (sslength ss)) " object(s).")) ) (alert "No objects selected for Button 1.") ; Handle no selection ) ) ;; Button 2: Show alert ((= a 2) (alert "Button 2 was pressed!")) ;; Button 3: Show alert ((= a 3) (alert "Button 3 was pressed!")) ;; Default case: Handle unknown button values (t (alert "Unknown button action!")) ) ) (defun C:SAMPLE1() ;; Load the DCL file (setq dcl_id (load_dialog "SAMPLE1.dcl")) ;; Load the dialog definition if it is not already loaded (if (not (new_dialog "SAMPLE1" dcl_id)) (exit)) ;; Map buttons to their respective actions (action_tile "but1" "(doButton 1)") (action_tile "but2" "(doButton 2)") (action_tile "but3" "(doButton 3)") (action_tile "cancel" "(done_dialog)") ;; Display the dialog box (setq result (start_dialog)) ;; Unload the dialog box (unload_dialog dcl_id) ;; Suppress the last echo for a clean exit (princ) ) SAMPLE1 : dialog { label = "Sample Dialog Box Routine - Part 1"; : column { : boxed_column { : button { key = "but1"; label = "Button 1"; is_default = false; } : button { key = "but2"; label = "Button 2"; is_default = false; } : button { key = "but3"; label = "Button 3"; is_default = false; } } : boxed_row { : button { key = "cancel"; label = "Close"; is_default = true; is_cancel = true; } } } } Quote
pkenewell Posted November 19 Posted November 19 (edited) You have to close the dialog in the (action_tile) statement before using (ssget). This for example can close the dialog then run your functions after the dialog closes: (action_tile "but1" "(done_dialog)(doButton 1)") (action_tile "but2" "(done_dialog)(doButton 2)") (action_tile "but3" "(done_dialog)(doButton 3)") You can also evaluate a value for (done_dialog) by using the return argument (done_dialog [int]). For example: (defun C:SAMPLE1() ;; Load the DCL file (setq dcl_id (load_dialog "SAMPLE1.dcl")) ;; Load the dialog definition if it is not already loaded (if (not (new_dialog "SAMPLE1" dcl_id)) (exit)) ;; Map buttons to their respective actions (action_tile "but1" "(done_dialog 1)") (action_tile "but2" "(done_dialog 2)") (action_tile "but3" "(done_dialog 3)") (action_tile "cancel" "(done_dialog 0)") ;; Display the dialog box (setq result (start_dialog)) ;; Unload the dialog box (unload_dialog dcl_id) (cond ((= result 1)(doButton 1)) ((= result 2)(doButton 2)) ((= result 3)(doButton 3)) ) ;; Suppress the last echo for a clean exit (princ) ) Edited November 19 by pkenewell 1 Quote
rcb007 Posted November 19 Author Posted November 19 That was it. I did not to think of the process like that. Thank you for the clarification! Quote
Recommended Posts
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.