Mihail Posted November 1, 2022 Posted November 1, 2022 Hi All, I have an issue with debugging a lisp. I compiled 2 lisps from Lee mac and another one from another source but slightly modified by myself. The lisp is doing as it follows: Select the command, select the files in which should be applied and execute it. The big issue is them commands are from another lisp and if the line has them as C:XXX it works like a charm but not if I want the XXX to come from selection. I have tried multiple ways but none works. The issue come when It tries to execute the following line: (strcat "(C:"(getvar 'Cmd)")") Any help would be appreciated Below all the code: ;;------------------------=={ Get Files Dialog }==----------------------;; ;; ;; ;; An analog of the 'getfiled' function for multiple file selection. ;; ;;----------------------------------------------------------------------;; ;; Author: Lee Mac, Copyright © 2012 - www.lee-mac.com ;; ;;----------------------------------------------------------------------;; ;; Arguments: ;; ;; msg - [str/nil] Dialog box label; 'Select Files' if nil or "". ;; ;; def - [str/nil] Default directory; dwgprefix if nil or "". ;; ;; ext - [str/nil] File extension filter (e.g. "dwg;lsp"); "*" if nil ;; ;;----------------------------------------------------------------------;; ;; Returns: List of selected files, else nil ;; ;;----------------------------------------------------------------------;; ;; Version 1.6 - 2016-03-21 ;; ;;----------------------------------------------------------------------;; (defun LM:getfiles ( msg def ext / *error* dch dcl des dir dirdata lst rtn ) (defun *error* ( msg ) (if (= 'file (type des)) (close des) ) (if (and (= 'int (type dch)) (< 0 dch)) (unload_dialog dch) ) (if (and (= 'str (type dcl)) (findfile dcl)) (vl-file-delete dcl) ) (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))) (princ (strcat "\nError: " msg)) ) (princ) ) (if (and (setq dcl (vl-filename-mktemp nil nil ".dcl")) (setq des (open dcl "w")) (progn (foreach x '( "lst : list_box" "{" " width = 40.0;" " height = 20.0;" " fixed_width = true;" " fixed_height = true;" " alignment = centered;" " multiple_select = true;" "}" "but : button" "{" " width = 20.0;" " height = 1.8;" " fixed_width = true;" " fixed_height = true;" " alignment = centered;" "}" "getfiles : dialog" "{" " key = \"title\"; spacer;" " : row" " {" " alignment = centered;" " : edit_box { key = \"dir\"; label = \"Folder:\"; }" " : button" " {" " key = \"brw\";" " label = \"Browse\";" " fixed_width = true;" " }" " }" " spacer;" " : row" " {" " : column" " {" " : lst { key = \"box1\"; }" " : but { key = \"add\" ; label = \"Add Files\"; }" " }" " : column {" " : lst { key = \"box2\"; }" " : but { key = \"del\" ; label = \"Remove Files\"; }" " }" " }" " spacer; ok_cancel;" "}" ) (write-line x des) ) (setq des (close des)) (< 0 (setq dch (load_dialog dcl))) ) (new_dialog "getfiles" dch) ) (progn (setq ext (if (= 'str (type ext)) (LM:getfiles:str->lst (strcase ext) ";") '("*"))) (set_tile "title" (if (member msg '(nil "")) "Select Files" msg)) (set_tile "dir" (setq dir (LM:getfiles:fixdir (if (or (member def '(nil "")) (not (vl-file-directory-p (LM:getfiles:fixdir def)))) (getvar 'dwgprefix) def ) ) ) ) (setq lst (LM:getfiles:updatefilelist dir ext nil)) (mode_tile "add" 1) (mode_tile "del" 1) (action_tile "brw" (vl-prin1-to-string '(if (setq tmp (LM:getfiles:browseforfolder "" nil 512)) (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir tmp)) ext rtn) rtn (LM:getfiles:updateselected dir rtn) ) ) ) ) (action_tile "dir" (vl-prin1-to-string '(if (= 1 $reason) (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir (LM:getfiles:fixdir $value))) ext rtn) rtn (LM:getfiles:updateselected dir rtn) ) ) ) ) (action_tile "box1" (vl-prin1-to-string '( (lambda ( / itm tmp ) (if (setq itm (mapcar '(lambda ( n ) (nth n lst)) (read (strcat "(" $value ")")))) (if (= 4 $reason) (cond ( (equal '("..") itm) (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir (LM:getfiles:updir dir))) ext rtn) rtn (LM:getfiles:updateselected dir rtn) ) ) ( (vl-file-directory-p (setq tmp (LM:getfiles:checkredirect (strcat dir "\\" (car itm))))) (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir tmp)) ext rtn) rtn (LM:getfiles:updateselected dir rtn) ) ) ( (setq rtn (LM:getfiles:sort (append rtn (mapcar '(lambda ( x ) (strcat dir "\\" x)) itm))) rtn (LM:getfiles:updateselected dir rtn) lst (LM:getfiles:updatefilelist dir ext rtn) ) ) ) (if (vl-every '(lambda ( x ) (vl-file-directory-p (strcat dir "\\" x))) itm) (mode_tile "add" 1) (mode_tile "add" 0) ) ) ) ) ) ) ) (action_tile "box2" (vl-prin1-to-string '( (lambda ( / itm ) (if (setq itm (mapcar '(lambda ( n ) (nth n rtn)) (read (strcat "(" $value ")")))) (if (= 4 $reason) (setq rtn (LM:getfiles:updateselected dir (vl-remove (car itm) rtn)) lst (LM:getfiles:updatefilelist dir ext rtn) ) (mode_tile "del" 0) ) ) ) ) ) ) (action_tile "add" (vl-prin1-to-string '( (lambda ( / itm ) (if (setq itm (vl-remove-if 'vl-file-directory-p (mapcar '(lambda ( n ) (nth n lst)) (read (strcat "(" (get_tile "box1") ")"))) ) ) (setq rtn (LM:getfiles:sort (append rtn (mapcar '(lambda ( x ) (strcat dir "\\" x)) itm))) rtn (LM:getfiles:updateselected dir rtn) lst (LM:getfiles:updatefilelist dir ext rtn) ) ) (mode_tile "add" 1) (mode_tile "del" 1) ) ) ) ) (action_tile "del" (vl-prin1-to-string '( (lambda ( / itm ) (if (setq itm (read (strcat "(" (get_tile "box2") ")"))) (setq rtn (LM:getfiles:updateselected dir (LM:getfiles:removeitems itm rtn)) lst (LM:getfiles:updatefilelist dir ext rtn) ) ) (mode_tile "add" 1) (mode_tile "del" 1) ) ) ) ) (if (zerop (start_dialog)) (setq rtn nil) ) ) ) (*error* nil) rtn ) (defun LM:getfiles:listbox ( key lst ) (start_list key) (foreach x lst (add_list x)) (end_list) lst ) (defun LM:getfiles:listfiles ( dir ext lst ) (vl-remove-if '(lambda ( x ) (member (strcat dir "\\" x) lst)) (cond ( (cdr (assoc dir dirdata))) ( (cdar (setq dirdata (cons (cons dir (append (LM:getfiles:sortlist (vl-remove "." (vl-directory-files dir nil -1))) (LM:getfiles:sort (if (member ext '(("") ("*"))) (vl-directory-files dir nil 1) (vl-remove-if-not (function (lambda ( x / e ) (and (setq e (vl-filename-extension x)) (setq e (strcase (substr e 2))) (vl-some '(lambda ( w ) (wcmatch e w)) ext) ) ) ) (vl-directory-files dir nil 1) ) ) ) ) ) dirdata ) ) ) ) ) ) ) (defun LM:getfiles:checkredirect ( dir / itm pos ) (cond ( (vl-directory-files dir) dir) ( (and (= (strcase (getenv "UserProfile")) (strcase (substr dir 1 (setq pos (vl-string-position 92 dir nil t)))) ) (setq itm (cdr (assoc (substr (strcase dir t) (+ pos 2)) '( ("my documents" . "Documents") ("my pictures" . "Pictures") ("my videos" . "Videos") ("my music" . "Music") ) ) ) ) (vl-file-directory-p (setq itm (strcat (substr dir 1 pos) "\\" itm))) ) itm ) ( dir ) ) ) (defun LM:getfiles:sort ( lst ) (apply 'append (mapcar 'LM:getfiles:sortlist (vl-sort (LM:getfiles:groupbyfunction lst (lambda ( a b / x y ) (and (setq x (vl-filename-extension a)) (setq y (vl-filename-extension b)) (= (strcase x) (strcase y)) ) ) ) (function (lambda ( a b / x y ) (and (setq x (vl-filename-extension (car a))) (setq y (vl-filename-extension (car b))) (< (strcase x) (strcase y)) ) ) ) ) ) ) ) (defun LM:getfiles:sortlist ( lst ) (mapcar (function (lambda ( n ) (nth n lst))) (vl-sort-i (mapcar 'LM:getfiles:splitstring lst) (function (lambda ( a b / x y ) (while (and (setq x (car a)) (setq y (car b)) (= x y) ) (setq a (cdr a) b (cdr b) ) ) (cond ( (null x) b) ( (null y) nil) ( (and (numberp x) (numberp y)) (< x y)) ( (numberp x)) ( (numberp y) nil) ( (< x y)) ) ) ) ) ) ) (defun LM:getfiles:groupbyfunction ( lst fun / tmp1 tmp2 x1 ) (if (setq x1 (car lst)) (progn (foreach x2 (cdr lst) (if (fun x1 x2) (setq tmp1 (cons x2 tmp1)) (setq tmp2 (cons x2 tmp2)) ) ) (cons (cons x1 (reverse tmp1)) (LM:getfiles:groupbyfunction (reverse tmp2) fun)) ) ) ) (defun LM:getfiles:splitstring ( str ) ( (lambda ( l ) (read (strcat "(" (vl-list->string (apply 'append (mapcar (function (lambda ( a b c ) (cond ( (member b '(45 46 92)) (list 32) ) ( (< 47 b 58) (list b) ) ( (list 32 34 b 34 32)) ) ) ) (cons nil l) l (append (cdr l) '(( ))) ) ) ) ")" ) ) ) (vl-string->list (strcase str)) ) ) (defun LM:getfiles:browseforfolder ( msg dir flg / err fld pth shl slf ) (setq err (vl-catch-all-apply (function (lambda ( / app hwd ) (if (setq app (vlax-get-acad-object) shl (vla-getinterfaceobject app "shell.application") hwd (vl-catch-all-apply 'vla-get-hwnd (list app)) fld (vlax-invoke-method shl 'browseforfolder (if (vl-catch-all-error-p hwd) 0 hwd) msg flg dir) ) (setq slf (vlax-get-property fld 'self) pth (LM:getfiles:fixdir (vlax-get-property slf 'path)) ) ) ) ) ) ) (if slf (vlax-release-object slf)) (if fld (vlax-release-object fld)) (if shl (vlax-release-object shl)) (if (vl-catch-all-error-p err) (prompt (vl-catch-all-error-message err)) pth ) ) (defun LM:getfiles:full->relative ( dir path / p q ) (setq dir (vl-string-right-trim "\\" dir)) (cond ( (and (setq p (vl-string-position 58 dir)) (setq q (vl-string-position 58 path)) (/= (strcase (substr dir 1 p)) (strcase (substr path 1 q))) ) path ) ( (and (setq p (vl-string-position 92 dir)) (setq q (vl-string-position 92 path)) (= (strcase (substr dir 1 p)) (strcase (substr path 1 q))) ) (LM:getfiles:full->relative (substr dir (+ 2 p)) (substr path (+ 2 q))) ) ( (and (setq q (vl-string-position 92 path)) (= (strcase dir) (strcase (substr path 1 q))) ) (strcat ".\\" (substr path (+ 2 q))) ) ( (= "" dir) path ) ( (setq p (vl-string-position 92 dir)) (LM:getfiles:full->relative (substr dir (+ 2 p)) (strcat "..\\" path)) ) ( (LM:getfiles:full->relative "" (strcat "..\\" path))) ) ) (defun LM:getfiles:str->lst ( str del / pos ) (if (setq pos (vl-string-search del str)) (cons (substr str 1 pos) (LM:getfiles:str->lst (substr str (+ pos 1 (strlen del))) del)) (list str) ) ) (defun LM:getfiles:updatefilelist ( dir ext lst ) (LM:getfiles:listbox "box1" (LM:getfiles:listfiles dir ext lst)) ) (defun LM:getfiles:updateselected ( dir lst ) (LM:getfiles:listbox "box2" (mapcar '(lambda ( x ) (LM:getfiles:full->relative dir x)) lst)) lst ) (defun LM:getfiles:updir ( dir ) (substr dir 1 (vl-string-position 92 dir nil t)) ) (defun LM:getfiles:fixdir ( dir ) (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir)) ) (defun LM:getfiles:removeitems ( itm lst / idx ) (setq idx -1) (vl-remove-if '(lambda ( x ) (member (setq idx (1+ idx)) itm)) lst) ) (vl-load-com) (princ) ;; List Box - Lee Mac ;; Displays a DCL list box allowing the user to make a selection from the supplied data. ;; msg - [str] Dialog label ;; lst - [lst] List of strings to display ;; bit - [int] 1=allow multiple; 2=return indexes ;; Returns: [lst] List of selected items/indexes, else nil (defun LM:listbox ( msg lst bit / dch des tmp rtn ) (cond ( (not (and (setq tmp (vl-filename-mktemp nil nil ".dcl")) (setq des (open tmp "w")) (write-line (strcat "listbox:dialog{label=\"" msg "\";spacer;:list_box{key=\"list\";multiple_select=" (if (= 1 (logand 1 bit)) "true" "false") ";width=50;height=15;}spacer;ok_cancel;}" ) des ) (not (close des)) (< 0 (setq dch (load_dialog tmp))) (new_dialog "listbox" dch) ) ) (prompt "\nError Loading List Box Dialog.") ) ( t (start_list "list") (foreach itm lst (add_list itm)) (end_list) (setq rtn (set_tile "list" "0")) (action_tile "list" "(setq rtn $value)") (setq rtn (if (= 1 (start_dialog)) (if (= 2 (logand 2 bit)) (read (strcat "(" rtn ")")) (mapcar '(lambda ( x ) (nth x lst)) (read (strcat "(" rtn ")"))) ) ) ) ) ) (if (< 0 dch) (unload_dialog dch) ) (if (and tmp (setq tmp (findfile tmp))) (vl-file-delete tmp) ) rtn ) (setq Cmd (LM:listbox "Select an Item" '("IFCALL" "FWRALL" "REVB" "REV1" "IFRDEF") 1)) (progn (setvar "SDI" 1) (setvar "LISPINIT" 0) (setq Files_Folder (LM:getfiles "Select Drawings" "" "dwg")) (command "save" (strcat (getvar "dwgprefix") (getvar "dwgname")) "Y") (setq n 0) (while (< n (length Files_Folder)) (command "fileopen" (nth n Files_Folder)) (strcat "(C:"(getvar 'Cmd)")");;;This is an example...Place your command as you needed (vl-cmdf "save" (nth n Files_Folder)) (setq n (+ 1 n)) ) (setvar "SDI" 0) (setvar "LISPINIT" 1) ) (vl-load-com) (princ)) Quote
Steven P Posted November 1, 2022 Posted November 1, 2022 Just looking at your first part, (strcat "(C:"(getvar 'Cmd)")") I did a quick look, my CAD doesn't have a system variable 'cmd, not sure if BricsCAD does, so you might want to check that - do you need to use "getvar" or just use the CMD value you got earlier in the LISP (getvar gets the system variables) You might want to use: (strcat "(C:" cmd ")" ) Your line will produce something like: C:-MyCommand- which is great if the LISP you want to use starts with a 'c:' but not so great if it doesn't - so you might also need to work out how to distinguish between the 2. I forget the exact line but something like Lee Mac in this might help (vl-symbol-value 'c:ttt) Can do a check is the 'C' version exists of if it doesn't have it, it will return 'nil' if the LISP doesn't exist Quote
Mihail Posted November 1, 2022 Author Posted November 1, 2022 5 minutes ago, Steven P said: Just looking at your first part, (strcat "(C:"(getvar 'Cmd)")") I did a quick look, my CAD doesn't have a system variable 'cmd, not sure if BricsCAD does, so you might want to check that - do you need to use "getvar" or just use the CMD value you got earlier in the LISP (getvar gets the system variables) You might want to use: (strcat "(C:" cmd ")" ) Your line will produce something like: C:-MyCommand- which is great if the LISP you want to use starts with a 'c:' but not so great if it doesn't - so you might also need to work out how to distinguish between the 2. I forget the exact line but something like Lee Mac in this might help (vl-symbol-value 'c:ttt) Can do a check is the 'C' version exists of if it doesn't have it, it will return 'nil' if the LISP doesn't exist Hi Steven, (strcat "(C:" cmd ")" ) is giving me the follwing: Command: ; error: bad argument type: stringp ("IFCALL") - I choose IFCALL from the list All the commands I want to use are from different lisps which are loaded at startup so all are the like of C:IFRDEF for example. Indeed now I realise the getvar is getting only system variable. Quote
Steven P Posted November 1, 2022 Posted November 1, 2022 Try a thing and lets see what cmd is, put in (princ cmd) just before that line, or (alert cmd) - this will tell you what it thinks cmd value is - I am going to guess that it is a number (the position in your list that ifcall is) Quote
Mihail Posted November 1, 2022 Author Posted November 1, 2022 12 minutes ago, Steven P said: Try a thing and lets see what cmd is, put in (princ cmd) just before that line, or (alert cmd) - this will tell you what it thinks cmd value is - I am going to guess that it is a number (the position in your list that ifcall is) It is really weird. (princ cmd) returns what I selected (IFCALL) in this case. I think the problem is the strcat. I did a setq xxx for strcat and after I put a (princ xxx) and what I got is " ; error: bad argument type: stringp ("IFCALL") " same error Quote
Mihail Posted November 1, 2022 Author Posted November 1, 2022 50 minutes ago, Steven P said: Try a thing and lets see what cmd is, put in (princ cmd) just before that line, or (alert cmd) - this will tell you what it thinks cmd value is - I am going to guess that it is a number (the position in your list that ifcall is) I think I found the issue but I have no clue how to sort it. The problem is in the code is collecting the IFCALL. The one I have from Lee. I updated the code with a C:Test and a (princ cmd) and what it returns it's what I selected. ;;------------------------=={ Get Files Dialog }==----------------------;; ;; ;; ;; An analog of the 'getfiled' function for multiple file selection. ;; ;;----------------------------------------------------------------------;; ;; Author: Lee Mac, Copyright © 2012 - www.lee-mac.com ;; ;;----------------------------------------------------------------------;; ;; Arguments: ;; ;; msg - [str/nil] Dialog box label; 'Select Files' if nil or "". ;; ;; def - [str/nil] Default directory; dwgprefix if nil or "". ;; ;; ext - [str/nil] File extension filter (e.g. "dwg;lsp"); "*" if nil ;; ;;----------------------------------------------------------------------;; ;; Returns: List of selected files, else nil ;; ;;----------------------------------------------------------------------;; ;; Version 1.6 - 2016-03-21 ;; ;;----------------------------------------------------------------------;; (defun LM:getfiles ( msg def ext / *error* dch dcl des dir dirdata lst rtn ) (defun *error* ( msg ) (if (= 'file (type des)) (close des) ) (if (and (= 'int (type dch)) (< 0 dch)) (unload_dialog dch) ) (if (and (= 'str (type dcl)) (findfile dcl)) (vl-file-delete dcl) ) (if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))) (princ (strcat "\nError: " msg)) ) (princ) ) (if (and (setq dcl (vl-filename-mktemp nil nil ".dcl")) (setq des (open dcl "w")) (progn (foreach x '( "lst : list_box" "{" " width = 40.0;" " height = 20.0;" " fixed_width = true;" " fixed_height = true;" " alignment = centered;" " multiple_select = true;" "}" "but : button" "{" " width = 20.0;" " height = 1.8;" " fixed_width = true;" " fixed_height = true;" " alignment = centered;" "}" "getfiles : dialog" "{" " key = \"title\"; spacer;" " : row" " {" " alignment = centered;" " : edit_box { key = \"dir\"; label = \"Folder:\"; }" " : button" " {" " key = \"brw\";" " label = \"Browse\";" " fixed_width = true;" " }" " }" " spacer;" " : row" " {" " : column" " {" " : lst { key = \"box1\"; }" " : but { key = \"add\" ; label = \"Add Files\"; }" " }" " : column {" " : lst { key = \"box2\"; }" " : but { key = \"del\" ; label = \"Remove Files\"; }" " }" " }" " spacer; ok_cancel;" "}" ) (write-line x des) ) (setq des (close des)) (< 0 (setq dch (load_dialog dcl))) ) (new_dialog "getfiles" dch) ) (progn (setq ext (if (= 'str (type ext)) (LM:getfiles:str->lst (strcase ext) ";") '("*"))) (set_tile "title" (if (member msg '(nil "")) "Select Files" msg)) (set_tile "dir" (setq dir (LM:getfiles:fixdir (if (or (member def '(nil "")) (not (vl-file-directory-p (LM:getfiles:fixdir def)))) (getvar 'dwgprefix) def ) ) ) ) (setq lst (LM:getfiles:updatefilelist dir ext nil)) (mode_tile "add" 1) (mode_tile "del" 1) (action_tile "brw" (vl-prin1-to-string '(if (setq tmp (LM:getfiles:browseforfolder "" nil 512)) (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir tmp)) ext rtn) rtn (LM:getfiles:updateselected dir rtn) ) ) ) ) (action_tile "dir" (vl-prin1-to-string '(if (= 1 $reason) (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir (LM:getfiles:fixdir $value))) ext rtn) rtn (LM:getfiles:updateselected dir rtn) ) ) ) ) (action_tile "box1" (vl-prin1-to-string '( (lambda ( / itm tmp ) (if (setq itm (mapcar '(lambda ( n ) (nth n lst)) (read (strcat "(" $value ")")))) (if (= 4 $reason) (cond ( (equal '("..") itm) (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir (LM:getfiles:updir dir))) ext rtn) rtn (LM:getfiles:updateselected dir rtn) ) ) ( (vl-file-directory-p (setq tmp (LM:getfiles:checkredirect (strcat dir "\\" (car itm))))) (setq lst (LM:getfiles:updatefilelist (set_tile "dir" (setq dir tmp)) ext rtn) rtn (LM:getfiles:updateselected dir rtn) ) ) ( (setq rtn (LM:getfiles:sort (append rtn (mapcar '(lambda ( x ) (strcat dir "\\" x)) itm))) rtn (LM:getfiles:updateselected dir rtn) lst (LM:getfiles:updatefilelist dir ext rtn) ) ) ) (if (vl-every '(lambda ( x ) (vl-file-directory-p (strcat dir "\\" x))) itm) (mode_tile "add" 1) (mode_tile "add" 0) ) ) ) ) ) ) ) (action_tile "box2" (vl-prin1-to-string '( (lambda ( / itm ) (if (setq itm (mapcar '(lambda ( n ) (nth n rtn)) (read (strcat "(" $value ")")))) (if (= 4 $reason) (setq rtn (LM:getfiles:updateselected dir (vl-remove (car itm) rtn)) lst (LM:getfiles:updatefilelist dir ext rtn) ) (mode_tile "del" 0) ) ) ) ) ) ) (action_tile "add" (vl-prin1-to-string '( (lambda ( / itm ) (if (setq itm (vl-remove-if 'vl-file-directory-p (mapcar '(lambda ( n ) (nth n lst)) (read (strcat "(" (get_tile "box1") ")"))) ) ) (setq rtn (LM:getfiles:sort (append rtn (mapcar '(lambda ( x ) (strcat dir "\\" x)) itm))) rtn (LM:getfiles:updateselected dir rtn) lst (LM:getfiles:updatefilelist dir ext rtn) ) ) (mode_tile "add" 1) (mode_tile "del" 1) ) ) ) ) (action_tile "del" (vl-prin1-to-string '( (lambda ( / itm ) (if (setq itm (read (strcat "(" (get_tile "box2") ")"))) (setq rtn (LM:getfiles:updateselected dir (LM:getfiles:removeitems itm rtn)) lst (LM:getfiles:updatefilelist dir ext rtn) ) ) (mode_tile "add" 1) (mode_tile "del" 1) ) ) ) ) (if (zerop (start_dialog)) (setq rtn nil) ) ) ) (*error* nil) rtn ) (defun LM:getfiles:listbox ( key lst ) (start_list key) (foreach x lst (add_list x)) (end_list) lst ) (defun LM:getfiles:listfiles ( dir ext lst ) (vl-remove-if '(lambda ( x ) (member (strcat dir "\\" x) lst)) (cond ( (cdr (assoc dir dirdata))) ( (cdar (setq dirdata (cons (cons dir (append (LM:getfiles:sortlist (vl-remove "." (vl-directory-files dir nil -1))) (LM:getfiles:sort (if (member ext '(("") ("*"))) (vl-directory-files dir nil 1) (vl-remove-if-not (function (lambda ( x / e ) (and (setq e (vl-filename-extension x)) (setq e (strcase (substr e 2))) (vl-some '(lambda ( w ) (wcmatch e w)) ext) ) ) ) (vl-directory-files dir nil 1) ) ) ) ) ) dirdata ) ) ) ) ) ) ) (defun LM:getfiles:checkredirect ( dir / itm pos ) (cond ( (vl-directory-files dir) dir) ( (and (= (strcase (getenv "UserProfile")) (strcase (substr dir 1 (setq pos (vl-string-position 92 dir nil t)))) ) (setq itm (cdr (assoc (substr (strcase dir t) (+ pos 2)) '( ("my documents" . "Documents") ("my pictures" . "Pictures") ("my videos" . "Videos") ("my music" . "Music") ) ) ) ) (vl-file-directory-p (setq itm (strcat (substr dir 1 pos) "\\" itm))) ) itm ) ( dir ) ) ) (defun LM:getfiles:sort ( lst ) (apply 'append (mapcar 'LM:getfiles:sortlist (vl-sort (LM:getfiles:groupbyfunction lst (lambda ( a b / x y ) (and (setq x (vl-filename-extension a)) (setq y (vl-filename-extension b)) (= (strcase x) (strcase y)) ) ) ) (function (lambda ( a b / x y ) (and (setq x (vl-filename-extension (car a))) (setq y (vl-filename-extension (car b))) (< (strcase x) (strcase y)) ) ) ) ) ) ) ) (defun LM:getfiles:sortlist ( lst ) (mapcar (function (lambda ( n ) (nth n lst))) (vl-sort-i (mapcar 'LM:getfiles:splitstring lst) (function (lambda ( a b / x y ) (while (and (setq x (car a)) (setq y (car b)) (= x y) ) (setq a (cdr a) b (cdr b) ) ) (cond ( (null x) b) ( (null y) nil) ( (and (numberp x) (numberp y)) (< x y)) ( (numberp x)) ( (numberp y) nil) ( (< x y)) ) ) ) ) ) ) (defun LM:getfiles:groupbyfunction ( lst fun / tmp1 tmp2 x1 ) (if (setq x1 (car lst)) (progn (foreach x2 (cdr lst) (if (fun x1 x2) (setq tmp1 (cons x2 tmp1)) (setq tmp2 (cons x2 tmp2)) ) ) (cons (cons x1 (reverse tmp1)) (LM:getfiles:groupbyfunction (reverse tmp2) fun)) ) ) ) (defun LM:getfiles:splitstring ( str ) ( (lambda ( l ) (read (strcat "(" (vl-list->string (apply 'append (mapcar (function (lambda ( a b c ) (cond ( (member b '(45 46 92)) (list 32) ) ( (< 47 b 58) (list b) ) ( (list 32 34 b 34 32)) ) ) ) (cons nil l) l (append (cdr l) '(( ))) ) ) ) ")" ) ) ) (vl-string->list (strcase str)) ) ) (defun LM:getfiles:browseforfolder ( msg dir flg / err fld pth shl slf ) (setq err (vl-catch-all-apply (function (lambda ( / app hwd ) (if (setq app (vlax-get-acad-object) shl (vla-getinterfaceobject app "shell.application") hwd (vl-catch-all-apply 'vla-get-hwnd (list app)) fld (vlax-invoke-method shl 'browseforfolder (if (vl-catch-all-error-p hwd) 0 hwd) msg flg dir) ) (setq slf (vlax-get-property fld 'self) pth (LM:getfiles:fixdir (vlax-get-property slf 'path)) ) ) ) ) ) ) (if slf (vlax-release-object slf)) (if fld (vlax-release-object fld)) (if shl (vlax-release-object shl)) (if (vl-catch-all-error-p err) (prompt (vl-catch-all-error-message err)) pth ) ) (defun LM:getfiles:full->relative ( dir path / p q ) (setq dir (vl-string-right-trim "\\" dir)) (cond ( (and (setq p (vl-string-position 58 dir)) (setq q (vl-string-position 58 path)) (/= (strcase (substr dir 1 p)) (strcase (substr path 1 q))) ) path ) ( (and (setq p (vl-string-position 92 dir)) (setq q (vl-string-position 92 path)) (= (strcase (substr dir 1 p)) (strcase (substr path 1 q))) ) (LM:getfiles:full->relative (substr dir (+ 2 p)) (substr path (+ 2 q))) ) ( (and (setq q (vl-string-position 92 path)) (= (strcase dir) (strcase (substr path 1 q))) ) (strcat ".\\" (substr path (+ 2 q))) ) ( (= "" dir) path ) ( (setq p (vl-string-position 92 dir)) (LM:getfiles:full->relative (substr dir (+ 2 p)) (strcat "..\\" path)) ) ( (LM:getfiles:full->relative "" (strcat "..\\" path))) ) ) (defun LM:getfiles:str->lst ( str del / pos ) (if (setq pos (vl-string-search del str)) (cons (substr str 1 pos) (LM:getfiles:str->lst (substr str (+ pos 1 (strlen del))) del)) (list str) ) ) (defun LM:getfiles:updatefilelist ( dir ext lst ) (LM:getfiles:listbox "box1" (LM:getfiles:listfiles dir ext lst)) ) (defun LM:getfiles:updateselected ( dir lst ) (LM:getfiles:listbox "box2" (mapcar '(lambda ( x ) (LM:getfiles:full->relative dir x)) lst)) lst ) (defun LM:getfiles:updir ( dir ) (substr dir 1 (vl-string-position 92 dir nil t)) ) (defun LM:getfiles:fixdir ( dir ) (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir)) ) (defun LM:getfiles:removeitems ( itm lst / idx ) (setq idx -1) (vl-remove-if '(lambda ( x ) (member (setq idx (1+ idx)) itm)) lst) ) (vl-load-com) (princ) ;; List Box - Lee Mac ;; Displays a DCL list box allowing the user to make a selection from the supplied data. ;; msg - [str] Dialog label ;; lst - [lst] List of strings to display ;; bit - [int] 1=allow multiple; 2=return indexes ;; Returns: [lst] List of selected items/indexes, else nil (defun LM:listbox ( msg lst bit / dch des tmp rtn ) (cond ( (not (and (setq tmp (vl-filename-mktemp nil nil ".dcl")) (setq des (open tmp "w")) (write-line (strcat "listbox:dialog{label=\"" msg "\";spacer;:list_box{key=\"list\";multiple_select=" (if (= 1 (logand 1 bit)) "true" "false") ";width=50;height=15;}spacer;ok_cancel;}" ) des ) (not (close des)) (< 0 (setq dch (load_dialog tmp))) (new_dialog "listbox" dch) ) ) (prompt "\nError Loading List Box Dialog.") ) ( t (start_list "list") (foreach itm lst (add_list itm)) (end_list) (setq rtn (set_tile "list" "0")) (action_tile "list" "(setq rtn $value)") (setq rtn (if (= 1 (start_dialog)) (if (= 2 (logand 2 bit)) (read (strcat "(" rtn ")")) (mapcar '(lambda ( x ) (nth x lst)) (read (strcat "(" rtn ")"))) ) ) ) ) ) (if (< 0 dch) (unload_dialog dch) ) (if (and tmp (setq tmp (findfile tmp))) (vl-file-delete tmp) ) rtn ) (defun c:TEST ( / Cmd Files_Folder n) ;(setq Files_Folder (LM:getfiles "Select Drawings" "" "dwg")) ;(mapcar 'print Files_Folder) ;(princ) (setq Cmd (LM:listbox "Select a Function" '("IFCALL" "FWRALL" "REVB" "REV1" "IFRDEF") 0)) (princ cmd) ;(progn ; (setvar "SDI" 1) ; (setvar "LISPINIT" 0) ; (setq Files_Folder (LM:getfiles "Select Drawings" "" "dwg")) ; (command "save" (strcat (getvar "dwgprefix") (getvar "dwgname")) "Y") ; (setq n 0) ; (while (< n (length Files_Folder)) ; (command "fileopen" (nth n Files_Folder)) ; (eval(list(read(strcat "C:" cmd ))));;;This is an example...Place your command as you needed ; (vl-cmdf "save" (nth n Files_Folder)) ; (setq n (+ 1 n)) ; ) ; (setvar "SDI" 0) ; (setvar "LISPINIT" 1) ; ) (vl-load-com) (princ)) Quote
Steven P Posted November 1, 2022 Posted November 1, 2022 OK, the stringp error tells us that the variable is not a string that the LISP is happy with, most often for me it is because I am trying to use a number and not a string, the next option could be that it is a list you are trying to use .... which kind of makes sense with the brackets, try either (setq Cmd (car (LM:listbox "Select an Item" '("IFCALL" "FWRALL" "REVB" "REV1" "IFRDEF") 1))) or this line after your setq Cmd line: (setq cmd (car Cmd)) see what happens there 2 Quote
Mihail Posted November 1, 2022 Author Posted November 1, 2022 13 minutes ago, Steven P said: OK, the stringp error tells us that the variable is not a string that the LISP is happy with, most often for me it is because I am trying to use a number and not a string, the next option could be that it is a list you are trying to use .... which kind of makes sense with the brackets, try either (setq Cmd (car (LM:listbox "Select an Item" '("IFCALL" "FWRALL" "REVB" "REV1" "IFRDEF") 1))) or this line after your setq Cmd line: (setq cmd (car Cmd)) see what happens there Perfect. Thank you very much! 1 Quote
BIGAL Posted November 2, 2022 Posted November 2, 2022 I think I am missing something here (c:runmyprogram) will do just the same as if you typed "runmyprogram" on command line. (setq Cmd (car (LM:listbox "Select an Item" '("IFCALL" "FWRALL" "REVB" "REV1" "IFRDEF") 1))) Would not a cond be useful and run correct choice. (cond ((= cmd "IFCALL")(C:IFCALL)) ((= cmd "FWRALL" )(C:FWRALL )) Just a side note look at Multi radio Buttons.lsp useful for this type of choice. Its here in downloads. (if (not AH:Butts)(load "Multi radio buttons.lsp")) ; loads the program if not loaded already (if (= ahdef nil)(setq ahdef 1)) ; this is needed to set default button ; you can reset default button to user pick save ahdef (setq ans (ah:butts ahdef "V" '("Please choose " "IFCALL" "FWRALL" "REVB" "REV1" "IFRDEF"))) ; ans holds the button picked value as a string 1 Quote
Mihail Posted November 2, 2022 Author Posted November 2, 2022 5 hours ago, BIGAL said: I think I am missing something here (c:runmyprogram) will do just the same as if you typed "runmyprogram" on command line. (setq Cmd (car (LM:listbox "Select an Item" '("IFCALL" "FWRALL" "REVB" "REV1" "IFRDEF") 1))) Would not a cond be useful and run correct choice. (cond ((= cmd "IFCALL")(C:IFCALL)) ((= cmd "FWRALL" )(C:FWRALL )) Just a side note look at Multi radio Buttons.lsp useful for this type of choice. Its here in downloads. (if (not AH:Butts)(load "Multi radio buttons.lsp")) ; loads the program if not loaded already (if (= ahdef nil)(setq ahdef 1)) ; this is needed to set default button ; you can reset default button to user pick save ahdef (setq ans (ah:butts ahdef "V" '("Please choose " "IFCALL" "FWRALL" "REVB" "REV1" "IFRDEF"))) ; ans holds the button picked value as a string Thank you for your help! I will give it a try as well. For me the most important is to have a dialog box for that batch lisp in order to avoid duplicating it over and over for each command. Any simple solution which give me the option to select the command is welcome. And, I'm struggling to understand and learn how the lisp's are working to develop better routines in the future. Appreciate Quote
BIGAL Posted November 3, 2022 Posted November 3, 2022 (edited) If you look into the multi radio buttons you will see (if (not AH:Butts)(load "Multi Radio buttons.lsp")) this is asking if you have not previously loaded the library program "Multi Radio buttons.lsp" which has a defun called AH:Butts, if it does not exist then load it. The code is like 200 lines long but demand loaded with 1 line of code. Ok second part I have the support path set where my library code is saved so can use a short "Load" if you need to can do a long load (if (not AH:Butts)(load "d:\\mylisps\\library code\\Multi Radio buttons.lsp")) setting the path to where the file is saved. Hopefully this helps. Edited November 3, 2022 by BIGAL 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.