明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5950|回复: 16

[源码] 利用论坛收集的函数,发个按照编号打印图纸的程序

[复制链接]
发表于 2013-12-22 08:43:46 | 显示全部楼层 |阅读模式
本帖最后由 newbuser 于 2013-12-22 08:48 编辑

本人菜鸟级水平,利用论坛搜集的函数,组装了个自己觉得平时工作用的到的一顺序打印程序,希望能够帮到有用之人。

  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.        "l"           ; 输入图形方向(纵向:P 横向:L)
  64.        "n"           ; 是否反向打印
  65.        "w"           ; 输入打印区域(显示:D范围:E图形界限:L 视图:V 窗口:W)
  66.        p1                   ; 打印图框左下角点坐标
  67.        p3                   ; 打印图框右上角点坐标
  68.        "f"           ; 输入打印比例(F:布满)
  69.        "c"           ; 输入打印偏移(居中打印:C)
  70.        "y"           ; 是否按样式打印
  71.        "acad.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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

总体看起来可能没什么问题,但是用COMMAND调用PLOT命令这会在CAD版本不同的时候可能导致命令不能执行,我一年多前在2006下这么写过,也是最后调用plot来执行打印,结果到2004上它就参数错误  发表于 2013-12-22 22:35

评分

参与人数 1明经币 +1 收起 理由
zctao1966 + 1 神马都是浮云

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2017-12-22 14:56:54 | 显示全部楼层
楼主,你的程序只单一方向(纵向或者横向),能不能智能识别并智能旋转啊,这样实用性更高,望重新改善后的程序并共享下源码,感谢了。
发表于 2017-10-20 09:31:00 | 显示全部楼层
试试看看 看起来比较实用
发表于 2013-12-22 10:01:51 | 显示全部楼层
(defun vl (lst) (mapcar 'cdadr lst))
 楼主| 发表于 2013-12-22 10:32:20 | 显示全部楼层
ZZXXQQ 发表于 2013-12-22 10:01
(defun vl (lst) (mapcar 'cdadr lst))

感谢ZZXXQQ版主的简化思路。
发表于 2013-12-22 12:55:57 | 显示全部楼层
运行效果良好,有时间慢慢研究

点评

哪里有源码,哪里就能见到你的身影  发表于 2013-12-22 14:52
呵呵,看样子你专门收集源码啊  发表于 2013-12-22 14:50
发表于 2013-12-22 19:05:25 | 显示全部楼层
是啊,我爱好这些,也天天写,也收集
发表于 2013-12-22 22:43:01 | 显示全部楼层
对于其中的点在不在线内的问题最让我郁闷,由于CAD本身或者是取位的原因,明明在线上的点可能会被判为不在线上,甚至碰到过两条线的公共顶点结果它不在另一条线上,给来了个互不相认,弄得我没办法,只好先判断点到线的距离是不是小到可以认为它在线上,然后再去对线进行偏移,比较偏移前后点到线的距离是增大了还是减小了来进行内外的判断。总之CAD它对于实数取位的问题弄得我相当头痛
 楼主| 发表于 2013-12-23 08:27:45 | 显示全部楼层
llsheng_73 发表于 2013-12-22 22:43
对于其中的点在不在线内的问题最让我郁闷,由于CAD本身或者是取位的原因,明明在线上的点可能会被判为不在线 ...

这些特殊状况还未遇到过。这个程序还有待完善,程序中无奈用了两次repeat循环,无法使用嵌套foreach,将图框角点坐标表根据图框内的序号坐标排序。
发表于 2013-12-23 18:58:11 | 显示全部楼层
发表于 2014-4-1 12:34:07 | 显示全部楼层
图中有好多图纸,已套好图框(图框为属性块)怎么框选图纸,将图纸按属性快中图纸编号按横向(纵向)间隔排序,这样批量打印后就不用分图整理了
 楼主| 发表于 2014-4-1 14:38:46 | 显示全部楼层
bai2000 发表于 2014-4-1 12:34
图中有好多图纸,已套好图框(图框为属性块)怎么框选图纸,将图纸按属性快中图纸编号按横向(纵向)间隔排 ...

你说的是地形图吗?如果是紧挨着的套好图框的地形图估计是不行的,因为相邻的图框重合的部分仍然会被打印出来的。这种需要你分图后,利用scr来完成该项任务。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:37 , Processed in 0.226791 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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