Select If
Function Syntax | (LM:SelectIf <msg> [pred] <func> [keyw]) |
Current Version | 1.0 |
Arguments | ||
---|---|---|
Symbol | Type | Description |
msg | String | Selection prompt String |
pred | Function | [Optional] Predicate function taking selection list argument |
func | Function | Selection function: entsel, nentsel or enentselp |
keyw | List | [Optional] Initget argument list |
Returns | ||
Type | Description | |
List / String | Selection List, Keyword, or nil |
Program Description
This function continously prompts the user for a selection until either a predicate function is validated or a valid keyword is supplied.
The predicate function should require a single argument: the list returned by the selection function argument (either entsel, nentsel, or nentselp). Upon validation of the predicate function, the entity selection list is returned.
A keyword will be returned if the 'keyw' argument is supplied and the user enters a keyword appearing in the initget argument list.
;;---------------------=={ Select if }==----------------------;; ;; ;; ;; Provides continuous selection prompts until either a ;; ;; predicate function is validated or a keyword is supplied. ;; ;;------------------------------------------------------------;; ;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;; ;;------------------------------------------------------------;; ;; Arguments: ;; ;; msg - prompt string ;; ;; pred - optional predicate function [selection list arg] ;; ;; func - selection function to invoke ;; ;; keyw - optional initget argument list ;; ;;------------------------------------------------------------;; ;; Returns: Entity selection list, keyword, or nil ;; ;;------------------------------------------------------------;; (defun LM:SelectIf ( msg pred func keyw / sel ) (setq pred (eval pred)) (while (progn (setvar 'ERRNO 0) (if keyw (apply 'initget keyw)) (setq sel (func msg)) (cond ( (= 7 (getvar 'ERRNO)) (princ "\nMissed, Try again.") ) ( (eq 'STR (type sel)) nil ) ( (vl-consp sel) (if (and pred (not (pred sel))) (princ "\nInvalid Object Selected.") ) ) ) ) ) sel )
Example Function Calls
Example 1
This first example continously prompts the user until a Line entity is selected. Following a valid selection, the handle of the selected line is printed to the command line.
(defun c:test1 ( / entity ) (if (setq entity (car (LM:SelectIf "\nSelect a Line: " (lambda ( x ) (eq "LINE" (cdr (assoc 0 (entget (car x)))))) entsel nil ) ) ) (princ (strcat "\nHandle of Selected Line: " (cdr (assoc 5 (entget entity))))) ) (princ) )
Example 2
In this second example, the user may either select a Circle whose centre point will be printed to the command line, or choose to pick an arbitrary point to be printed by specifying the 'Point' keyword at the prompt.
(defun c:test2 ( / select pt ) (if (and (setq select (LM:SelectIf "\nSelect Circle [Point]: " (lambda ( x ) (eq "CIRCLE" (cdr (assoc 0 (entget (car x)))))) entsel '("Point") ) ) (or (and (listp select) (setq pt (cdr (assoc 10 (entget (car select))))) ) (setq pt (getpoint "\nSpecify Point: ")) ) ) (princ (apply 'strcat (mapcar 'strcat '("\nPoint: " "," ",") (mapcar 'rtos pt)))) ) (princ) )