明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2718|回复: 12

[讨论]批量打印的顺序烦恼,谁可解?

  [复制链接]
发表于 2004-8-18 16:30 | 显示全部楼层 |阅读模式
;看到了本站中的好多关于批量打印的程序,但是所打印的图纸顺序是凌乱的,因此想若能编写出打印的顺序是先横向后纵向即Z型,或者先纵向后横向的N型打印。但是水平有限,不;能完成,请高手指点。
;我们知道,A3图纸420*297,因此,多说图纸的外框为420*297下面程序是想要在图形中搜索出长为420,角度为0°的线段的起点,而后进行排序(用sort函数),然后依次取出排好序后的点的x,y坐标,作为愈要打印的图纸的第一个点的坐标,这样,打印的图纸顺序是有序的了,就不在是ssget里面的顺序进行打印了。但是,水平有限,不能实现,还是请高手继续吧!
;=============================================================
(setq sv (ssget "X" (list (cons 0 "line"))))
(setq ls (sslength sv))
(setq prpage 0)
(setq s 0)
(setq keyline "420.0000")
(setq keyAng "0.0000")
(setq do (getint "\n输入打印顺序(0=Z型,1=N型):"))
(repeat ls
(setq vv (ssname sv s))
(setq sp (cdr (assoc 10 (entget vv))))
(setq ep (cdr (assoc 11 (entget vv))))
(setq s_epdis (distance sp ep))
(setq s_epAng (angle sp ep))
(if (and (= (rtos s_epdis 2 4) keyline) (= (rtos s_epAng 2 4) keyang) (setq lst (ssadd sp))) ;得到包括所有满足条件的线段的起点坐标表即lst
(setq s (+ 1 s))
(foreach n (sort lst (list do < >))
;我想从排好序的坐标对中,以此取出点的x,y坐标,却不知怎么向下编写下去,请高手和大虾指点。先谢了!

;---------------------------------------------
;排序函数,从本站高手那里拿来的
(defun sort(lst fun / a)
(defun des(e1 e2)
((eval (cadr fun)) (car e1) (car e2))
)
(defun des2(e1 e2)
((eval (caddr fun)) (cadr e1) (cadr e2))
)
(cond
((= (car fun) 0) (setq a (vl-sort lst 'des)) (vl-sort a 'des2))
((= (car fun) 1) (setq a (vl-sort lst 'des2)) (vl-sort a 'des))
)
发表于 2004-8-18 21:21 | 显示全部楼层
不明白。纵向或横向是根据已插入的图框来决定的,为什么要那么麻烦?
 楼主| 发表于 2004-8-19 08:00 | 显示全部楼层
肯能是我没有讲清楚吧,我是说有好多图纸在一张cad的图中,就是有几排的时候,是按行或按列打印。不知我这次说的你明白否?
 楼主| 发表于 2004-8-19 08:04 | 显示全部楼层
N型打印就是按列打印,z型就是按行打印,以实现打印的图纸和cad中的图纸排列顺序一致,明白否?
发表于 2004-8-19 09:21 | 显示全部楼层
这个问题怎么说呢?因为用户的需求是各种各样的,你的这中要求只能说对你自己的图纸有效,对别人的都无效.因为用户的绘图方式可能是1.全尺寸的 2. 可能有各种角度各种坐标系出图 3.可能是Layouts出图 4. 可能有多种不同比例 5.可能在Model中并没有按顺序排列....

就程序来说,这样写出的程序的应用范围可以说除了你别人都不适用.所以我觉得没必要这样去编一个程序.

你完全可以使用Layouts,Sheetset来顺序出图,而且既然你自己在Model中放置得如此有顺序,这样作更是一劳永逸,下次你如果要再次打印全套,只需要几次点击就可以了.




 楼主| 发表于 2004-8-19 18:40 | 显示全部楼层
其实,这个问题是实质是找到所有满足要求的keyline的起点集,而后按照函数sort排序,起始我观点与e2002的观点不尽相同,本站的多说批量打印的lisp程序都是考搜索特征线段的起点作为打印图纸的起点的,但是ssget里面的顺序是乱的,没有规律可循。所以,想通过对起点排序的方式以实现打印图纸的规律型的。还是请高手努力一下吧!努力并等待中…………
 楼主| 发表于 2004-8-24 21:47 | 显示全部楼层
无奈。。。。。。。。


自顶一下。。。。。。。
发表于 2004-8-26 08:40 | 显示全部楼层
你最好给个图出来(只要图框,图的内容可以不要)
发表于 2004-8-26 08:43 | 显示全部楼层
楼主的程序修改后: (setq sv (ssget "X" (list (cons 0 "line"))))
(setq ls (sslength sv))
(setq prpage 0)
(SETQ LST (LIST))
(setq s 0)
(setq do (IF (= (getint "\n输入打印顺序(0=Z型,1=N型):") 0))
(repeat ls
(setq vv (ssname sv s) s (+ 1 s))
(setq sp (cdr (assoc 10 (entget vv))))
(setq ep (cdr (assoc 11 (entget vv))))
(setq s_epdis (distance sp ep))
(setq s_epAng (angle sp ep))
(SETQ S_SPANG (ANGLE EP SP))
(if (and (EQUAL s_epdis 420.0 1E-4)
(OR (EQUAL s_epAng 0.0 1E-4) (EQUAL S_SPANG 0.0 1E-4)))
(setq lst (CONS (IF (> (CAR SP) (CAR EP)) EP SP) LST))
) ;得到包括所有满足条件的线段的起点坐标表即 LST = (PT1 PT2 ...)
(SORTXY)
(DEFUN SORTXY ()
(IF DO (PROGN
(SETQ SL (LENGTH LST) TTMPL (LIST))
(WHILE (> SL 0)
(SETQ Y1 (CADR (NTH 0 LST)) TMPL (LIST) I 0)
(WHILE (< I SL)
(SETQ PT1 (NTH I LST))
(IF (EQUAL (CADR PT1) Y1 1E-4)
(SETQ TEMPL (CONS PT1 TMPL) LST (XL-REMOVE I LST) SL (1- SL))
(SETQ I (1+ I))
)
)
(SETQ TTMPL (CONS (REVERSE TMPL) TTMPL))
)
;;;LST = ((PT11 PT12 ...) (PT21 PT22 ...) ...) GROUP BY Y
(SETQ LST (REVERSE TTMPL) SL (LENGTH LST) I 0 TTMPL (LIST))
(WHILE (< I SL) ;;;SORT X
(SETQ DL1 (NTH I LST) SL1 (LENGTH DL1) J 1)
(SETQ X1 (CAR (NTH I DL1)) IJ I)
(WHILE (< J SL1)
(SETQ K J)
(WHILE (< K SL1)
(SETQ X2 (CAR (NTH K DL1)))
(IF (< X2 X1) (SETQ X1 X2 IJ K))
(SETQ K (1+ K))
)
(IF (/= IJ I) (SETQ DL1 (APPEND (LIST (NTH IJ DL1)) (XL-REMOVE IJ DL1))))
(SETQ J (1+ J))
)
(SETQ TTMPL (CONS DL1 TTMPL) I (1+ I))
)
(SETQ LST (REVERSE TTMPL) I 0)
(WHILE (< I SL) ;;;SORT Y
(SETQ DL1 (NTH I LST) Y1 (CADAR DL1) J 1 IJ I)
(WHILE (< J SL)
(SETQ Y2 (CADAR (NTH J LST)))
(IF (< Y2 Y1) (SETQ Y1 Y2 IJ J))
(SETQ J (1+ J))
)
(IF (/= IJ I) (SETQ LST (APPEND (LIST (NTH IJ LST)) (XL-REMOVE IJ LST))))
(SETQ I (1+ I))
)
) (PROGN
(SETQ SL (LENGTH LST) TTMPL (LIST))
(WHILE (> SL 0)
(SETQ X1 (CAR (NTH 0 LST)) TMPL (LIST) I 0)
(WHILE (< I SL)
(SETQ PT1 (NTH I LST))
(IF (EQUAL (CAR PT1) X1 1E-4)
(SETQ TEMPL (CONS PT1 TMPL) LST (XL-REMOVE I LST) SL (1- SL))
(SETQ I (1+ I))
)
)
(SETQ TTMPL (CONS (REVERSE TMPL) TTMPL))
)
;;;LST = ((PT11 PT12 ...) (PT21 PT22 ...) ...) GROUP BY X
(SETQ LST (REVERSE TTMPL) SL (LENGTH LST) I 0 TTMPL (LIST))
(WHILE (< I SL) ;;;SORT Y
(SETQ DL1 (NTH I LST) SL1 (LENGTH DL1) J 1)
(SETQ Y1 (CADR (NTH I DL1)) IJ I)
(WHILE (< J SL1)
(SETQ K J)
(WHILE (< K SL1)
(SETQ Y2 (CADR (NTH K DL1)))
(IF (< Y2 Y1) (SETQ Y1 Y2 IJ K))
(SETQ K (1+ K))
)
(IF (/= IJ I) (SETQ DL1 (APPEND (LIST (NTH IJ DL1)) (XL-REMOVE IJ DL1))))
(SETQ J (1+ J))
)
(SETQ TTMPL (CONS DL1 TTMPL) I (1+ I))
)
(SETQ LST (REVERSE TTMPL) I 0)
(WHILE (< I SL) ;;;SORT X
(SETQ DL1 (NTH I LST) X1 (CAAR DL1) J 1 IJ I)
(WHILE (< J SL)
(SETQ X2 (CAAR (NTH J LST)))
(IF (< X2 X1) (SETQ X1 X2 IJ J))
(SETQ J (1+ J))
)
(IF (/= IJ I) (SETQ LST (APPEND (LIST (NTH IJ LST)) (XL-REMOVE IJ LST))))
(SETQ I (1+ I))
)
))
) (DEFUN XL-REMOVE (N L / TEMPL)
(SETQ TEMPL (LIST))
(REPEAT (1- N) (SETQ TEMPL (CONS (CAR L) TEMPL) L (CDR L)))
(APPEND (REVERSE TEMPL) (CDR L))
)
发表于 2005-8-20 11:36 | 显示全部楼层
可以用autowiseplot,网址 www.awpsoft.com/cn
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 09:33 , Processed in 1.185938 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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