Hallo zusammen,
ich habe dem Ersteller der hier aufgeführten LISP schon eine PM geschickt,
ich schreibe aber nochmals hier rein, vielleicht kann mir auch noch jemand anderes helfen.
Es geht um diese LISP-Datei, bei der immer wieder folgender Fehler auftaucht:
Fehler: Fehlerhafter Argumenttyp: stringp nil
Hier die LISP:
(vl-load-com)
(defun mk_tree (pfad verz_nicht / DIR NEU_PFAD_LIST PFAD PFAD_LIST)
(defun mk_tree_work (pfad_list)
(if (setq neu_pfad_list
(apply
'append
(mapcar '(lambda (pfad)
(mapcar '(lambda (dir)
(print (strcat pfad dir "\\"))
(strcat pfad dir "\\")
)
(vl-remove-if
'(lambda (dir) (member dir verz_nicht))
(vl-directory-files pfad nil -1)
)
)
)
pfad_list
)
)
)
(append pfad_list (mk_tree_work neu_pfad_list))
)
)
(setq pfad_list (list pfad))
(setq verz_nicht (append verz_nicht (list "." "..")))
(cons pfad (mk_tree_work pfad_list))
)
(defun mk_tree_files (pfad verz_nicht filter
/ alle_pfad_list
startpfad_list verz_list
dummy_list pfade
)
(apply
'append
(vl-remove 'nil
(mapcar '(lambda (pfad)
(mapcar '(lambda (file) (strcat pfad file))
(vl-directory-files pfad filter 0)
)
)
(mk_tree pfad verz_nicht)
)
)
)
)
(defun ext_folder (str start / folder obj_shell)
(setq obj_shell (vlax-get-or-create-object "shell.application"))
(if (setq
folder (vlax-invoke obj_shell "BrowseForFolder" 0 str 1 start)
)
(setq folder (vlax-get (vlax-get folder "Self") "Path"))
)
(vlax-release-object obj_shell)
folder
)
(defun k_odbx-open (pfad funktion / rückgabe wert)
;;; Beispiel -------------------------------------
;;; (setq
;;; blk_def_list
;;; (k_odbx-open
;;; dateiname
;;; '(lambda (dbx_interface / blk_data)
;;; (vlax-for block (vla-get-blocks dbx_interface)
;;; (setq blk_data (list (vla-get-name block)))
;;; )
;;; blk_data
;;; )
;;; )
;;; )
(vla-open
(setq dbx_interface (k_get_interface_object))
pfad
)
(setq rückgabe ((eval funktion) dbx_interface))
(vlax-release-object dbx_interface)
rückgabe
)
(defun k_get_interface_object ()
(vl-catch-all-apply
'vla-getinterfaceobject
(append
(list (vlax-get-acad-object))
(vl-remove-if-not
'(lambda (eintrag)
(wcmatch eintrag
(strcat "*" (itoa (atoi (getvar "acadver"))) "*")
)
)
(vl-remove-if
'not
(mapcar
(function
(lambda (version)
(if
(findfile
(vl-registry-read
(strcat
"HKEY_CLASSES_ROOT\\CLSID\\"
(vl-registry-read
(strcat "HKEY_CLASSES_ROOT\\"
version
"\\CLSID"
)
)
"\\InProcServer32"
)
) ;prüft, welche dll-Datei für die ObjectDBX-Version registriert ist, ->
) ;wenn file in den Supportpfaden, dann isses gut
version
nil
)
)
)
(vl-remove-if-not
'(lambda (VARIABLE)
(wcmatch VARIABLE "ObjectDBX.AxDbDocument.*")
)
(vl-registry-descendents "HKEY_CLASSES_ROOT")
) ;Rückgabe: Liste aller registrierten ObjectDBX-Versionen
)
) ;Liste mit einer gültigen Version als Text
)
)
) ;Rückgabewert ist VLA-Object der aktuellen DBX-Variante
)
;;; ##################################################################################################
(defun c:k_attchg_tree (/ ATTINH ATTNAME
BLK_DEF_LIST BLOCKNAME DATEINAME
FILES_LIST NEUTEXT
)
;;; ab einem Startverzeichniss in ALLEN DWGs ALLE Attributinhalte ALLER Blöcke ändern die zu den Filterkriterien passen
;;; zulässige Filter siehe unter wcmatch in der Entwickler-Dokumentation (Lisp-Hilfe)
(setq blockname (getstring t "Blockname : "))
(setq attname (getstring t "Attributname : "))
(setq attinh (getstring t "alter Attributinhalt : "))
(setq neutext (getstring t "neuer Attributinhalt : "))
(setq files_list
(mk_tree_files
(strcat (ext_folder "Startpfad" nil) "\\")
nil
"*.dwg"
)
)
(mapcar '(lambda (dateiname)
(print dateiname)
(setq
blk_def_list
(k_odbx-open
dateiname
'(lambda (dbx_interface / blk_data)
;;; alle Blöcke (Layouts) bearbeiten
(vlax-for block (vla-get-blocks dbx_interface)
;;; wenn Layout, dann Objekte durchlaufen
(if (= (vla-get-IsLayout block) :vlax-true)
(vlax-for obj_name block
;;; wenn Block
(if (= (vla-get-ObjectName obj_name)
"AcDbBlockReference"
)
;;; wenn Blockname passt und Attribute vorhanden
(if
(and
(wcmatch (vla-get-Name obj_name)
blockname
)
(= (vla-get-HasAttributes obj_name) :vlax-true)
(not (minusp
(vlax-safearray-get-u-bound
(vlax-variant-value
(vla-getattributes obj_name)
)
1
)
)
)
)
;;; Attributdaten bearbeiten
(mapcar
'(lambda (data)
(vla-put-textstring (nth 0 data) neutext)
)
(vl-remove-if-not
'(lambda (data)
(and (wcmatch (nth 1 data) attname)
(wcmatch (nth 2 data) attinh)
)
)
(mapcar '(lambda (obj)
(list obj
(vla-get-tagstring obj)
(vla-get-textstring obj)
)
)
(vlax-safearray->list
(vlax-variant-value
(vla-getattributes obj_name)
)
)
)
)
)
)
)
att_list
)
)
)
(vla-saveas dbx_interface dateiname)
)
)
)
)
files_list
)
(princ)
)
Ich habe wieder das Problem, dass ich in vielen DWG´s mehrere Attribute ändern muss.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP