本帖最后由 zhanghuohuo 于 2025-11-30 21:20 编辑
  1. (defun c:BPLOT (/ *error* dcl-file dcl-id result
  2.                        get-plotters get-styles get-media-names
  3.                        update-media-list update-file-list write-dcl browse-folder
  4.                        valid-folder-p save-settings load-settings
  5.                        generate-worker-lsp generate-scr-file
  6.                        smart-sort path-slash prepare-temp-env
  7.                        remove-selected-file browse-multi-files
  8.                        plotters styles media-list pick-block
  9.                        sel-block sel-plotter sel-style sel-media sel-scale sel-factor
  10.                        sel-folder file-list selected-file-idx
  11.                        acad-obj doc clayout reg-path factor-num
  12.                        worker-path scr-path temp loop temp-dir input-path)

  13.   (vl-load-com)
  14.   
  15.   (setq acad-obj (vlax-get-acad-object))
  16.   (setq doc (vla-get-ActiveDocument acad-obj))
  17.   (setq clayout (vla-get-ActiveLayout doc))
  18.   (setq reg-path "HKEY_CURRENT_USER\\Software\\BatchPlotTool_SCR")
  19.   (setq file-list nil)
  20.   (setq selected-file-idx nil)
  21.   (setq input-path "")

  22.   (defun *error* (msg)
  23.     (if dcl-id (unload_dialog dcl-id))
  24.     (if (and dcl-file (findfile dcl-file)) (vl-file-delete dcl-file))
  25.     (if (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*")))
  26.       (princ (strcat "\n错误: " msg))
  27.     )
  28.     (princ)
  29.   )

  30.   ;; ========== 基础工具 ==========
  31.   
  32.   (defun path-slash (path)
  33.     (while (vl-string-search "\" path)
  34.       (setq path (vl-string-subst "/" "\" path))
  35.     )
  36.     path
  37.   )

  38.   (defun smart-sort (lst / extract-number)
  39.     (defun extract-number (s / i len c num found)
  40.       (setq i 1 len (strlen s) num "" found nil)
  41.       (while (and (<= i len) (not (wcmatch (substr s i 1) "#")))
  42.         (setq i (1+ i))
  43.       )
  44.       (while (and (<= i len) (wcmatch (setq c (substr s i 1)) "#"))
  45.         (setq num (strcat num c) i (1+ i) found T)
  46.       )
  47.       (if found (atoi num) 999999)
  48.     )
  49.     (vl-sort lst
  50.       '(lambda (a b / na nb)
  51.          (setq na (extract-number a) nb (extract-number b))
  52.          (if (= na nb)
  53.            (< a b)
  54.            (< na nb)
  55.          )
  56.        )
  57.     )
  58.   )

  59.   (defun smart-sort-paths (lst)
  60.     (vl-sort lst
  61.       '(lambda (a b / na nb)
  62.          (setq na (extract-number (vl-filename-base a)))
  63.          (setq nb (extract-number (vl-filename-base b)))
  64.          (if (= na nb)
  65.            (< (strcase (vl-filename-base a)) (strcase (vl-filename-base b)))
  66.            (< na nb)
  67.          )
  68.        )
  69.     )
  70.   )

  71.   (defun extract-number (s / i len c num found)
  72.     (setq i 1 len (strlen s) num "" found nil)
  73.     (while (and (<= i len) (not (wcmatch (substr s i 1) "#")))
  74.       (setq i (1+ i))
  75.     )
  76.     (while (and (<= i len) (wcmatch (setq c (substr s i 1)) "#"))
  77.       (setq num (strcat num c) i (1+ i) found T)
  78.     )
  79.     (if found (atoi num) 999999)
  80.   )

  81.   (defun prepare-temp-env (file-list temp-dir / fso src-path temp-path file-obj attrs copied-count fname)
  82.     (setq fso (vlax-create-object "Scripting.FileSystemObject"))
  83.     (if (vlax-invoke fso 'FolderExists temp-dir)
  84.       (vl-catch-all-apply 'vlax-invoke (list fso 'DeleteFolder temp-dir :vlax-true))
  85.     )
  86.     (vl-mkdir temp-dir)
  87.     (setq copied-count 0)
  88.     (if file-list
  89.       (progn
  90.         (princ "\n[系统] 正在初始化临时环境...")
  91.         (foreach src-path file-list
  92.           (setq fname (vl-filename-base src-path))
  93.           (setq temp-path (strcat temp-dir "\" fname ".dwg"))
  94.           (if (vl-file-copy src-path temp-path)
  95.             (progn
  96.               (if (setq file-obj (vl-catch-all-apply 'vlax-invoke (list fso 'GetFile temp-path)))
  97.                 (if (not (vl-catch-all-error-p file-obj))
  98.                   (progn
  99.                     (setq attrs (vlax-get file-obj 'Attributes))
  100.                     (if (= (logand attrs 1) 1)
  101.                       (vlax-put file-obj 'Attributes (logand attrs 65534))
  102.                     )
  103.                     (vlax-release-object file-obj)
  104.                   )
  105.                 )
  106.               )
  107.               (setq copied-count (1+ copied-count))
  108.               (princ (strcat "\n  -> 副本就绪: " fname ".dwg"))
  109.             )
  110.           )
  111.         )
  112.       )
  113.     )
  114.     (if fso (vlax-release-object fso))
  115.     (if (> copied-count 0) T nil)
  116.   )

  117.   ;; ========== 界面配置函数 ==========
  118.   (defun get-plotters ()
  119.     (vla-RefreshPlotDeviceInfo clayout)
  120.     (vlax-safearray->list (vlax-variant-value (vla-GetPlotDeviceNames clayout)))
  121.   )
  122.   
  123.   (defun get-styles ()
  124.     (vla-RefreshPlotDeviceInfo clayout)
  125.     (vlax-safearray->list (vlax-variant-value (vla-GetPlotStyleTableNames clayout)))
  126.   )
  127.   
  128.   (defun get-media-names (plotter / media err)
  129.     (setq media nil)
  130.     (if (and plotter (/= plotter ""))
  131.       (progn
  132.         (setq err (vl-catch-all-apply 'vla-put-ConfigName (list clayout plotter)))
  133.         (if (not (vl-catch-all-error-p err))
  134.           (progn
  135.             (vla-RefreshPlotDeviceInfo clayout)
  136.             (setq media (vl-catch-all-apply
  137.               '(lambda () (vlax-safearray->list (vlax-variant-value (vla-GetCanonicalMediaNames clayout))))
  138.               nil))
  139.             (if (vl-catch-all-error-p media) (setq media nil))
  140.           )
  141.         )
  142.       )
  143.     )
  144.     media
  145.   )
  146.   
  147.   (defun browse-folder (msg / sh folder folderobj path)
  148.     (setq path nil)
  149.     (setq sh (vla-getInterfaceObject acad-obj "Shell.Application"))
  150.     (if sh
  151.       (progn
  152.         (setq folder (vl-catch-all-apply 'vlax-invoke-method (list sh 'BrowseForFolder 0 msg 0)))
  153.         (if (and folder (not (vl-catch-all-error-p folder)))
  154.           (progn
  155.             (setq folderobj (vlax-get-property folder 'Self))
  156.             (setq path (vlax-get-property folderobj 'Path))
  157.             (vlax-release-object folderobj)
  158.             (vlax-release-object folder)
  159.           )
  160.         )
  161.         (vlax-release-object sh)
  162.       )
  163.     )
  164.     (if (and path (> (strlen path) 0))
  165.       (if (/= (substr path (strlen path) 1) "\")
  166.         (setq path (strcat path "\"))
  167.       )
  168.     )
  169.     path
  170.   )

  171.   (defun browse-single-file (/ result)
  172.     (setq result (getfiled "选择DWG文件 (可多次添加)" "" "dwg" 4))
  173.     result
  174.   )
  175.   
  176.   (defun valid-folder-p (folder)
  177.     (and folder (= (type folder) 'STR) (> (strlen folder) 0))
  178.   )
  179.   
  180.   (defun pick-block (/ ent obj name)
  181.     (setq name nil)
  182.     (princ "\n选择图框块...")
  183.     (while (null name)
  184.       (setq ent (car (entsel "\n点击选择图框块: ")))
  185.       (if ent
  186.         (progn
  187.           (setq obj (vlax-ename->vla-object ent))
  188.           (if (= (vla-get-ObjectName obj) "AcDbBlockReference")
  189.             (if (vlax-property-available-p obj 'EffectiveName)
  190.               (setq name (vla-get-EffectiveName obj))
  191.               (setq name (vla-get-Name obj))
  192.             )
  193.             (princ "\n不是块引用")
  194.           )
  195.         )
  196.         (setq name "")
  197.       )
  198.     )
  199.     name
  200.   )
  201.   
  202.   (defun save-settings ()
  203.     (vl-registry-write reg-path "Block" (if sel-block sel-block ""))
  204.     (vl-registry-write reg-path "Printer" (if sel-plotter sel-plotter ""))
  205.     (vl-registry-write reg-path "Style" (if sel-style sel-style ""))
  206.     (vl-registry-write reg-path "Media" (if sel-media sel-media ""))
  207.     (vl-registry-write reg-path "Scale" (if sel-scale sel-scale "ScaleToFit"))
  208.     (vl-registry-write reg-path "Factor" (if sel-factor sel-factor "1.0"))
  209.     (vl-registry-write reg-path "Folder" (if sel-folder sel-folder ""))
  210.   )
  211.   
  212.   (defun load-settings ()
  213.     (setq sel-block (vl-registry-read reg-path "Block"))
  214.     (setq sel-plotter (vl-registry-read reg-path "Printer"))
  215.     (setq sel-style (vl-registry-read reg-path "Style"))
  216.     (setq sel-media (vl-registry-read reg-path "Media"))
  217.     (setq sel-scale (vl-registry-read reg-path "Scale"))
  218.     (setq sel-factor (vl-registry-read reg-path "Factor"))
  219.     (setq sel-folder (vl-registry-read reg-path "Folder"))
  220.     (if (or (not sel-scale) (= sel-scale "")) (setq sel-scale "ScaleToFit"))
  221.     (if (or (not sel-factor) (= sel-factor "")) (setq sel-factor "1.0"))
  222.   )

  223.   ;; ========== 文件列表管理 ==========
  224.   
  225.   (defun load-folder-files (folder / files full-path)
  226.     (if (valid-folder-p folder)
  227.       (progn
  228.         (if (= (substr folder (strlen folder) 1) "\")
  229.           (setq folder (substr folder 1 (1- (strlen folder))))
  230.         )
  231.         (setq files (vl-directory-files folder "*.dwg" 1))
  232.         (setq files (smart-sort files))
  233.         (setq file-list nil)
  234.         (foreach f files
  235.           (setq full-path (strcat folder "\" f))
  236.           (setq file-list (append file-list (list full-path)))
  237.         )
  238.       )
  239.     )
  240.     file-list
  241.   )

  242.   (defun update-file-list-display ()
  243.     (start_list "lst_files")
  244.     (if file-list
  245.       (foreach f file-list
  246.         (add_list (strcat (vl-filename-base f) ".dwg"))
  247.       )
  248.       (add_list "(空)")
  249.     )
  250.     (end_list)
  251.     (set_tile "txt_count" (strcat "共 " (itoa (length file-list)) " 个文件"))
  252.   )

  253.   (defun update-path-display (idx)
  254.     (if (and file-list idx (>= idx 0) (< idx (length file-list)))
  255.       (progn
  256.         (setq input-path (nth idx file-list))
  257.         (set_tile "txt_path" input-path)
  258.       )
  259.     )
  260.   )

  261.   (defun remove-selected-file (idx / i new-list)
  262.     (if (and idx (>= idx 0) (< idx (length file-list)))
  263.       (progn
  264.         (setq i 0 new-list nil)
  265.         (foreach f file-list
  266.           (if (/= i idx)
  267.             (setq new-list (append new-list (list f)))
  268.           )
  269.           (setq i (1+ i))
  270.         )
  271.         (setq file-list new-list)
  272.       )
  273.     )
  274.   )

  275.   (defun add-file-to-list (filepath)
  276.     (if (and filepath
  277.              (findfile filepath)
  278.              (wcmatch (strcase filepath) "*.DWG")
  279.              (not (member filepath file-list)))
  280.       (progn
  281.         (setq file-list (append file-list (list filepath)))
  282.         (setq file-list (smart-sort-paths file-list))
  283.         T
  284.       )
  285.       nil
  286.     )
  287.   )

  288.   (defun load-from-input-path (path / clean-path)
  289.     (if (and path (/= path ""))
  290.       (progn
  291.         (setq clean-path (vl-string-trim " \t" path))
  292.         (if (= (substr clean-path (strlen clean-path) 1) "\")
  293.           (setq clean-path (substr clean-path 1 (1- (strlen clean-path))))
  294.         )
  295.         (cond
  296.           ((and (wcmatch (strcase clean-path) "*.DWG")
  297.                 (findfile clean-path))
  298.            (if (add-file-to-list clean-path)
  299.              (progn
  300.                (princ (strcat "\n已添加文件: " (vl-filename-base clean-path)))
  301.                T
  302.              )
  303.              (progn
  304.                (princ "\n文件已存在或无效")
  305.                nil
  306.              )
  307.            )
  308.           )
  309.           ((vl-file-directory-p clean-path)
  310.            (setq sel-folder (strcat clean-path "\"))
  311.            (load-folder-files sel-folder)
  312.            (if file-list
  313.              (progn
  314.                (princ (strcat "\n已从文件夹加载 " (itoa (length file-list)) " 个文件"))
  315.                T
  316.              )
  317.              (progn
  318.                (princ "\n文件夹中没有DWG文件")
  319.                nil
  320.              )
  321.            )
  322.           )
  323.           (T
  324.            (alert (strcat "无效路径:\n" clean-path "\n\n请输入有效的文件夹路径或DWG文件路径"))
  325.            nil
  326.           )
  327.         )
  328.       )
  329.       nil
  330.     )
  331.   )

  332.   (defun update-factor-state (scale-mode)
  333.     (if (= scale-mode "ScaleToFit")
  334.       (mode_tile "txt_factor" 0)
  335.       (mode_tile "txt_factor" 1)
  336.     )
  337.   )

  338.   ;; ========== 生成 Worker.lsp ==========
  339.   (defun generate-worker-lsp (filepath block printer style media scale-mode factor / f)
  340.     (setq f (open filepath "w"))
  341.     (if f
  342.       (progn
  343.         (write-line ";; BatchPlot Worker V1.0" f)
  344.         (write-line "(princ "\\n[Worker] 加载中...")" f)
  345.         
  346.         (write-line "(defun ss->list (ss / n lst)" f)
  347.         (write-line "  (if ss (repeat (setq n (sslength ss)) (setq lst (cons (ssname ss (setq n (1- n))) lst)))) lst)" f)
  348.         
  349.         (write-line "(defun ax:2dpoint (pt)" f)
  350.         (write-line "  (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 1)) (list (float (car pt)) (float (cadr pt))))))" f)
  351.         
  352.         (write-line "(defun shrink-bounding (bd factor / ll ur cx cy hw hh)" f)
  353.         (write-line "  (setq ll (car bd) ur (cadr bd))" f)
  354.         (write-line "  (setq cx (/ (+ (car ll) (car ur)) 2.0) cy (/ (+ (cadr ll) (cadr ur)) 2.0))" f)
  355.         (write-line "  (setq hw (/ (- (car ur) (car ll)) 2.0 factor) hh (/ (- (cadr ur) (cadr ll)) 2.0 factor))" f)
  356.         (write-line "  (list (list (- cx hw) (- cy hh)) (list (+ cx hw) (+ cy hh))))" f)
  357.         
  358.         (write-line "(defun islandscape (bd) (> (abs (- (caadr bd) (caar bd))) (abs (- (cadadr bd) (cadar bd)))))" f)
  359.         (write-line "(defun getwidth (bd) (max (abs (- (caadr bd) (caar bd))) (abs (- (cadadr bd) (cadar bd)))))" f)
  360.         
  361.         (write-line "(defun fixscale (n / i large)" f)
  362.         (write-line "  (setq i 0 large (> n 100))" f)
  363.         (write-line "  (while (or (> n 100) (< n 10)) (if large (setq n (/ n 10.0)) (setq n (* n 10.0))) (setq i (1+ i)))" f)
  364.         (write-line "  (setq n (fix (+ 0.5 n)))" f)
  365.         (write-line "  (repeat i (if large (setq n (* n 10.0)) (setq n (/ n 10.0)))) n)" f)
  366.         
  367.         (write-line "(defun sort-frames (bdlist / fuzz)" f)
  368.         (write-line "  (setq fuzz 10.0)" f)
  369.         (write-line "  (vl-sort bdlist '(lambda (a b)" f)
  370.         (write-line "    (if (equal (caar a) (caar b) fuzz) (> (cadar a) (cadar b)) (< (caar a) (caar b))))))" f)
  371.         
  372.         (write-line "(defun str-split (str delim / lst pos)" f)
  373.         (write-line "  (while (setq pos (vl-string-search delim str))" f)
  374.         (write-line "    (if (> pos 0) (setq lst (cons (substr str 1 pos) lst)))" f)
  375.         (write-line "    (setq str (substr str (+ 2 pos))))" f)
  376.         (write-line "  (if (/= str "") (setq lst (cons str lst))) (reverse lst))" f)
  377.         
  378.         (write-line "(defun process-layout (doc lay lay-name cfg-block cfg-printer cfg-style cfg-media cfg-scale-mode cfg-factor /" f)
  379.         (write-line "         ss elist obj name minpt maxpt bdlist pW pH paperW i plot-bd scale frame-w target-list)" f)
  380.         (write-line "  (princ (strcat "\\n[" lay-name "]"))" f)
  381.         (write-line "  (if (vl-string-search ";" cfg-block)" f)
  382.         (write-line "    (setq target-list (mapcar 'strcase (str-split cfg-block ";")))" f)
  383.         (write-line "    (setq target-list (mapcar 'strcase (str-split cfg-block " "))))" f)
  384.         (write-line "  (if (null target-list) (setq target-list (list (strcase cfg-block))))" f)
  385.         (write-line "  (vla-ZoomExtents (vlax-get-acad-object))" f)
  386.         (write-line "  (setq ss (ssget "X" (list '(0 . "INSERT") (cons 410 lay-name))))" f)
  387.         (write-line "  (if ss (progn" f)
  388.         (write-line "    (setq elist (ss->list ss) bdlist '())" f)
  389.         (write-line "    (foreach ent elist" f)
  390.         (write-line "      (setq obj (vlax-ename->vla-object ent))" f)
  391.         (write-line "      (setq name (if (vlax-property-available-p obj 'EffectiveName) (vla-get-EffectiveName obj) (vla-get-Name obj)))" f)
  392.         (write-line "      (if (member (strcase name) target-list)" f)
  393.         (write-line "        (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-GetBoundingBox (list obj 'minpt 'maxpt))))" f)
  394.         (write-line "          (setq minpt (vlax-safearray->list minpt) maxpt (vlax-safearray->list maxpt)" f)
  395.         (write-line "                bdlist (cons (list (list (car minpt) (cadr minpt)) (list (car maxpt) (cadr maxpt))) bdlist)))))))" f)
  396.         (write-line "  (if bdlist (progn" f)
  397.         (write-line "    (setq bdlist (sort-frames bdlist))" f)
  398.         (write-line "    (princ (strcat " 找到" (itoa (length bdlist)) "个图框"))" f)
  399.         (write-line "    (vl-catch-all-apply 'vla-put-ActiveLayout (list doc lay))" f)
  400.         (write-line "    (vla-RefreshPlotDeviceInfo lay)" f)
  401.         (write-line "    (vl-catch-all-apply 'vla-put-ConfigName (list lay cfg-printer))" f)
  402.         (write-line "    (vla-RefreshPlotDeviceInfo lay)" f)
  403.         (write-line "    (vl-catch-all-apply 'vla-put-CanonicalMediaName (list lay cfg-media))" f)
  404.         (write-line "    (if (/= cfg-style "") (vl-catch-all-apply 'vla-put-StyleSheet (list lay cfg-style)))" f)
  405.         (write-line "    (vla-put-PaperUnits lay 1)" f)
  406.         (write-line "    (vla-GetPaperSize lay 'pW 'pH)" f)
  407.         (write-line "    (setq paperW (max pW pH) i 0)" f)
  408.         (write-line "    (foreach bd bdlist" f)
  409.         (write-line "      (setq i (1+ i))" f)
  410.         (write-line "      (princ (strcat "\\n  打印[" (itoa i) "/" (itoa (length bdlist)) "]"))" f)
  411.         (write-line "      (if (and (= cfg-scale-mode "ScaleToFit") (/= cfg-factor 1.0))" f)
  412.         (write-line "        (setq plot-bd (shrink-bounding bd cfg-factor)) (setq plot-bd bd))" f)
  413.         (write-line "      (if (= (islandscape bd) (> pW pH)) (vla-put-PlotRotation lay 0) (vla-put-PlotRotation lay 1))" f)
  414.         (write-line "      (vla-SetWindowToPlot lay (ax:2dpoint (car plot-bd)) (ax:2dpoint (cadr plot-bd)))" f)
  415.         (write-line "      (vla-put-PlotType lay 4) (vla-put-CenterPlot lay :vlax-true)" f)
  416.         (write-line "      (cond" f)
  417.         (write-line "        ((= cfg-scale-mode "ScaleToFit") (vla-put-UseStandardScale lay :vlax-true) (vla-put-StandardScale lay 0))" f)
  418.         (write-line "        ((= cfg-scale-mode "1:1") (vla-put-UseStandardScale lay :vlax-false) (vla-SetCustomScale lay 1.0 1.0))" f)
  419.         (write-line "        ((= cfg-scale-mode "Auto") (setq frame-w (getwidth bd) scale (fixscale (/ frame-w paperW)))" f)
  420.         (write-line "          (vla-put-UseStandardScale lay :vlax-false) (vla-SetCustomScale lay 1.0 scale)))" f)
  421.         (write-line "      (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-PlotToDevice (list (vla-get-Plot doc))))" f)
  422.         (write-line "        (princ " X") (princ " OK"))))" f)
  423.         (write-line "    (princ " 无匹配图框")))" f)
  424.         
  425.         (write-line "(defun c:AutoRunBatchPlot (/ acad doc layouts lay layout-list)" f)
  426.         (write-line "  (vl-load-com)" f)
  427.         (write-line "  (setq acad (vlax-get-acad-object) doc (vla-get-ActiveDocument acad) layouts (vla-get-Layouts doc))" f)
  428.         (write-line "  (setvar "BACKGROUNDPLOT" 0)" f)
  429.         (write-line (strcat "  (setq cfg-block "" block "" cfg-printer "" printer "" cfg-style "" style "")") f)
  430.         (write-line (strcat "  (setq cfg-media "" media "" cfg-scale-mode "" scale-mode "" cfg-factor " (rtos factor 2 6) ")") f)
  431.         (write-line "  (process-layout doc (vla-Item layouts "Model") "Model" cfg-block cfg-printer cfg-style cfg-media cfg-scale-mode cfg-factor)" f)
  432.         (write-line "  (setq layout-list '())" f)
  433.         (write-line "  (vlax-for lay layouts (if (/= (vla-get-Name lay) "Model") (setq layout-list (cons lay layout-list))))" f)
  434.         (write-line "  (setq layout-list (vl-sort layout-list '(lambda (a b) (< (vla-get-TabOrder a) (vla-get-TabOrder b)))))" f)
  435.         (write-line "  (foreach lay layout-list (process-layout doc lay (vla-get-Name lay) cfg-block cfg-printer cfg-style cfg-media cfg-scale-mode cfg-factor))" f)
  436.         (write-line "  (princ "\\n--- 当前文件完成 ---") (princ))" f)
  437.         (write-line "(c:AutoRunBatchPlot)" f)
  438.         (close f)
  439.         filepath
  440.       )
  441.       nil
  442.     )
  443.   )

  444.   ;; ========== 生成 SCR ==========
  445.   (defun generate-scr-file (scr-path worker-path temp-dir file-list / f file full-path fname)
  446.     (setq worker-path (path-slash worker-path))
  447.     (if file-list
  448.       (progn
  449.         (setq f (open scr-path "w"))
  450.         (if f
  451.           (progn
  452.             (write-line "SDI 0" f)
  453.             (write-line "SECURELOAD 0" f)
  454.             (write-line "FILEDIA 0" f)
  455.             (write-line "CMDECHO 0" f)
  456.             (write-line "XREFNOTIFY 0" f)
  457.             (write-line "PROXYNOTICE 0" f)
  458.             (foreach file file-list
  459.               (setq fname (vl-filename-base file))
  460.               (setq full-path (strcat temp-dir "\" fname ".dwg"))
  461.               (setq full-path (path-slash full-path))
  462.               (write-line (strcat "_.OPEN "" full-path """) f)
  463.               (write-line "DELAY 100" f)
  464.               (write-line (strcat "(if (findfile "" worker-path "") (load "" worker-path ""))") f)
  465.               (write-line "DELAY 50" f)
  466.               (write-line "_.CLOSE _N" f)
  467.             )
  468.             (write-line "FILEDIA 1" f)
  469.             (write-line "CMDECHO 1" f)
  470.             (write-line "SECURELOAD 1" f)
  471.             (write-line "(princ "\\n==============================")" f)
  472.             (write-line "(princ "\\n  批量打印全部完成!")" f)
  473.             (write-line "(princ "\\n==============================")" f)
  474.             (write-line "(princ)" f)
  475.             (close f)
  476.             T
  477.           )
  478.           nil
  479.         )
  480.       )
  481.       nil
  482.     )
  483.   )

  484.   ;; ========== DCL 界面 ==========
  485.   (defun write-dcl (filename / f)
  486.     (setq f (open filename "w"))
  487.     (if f
  488.       (progn
  489.         (write-line "batchplot : dialog {" f)
  490.         (write-line "  label = "批量打印 V1.0";" f)
  491.         (write-line "  : row {" f)
  492.         
  493.         ;; 左侧 - 文件列表
  494.         (write-line "    : boxed_column {" f)
  495.         (write-line "      label = "待打印文件";" f)
  496.         (write-line "      : row {" f)
  497.         (write-line "        : edit_box {" f)
  498.         (write-line "          key = "txt_path";" f)
  499.         (write-line "          width = 30;" f)
  500.         (write-line "          edit_limit = 512;" f)
  501.         (write-line "        }" f)
  502.         (write-line "        : button { label = "..."; key = "btn_browse"; width = 3; fixed_width = true; }" f)
  503.         (write-line "      }" f)
  504.         (write-line "      : row {" f)
  505.         (write-line "        : button { label = "加载路径"; key = "btn_load"; width = 10; }" f)
  506.         (write-line "        : button { label = "添加文件"; key = "btn_add"; width = 10; }" f)
  507.         (write-line "        : button { label = "清空"; key = "btn_clear"; width = 6; }" f)
  508.         (write-line "      }" f)
  509.         (write-line "      : list_box {" f)
  510.         (write-line "        key = "lst_files";" f)
  511.         (write-line "        width = 36;" f)
  512.         (write-line "        height = 15;" f)
  513.         (write-line "        multiple_select = false;" f)
  514.         (write-line "      }" f)
  515.         (write-line "      : row {" f)
  516.         (write-line "        : text { key = "txt_count"; label = "共 0 个文件"; width = 16; }" f)
  517.         (write-line "        : button { label = "删除选中"; key = "btn_remove"; width = 10; }" f)
  518.         (write-line "      }" f)
  519.         (write-line "    }" f)
  520.         
  521.         ;; 右侧 - 打印设置
  522.         (write-line "    : column {" f)
  523.         (write-line "      : boxed_column {" f)
  524.         (write-line "        label = "图框设置";" f)
  525.         (write-line "        : row {" f)
  526.         (write-line "          : edit_box { label = "块名:"; key = "txt_block"; width = 22; }" f)
  527.         (write-line "          : button { label = "拾取"; key = "btn_pick"; width = 6; }" f)
  528.         (write-line "        }" f)
  529.         (write-line "        : text { label = "多个块名用分号;分隔"; }" f)
  530.         (write-line "      }" f)
  531.         
  532.         (write-line "      : boxed_column {" f)
  533.         (write-line "        label = "打印机设置";" f)
  534.         (write-line "        : popup_list { label = "打印机:"; key = "pop_printer"; width = 32; }" f)
  535.         (write-line "        : popup_list { label = "样式表:"; key = "pop_style"; width = 32; }" f)
  536.         (write-line "        : popup_list { label = "纸张:  "; key = "pop_media"; width = 32; }" f)
  537.         (write-line "      }" f)
  538.         
  539.         (write-line "      : boxed_column {" f)
  540.         (write-line "        label = "比例设置";" f)
  541.         (write-line "        : popup_list { label = "比例:"; key = "pop_scale"; width = 18; }" f)
  542.         (write-line "        : edit_box { label = "放大系数:"; key = "txt_factor"; width = 12; }" f)
  543.         (write-line "        : text { label = "(放大系数仅布满图纸时有效)"; }" f)
  544.         (write-line "      }" f)
  545.         
  546.         (write-line "      : boxed_column {" f)
  547.         (write-line "        label = "使用说明";" f)
  548.         (write-line "        : text { label = "1. 路径栏可粘贴文件夹或DWG路径"; }" f)
  549.         (write-line "        : text { label = "2. 点击[加载路径]导入文件"; }" f)
  550.         (write-line "        : text { label = "3. 选中列表项可查看完整路径"; }" f)
  551.         (write-line "      }" f)
  552.         (write-line "    }" f)
  553.         
  554.         (write-line "  }" f)
  555.         (write-line "  spacer_1;" f)
  556.         (write-line "  ok_cancel;" f)
  557.         (write-line "}" f)
  558.         (close f)
  559.         T
  560.       )
  561.       nil
  562.     )
  563.   )

  564.   ;; ========== 主逻辑 ==========
  565.   (load-settings)
  566.   (setq plotters (get-plotters))
  567.   (setq styles (get-styles))
  568.   (setq dcl-file (vl-filename-mktemp "bp_scr" nil ".dcl"))
  569.   (write-dcl dcl-file)
  570.   (setq dcl-id (load_dialog dcl-file))
  571.   (setq loop T)
  572.   
  573.   (if (valid-folder-p sel-folder)
  574.     (progn
  575.       (load-folder-files sel-folder)
  576.       (setq input-path sel-folder)
  577.     )
  578.   )
  579.   
  580.   (while loop
  581.     (if (not (new_dialog "batchplot" dcl-id))
  582.       (setq loop nil)
  583.       (progn
  584.         (start_list "pop_printer") (mapcar 'add_list plotters) (end_list)
  585.         (start_list "pop_style") (mapcar 'add_list styles) (end_list)
  586.         (start_list "pop_scale")
  587.         (add_list "布满图纸")
  588.         (add_list "自动比例")
  589.         (add_list "1:1")
  590.         (end_list)
  591.         
  592.         (update-file-list-display)
  593.         
  594.         (if (and input-path (/= input-path ""))
  595.           (set_tile "txt_path" input-path)
  596.           (if sel-folder (set_tile "txt_path" sel-folder))
  597.         )
  598.         
  599.         (cond
  600.           ((= sel-scale "ScaleToFit") (set_tile "pop_scale" "0"))
  601.           ((= sel-scale "Auto") (set_tile "pop_scale" "1"))
  602.           ((= sel-scale "1:1") (set_tile "pop_scale" "2"))
  603.           (T (set_tile "pop_scale" "0") (setq sel-scale "ScaleToFit"))
  604.         )
  605.         
  606.         (update-factor-state sel-scale)
  607.         
  608.         (if sel-block (set_tile "txt_block" sel-block))
  609.         (set_tile "txt_factor" (if sel-factor sel-factor "1.0"))
  610.         
  611.         (if (and sel-plotter (member sel-plotter plotters))
  612.           (set_tile "pop_printer" (itoa (vl-position sel-plotter plotters)))
  613.         )
  614.         
  615.         (if (and sel-style (member sel-style styles))
  616.           (set_tile "pop_style" (itoa (vl-position sel-style styles)))
  617.         )
  618.         
  619.         (defun update-media-list (idx)
  620.           (if (and plotters (< (atoi idx) (length plotters)))
  621.             (progn
  622.               (setq sel-plotter (nth (atoi idx) plotters))
  623.               (setq media-list (get-media-names sel-plotter))
  624.               (start_list "pop_media")
  625.               (if media-list
  626.                 (mapcar 'add_list media-list)
  627.                 (add_list "无可用纸张")
  628.               )
  629.               (end_list)
  630.               (if (and media-list sel-media (member sel-media media-list))
  631.                 (set_tile "pop_media" (itoa (vl-position sel-media media-list)))
  632.                 (if media-list (setq sel-media (car media-list)))
  633.               )
  634.             )
  635.           )
  636.         )
  637.         
  638.         (update-media-list
  639.           (if (and sel-plotter (member sel-plotter plotters))
  640.             (itoa (vl-position sel-plotter plotters))
  641.             "0"
  642.           )
  643.         )
  644.         
  645.         (action_tile "btn_pick" "(done_dialog 2)")
  646.         (action_tile "btn_browse" "(done_dialog 3)")
  647.         (action_tile "btn_load" "(done_dialog 7)")
  648.         (action_tile "btn_add" "(done_dialog 4)")
  649.         (action_tile "btn_remove" "(done_dialog 5)")
  650.         (action_tile "btn_clear" "(done_dialog 6)")
  651.         
  652.         (action_tile "lst_files"
  653.           "(progn (setq selected-file-idx (atoi $value)) (update-path-display selected-file-idx))"
  654.         )
  655.         
  656.         (action_tile "txt_path" "(setq input-path $value)")
  657.         
  658.         (action_tile "pop_printer" "(update-media-list $value)")
  659.         (action_tile "pop_style" "(setq sel-style (nth (atoi $value) styles))")
  660.         (action_tile "pop_media" "(if media-list (setq sel-media (nth (atoi $value) media-list)))")
  661.         (action_tile "txt_block" "(setq sel-block $value)")
  662.         (action_tile "txt_factor" "(setq sel-factor $value)")
  663.         
  664.         (action_tile "pop_scale"
  665.           (strcat
  666.             "(cond ((= $value "0") (setq sel-scale "ScaleToFit"))"
  667.             "      ((= $value "1") (setq sel-scale "Auto"))"
  668.             "      ((= $value "2") (setq sel-scale "1:1")))"
  669.             "(update-factor-state sel-scale)"
  670.           )
  671.         )
  672.         
  673.         (action_tile "accept" "(setq input-path (get_tile "txt_path"))(done_dialog 1)")
  674.         (action_tile "cancel" "(done_dialog 0)")
  675.         
  676.         (setq result (start_dialog))
  677.         
  678.         (cond
  679.           ((= result 1)
  680.            (setq loop nil)
  681.            (if (null sel-scale) (setq sel-scale "ScaleToFit"))
  682.            (save-settings)
  683.            
  684.            (if (and file-list
  685.                     (> (length file-list) 0)
  686.                     sel-block (/= sel-block "")
  687.                     sel-media)
  688.              (progn
  689.                (setq temp-dir "C:\\BatchPlotTemp")
  690.                
  691.                (princ "\n======================================")
  692.                (princ "\n[批量打印 V1.0] 准备中...")
  693.                (princ (strcat "\n文件数: " (itoa (length file-list))))
  694.                (princ (strcat "\n图框: " sel-block))
  695.                (princ (strcat "\n比例: " sel-scale))
  696.                (princ "\n======================================")
  697.                
  698.                (if (prepare-temp-env file-list temp-dir)
  699.                  (progn
  700.                    (setq worker-path (strcat temp-dir "\\BP_Worker.lsp"))
  701.                    (setq scr-path (strcat temp-dir "\\BP_Job.scr"))
  702.                    (setq factor-num (atof sel-factor))
  703.                    (if (or (= factor-num 0.0) (< factor-num 0.1))
  704.                      (setq factor-num 1.0)
  705.                    )
  706.                   
  707.                    (princ "\n生成Worker...")
  708.                    (if (generate-worker-lsp worker-path sel-block sel-plotter sel-style sel-media sel-scale factor-num)
  709.                      (progn
  710.                        (princ " OK")
  711.                        (princ "\n生成脚本...")
  712.                        
  713.                        (if (generate-scr-file scr-path worker-path temp-dir file-list)
  714.                          (progn
  715.                            (princ " OK")
  716.                            (unload_dialog dcl-id)
  717.                            (setq dcl-id nil)
  718.                            (princ "\n启动打印...")
  719.                            (command "_.SCRIPT" scr-path)
  720.                          )
  721.                          (alert "脚本生成失败!")
  722.                        )
  723.                      )
  724.                      (alert "Worker生成失败!")
  725.                    )
  726.                  )
  727.                  (alert "准备临时环境失败!\n请检查磁盘空间和权限。")
  728.                )
  729.              )
  730.              (alert "请检查:\n- 文件列表不能为空\n- 必须填写图框块名\n- 必须选择纸张")
  731.            )
  732.           )
  733.          
  734.           ((= result 2)
  735.            (setq temp (pick-block))
  736.            (if (and temp (/= temp ""))
  737.              (if (and sel-block (/= sel-block ""))
  738.                (setq sel-block (strcat sel-block ";" temp))
  739.                (setq sel-block temp)
  740.              )
  741.            )
  742.           )
  743.          
  744.           ((= result 3)
  745.            (setq temp (browse-folder "选择DWG文件夹"))
  746.            (if temp
  747.              (setq input-path temp)
  748.            )
  749.           )
  750.          
  751.           ((= result 4)
  752.            (setq temp (browse-single-file))
  753.            (if temp
  754.              (progn
  755.                (if (add-file-to-list temp)
  756.                  (progn
  757.                    (setq input-path temp)
  758.                    (princ (strcat "\n已添加: " (vl-filename-base temp)))
  759.                  )
  760.                  (princ "\n文件已存在或无效")
  761.                )
  762.              )
  763.            )
  764.           )
  765.          
  766.           ((= result 5)
  767.            (if (and selected-file-idx (>= selected-file-idx 0) (< selected-file-idx (length file-list)))
  768.              (progn
  769.                (princ (strcat "\n已删除: " (vl-filename-base (nth selected-file-idx file-list))))
  770.                (remove-selected-file selected-file-idx)
  771.                (setq selected-file-idx nil)
  772.              )
  773.              (alert "请先选择要删除的文件")
  774.            )
  775.           )
  776.          
  777.           ((= result 6)
  778.            (setq file-list nil)
  779.            (setq selected-file-idx nil)
  780.            (setq input-path "")
  781.            (princ "\n文件列表已清空")
  782.           )
  783.          
  784.           ((= result 7)
  785.            (load-from-input-path input-path)
  786.           )
  787.          
  788.           ((= result 0) (setq loop nil))
  789.         )
  790.       )
  791.     )
  792.   )
  793.   
  794.   (if dcl-id (unload_dialog dcl-id))
  795.   (if (and dcl-file (findfile dcl-file)) (vl-file-delete dcl-file))
  796.   (princ)
  797. )


用到了SCR 函数。会在c盘创建临时的文件夹,打印的cad文档会复制到临时文件。每次启动会检查若存在临时文件则删除重新创建,避免错误!



网友答: 建议再加个设置透明度打印,第二个纸图幅大小根据文件自动判断

网友答: 2016版本提示错误: 输入中的点位置不正确  ai越来越火了

网友答: 目前多文档批量打印的还真不多见,赞

网友答: 厉害了兄得

网友答: 厉害。兄弟厉害,AI也厉害。试试

网友答: 看起来很厉害的样子

网友答: 厉害了兄得


网友答: acad加载后提示命令: (LOAD "F:/资源/bplot.lsp") ; 错误: 输入中的点位置不正确。中望cad加载后提示:Error: 输入的列表有缺陷

网友答:
xsmabbs 发表于 2025-11-30 21:25
2016版本提示错误: 输入中的点位置不正确  ai越来越火了

我用的是cad2024没有问题。
代码修复了,测试的cad2008和cad2024.其他版本cad没有,没有测试。
注意:cad2008,保存为.lsp时,要保存为 ANSI 格式

ai分析的:
主要修改点
位置        修改内容        目的
generate-scr-file        使用 (setvar ...) 替代命令行方式        更可靠的变量设置
generate-scr-file        添加 (if (getvar "SECURELOAD") ...)        CAD 2008无此变量
generate-scr-file        添加 DEMANDLOAD 条件设置        防止按需加载干扰
generate-scr-file        DELAY 增加到 300/100        CAD 2008 响应较慢
generate-worker-lsp        BACKGROUNDPLOT 条件检测        兼容旧版本
版本号        V1.0 → V1.1        标识修复版本
  1. (defun c:BPLOT (/ *error* dcl-file dcl-id result
  2.                   get-plotters get-styles get-media-names
  3.                   update-media-list update-file-list write-dcl browse-folder
  4.                   valid-folder-p save-settings load-settings
  5.                   generate-worker-lsp generate-scr-file
  6.                   smart-sort path-slash prepare-temp-env
  7.                   remove-selected-file browse-single-file
  8.                   plotters styles media-list pick-block
  9.                   sel-block sel-plotter sel-style sel-media sel-scale sel-factor
  10.                   sel-folder file-list selected-file-idx
  11.                   acad-obj doc clayout reg-path factor-num
  12.                   worker-path scr-path temp loop temp-dir input-path)

  13.   (vl-load-com)
  14.   
  15.   (setq acad-obj (vlax-get-acad-object))
  16.   (setq doc (vla-get-ActiveDocument acad-obj))
  17.   (setq clayout (vla-get-ActiveLayout doc))
  18.   (setq reg-path "HKEY_CURRENT_USER\\Software\\BatchPlotTool_SCR")
  19.   (setq file-list nil)
  20.   (setq selected-file-idx nil)
  21.   (setq input-path "")

  22.   (defun *error* (msg)
  23.     (if dcl-id (unload_dialog dcl-id))
  24.     (if (and dcl-file (findfile dcl-file)) (vl-file-delete dcl-file))
  25.     (if (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*")))
  26.       (princ (strcat "\n错误: " msg))
  27.     )
  28.     (princ)
  29.   )

  30.   (defun path-slash (path)
  31.     (while (vl-string-search "\" path)
  32.       (setq path (vl-string-subst "/" "\" path))
  33.     )
  34.     path
  35.   )

  36.   (defun extract-number (s / i len c num found)
  37.     (setq i 1 len (strlen s) num "" found nil)
  38.     (while (and (<= i len) (not (wcmatch (substr s i 1) "#")))
  39.       (setq i (1+ i))
  40.     )
  41.     (while (and (<= i len) (wcmatch (setq c (substr s i 1)) "#"))
  42.       (setq num (strcat num c) i (1+ i) found T)
  43.     )
  44.     (if found (atoi num) 999999)
  45.   )

  46.   (defun smart-sort (lst)
  47.     (vl-sort lst
  48.       (function (lambda (a b / na nb)
  49.         (setq na (extract-number a) nb (extract-number b))
  50.         (if (= na nb) (< a b) (< na nb))
  51.       ))
  52.     )
  53.   )

  54.   (defun smart-sort-paths (lst)
  55.     (vl-sort lst
  56.       (function (lambda (a b / na nb)
  57.         (setq na (extract-number (vl-filename-base a)))
  58.         (setq nb (extract-number (vl-filename-base b)))
  59.         (if (= na nb)
  60.           (< (strcase (vl-filename-base a)) (strcase (vl-filename-base b)))
  61.           (< na nb)
  62.         )
  63.       ))
  64.     )
  65.   )

  66.   (defun prepare-temp-env (file-list temp-dir / fso src-path temp-path file-obj attrs copied-count fname)
  67.     (setq fso (vlax-create-object "Scripting.FileSystemObject"))
  68.     (if (vlax-invoke fso 'FolderExists temp-dir)
  69.       (vl-catch-all-apply 'vlax-invoke (list fso 'DeleteFolder temp-dir :vlax-true))
  70.     )
  71.     (vl-mkdir temp-dir)
  72.     (setq copied-count 0)
  73.     (if file-list
  74.       (progn
  75.         (princ "\n[系统] 正在初始化临时环境...")
  76.         (foreach src-path file-list
  77.           (setq fname (vl-filename-base src-path))
  78.           (setq temp-path (strcat temp-dir "\" fname ".dwg"))
  79.           (if (vl-file-copy src-path temp-path)
  80.             (progn
  81.               (setq file-obj (vl-catch-all-apply 'vlax-invoke (list fso 'GetFile temp-path)))
  82.               (if (and file-obj (not (vl-catch-all-error-p file-obj)))
  83.                 (progn
  84.                   (setq attrs (vlax-get file-obj 'Attributes))
  85.                   (if (= (logand attrs 1) 1)
  86.                     (vlax-put file-obj 'Attributes (logand attrs 65534))
  87.                   )
  88.                   (vlax-release-object file-obj)
  89.                 )
  90.               )
  91.               (setq copied-count (1+ copied-count))
  92.               (princ (strcat "\n  -> 副本就绪: " fname ".dwg"))
  93.             )
  94.           )
  95.         )
  96.       )
  97.     )
  98.     (if fso (vlax-release-object fso))
  99.     (> copied-count 0)
  100.   )

  101.   (defun get-plotters ()
  102.     (vla-RefreshPlotDeviceInfo clayout)
  103.     (vlax-safearray->list (vlax-variant-value (vla-GetPlotDeviceNames clayout)))
  104.   )
  105.   
  106.   (defun get-styles ()
  107.     (vla-RefreshPlotDeviceInfo clayout)
  108.     (vlax-safearray->list (vlax-variant-value (vla-GetPlotStyleTableNames clayout)))
  109.   )
  110.   
  111.   (defun get-media-names (plotter / media err)
  112.     (setq media nil)
  113.     (if (and plotter (/= plotter ""))
  114.       (progn
  115.         (setq err (vl-catch-all-apply 'vla-put-ConfigName (list clayout plotter)))
  116.         (if (not (vl-catch-all-error-p err))
  117.           (progn
  118.             (vla-RefreshPlotDeviceInfo clayout)
  119.             (setq media (vl-catch-all-apply
  120.               (function (lambda ()
  121.                 (vlax-safearray->list (vlax-variant-value (vla-GetCanonicalMediaNames clayout)))
  122.               ))
  123.               nil
  124.             ))
  125.             (if (vl-catch-all-error-p media) (setq media nil))
  126.           )
  127.         )
  128.       )
  129.     )
  130.     media
  131.   )
  132.   
  133.   (defun browse-folder (msg / sh folder folderobj path)
  134.     (setq path nil)
  135.     (setq sh (vla-getInterfaceObject acad-obj "Shell.Application"))
  136.     (if sh
  137.       (progn
  138.         (setq folder (vl-catch-all-apply 'vlax-invoke-method (list sh 'BrowseForFolder 0 msg 0)))
  139.         (if (and folder (not (vl-catch-all-error-p folder)))
  140.           (progn
  141.             (setq folderobj (vlax-get-property folder 'Self))
  142.             (setq path (vlax-get-property folderobj 'Path))
  143.             (vlax-release-object folderobj)
  144.             (vlax-release-object folder)
  145.           )
  146.         )
  147.         (vlax-release-object sh)
  148.       )
  149.     )
  150.     (if (and path (> (strlen path) 0))
  151.       (if (/= (substr path (strlen path) 1) "\")
  152.         (setq path (strcat path "\"))
  153.       )
  154.     )
  155.     path
  156.   )

  157.   (defun browse-single-file ()
  158.     (getfiled "选择DWG文件" "" "dwg" 4)
  159.   )
  160.   
  161.   (defun valid-folder-p (folder)
  162.     (and folder (= (type folder) 'STR) (> (strlen folder) 0))
  163.   )
  164.   
  165.   (defun pick-block (/ ent obj name)
  166.     (setq name nil)
  167.     (princ "\n选择图框块...")
  168.     (while (null name)
  169.       (setq ent (car (entsel "\n点击选择图框块: ")))
  170.       (if ent
  171.         (progn
  172.           (setq obj (vlax-ename->vla-object ent))
  173.           (if (= (vla-get-ObjectName obj) "AcDbBlockReference")
  174.             (if (vlax-property-available-p obj 'EffectiveName)
  175.               (setq name (vla-get-EffectiveName obj))
  176.               (setq name (vla-get-Name obj))
  177.             )
  178.             (princ "\n不是块引用")
  179.           )
  180.         )
  181.         (setq name "")
  182.       )
  183.     )
  184.     name
  185.   )
  186.   
  187.   (defun save-settings ()
  188.     (vl-registry-write reg-path "Block" (if sel-block sel-block ""))
  189.     (vl-registry-write reg-path "Printer" (if sel-plotter sel-plotter ""))
  190.     (vl-registry-write reg-path "Style" (if sel-style sel-style ""))
  191.     (vl-registry-write reg-path "Media" (if sel-media sel-media ""))
  192.     (vl-registry-write reg-path "Scale" (if sel-scale sel-scale "ScaleToFit"))
  193.     (vl-registry-write reg-path "Factor" (if sel-factor sel-factor "1.0"))
  194.     (vl-registry-write reg-path "Folder" (if sel-folder sel-folder ""))
  195.   )
  196.   
  197.   (defun load-settings ()
  198.     (setq sel-block (vl-registry-read reg-path "Block"))
  199.     (setq sel-plotter (vl-registry-read reg-path "Printer"))
  200.     (setq sel-style (vl-registry-read reg-path "Style"))
  201.     (setq sel-media (vl-registry-read reg-path "Media"))
  202.     (setq sel-scale (vl-registry-read reg-path "Scale"))
  203.     (setq sel-factor (vl-registry-read reg-path "Factor"))
  204.     (setq sel-folder (vl-registry-read reg-path "Folder"))
  205.     (if (or (not sel-scale) (= sel-scale "")) (setq sel-scale "ScaleToFit"))
  206.     (if (or (not sel-factor) (= sel-factor "")) (setq sel-factor "1.0"))
  207.   )

  208.   (defun load-folder-files (folder / files full-path)
  209.     (if (valid-folder-p folder)
  210.       (progn
  211.         (if (= (substr folder (strlen folder) 1) "\")
  212.           (setq folder (substr folder 1 (1- (strlen folder))))
  213.         )
  214.         (setq files (vl-directory-files folder "*.dwg" 1))
  215.         (setq files (smart-sort files))
  216.         (setq file-list nil)
  217.         (foreach f files
  218.           (setq full-path (strcat folder "\" f))
  219.           (setq file-list (append file-list (list full-path)))
  220.         )
  221.       )
  222.     )
  223.     file-list
  224.   )

  225.   (defun update-file-list-display ()
  226.     (start_list "lst_files")
  227.     (if file-list
  228.       (foreach f file-list
  229.         (add_list (strcat (vl-filename-base f) ".dwg"))
  230.       )
  231.       (add_list "(空)")
  232.     )
  233.     (end_list)
  234.     (set_tile "txt_count" (strcat "共 " (itoa (length file-list)) " 个文件"))
  235.   )

  236.   (defun update-path-display (idx)
  237.     (if (and file-list idx (>= idx 0) (< idx (length file-list)))
  238.       (progn
  239.         (setq input-path (nth idx file-list))
  240.         (set_tile "txt_path" input-path)
  241.       )
  242.     )
  243.   )

  244.   (defun remove-selected-file (idx / i new-list)
  245.     (if (and idx (>= idx 0) (< idx (length file-list)))
  246.       (progn
  247.         (setq i 0 new-list nil)
  248.         (foreach f file-list
  249.           (if (/= i idx)
  250.             (setq new-list (append new-list (list f)))
  251.           )
  252.           (setq i (1+ i))
  253.         )
  254.         (setq file-list new-list)
  255.       )
  256.     )
  257.   )

  258.   (defun add-file-to-list (filepath)
  259.     (if (and filepath
  260.              (findfile filepath)
  261.              (wcmatch (strcase filepath) "*.DWG")
  262.              (not (member filepath file-list)))
  263.       (progn
  264.         (setq file-list (append file-list (list filepath)))
  265.         (setq file-list (smart-sort-paths file-list))
  266.         T
  267.       )
  268.       nil
  269.     )
  270.   )

  271.   (defun load-from-input-path (path / clean-path)
  272.     (if (and path (/= path ""))
  273.       (progn
  274.         (setq clean-path (vl-string-trim " \t" path))
  275.         (if (= (substr clean-path (strlen clean-path) 1) "\")
  276.           (setq clean-path (substr clean-path 1 (1- (strlen clean-path))))
  277.         )
  278.         (cond
  279.           ((and (wcmatch (strcase clean-path) "*.DWG") (findfile clean-path))
  280.            (if (add-file-to-list clean-path)
  281.              (progn (princ (strcat "\n已添加文件: " (vl-filename-base clean-path))) T)
  282.              (progn (princ "\n文件已存在或无效") nil)
  283.            )
  284.           )
  285.           ((vl-file-directory-p clean-path)
  286.            (setq sel-folder (strcat clean-path "\"))
  287.            (load-folder-files sel-folder)
  288.            (if file-list
  289.              (progn (princ (strcat "\n已从文件夹加载 " (itoa (length file-list)) " 个文件")) T)
  290.              (progn (princ "\n文件夹中没有DWG文件") nil)
  291.            )
  292.           )
  293.           (T (alert (strcat "无效路径:\n" clean-path)) nil)
  294.         )
  295.       )
  296.       nil
  297.     )
  298.   )

  299.   (defun update-factor-state (scale-mode)
  300.     (if (= scale-mode "ScaleToFit")
  301.       (mode_tile "txt_factor" 0)
  302.       (mode_tile "txt_factor" 1)
  303.     )
  304.   )

  305.   (defun generate-worker-lsp (filepath block printer style media scale-mode factor / f)
  306.     (setq f (open filepath "w"))
  307.     (if f
  308.       (progn
  309.         (write-line ";; BatchPlot Worker V1.1" f)
  310.         (write-line "(princ "\\n[Worker] 加载中...")" f)
  311.         (write-line "" f)
  312.         (write-line "(defun ss->list (ss / n lst)" f)
  313.         (write-line "  (if ss (repeat (setq n (sslength ss)) (setq lst (cons (ssname ss (setq n (1- n))) lst)))) lst)" f)
  314.         (write-line "" f)
  315.         (write-line "(defun ax:2dpoint (pt / arr)" f)
  316.         (write-line "  (setq arr (vlax-make-safearray vlax-vbdouble (cons 0 1)))" f)
  317.         (write-line "  (vlax-safearray-put-element arr 0 (float (car pt)))" f)
  318.         (write-line "  (vlax-safearray-put-element arr 1 (float (cadr pt)))" f)
  319.         (write-line "  (vlax-make-variant arr))" f)
  320.         (write-line "" f)
  321.         (write-line "(defun shrink-bounding (bd factor / ll ur cx cy hw hh)" f)
  322.         (write-line "  (setq ll (car bd) ur (cadr bd))" f)
  323.         (write-line "  (setq cx (/ (+ (car ll) (car ur)) 2.0))" f)
  324.         (write-line "  (setq cy (/ (+ (cadr ll) (cadr ur)) 2.0))" f)
  325.         (write-line "  (setq hw (/ (- (car ur) (car ll)) 2.0 factor))" f)
  326.         (write-line "  (setq hh (/ (- (cadr ur) (cadr ll)) 2.0 factor))" f)
  327.         (write-line "  (list (list (- cx hw) (- cy hh)) (list (+ cx hw) (+ cy hh))))" f)
  328.         (write-line "" f)
  329.         (write-line "(defun islandscape (bd)" f)
  330.         (write-line "  (> (abs (- (caadr bd) (caar bd))) (abs (- (cadadr bd) (cadar bd)))))" f)
  331.         (write-line "" f)
  332.         (write-line "(defun getwidth (bd)" f)
  333.         (write-line "  (max (abs (- (caadr bd) (caar bd))) (abs (- (cadadr bd) (cadar bd)))))" f)
  334.         (write-line "" f)
  335.         (write-line "(defun fixscale (n / i large)" f)
  336.         (write-line "  (setq i 0 large (> n 100))" f)
  337.         (write-line "  (while (or (> n 100) (< n 10))" f)
  338.         (write-line "    (if large (setq n (/ n 10.0)) (setq n (* n 10.0)))" f)
  339.         (write-line "    (setq i (1+ i)))" f)
  340.         (write-line "  (setq n (fix (+ 0.5 n)))" f)
  341.         (write-line "  (repeat i (if large (setq n (* n 10.0)) (setq n (/ n 10.0)))) n)" f)
  342.         (write-line "" f)
  343.         (write-line "(defun sort-frames (bdlist / fuzz)" f)
  344.         (write-line "  (setq fuzz 10.0)" f)
  345.         (write-line "  (vl-sort bdlist" f)
  346.         (write-line "    (function (lambda (a b)" f)
  347.         (write-line "      (if (equal (caar a) (caar b) fuzz)" f)
  348.         (write-line "        (> (cadar a) (cadar b))" f)
  349.         (write-line "        (< (caar a) (caar b)))))))" f)
  350.         (write-line "" f)
  351.         (write-line "(defun str-split (str delim / lst pos)" f)
  352.         (write-line "  (while (setq pos (vl-string-search delim str))" f)
  353.         (write-line "    (if (> pos 0) (setq lst (cons (substr str 1 pos) lst)))" f)
  354.         (write-line "    (setq str (substr str (+ 2 pos))))" f)
  355.         (write-line "  (if (/= str "") (setq lst (cons str lst)))" f)
  356.         (write-line "  (reverse lst))" f)
  357.         (write-line "" f)
  358.         (write-line "(defun process-layout (doc lay lay-name cfg-block cfg-printer cfg-style cfg-media cfg-scale-mode cfg-factor /" f)
  359.         (write-line "         ss elist obj name minpt maxpt bdlist pW pH paperW i plot-bd scale frame-w target-list)" f)
  360.         (write-line "  (princ (strcat "\\n[" lay-name "]"))" f)
  361.         (write-line "  (if (vl-string-search ";" cfg-block)" f)
  362.         (write-line "    (setq target-list (mapcar (function strcase) (str-split cfg-block ";")))" f)
  363.         (write-line "    (setq target-list (list (strcase cfg-block))))" f)
  364.         (write-line "  (vla-ZoomExtents (vlax-get-acad-object))" f)
  365.         (write-line "  (setq ss (ssget "X" (list (cons 0 "INSERT") (cons 410 lay-name))))" f)
  366.         (write-line "  (if ss" f)
  367.         (write-line "    (progn" f)
  368.         (write-line "      (setq elist (ss->list ss) bdlist nil)" f)
  369.         (write-line "      (foreach ent elist" f)
  370.         (write-line "        (setq obj (vlax-ename->vla-object ent))" f)
  371.         (write-line "        (setq name (if (vlax-property-available-p obj 'EffectiveName)" f)
  372.         (write-line "                     (vla-get-EffectiveName obj) (vla-get-Name obj)))" f)
  373.         (write-line "        (if (member (strcase name) target-list)" f)
  374.         (write-line "          (if (not (vl-catch-all-error-p" f)
  375.         (write-line "                (vl-catch-all-apply 'vla-GetBoundingBox (list obj 'minpt 'maxpt))))" f)
  376.         (write-line "            (progn" f)
  377.         (write-line "              (setq minpt (vlax-safearray->list minpt))" f)
  378.         (write-line "              (setq maxpt (vlax-safearray->list maxpt))" f)
  379.         (write-line "              (setq bdlist (cons (list (list (car minpt) (cadr minpt))" f)
  380.         (write-line "                                       (list (car maxpt) (cadr maxpt))) bdlist))))))))" f)
  381.         (write-line "  (if bdlist" f)
  382.         (write-line "    (progn" f)
  383.         (write-line "      (setq bdlist (sort-frames bdlist))" f)
  384.         (write-line "      (princ (strcat " 找到 " (itoa (length bdlist)) " 个图框"))" f)
  385.         (write-line "      (vl-catch-all-apply 'vla-put-ActiveLayout (list doc lay))" f)
  386.         (write-line "      (vla-RefreshPlotDeviceInfo lay)" f)
  387.         (write-line "      (vl-catch-all-apply 'vla-put-ConfigName (list lay cfg-printer))" f)
  388.         (write-line "      (vla-RefreshPlotDeviceInfo lay)" f)
  389.         (write-line "      (vl-catch-all-apply 'vla-put-CanonicalMediaName (list lay cfg-media))" f)
  390.         (write-line "      (if (/= cfg-style "")" f)
  391.         (write-line "        (vl-catch-all-apply 'vla-put-StyleSheet (list lay cfg-style)))" f)
  392.         (write-line "      (vla-put-PaperUnits lay 1)" f)
  393.         (write-line "      (vla-GetPaperSize lay 'pW 'pH)" f)
  394.         (write-line "      (setq paperW (max pW pH) i 0)" f)
  395.         (write-line "      (foreach bd bdlist" f)
  396.         (write-line "        (setq i (1+ i))" f)
  397.         (write-line "        (princ (strcat "\\n  打印[" (itoa i) "/" (itoa (length bdlist)) "]"))" f)
  398.         (write-line "        (if (and (= cfg-scale-mode "ScaleToFit") (/= cfg-factor 1.0))" f)
  399.         (write-line "          (setq plot-bd (shrink-bounding bd cfg-factor))" f)
  400.         (write-line "          (setq plot-bd bd))" f)
  401.         (write-line "        (if (= (islandscape bd) (> pW pH))" f)
  402.         (write-line "          (vla-put-PlotRotation lay 0)" f)
  403.         (write-line "          (vla-put-PlotRotation lay 1))" f)
  404.         (write-line "        (vla-SetWindowToPlot lay (ax:2dpoint (car plot-bd)) (ax:2dpoint (cadr plot-bd)))" f)
  405.         (write-line "        (vla-put-PlotType lay 4)" f)
  406.         (write-line "        (vla-put-CenterPlot lay :vlax-true)" f)
  407.         (write-line "        (cond" f)
  408.         (write-line "          ((= cfg-scale-mode "ScaleToFit")" f)
  409.         (write-line "           (vla-put-UseStandardScale lay :vlax-true)" f)
  410.         (write-line "           (vla-put-StandardScale lay 0))" f)
  411.         (write-line "          ((= cfg-scale-mode "1:1")" f)
  412.         (write-line "           (vla-put-UseStandardScale lay :vlax-false)" f)
  413.         (write-line "           (vla-SetCustomScale lay 1.0 1.0))" f)
  414.         (write-line "          ((= cfg-scale-mode "Auto")" f)
  415.         (write-line "           (setq frame-w (getwidth bd))" f)
  416.         (write-line "           (setq scale (fixscale (/ frame-w paperW)))" f)
  417.         (write-line "           (vla-put-UseStandardScale lay :vlax-false)" f)
  418.         (write-line "           (vla-SetCustomScale lay 1.0 scale)))" f)
  419.         (write-line "        (if (vl-catch-all-error-p" f)
  420.         (write-line "              (vl-catch-all-apply 'vla-PlotToDevice (list (vla-get-Plot doc))))" f)
  421.         (write-line "          (princ " X")" f)
  422.         (write-line "          (princ " OK"))))" f)
  423.         (write-line "    (princ " 无匹配图框")))" f)
  424.         (write-line "" f)
  425.         (write-line "(defun c:AutoRunBatchPlot (/ acad doc layouts lay layout-list)" f)
  426.         (write-line "  (vl-load-com)" f)
  427.         (write-line "  (setq acad (vlax-get-acad-object))" f)
  428.         (write-line "  (setq doc (vla-get-ActiveDocument acad))" f)
  429.         (write-line "  (setq layouts (vla-get-Layouts doc))" f)
  430.         (write-line "  (if (getvar "BACKGROUNDPLOT") (setvar "BACKGROUNDPLOT" 0))" f)
  431.         (write-line (strcat "  (setq cfg-block "" block "")") f)
  432.         (write-line (strcat "  (setq cfg-printer "" printer "")") f)
  433.         (write-line (strcat "  (setq cfg-style "" style "")") f)
  434.         (write-line (strcat "  (setq cfg-media "" media "")") f)
  435.         (write-line (strcat "  (setq cfg-scale-mode "" scale-mode "")") f)
  436.         (write-line (strcat "  (setq cfg-factor " (rtos factor 2 6) ")") f)
  437.         (write-line "  (process-layout doc (vla-Item layouts "Model") "Model"" f)
  438.         (write-line "    cfg-block cfg-printer cfg-style cfg-media cfg-scale-mode cfg-factor)" f)
  439.         (write-line "  (setq layout-list nil)" f)
  440.         (write-line "  (vlax-for lay layouts" f)
  441.         (write-line "    (if (/= (vla-get-Name lay) "Model")" f)
  442.         (write-line "      (setq layout-list (cons lay layout-list))))" f)
  443.         (write-line "  (setq layout-list (vl-sort layout-list" f)
  444.         (write-line "    (function (lambda (a b) (< (vla-get-TabOrder a) (vla-get-TabOrder b))))))" f)
  445.         (write-line "  (foreach lay layout-list" f)
  446.         (write-line "    (process-layout doc lay (vla-get-Name lay)" f)
  447.         (write-line "      cfg-block cfg-printer cfg-style cfg-media cfg-scale-mode cfg-factor))" f)
  448.         (write-line "  (princ "\\n--- 当前文件完成 ---")" f)
  449.         (write-line "  (princ))" f)
  450.         (write-line "" f)
  451.         (write-line "(c:AutoRunBatchPlot)" f)
  452.         (close f)
  453.         filepath
  454.       )
  455.       nil
  456.     )
  457.   )

  458.   (defun generate-scr-file (scr-path worker-path temp-dir file-list / f fname full-path)
  459.     (setq worker-path (path-slash worker-path))
  460.     (if file-list
  461.       (progn
  462.         (setq f (open scr-path "w"))
  463.         (if f
  464.           (progn
  465.             (write-line "(setvar "SDI" 0)" f)
  466.             (write-line "(setvar "FILEDIA" 0)" f)
  467.             (write-line "(setvar "CMDECHO" 0)" f)
  468.             (write-line "(if (getvar "SECURELOAD") (setvar "SECURELOAD" 0))" f)
  469.             (write-line "(if (getvar "XREFNOTIFY") (setvar "XREFNOTIFY" 0))" f)
  470.             (write-line "(if (getvar "PROXYNOTICE") (setvar "PROXYNOTICE" 0))" f)
  471.             (foreach file file-list
  472.               (setq fname (vl-filename-base file))
  473.               (setq full-path (strcat temp-dir "\" fname ".dwg"))
  474.               (setq full-path (path-slash full-path))
  475.               (write-line (strcat "_.OPEN "" full-path """) f)
  476.               (write-line "_.DELAY 300" f)
  477.               (write-line (strcat "(if (findfile "" worker-path "") (load "" worker-path ""))") f)
  478.               (write-line "_.DELAY 100" f)
  479.               (write-line "_.CLOSE _N" f)
  480.             )
  481.             (write-line "(setvar "FILEDIA" 1)" f)
  482.             (write-line "(setvar "CMDECHO" 1)" f)
  483.             (write-line "(if (getvar "SECURELOAD") (setvar "SECURELOAD" 1))" f)
  484.             (write-line "(princ "\\n==============================")" f)
  485.             (write-line "(princ "\\n  批量打印全部完成!")" f)
  486.             (write-line "(princ "\\n==============================")" f)
  487.             (write-line "(princ)" f)
  488.             (close f)
  489.             T
  490.           )
  491.           nil
  492.         )
  493.       )
  494.       nil
  495.     )
  496.   )

  497.   ;; ========== DCL 中文界面 ==========
  498.   (defun write-dcl (filename / f)
  499.     (setq f (open filename "w"))
  500.     (if f
  501.       (progn
  502.         (write-line "batchplot : dialog {" f)
  503.         (write-line "  label = "批量打印 V1.1";" f)
  504.         (write-line "  : row {" f)
  505.         (write-line "    : boxed_column {" f)
  506.         (write-line "      label = "待打印文件";" f)
  507.         (write-line "      : row {" f)
  508.         (write-line "        : edit_box { key = "txt_path"; width = 30; edit_limit = 512; }" f)
  509.         (write-line "        : button { label = "..."; key = "btn_browse"; width = 3; fixed_width = true; }" f)
  510.         (write-line "      }" f)
  511.         (write-line "      : row {" f)
  512.         (write-line "        : button { label = "加载路径"; key = "btn_load"; width = 10; }" f)
  513.         (write-line "        : button { label = "添加文件"; key = "btn_add"; width = 10; }" f)
  514.         (write-line "        : button { label = "清空"; key = "btn_clear"; width = 6; }" f)
  515.         (write-line "      }" f)
  516.         (write-line "      : list_box { key = "lst_files"; width = 36; height = 15; multiple_select = false; }" f)
  517.         (write-line "      : row {" f)
  518.         (write-line "        : text { key = "txt_count"; label = "共 0 个文件"; width = 16; }" f)
  519.         (write-line "        : button { label = "删除选中"; key = "btn_remove"; width = 10; }" f)
  520.         (write-line "      }" f)
  521.         (write-line "    }" f)
  522.         (write-line "    : column {" f)
  523.         (write-line "      : boxed_column {" f)
  524.         (write-line "        label = "图框设置";" f)
  525.         (write-line "        : row {" f)
  526.         (write-line "          : edit_box { label = "块名:"; key = "txt_block"; width = 22; }" f)
  527.         (write-line "          : button { label = "拾取"; key = "btn_pick"; width = 6; }" f)
  528.         (write-line "        }" f)
  529.         (write-line "        : text { label = "多个块名用分号;分隔"; }" f)
  530.         (write-line "      }" f)
  531.         (write-line "      : boxed_column {" f)
  532.         (write-line "        label = "打印机设置";" f)
  533.         (write-line "        : popup_list { label = "打印机:"; key = "pop_printer"; width = 32; }" f)
  534.         (write-line "        : popup_list { label = "样式表:"; key = "pop_style"; width = 32; }" f)
  535.         (write-line "        : popup_list { label = "纸张:  "; key = "pop_media"; width = 32; }" f)
  536.         (write-line "      }" f)
  537.         (write-line "      : boxed_column {" f)
  538.         (write-line "        label = "比例设置";" f)
  539.         (write-line "        : popup_list { label = "比例:"; key = "pop_scale"; width = 18; }" f)
  540.         (write-line "        : edit_box { label = "放大系数:"; key = "txt_factor"; width = 12; }" f)
  541.         (write-line "        : text { label = "(放大系数仅布满图纸时有效)"; }" f)
  542.         (write-line "      }" f)
  543.         (write-line "      : boxed_column {" f)
  544.         (write-line "        label = "使用说明";" f)
  545.         (write-line "        : text { label = "1. 路径栏可粘贴文件夹或DWG路径"; }" f)
  546.         (write-line "        : text { label = "2. 点击[加载路径]导入文件"; }" f)
  547.         (write-line "        : text { label = "3. 选中列表项可查看完整路径"; }" f)
  548.         (write-line "      }" f)
  549.         (write-line "    }" f)
  550.         (write-line "  }" f)
  551.         (write-line "  spacer_1;" f)
  552.         (write-line "  ok_cancel;" f)
  553.         (write-line "}" f)
  554.         (close f)
  555.         T
  556.       )
  557.       nil
  558.     )
  559.   )

  560.   ;; ========== 主程序 ==========
  561.   (load-settings)
  562.   (setq plotters (get-plotters))
  563.   (setq styles (get-styles))
  564.   (setq dcl-file (vl-filename-mktemp "bp_scr" nil ".dcl"))
  565.   (write-dcl dcl-file)
  566.   (setq dcl-id (load_dialog dcl-file))
  567.   (setq loop T)
  568.   
  569.   (if (valid-folder-p sel-folder)
  570.     (progn
  571.       (load-folder-files sel-folder)
  572.       (setq input-path sel-folder)
  573.     )
  574.   )
  575.   
  576.   (while loop
  577.     (if (not (new_dialog "batchplot" dcl-id))
  578.       (setq loop nil)
  579.       (progn
  580.         (start_list "pop_printer") (mapcar 'add_list plotters) (end_list)
  581.         (start_list "pop_style") (mapcar 'add_list styles) (end_list)
  582.         (start_list "pop_scale")
  583.         (add_list "布满图纸")
  584.         (add_list "自动比例")
  585.         (add_list "1:1")
  586.         (end_list)
  587.         
  588.         (update-file-list-display)
  589.         
  590.         (if (and input-path (/= input-path ""))
  591.           (set_tile "txt_path" input-path)
  592.           (if sel-folder (set_tile "txt_path" sel-folder))
  593.         )
  594.         
  595.         (cond
  596.           ((= sel-scale "ScaleToFit") (set_tile "pop_scale" "0"))
  597.           ((= sel-scale "Auto") (set_tile "pop_scale" "1"))
  598.           ((= sel-scale "1:1") (set_tile "pop_scale" "2"))
  599.           (T (set_tile "pop_scale" "0") (setq sel-scale "ScaleToFit"))
  600.         )
  601.         
  602.         (update-factor-state sel-scale)
  603.         
  604.         (if sel-block (set_tile "txt_block" sel-block))
  605.         (set_tile "txt_factor" (if sel-factor sel-factor "1.0"))
  606.         
  607.         (if (and sel-plotter (member sel-plotter plotters))
  608.           (set_tile "pop_printer" (itoa (vl-position sel-plotter plotters)))
  609.         )
  610.         
  611.         (if (and sel-style (member sel-style styles))
  612.           (set_tile "pop_style" (itoa (vl-position sel-style styles)))
  613.         )
  614.         
  615.         (defun update-media-list (idx)
  616.           (if (and plotters (< (atoi idx) (length plotters)))
  617.             (progn
  618.               (setq sel-plotter (nth (atoi idx) plotters))
  619.               (setq media-list (get-media-names sel-plotter))
  620.               (start_list "pop_media")
  621.               (if media-list
  622.                 (mapcar 'add_list media-list)
  623.                 (add_list "无可用纸张")
  624.               )
  625.               (end_list)
  626.               (if (and media-list sel-media (member sel-media media-list))
  627.                 (set_tile "pop_media" (itoa (vl-position sel-media media-list)))
  628.                 (if media-list (setq sel-media (car media-list)))
  629.               )
  630.             )
  631.           )
  632.         )
  633.         
  634.         (update-media-list
  635.           (if (and sel-plotter (member sel-plotter plotters))
  636.             (itoa (vl-position sel-plotter plotters))
  637.             "0"
  638.           )
  639.         )
  640.         
  641.         (action_tile "btn_pick" "(done_dialog 2)")
  642.         (action_tile "btn_browse" "(done_dialog 3)")
  643.         (action_tile "btn_load" "(done_dialog 7)")
  644.         (action_tile "btn_add" "(done_dialog 4)")
  645.         (action_tile "btn_remove" "(done_dialog 5)")
  646.         (action_tile "btn_clear" "(done_dialog 6)")
  647.         
  648.         (action_tile "lst_files"
  649.           "(progn (setq selected-file-idx (atoi $value)) (update-path-display selected-file-idx))"
  650.         )
  651.         
  652.         (action_tile "txt_path" "(setq input-path $value)")
  653.         (action_tile "pop_printer" "(update-media-list $value)")
  654.         (action_tile "pop_style" "(setq sel-style (nth (atoi $value) styles))")
  655.         (action_tile "pop_media" "(if media-list (setq sel-media (nth (atoi $value) media-list)))")
  656.         (action_tile "txt_block" "(setq sel-block $value)")
  657.         (action_tile "txt_factor" "(setq sel-factor $value)")
  658.         
  659.         (action_tile "pop_scale"
  660.           "(progn (cond ((= $value "0") (setq sel-scale "ScaleToFit")) ((= $value "1") (setq sel-scale "Auto")) ((= $value "2") (setq sel-scale "1:1"))) (update-factor-state sel-scale))"
  661.         )
  662.         
  663.         (action_tile "accept" "(setq input-path (get_tile "txt_path"))(done_dialog 1)")
  664.         (action_tile "cancel" "(done_dialog 0)")
  665.         
  666.         (setq result (start_dialog))
  667.         
  668.         (cond
  669.           ((= result 1)
  670.            (setq loop nil)
  671.            (if (null sel-scale) (setq sel-scale "ScaleToFit"))
  672.            (save-settings)
  673.            
  674.            (if (and file-list (> (length file-list) 0) sel-block (/= sel-block "") sel-media)
  675.              (progn
  676.                (setq temp-dir "C:\\BatchPlotTemp")
  677.                (princ "\n======================================")
  678.                (princ "\n[批量打印 V1.1] 准备中...")
  679.                (princ (strcat "\n文件数: " (itoa (length file-list))))
  680.                (princ (strcat "\n图框: " sel-block))
  681.                (princ (strcat "\n比例: " sel-scale))
  682.                (princ "\n======================================")
  683.                
  684.                (if (prepare-temp-env file-list temp-dir)
  685.                  (progn
  686.                    (setq worker-path (strcat temp-dir "\\BP_Worker.lsp"))
  687.                    (setq scr-path (strcat temp-dir "\\BP_Job.scr"))
  688.                    (setq factor-num (atof sel-factor))
  689.                    (if (or (= factor-num 0.0) (< factor-num 0.1)) (setq factor-num 1.0))
  690.                   
  691.                    (princ "\n生成Worker...")
  692.                    (if (generate-worker-lsp worker-path sel-block sel-plotter sel-style sel-media sel-scale factor-num)
  693.                      (progn
  694.                        (princ " OK")
  695.                        (princ "\n生成脚本...")
  696.                        (if (generate-scr-file scr-path worker-path temp-dir file-list)
  697.                          (progn
  698.                            (princ " OK")
  699.                            (unload_dialog dcl-id)
  700.                            (setq dcl-id nil)
  701.                            (princ "\n启动打印...")
  702.                            (command "_.SCRIPT" scr-path)
  703.                          )
  704.                          (alert "脚本生成失败!")
  705.                        )
  706.                      )
  707.                      (alert "Worker生成失败!")
  708.                    )
  709.                  )
  710.                  (alert "准备临时环境失败!\n请检查磁盘空间和权限。")
  711.                )
  712.              )
  713.              (alert "请检查:\n- 文件列表不能为空\n- 必须填写图框块名\n- 必须选择纸张")
  714.            )
  715.           )
  716.          
  717.           ((= result 2)
  718.            (setq temp (pick-block))
  719.            (if (and temp (/= temp ""))
  720.              (if (and sel-block (/= sel-block ""))
  721.                (setq sel-block (strcat sel-block ";" temp))
  722.                (setq sel-block temp)
  723.              )
  724.            )
  725.           )
  726.          
  727.           ((= result 3)
  728.            (setq temp (browse-folder "选择DWG文件夹"))
  729.            (if temp (setq input-path temp))
  730.           )
  731.          
  732.           ((= result 4)
  733.            (setq temp (browse-single-file))
  734.            (if temp
  735.              (if (add-file-to-list temp)
  736.                (progn (setq input-path temp) (princ (strcat "\n已添加: " (vl-filename-base temp))))
  737.                (princ "\n文件已存在或无效")
  738.              )
  739.            )
  740.           )
  741.          
  742.           ((= result 5)
  743.            (if (and selected-file-idx (>= selected-file-idx 0) (< selected-file-idx (length file-list)))
  744.              (progn
  745.                (princ (strcat "\n已删除: " (vl-filename-base (nth selected-file-idx file-list))))
  746.                (remove-selected-file selected-file-idx)
  747.                (setq selected-file-idx nil)
  748.              )
  749.              (alert "请先选择要删除的文件")
  750.            )
  751.           )
  752.          
  753.           ((= result 6)
  754.            (setq file-list nil selected-file-idx nil input-path "")
  755.            (princ "\n文件列表已清空")
  756.           )
  757.          
  758.           ((= result 7)
  759.            (load-from-input-path input-path)
  760.           )
  761.          
  762.           ((= result 0) (setq loop nil))
  763.         )
  764.       )
  765.     )
  766.   )
  767.   
  768.   (if dcl-id (unload_dialog dcl-id))
  769.   (if (and dcl-file (findfile dcl-file)) (vl-file-delete dcl-file))
  770.   (princ)
  771. )
  • 上一篇:没有了
  • 下一篇:没有了