明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: w245272914

[源码] 智能批量打印程序

[复制链接]
发表于 2017-12-26 13:28 | 显示全部楼层

又想拿别人开发的快刀批量打印卖钱?  你到底尊不尊重版权     
 楼主| 发表于 2017-12-26 13:54 | 显示全部楼层
依然小小鸟 发表于 2017-12-26 13:28
又想拿别人开发的快刀批量打印卖钱?  你到底尊不尊重版权

兄弟,谢谢提醒  ^^   
你有这种程序吗?可以共享给我吗、感谢你了
Y10086520@163.com
发表于 2017-12-26 17:59 | 显示全部楼层
先下载学习一下
发表于 2017-12-27 08:45 | 显示全部楼层
ygp820601 发表于 2017-12-26 10:58
注释的中文都是乱码?
  1. ;;需建立打印每幅图范围多段线图框及编号,并且令其处同一图层
  2. ;;主程序
  3. (defun c:sxdy ( / cmd doc e2 el2 i i2 itm lst lst1 lst2 msg n os p1 p3 sgel ss1 ss2 tc xy)
  4.     (defun *error* (msg)
  5.     (setvar "cmdecho" cmd) ;_ 恢复cmdecho系统变量
  6.     (setvar "osmode" os) ;_ 恢复osmode系统变量
  7.     (princ "error: ")
  8.     (princ msg) ;_ 打印错误信息
  9.     (princ)
  10.   )
  11.   (setq cmd (getvar "cmdecho")) ;_ 保存系统变量cmdecho值
  12.   (setq os (getvar "osmode"))
  13.   (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  14.   (vla-StartUndoMark doc)
  15.   (setvar "osmode" 0)
  16.   (setq tc (assoc 8 (entget (car (entsel "\n 请选任选一打印序号==>> ")))))
  17.   (command "-layer" "p" "n" (cdr tc) "")
  18.   (print "\n 请选择需要打印的范围的图框==>>")
  19.   ;同时获取图框选择集ss1 文字选择集ss2
  20.   (setq ss1 nil ss2 nil)
  21.   (if (setq ss1 (ssget (list (cons 0 "TEXT,LWPOLYLINE") tc)))
  22.     (foreach itm (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss1)))
  23.       (if (= (cdr (assoc 0 (entget itm))) "TEXT")
  24.         (progn
  25.           (or ss2 (setq ss2 (ssadd)))
  26.           (ssadd itm ss2)
  27.           (ssdel itm ss1)
  28.         )
  29.       )
  30.     )
  31.   )
  32. (setq i2 0)
  33. (setq lst2 nil)
  34. (repeat (sslength ss2)
  35.   (setq e2 (ssname ss2 i2))
  36.   (setq el2 (entget e2))
  37.   (setq lst2 (append lst2 (list (list (read (cdr (assoc 1 el2))) (assoc 10 el2)))))
  38.   (setq i2 (1+ i2))
  39.   )
  40.   (setq lst2 (sort lst2))     ;;已经按图框内数字1,2,3,4进行排序的表lst2 ((序号1 (10 三维点)) (序?2 (10 三号)))
  41.   (setq lst2 (vl lst2))       ;;去掉lst2中的序号,重组序号表 lst2
  42.   (lstlw ss1)                 ;; 得到图框角点坐标表lst1         
  43.   (setq n 0)
  44.   (setq lst nil)
  45.   (repeat (length lst2)
  46.     (setq sgel (nth n lst2))   ;;获取单个序号坐坐标
  47.     (setq lst (append lst  (pp sgel lst1)))  ;;得到对应图框坐标表
  48.     (setq n (1+ n))
  49.     )
  50.   (setq i 0)
  51.   (repeat (length lst)
  52.     (setq xy (nth i lst))
  53.     (setq p1 (car xy))
  54.     (setq p3 (cadr (cdr xy)))
  55.     (command "zoom" "w" p1 p3)
  56.     (command "-plot" "y"         ; 是否需要详细打印配置
  57.        "模型"           ; 输入布局、模型名称
  58.        "pdfFactory Pro"         ; 输入输出设备的名称  此处举例虚拟打印机 pdfFactory Pro
  59.                                        ; (lisp语言中的一个 \ 符号需要用 \\符号表示,即\=>\\)
  60.                                  ; 例如:共享打印机 \\Adminstractor\Kyocera KM-2560 KX应该表示为\\\\Adminstractor\\Kyocera KM-2560 KX
  61.        "A4"          ; 输入图纸尺寸A4
  62.        "m"           ; 输入图纸单位(I:英寸 M:毫米)
  63.        "p"           ; 输入图形方向(纵向:P 横向:L  )
  64.        "n"           ; 是否反向打印
  65.        "w"           ; 输入打印区域(显示:D范围:E图形界限:L 视图:V 窗口:W)
  66.        p1                   ; 打印图框左下角点坐标
  67.        p3                   ; 打印图框右上角点坐标
  68.        "f"           ; 输入打印比例(F:布满)
  69.        "c"           ; 输入打印偏移(居中打印:C)
  70.        "y"           ; 是否按样式打印
  71.        "monochrome.ctb"           ; 输入打印样式名称
  72.        "y"           ; 是否打印线宽
  73.        "a"           ; 输入着色打印设置置(按显示:A  线框:W
  74.                      ; 消隐:H 渲染:R)
  75.        "n"           ; 是否打印到文件
  76.        "n"           ; 是否保存页面设置的修改
  77.        "y"           ; 是否继续打印
  78.     )
  79.     (setq i (+ i 1))
  80.   )
  81.     (setvar "cmdecho" cmd) ;_ 恢复cmdecho系统变量
  82.   (setvar "osmode" os)   ;_ 恢复osmode系统变量
  83.   (vla-EndUndoMark doc)
  84.   (vlax-release-object doc)
  85.   (princ)
  86. )
  87.   
  88. ;获取图框集合多段点表总表
  89. (defun lstlw (ss)
  90.   (setq i1 0)
  91.   (setq lst1 nil)
  92.   (repeat (sslength ss)
  93.     (setq e1 (ssname ss i1))
  94.     (setq el1 (LWPL e1))
  95.     (setq lst1 (append lst1 (list el1)))
  96.     (setq i1 (1+ i1))
  97.   )
  98. )
  99. ;获取多段线点表函数
  100. (defun LWPL (x /)
  101.   (vl-remove-if
  102.     'not
  103.     (mapcar
  104.       '(lambda (x)
  105.    (if (= (car x) 10)
  106.      (append (cdr x) '(0))
  107.    )
  108.        )
  109.       (entget x)
  110.     )
  111.   )
  112. )

  113. ;;?((1 (10 1117.07 581.131 0.0)) (2 (10 1693.6 596.47 0.0)))中的序号1 2去掉
  114. (defun  vl (lst)
  115.    (mapcar '(lambda (x)
  116.         (cdr (car (cdr x)))
  117.       )
  118.      lst
  119.    )
  120. )

  121. ;;提取出对应单个图框的坐标表
  122. (defun pp (pt lst)
  123.   (vl-remove-if
  124.     'not
  125.     (mapcar
  126.       '(lambda (x)
  127.    (if (= T (isPtinPM pt x))
  128.      x
  129.    )
  130.        )
  131.       lst
  132.     )
  133.   )
  134. )
  135. ;;根据文字内容进行表排序
  136. (defun sort (LST / REC)
  137.   (defun REC (A B)
  138.     ;;递归
  139.     (cond ((equal (car A) (car B) 1E-4)
  140.      (REC (cdr A) (cdr B))
  141.     )
  142.     (T (< (car A) (car B)))
  143.     )
  144.   )
  145.   (vl-sort LST '(lambda (P1 P2) (REC P1 P2)))
  146. )
  147. ;;eg:((1 (10 1117.07 581.131 0.0)) (2 (10 1693.6 596.47 0.0)) (3 (10 2284.33 603.215 0.0)))
  148. ;;;******************************************************************************
  149. ;;; No.51  判断点是否在多边形内(狂刀程序)                                       
  150. ;;;xPt是要判断的点坐标(x y z ), Points是多边形顶点列表((x1 y1 z1) (x2 y2 z2)...)
  151. ;;;******************************************************************************
  152. (defun isPtinPM  (xPt Points)
  153.   (equal
  154.     PI
  155.     (abs
  156.       (apply
  157.   '+
  158.   (mapcar  '(lambda (x y) (rem (- (angle xPt x) (angle xPt y)) PI))
  159.     (reverse (cdr (reverse (cons (last Points) Points))))
  160.     Points
  161.   )
  162.       )
  163.     )
  164.     1e-6
  165.   )          ;end_equal
  166. )          ;end_defun



翻译了一下
发表于 2017-12-27 09:06 | 显示全部楼层
最近正好也在研究这块。
1. 关于打印方向的问题,command plot里就有一个参数控制的(P/L),你的注释里就有。所以可以设置一个参数dir,在打印前,可以先根据p1和p3,判断dir是P还是L,然后在command里用dir来控制就可以。
2. 另外关于pdf位置,如果用的是07版以上的CAD的话,用自带的DWG TO PDF.pc3来设置路径比较方便。
3. 当前dwg文件的路径用(getvar "dwgprefix")获得
发表于 2017-12-27 11:36 | 显示全部楼层
lostbalance 发表于 2017-12-27 09:06
最近正好也在研究这块。
1. 关于打印方向的问题,command plot里就有一个参数控制的(P/L),你的注释里就 ...

请教一下,关于第二点提到的位置,具体应该怎样设置呢?
这个困扰了好久,每次都是先手动用一下DWG TO PDF.pc3一次,确定了位置再批量转PDF,好麻烦。
发表于 2017-12-27 12:55 | 显示全部楼层
里面怎么是乱码?
发表于 2017-12-27 14:57 | 显示全部楼层
本帖最后由 lostbalance 于 2017-12-27 15:03 编辑
行行止 发表于 2017-12-27 11:36
请教一下,关于第二点提到的位置,具体应该怎样设置呢?
这个困扰了好久,每次都是先手动 ...

用上面第3条提到的dwgprefix获取当前文件夹路径,是个字符串,类似"c://test",然后确定pdf的名字,比如"a.pdf",把路径和文件名合并成一个字符串str,然后在用command plot打印的代码中修改使用就可以。
补充下:关于command plot,我编程序的时候发现,根据打印成品的不同,格式有变化。
1. 用CAD的打印机DWG TO PDF.PC3,在设置打印到文件时,直接用路径地址(含文件名),不需要加y/n;
2. 打印PLT时,在设置打印到文件时,要先输入y,然后加路径地址;
3. 用其他的打印机打图纸或PDF时,在设置打印到文件时,输入n;
4. 打印图片格式等之类的,因为没怎么用过,不清楚了
以下是我编的打印插件里的,你可以看着参考下。ps,我的在设置方向的时候单独加了A2图纸的判断是公司这边打印机的关系。
(setq xd (abs (- (car p1) (car p2))))
(setq yd (abs (- (cadr p1) (cadr p2))))
(cond
    ((and sc (equal (* xd 1. sc) 420 20) (equal (* yd 1. sc) 594 20))
        (setq dir "L")
    )
    ((and sc (equal (* xd 1. sc) 594 20) (equal (* yd 1. sc) 420 20))
        (setq dir "P")
    )
    ((>= xd yd)
        (setq dir "L")
    )
    (t
        (setq dir "P")
    )
)
(command
    "._plot"
    "y"     ;;详细配置
    ""      ;;模型或布局名
    prt_n   ;;打印机
    paper_n ;;图纸尺寸
    "m"     ;;单位,英寸I/毫米M
    dir     ;;打印方向,纵向P/横向L
    "n"     ;;颠倒打印,Y/N
    "w"     ;;打印区域,窗口W
    "_non" p1
    "_non" p2
)
(if sc
    (command
        (rtos sc) ;;打印比例,或布满F
        "0,0"     ;;打印偏移,或居中C
    )
    (command
        "f"       ;;打印比例,或布满F
        "c"       ;;打印偏移,或居中C
    )
)
(command
    "y" ;;是否按打印样式,Y/N
    ctb ;;样式表
    "y" ;;打印线宽,Y/N
    "w" ;;着色打印,传统线框W
)
(cond ;;打印到文件,Y/N
    ((and (= prt 1) (= (strcase prt_n) "DWG TO PDF.PC3"))
        (command (strcat path "\\done\\" (add_fn_no) ".pdf"))
    )
    ((= prt 2)
        (command "y" (strcat path "\\done\\" (add_fn_no) ".plt"))
    )
    (t
        (command "n")
    )
)
(command
    "n" ;;保存设置,Y/N
    "y" ;;是否打印,Y/N
)
发表于 2017-12-28 08:05 | 显示全部楼层
本帖最后由 行行止 于 2017-12-28 08:07 编辑
lostbalance 发表于 2017-12-27 14:57
用上面第3条提到的dwgprefix获取当前文件夹路径,是个字符串,类似"c://test",然后确定pdf的名字,比如" ...


原来还可以把命令这样拆分的啊,不仅解决了我之前的问题,还打开了一条没发现的新路,真的万分感谢!
 楼主| 发表于 2017-12-28 10:23 | 显示全部楼层

谢谢大神~  :   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-29 14:07 , Processed in 0.233405 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表