(in-package :custom) (use-package :oli) (setq *default-dxf-save-path* "C:/temp/") (setq *create-date-tb-attrib* "CREATED_AT") (setq *change-date-tb-attrib* "LASTUPDATE_DATE") (setq *invalid-filename-char-replacement* "_") (when (not (sd-directory-p *default-dxf-save-path*)) (setq *default-dxf-save-path* (sd-inq-temp-dir))) (sd-defdialog 'am-custom-dxf-save :dialog-title (sd-multi-lang-string "Custom save dxf" :german "Angepasstes dxf speichern") :toolbox-button :force :variables '( (dir :title (sd-multi-lang-string "Directory" :german "Verzeichnis") :initial-value *default-dxf-save-path* :value-type :directory) (change-date :value-type :grouped-boolean) (create-date :value-type :grouped-boolean) (pushbutton-var :title (sd-multi-lang-string "Save" :german "Speichern") :toggle-type :wide-toggle :push-action (convert-all-sheets-to-dxf :directory dir :change-date change-date :create-date create-date))) :mutual-exclusion '(change-date create-date)) (defun convert-all-sheets-to-dxf (&key directory change-date create-date) (let ( date-list date (date-attribute (if change-date (am-inq-drw-tb-attribute-value *change-date-tb-attrib*) (am-inq-drw-tb-attribute-value *create-date-tb-attrib*)))) (unless date-attribute (sd-display-error (sd-multi-lang-string "Can't inquire date attribute." :german "Ermitteln des Datums ist fehlgeschlagen.")) (return-from convert-all-sheets-to-dxf nil)) (setq date-list (sd-string-split date-attribute ".")) (if (= (length date-list) 3) (setq date (format nil "~a.~a.20~a" (first date-list) (second date-list) (third date-list))) (progn (sd-display-error (sd-multi-lang-string "Invalid date format." :german "Ungültiges Datumsformat.")) (return-from convert-all-sheets-to-dxf nil))) (dolist (single-sheet (sd-am-inq-all-sheets)) (let* ( (dxf-file-name (format nil "~a-~a-~a" (sd-am-inq-drawing-no) (sd-am-inq-name single-sheet) date)) (dxf-file-name-valid (replace-invalid-filename-chars :filename dxf-file-name :replacement *invalid-filename-char-replacement*)) (dxf-file-path (format nil "~a/~a" directory dxf-file-name-valid))) (sd-call-cmds (am_save_sheet_dxf :sheet single-sheet :filename dxf-file-path :overwrite :yes)))))) (defun replace-invalid-filename-chars (&key filename replacement) (let ( (invalid-characters '("*" "/" "\\" ":" "?" "<" ">" "|"))) (when (member replacement invalid-characters :test #'string=) (sd-display-error (sd-multi-lang-string "Failed to replace invalid characters." :german "Ersetzen der ungültigen Zeichen ist fehlgeschlagen.")) (return-from replace-invalid-filename-chars filename)) (dolist (invalid-char invalid-characters) (setq filename (sd-string-replace filename invalid-char replacement))) filename)) (defun am-inq-drw-tb-attribute-value (attribut) (let (attribute-value) (sd-execute-annotator-command :cmd (format nil "~a ~a ~a ~a ~a ~a ~a ~a ~a ~a ~a ~a ~a" "DEFINE inq_drw_tb_attrib" "LOCAL Numtext" (format nil "INQ_SELECTED_ELEM SELECT GLOBAL INFOS 'TR:tb:~a:*' CONFIRM" attribut) "IF ((INQ 403)=TEXT)" "LET Numtext (INQ 902)" "ELSE" "LET Numtext 'NOVALUEFOUND'" "END_IF" "LET lispstring (DOCU_CSTRING_TO_LSTRING Numtext)" "LET isopen (DOCU_OPEN_CONNECTION_TO_SD)" "LET done (DOCU_ADD_LINE_TO_SD lispstring)" "LET isclosed (DOCU_CLOSE_CONNECTION_TO_SD)" "END_DEFINE")) (setq attribute-value (sd-execute-annotator-function :fnc "inq_drw_tb_attrib")) (if (string-equal "NOVALUEFOUND" attribute-value) nil attribute-value)))