;| RandomLayer.lsp assigns selected objects to layers randomly selected from a list of user-specified layers. Requires DOSLib, free from www.mcneel.com If DOSLib is in search path but not loaded, routine will load it, run, and unload it. If DOSLib is neither in search path nor loaded, routine will quit. by Bill Gilliss bill dot gilliss at aya dot yale dot edu version 1.0 01/20/2010 initial release version 1.1 01/21/1020 auto-load and unload DOSLib error trapping recognizes 32-and 64-bit AutoCAD compatible w/ international versions Many thanks to Owen Wengerd for (isX64). We do but stand on the shoulders of giants. Comments and suggestions always welome. |; (defun c:randomLayer ( / ss layers layernum n item ed new old a DOSLibname loadedAtStartup loadedAtRuntime myerror temperr *error*) (defun myerror (errmsg) (if (not loadedAtStartup) (progn (vl-cmdf "._arx" "_unload" DOSLibname) (princ "Terminated by user input.") (setq *error* temperr) ) ) ) (setq temperr *error*) (setq *error* myerror) (vl-load-com) ;; determine whether appropriate version of DOSLib is already loaded. ;; if not, try to load it. (setq CADver (substr (getvar "acadver") 1 2)) ;; i.e., "17", "18", etc. (setq arxlist (arx)) (if (isX64) (setq DOSLibname (strcat "doslib" CADver "x64.arx")) (setq DOSLibname (strcat "doslib" CADver ".arx")) ) (foreach a arxlist (if (equal a DOSLibname) (setq loadedAtStartup T))) (if (not loadedAtStartup) (vl-cmdf "._arx" "_load" (findfile DOSLibname)) ) ;; verify that load was successful. ;; if not, quit. (setq arxlist (arx)) (foreach a arxlist (if (equal a DOSLibname) (setq loadedAtRuntime T) )) (if (not loadedAtRuntime) (progn (prompt "Sorry - DOSLib is not loaded and cannot be found in the AutoCAD search path.") (vlr-beep-reaction) (quit) ) ) ;; select objects to be randomized (prompt "Select objects to be randomized: ") (setq ss (ssget)) ;; select which layers to use (setq layers (dos_layerlistbox "Select layers to use:" "(Off and frozen layers not available)" 394) ;;ignore off & frozen layers, enable multiple selection ) ;; assign each object to a randomly chosen layer from list ;; note: dos_rand returns an integer between 1 and 32768 (setq layernum (length layers)) (setq n 0) (while (< n (sslength ss)) (setq item (fix (* (/ (dos_random) 32768.0) layernum)) ed (entget (ssname ss n)) old (assoc 8 ed) new (cons 8 (nth item layers)) ed (subst new old ed) ) (entmod ed) (setq n (1+ n)) ) ;;clean up (if (not loadedAtStartup) (vl-cmdf "._arx" "_unload" DOSLibname) ) (princ) ) ; ========= subroutines ========== (defun ISX64 (/ proc_arch) (and (setq proc_arch (getenv "PROCESSOR_ARCHITECTURE")) (< 1 (strlen proc_arch)) (eq "64" (substr proc_arch (1- (strlen proc_arch)))) ) ) (prompt "Type RANDOMLAYER to run this routine.") (princ)