;;; LayerObjectSelect
;;; Select all objects on selected layers, in current layout
;;; Required Subroutines: AT:ListSelect, AT:TabFilter
;;; Alan J. Thompson, 11.05.09
(defun AT:TabFilter (/)
;; Tab filter for ssget selection filtering
;; Alan J. Thompson, 06.05.09
(if (eq 1 (getvar 'cvport))
(cons 410 (getvar 'ctab))
(cons 410 "Model")
)
)
;list select dialog
;create a temp DCL multi-select list dialog from provided list
;value is returned in list form, DCL file is deleted when finished
;example: (setq the_list (AT:listselect "This is my list title" "Select items to make a list" "25" "30" "true" (list "object 1" "object 2" "object 3"))
;if mytitle is longer than defined width, the width will be ignored and it will fit to title string
;if mylabel is longer than defined width, mylabel will be truncated
;myheight and mywidth must be strings, not numbers
;mymultiselect must either be "true" or "false" (true for multi, false for single)
;created by: alan thompson, 9.23.08
;some coding borrowed from http://www.jefferypsanders.com (thanks for the DCL examples)
(defun AT:ListSelect ( mytitle ;title for dialog box
mylabel ;label right above list box
myheight ;height of dialog box !!*MUST BE STRING*!!
mywidth ;width of dialog box !!*MUST BE STRING*!!
mymultiselect ;"true" for multiselect, "false" for single select
mylist ;list to display in list box
/ retlist readlist count item savevars fn fo valuestr dcl_id )
(defun saveVars(/ readlist count item)
(setq retList(list))
(setq readlist(get_tile "mylist"))
(setq count 1)
(while (setq item (read readlist))
(setq retlist(append retList (list (nth item myList))))
(while
(and
(/= " " (substr readlist count 1))
(/= "" (substr readlist count 1))
)
(setq count (1+ count))
)
(setq readlist (substr readlist count))
)
);defun
(setq fn (vl-filename-mktemp "" "" ".dcl"))
(setq fo (open fn "w"))
(setq valuestr (strcat "value = \"" mytitle "\";"))
(write-line (strcat "list_select : dialog {
label = \"" mytitle "\";") fo)
(write-line
(strcat " : column {
: row {
: boxed_column {
: list_box {
label =\"" mylabel "\";
key = \"mylist\";
allow_accept = true;
height = " myheight ";
width = " mywidth ";
multiple_select = " mymultiselect ";
fixed_width_font = false;
value = \"0\";
}
}
}
: row {
: boxed_row {
: button {
key = \"accept\";
label = \" Okay \";
is_default = true;
}
: button {
key = \"cancel\";
label = \" Cancel \";
is_default = false;
is_cancel = true;
}
}
}
}
}") fo)
(close fo)
(setq dcl_id (load_dialog fn))
(new_dialog "list_select" dcl_id)
(start_list "mylist" 3)
(mapcar 'add_list myList)
(end_list)
(action_tile "cancel" "(setq ddiag 1)(done_dialog)")
(action_tile "accept" "(setq ddiag 2)(saveVars)(done_dialog)")
(start_dialog)
(if (= ddiag 1)
(setq retlist nil)
)
(unload_dialog dcl_id)
(vl-file-delete fn)
retlist
);defun
(defun c:LOS (/ _Layers #List #Filter #SS)
(vl-load-com)
(setq _Layers (lambda (/ d n l)
(while (setq d (tblnext "layer" (null d)))
(and (not (wcmatch (setq n (cdr (assoc 2 d))) "*|*"))
(setq l (cons n l))
) ;_ and
) ;_ while
(vl-sort l '<)
) ;_ lambda
) ;_ setq
(cond
((if dos_multilist
(setq #List (dos_multilist "Select objects on Layers" "Select layers:" (_Layers)))
(setq #List (AT:ListSelect
"Select objects on Layers"
"Select layers:"
"30"
"15"
"true"
(_Layers)
) ;_ AT:ListSelect
) ;_ setq
) ;_ if
(setq #Filter "")
(foreach x #List (setq #Filter (strcat #Filter x ",")))
(and (setq #SS (ssget (list (AT:TabFilter) (cons 8 #Filter))))
(sssetfirst nil #SS)
(print #List)
) ;_ and
)
) ;_ cond
(princ)
) ;_ defun
; ----- Error around expression -----
'ADD_LIST
;
; error : bad argument type <#<<FUNCTION> #x33 @fffc519f6>> ; expected <LIST> at [mapcar]
Ronjonp,Glad to help :)
Works perfectly now!
It's surprising how a slight change in how a routine operates can make such a difference!
Thanks very much for your knowledge and efforts.
Much appreciated.
Using Expresstools, the Layer Isolate - "Layiso" is what works for me.Layiso is different than Alan's routine which lets the user select objects based on a layer filter rather than turn off all layers other than the ones selected.
;;;;;;;;;;;;;;;;;;;;;;;;; Clear Selection Set Groups Function ;;;;;;;;;;;;;;;;;;;;;;;
(defun ARCH:CLEARGROUPS ()
(setvar "cmdecho" 0)
(setq sela nil
selb nil
selc nil)
(princ "\n* All Selection Set Groups have been Cleared *")
(ARCH:ChangeBitmap
"ARCH"
"Selection Set"
"Selection Set A"
"ARCH_SELECTA")
(ARCH:ChangeBitmap
"ARCH"
"Selection Set"
"Selection Set B"
"ARCH_SELECTB")
(ARCH:ChangeBitmap
"ARCH"
"Selection Set"
"Selection Set C"
"ARCH_SELECTC")
(princ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Change Bitmap Button Function ;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;from acadx.com
(defun ARCH:ChangeBitmap (mnuGroup tbrName btnName bitmap)
(vl-load-com)
(vla-setbitmaps
(vla-item
(vla-item
(vla-get-toolbars
(vla-item (vla-get-menugroups (vlax-get-acad-object)) mnuGroup))
tbrName)
btnName)
bitmap
bitmap)
(princ))
;|
Purpose
Changes the button top for the specified toolbar button
Arguments
The name of the menu group, the name of the toolbar, the name of the toolbar button and the bitmap to use
Example
(ax:ChangeBitmap "acad" "dimension" "linear dimension" "arch.bmp")
Notes
If the bitmap is not in the AutoCAD search path, you must specify the full path to file
(ARCH:ChangeBitmap "acad" "dimension" "linear dimension" "arch.bmp")
(ARCH:ChangeBitmap "ARCH" "Arch Program©" "SYMS" (strcat ARCH#IMAF "ARCH_SYMSX.bmp"))
|;
Try this:Code: [Select];;; LayerObjectSelect
;;; Select all objects on selected layers, in current layout
;;; Required Subroutines: AT:ListSelect, AT:TabFilter
;;; Alan J. Thompson, 11.05.09
(defun at:tabfilter (/)
;; Tab filter for ssget selection filtering
;; Alan J. Thompson, 06.05.09
(if (eq 1 (getvar 'cvport))
(cons 410 (getvar 'ctab))
(cons 410 "Model")
)
) ;list select dialog
;create a temp DCL multi-select list dialog from provided list
;value is returned in list form, DCL file is deleted when finished
;example: (setq the_list (AT:listselect "This is my list title" "Select items to make a list" "25" "30" "true" (list "object 1" "object 2" "object 3"))
;if mytitle is longer than defined width, the width will be ignored and it will fit to title string
;if mylabel is longer than defined width, mylabel will be truncated
;myheight and mywidth must be strings, not numbers
;mymultiselect must either be "true" or "false" (true for multi, false for single)
;created by: alan thompson, 9.23.08
;some coding borrowed from http://www.jefferypsanders.com (thanks for the DCL examples)
(defun at:listselect (mytitle ;title for dialog box
mylabel ;label right above list box
myheight ;height of dialog box !!*MUST BE STRING*!!
mywidth ;width of dialog box !!*MUST BE STRING*!!
mymultiselect ;"true" for multiselect, "false" for single select
mylist ;list to display in list box
/ retlist readlist count item savevars fn
fo valuestr dcl_id
)
(defun savevars (/ readlist count item)
(setq retlist (list))
(setq readlist (get_tile "mylist"))
(setq count 1)
(while (setq item (read readlist))
(setq retlist (append retlist (list (nth item mylist))))
(while (and (/= " " (substr readlist count 1)) (/= "" (substr readlist count 1)))
(setq count (1+ count))
)
(setq readlist (substr readlist count))
)
) ;defun
(setq fn (vl-filename-mktemp "" "" ".dcl"))
(setq fo (open fn "w"))
(setq valuestr (strcat "value = \"" mytitle "\";"))
(write-line (strcat "list_select : dialog {
label = \"" mytitle "\";") fo)
(write-line
(strcat
" : column {
: row {
: boxed_column {
: list_box {
label =\"" mylabel
"\";
key = \"mylist\";
allow_accept = true;
height = " myheight ";
width = " mywidth ";
multiple_select = " mymultiselect
";
fixed_width_font = false;
value = \"0\";
}
}
}
: row {
: boxed_row {
: button {
key = \"accept\";
label = \" Okay \";
is_default = true;
}
: button {
key = \"cancel\";
label = \" Cancel \";
is_default = false;
is_cancel = true;
}
}
}
}
}") fo
)
(close fo)
(setq dcl_id (load_dialog fn))
(new_dialog "list_select" dcl_id)
(start_list "mylist" 3)
(mapcar 'add_list mylist)
(end_list)
(action_tile "cancel" "(setq ddiag 1)(done_dialog)")
(action_tile "accept" "(setq ddiag 2)(saveVars)(done_dialog)")
(start_dialog)
(if (= ddiag 1)
(setq retlist nil)
)
(unload_dialog dcl_id)
(vl-file-delete fn)
retlist
) ;defun
(defun c:los (/ _layers #list #filter #ss l s)
(vl-load-com)
;; RJP added layer filter for items selected before running code
(cond ((setq s (cadr (ssgetfirst)))
(foreach x (setq s (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
(and (not (member (setq l (cdr (assoc 8 (entget x)))) _layers))
(setq _layers (cons l _layers))
)
)
)
((while (setq d (tblnext "layer" (null d)))
(and (not (wcmatch (setq n (cdr (assoc 2 d))) "*|*")) (setq _layers (cons n _layers))) ;_ and
) ;_ while
) ;_ setq
)
(setq _layers (vl-sort _layers '<))
(cond ((if dos_multilist
(setq #list (dos_multilist "Select objects on Layers" "Select layers:" _layers))
(setq #list
(at:listselect "Select objects on Layers" "Select layers:" "30" "15" "true" _layers) ;_ AT:ListSelect
) ;_ setq
) ;_ if
(setq #filter "")
(foreach x #list (setq #filter (strcat #filter x ",")))
(and (setq #ss (ssget (list (at:tabfilter) (cons 8 #filter))))
(sssetfirst nil #ss)
(print #list)
) ;_ and
)
) ;_ cond
(princ)
) ;_ defun
(not (wcmatch (setq n (cdr (assoc 2 d))) "*|*"))
Excludes xref-dependent layers :wink: