找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3367|回复: 2

[LISP程序]:工艺流程图交叉线打断

[复制链接]
发表于 2007-7-24 21:55:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
我们绘制工艺流程图时,交叉线经常要打断,一般都是竖断横不断。手工打断的话,间距不一样,很不美观,所以就编了这个小程序。

由于我们的工艺流程图都是正交线段,所以这个程序就很简单了,只考虑了最基本的要求。


[PHP]
(defun c:LC (/ osm oc ol Key Space pt pt1 pt2 ss len i entn a)
  (setq Space (getreal "请输入断开间距 <4>:"))
  (if (= Space nil)
    (setq Space 4)
  )
  (setq key 1)
  (while (/= key nil)
    (if (/= (setq pt (getpoint "\n选择需断开的交点:")) nil)
       (progn
            (setq pt1 (list (nth 0 pt) (+ (nth 1 pt) (/ Space 2))))
            (setq pt2 (list (nth 0 pt) (- (nth 1 pt) (/ Space 2))))
            (setq ss (ssget "C" (list (- (car pt) 1) (+ (cadr pt) 1))(list (+ (car pt) 1) (+ (cadr pt) 2))))
            (setq entn (ssname ss 0))
            (setq a (entget entn))
            (command "break" (list entn pt1) "f" pt1 pt2)
       )
       (setq key nil)
    )
  )  
  (setvar "osmode" 6799)
  (princ)
)

[/PHP]

同时,这个帖子兼回答网友 youhei 的帖子
http://www.xdcad.net/forum/showthread.php?s=&threadid=637177

他要求的横断竖不断的代码如下:
[PHP]
(defun c:LC (/ osm oc ol Key Space pt pt1 pt2 ss len i entn a)
  (setq Space (getreal "请输入断开间距 <4>:"))
  (if (= Space nil)
    (setq Space 4)
  )
  (setq key 1)
  (while (/= key nil)
    (if (/= (setq pt (getpoint "\n选择需断开的交点:")) nil)
       (progn
            (setq pt1 (list  (- (nth 0 pt) (/ Space 2)) (nth 1 pt)))
            (setq pt2 (list  (+ (nth 0 pt) (/ Space 2)) (nth 1 pt)))
            (setq ss (ssget "C" (list (- (car pt) 2) (- (cadr pt) 1))(list (- (car pt) 1) (+ (cadr pt) 1))))
            (setq entn (ssname ss 0))
            (setq a (entget entn))
            (command "break" (list entn pt1) "f" pt1 pt2)
       )
       (setq key nil)
    )
  )  
  (setvar "osmode" 6799)
  (princ)
)


[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-7-25 17:37:31 | 显示全部楼层

  1. (defun C:LC (/ TMP PT PT1 PT2 SS PT3 PT4 I SI ENTI)
  2.     ;;改动1:将space设置为全局变量,可以保存上次的输入
  3.     (if        (= SPACE NIL)
  4.         (setq SPACE 4)
  5.     )
  6.     ;;设置
  7.     (if        (setq TMP
  8.                  (getdist
  9.                      (strcat "\n请输入断开间距 <" (rtos SPACE 2 2) ">:")
  10.                  )
  11.         )
  12.         (setq SPACE TMP)
  13.     )
  14.     ;;循环
  15.     (while (setq PT (getpoint "\n选择需断开的交点:"))
  16.         ;;改动2:使用polar函数可以简化坐标计算
  17.         (setq PT1 (polar PT (* 0.25 pi) SPACE)
  18.               PT2 (polar PT (* 1.25 pi) SPACE)
  19.         )
  20.         ;;改动3:判断是否选择到了对象、对象个数、
  21.         (if (and (setq SS (ssget "C"
  22.                                  PT1
  23.                                  PT2
  24.                           )
  25.                  )
  26.                  (= (sslength SS) 2)
  27.             )
  28.             (progn
  29.                 ;;改动4:在除法运算中将2改为2.0,以避免两整数相除消除尾数现象。
  30.                 (setq PT3 (polar PT (* 0.5 pi) (/ SPACE 2.0))
  31.                       PT4 (polar PT (* 1.5 pi) (/ SPACE 2.0))
  32.                 )
  33.                 (setq I 0)
  34.                 (repeat        2
  35.                     (setq SI   (ssname SS I)
  36.                           ENTI (entget SI)
  37.                     )
  38.                     ;;改动5:判断对象是否为直线段,且竖直。
  39.                     (if        (and (= (cdr (assoc 0 ENTI)) "LINE")
  40.                              (equal (cadr (assoc 10 ENTI))
  41.                                     (cadr (assoc 11 ENTI))
  42.                                     0.00001
  43.                              )
  44.                         )
  45.                         ;;改动6:在没有关闭对象捕捉情况下,command函数中指定点位前,最好使用"non"选项,以消除捕捉影响。
  46.                         (command "_.break"
  47.                                  (list SI PT)
  48.                                  "f"
  49.                                  "non"
  50.                                  PT3
  51.                                  "non"
  52.                                  PT4
  53.                         )
  54.                     )
  55.                     (setq I (1+ I))
  56.                 ) ;_结束 repeat
  57.             )
  58.         ) ;_结束 if
  59.     ) ;_结束 while
  60.     ;;静默退出
  61.     (princ)
  62. ) ;_结束 defun

更多讨论见:http://www.acad.net.cn/viewthread.php?tid=264&extra=page%3D1
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-1-3 17:37:11 | 显示全部楼层
寻找很久了,我只有一个vlx文件的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-13 13:48 , Processed in 0.314836 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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