找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1681|回复: 11

[分享]:AUTOCAD中的几个LISP程序(也许大家都有了,如果重复了请斑竹删除)

[复制链接]
发表于 2003-10-12 13:13:36 | 显示全部楼层 |阅读模式

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

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

×

  1. ;;;机械制图中,常常得做许多大量的重复工作。下面这几个用Lisp编写得程序,是我画图时经常使用的,节省了我的不少时间,希望对大家有帮助。
  2. ;;;(如大家都有了,请斑竹帮忙删除,呵呵不好意思)

  3. ;;;1.自动求和
  4. ;;;机械制图中材料表的填写是毕不可少的,填写完后还需根据材料表求出总重量。一般一幅图中常有几十个物体,将这些重量一项一项相加个繁琐的过程,
  5. ;;;而且容易出错。使用下面这个程序,只需用鼠标选定需要相加的数,其和就会自动的显示在命令行中。
  6. ;;;因为在AUTOCAD中没有“数”这种实体,所有的数都以实体“TEXT”存在,所以程序中使用了“atof”函数,将以字符串形式表示的数转换为实数。
  7. (defun c:total (/ cmdmode sset ssl nsset temp ssl1 total)
  8.   (if *error*
  9.     quit
  10.   )
  11.   (setq cmdmode (getvar "cmdecho"))
  12.   (setvar "cmdecho" 0)
  13.   (prompt "\nSelect numbers to add: ")
  14.   (setq sset (ssget))
  15.   (if (null sset)
  16.     (princ "\nError: Nothing selected!\n") ; 过滤出选中的“text”实体,并报告有多少“text”实体被选中。
  17.     (progn
  18.       (setq ssl (sslength sset))
  19.       (setq nsset (ssadd))
  20.       (while (> ssl 0)
  21.         (setq temp (ssname sset (setq ssl (1- ssl))))
  22.         (if (= (cdr (assoc 0 (entget temp))) "TEXT")
  23.           (ssadd temp nsset)
  24.         )
  25.       )
  26.       (setq ssl (sslength nsset))
  27.       (print ssl)
  28.       (princ "text entities are found.") ; 选出所有可转化为数的“TEXT”,并求和。
  29.       (setq total 0)
  30.       (setq ssl1 ssl)
  31.       (while (> ssl 0)
  32.         (setq temp (ssname nsset (setq ssl (1- ssl))))
  33.         (setq number (atof (cdr (assoc 1 (entget temp)))))
  34.         (if (= 0 number)
  35.           (setq ssl1 (1- ssl1))
  36.           (setq total (+ total number))
  37.         )
  38.       )                                       ; 显示和及加数的个数,便于用户检查是否多选或漏选。
  39.       (princ "\nThe total is ")
  40.       (princ total)
  41.       (princ "of the ")
  42.       (princ ssl1)
  43.       (princ "numbers\n")
  44.     )
  45.   )

  46.   (setvar "CMDECHO" cmdmode)
  47. )

  48. (princ "\n\tc:total loaded. Start command with total.")


  49. ;;;2.自动生成递增数
  50. ;;;用CAD作图时,常需画一些距离一定、数值递增的数。如填写材料表时,“序号”一栏就需填写由下至上的递增数。
  51. ;;;通常,我们先用“text”命令写一个数,再用“array”命令将其按一定方向阵列,最后用“edit”命令一个一个的改正。
  52. ;;;下面这个程序可将你从这单调重复的动作中解放出来。
  53. (defun c:arn (/ ent temp d a number yorn)
  54.   (setq cmdmode (getvar "cmdecho"))
  55.   (setvar "cmdecho" 0)                       ; 选择一个实体,并判断能否作为生成递增数的初始数。
  56.   (setq ent (entsel "\nSelect number to arn: "))
  57.   (if (null ent)
  58.     (progn
  59.       (princ "\nError: Nothing selected!\n")
  60.       (exit)
  61.     )
  62.   )
  63.   (setq temp (entget (car ent)))
  64.   (if (= (cdr (assoc 0 temp)) "TEXT")  ; 输入生成递增数的个数、数间距及其方向。
  65.     (progn
  66.       (setq number (getint "Number of texts:"))
  67.       (setq d (getdist "Dist between texts:"))
  68.       (setq a (atoi (cdr (assoc 1 temp))))
  69.       (initget 1 "V H")
  70.       (setq yorn (getkword " Direction(V/H)?"))
  71.       (if (= yorn "V")
  72.         (setq p (list 0 d))
  73.       )
  74.       (if (= yorn "H")
  75.         (setq p (list d 0))
  76.       )                                       ; 重复拷贝前一个数,并将拷贝数加1。
  77.       (while (/= number 1)
  78.         (command "copy" ent "" p "")
  79.         (setq ent (entlast))
  80.         (setq temp (entget ent))
  81.         (setq a (+ a 1))
  82.         (entmod (subst
  83.                   (cons 1 (itoa a))
  84.                   (assoc 1 temp)
  85.                   temp
  86.                 )
  87.         )
  88.         (setq number (1- number))
  89.       )
  90.     )
  91.   )
  92.   (setvar "CMDECHO" cmdmode)
  93. )

  94. (princ "\n\tc:arn loaded. Start command with arn.")


  95. ;;;3.修改编号
  96. ;;;作图时,常常需要对图中的物体进行编号,有时会在已编好号的物体中插入几个物体,那么在这之后的编号都需作相应的增加。对于比较多的编号,
  97. ;;;一个个的寻找再修改就很麻烦,下面这个程序可以自动完成对编号的寻找及修改过程。
  98. ;;;为了能够清楚的看清要改变的数字及及其所处的位置,用变量“h”记录数字的高度,变量“viewctr”及“viewsize”记录了使用命令前的视窗中心及其大小。
  99. (defun c:chn (/ cmdmode viewctr viewsize sset i j k ssl nsset temp ent
  100.                 number x1 y1 x y h yorn
  101.              )
  102.   (defun *error* (s)
  103.     (exit)
  104.   )
  105.   (setq cmdmode (getvar "cmdecho"))
  106.   (setvar "cmdecho" 0)
  107.   (setq viewctr (getvar "viewctr"))
  108.   (setq viewsize (getvar "viewsize"))
  109.   (prompt "\nSelect numbers to add: ")
  110.   (setq sset (ssget))
  111.   (if (null sset)
  112.     (progn
  113.       (princ "\nError: Nothing selected!\n")
  114.       (exit)
  115.     )
  116.   )                                       ; 根据用户指定范围过滤出需要改变的编号,并报告找到多少编号。
  117.   (setq i (getint "\nThe number from which to change:"))
  118.   (setq j (getint "\nThe number to which to add:"))
  119.   (setq k (getint "\nHow much you want to add:"))
  120.   (setq ssl (sslength sset))
  121.   (setq nsset (ssadd))
  122.   (while (> ssl 0)
  123.     (setq temp (ssname sset (setq ssl (1- ssl))))
  124.     (if (= (cdr (assoc 0 (entget temp))) "TEXT")
  125.       (progn
  126.         (setq number (atoi (cdr (assoc 1 (entget temp)))))
  127.         (if (and
  128.               (<= i number)
  129.               (>= j number)
  130.             )
  131.           (ssadd temp nsset)
  132.         )
  133.       )
  134.     )
  135.   )
  136.   (setq ssl (sslength nsset))
  137.   (if (= ssl 0)
  138.     (progn
  139.       princ
  140.       ("\nNo numbers selected!")
  141.       (exit)
  142.     )
  143.   )
  144.   (print ssl)
  145.   (princ "numbers are found.")               ; 使被改变编号以一定大小处于屏幕中心位置并被高亮度显示,
  146.                                        ; 改变每个编号前先询问用户,以免改变了不想改变的编号。
  147.   (setq x1 (car viewctr))
  148.   (setq y1 (cadr viewctr))
  149.   (setq ent (entget (ssname nsset (- ssl 1))))
  150.   (setq h (cdr (assoc 40 ent)))
  151.   (while (> ssl 0)
  152.     (setq ent (entget (ssname nsset (setq ssl (1- ssl)))))
  153.     (setq x (cadr (assoc 10 ent)))
  154.     (setq y (caddr (assoc 10 ent)))
  155.     (if (or
  156.           (> (abs (- x x1)) (* h 10))
  157.           (> (abs (- y y1)) (* h 6))
  158.         )
  159.       (progn
  160.         (command "zoom" "c" (list x y) (* h 20))
  161.         (setq x1 x)
  162.         (setq y1 y)
  163.       )
  164.     )
  165.     (redraw (cdr (assoc -1 ent)) 3)
  166.     (initget 1 "Yes No")
  167.     (setq number (atoi (cdr (assoc 1 ent))))
  168.     (princ "\nThe number ")
  169.     (princ number)
  170.     (setq yorn (getkword " to be Changed?(y/n)"))
  171.     (if (= yorn "Yes")
  172.       (entmod (subst
  173.                 (cons 1 (itoa (+ number k)))
  174.                 (assoc 1 ent)
  175.                 ent
  176.               )
  177.       )
  178.     )
  179.     (redraw (cdr (assoc -1 ent)) 1)
  180.   )                                       ; 所有编号改变完成后,恢复使用本命令
  181.                                        ; 的视窗。
  182.   (command "zoom" "c" viewctr viewsize)
  183.   (setvar "CMDECHO" cmdmode)
  184. )

  185. (princ "\n\tc:chnumber loaded. Start command with chn.")


  186. ;;;4.自动画管线图的小程序
  187. ;;;画一些管路原理图时,常常有许多管路在图中相交,而这些管路实际并不相连。
  188. ;;;我们常把在相交点处次要的管路断开,在用一半圆连接两断点,下面的程序可以帮助大家完成做这一繁琐的工作。
  189. ;;;程序中使用“break”命令截断需要被断开的管线,再用“arc”命令画一半圆连接两断点。变量p读取管线交点;
  190. ;;;p1、p2为点p的左右或上下两点;p3为连接p1、p2半圆的中点。
  191. ;;;由于使用“break”命令时若AUTOCAD环境处于对象捕捉方式(OSMODE≠0),
  192. ;;;则“break”命令截断的p1、p2两点可能为变为p1、p2附近的捕捉点。所以程序开始时用变量myosmode记录系统变量OSMODE,而后设置OSMODE为0,
  193. ;;;程序结束后再设置还原OSMODE。变量horn判断用户需要断开的是水平线还是垂直线。
  194. (defun c:brel (/myosmode horv p p1 p2 p3)
  195.   (setq myosmode (getvar "OSMODE"))
  196.   (setvar "OSMODE" 0)
  197.   (setq p (getpoint "\nSelect point to break:"))
  198.   (initget 1 "H V")
  199.   (setq horv (getkword " Direction[H/V]?"))
  200.   (if (= horv "H")
  201.     (progn
  202.       (setq p1 (list (- (car p) 1.5) (cadr p)))
  203.       (setq p2 (list (+ (car p) 1.5) (cadr p)))
  204.       (setq p3 (list (car p) (+ (cadr p) 1.5)))
  205.     )
  206.     (progn
  207.       (setq p1 (list (car p) (- (cadr p) 1.5)))
  208.       (setq p2 (list (car p) (+ (cadr p) 1.5)))
  209.       (setq p3 (list (+ (car p) 1.5) (cadr p)))
  210.     )
  211.   )
  212.   (command "break" p1 p2)
  213.   (command "arc" p1 p3 p2)
  214.   (setvar "OSMODE" myosmode)
  215.   (princ)
  216. )

  217. (princ "\nStart command with brel which will break a line and join it with an arc.")




哇撒,我发了,怎么给我这么多钱?第一次收到这么多钱也,谢谢了!
我会继续努力的,斑竹对我的肯定比什么都好也,呵呵谢谢AEO。
哎,怎么每个论坛给我的感觉都不一样呢?在这里和WINDOWS技术论坛我最开心,嘿嘿不好意思有点小女人。
在AUTOCAD技术论坛里不太高兴,有人说我发水帖,我狂晕!
本论坛的高手们,我强烈恳求大家去AUTOCAD专栏技术论坛里去看看那里的所谓“高手”,我老在那里被他们笑。555555555555555。帮忙啦!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-10-12 18:23:32 | 显示全部楼层
谢谢你了,继续努力。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-10-12 19:42:09 | 显示全部楼层
CAD论坛去的比较少,重要的是交流学习。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-10-12 21:06:49 | 显示全部楼层
想想真不值得,交流在那些人眼里看来是“水帖”。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-10-12 21:18:44 | 显示全部楼层
祝贺你,发了几个程序得了58分,很少见到这样的高分哦。
鼓励一下,希望再接再厉
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-10-13 01:02:53 | 显示全部楼层
最初由 zxj1120 发布
[B]谢谢,有你们的支持我会继续努力的。:) [/B]


上当了不是,就等你下次呢,不然晓东砍我的头.^_^

下次贴的时候一定要整理好,该注释掉就注释掉。
代码要用[code].

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

使用道具 举报

发表于 2003-10-13 02:08:46 | 显示全部楼层
还没见过aeo的血是什么颜色的,不如等xd砍了他的头你再”下次“好吗?哈哈
说笑了,斑竹工作辛苦了。发贴的朋友注意发贴的规则,也算是对斑竹,对xd论坛的最大支持了:)
说的这么好,怎么不给加分啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-10-13 12:38:15 | 显示全部楼层
最初由 aeo 发布
[B]

上当了不是,就等你下次呢,不然晓东砍我的头.^_^

下次贴的时候一定要整理好,该注释掉就注释掉。
代码要用[code... [/B]


放心好啦,XD不会砍你头的,再说咯,你去看看刻录机在申请斑竹的宣言嘛,一腔热血为晓东,好歹你的头要下来也会溅血的嘛,放心吧,我那时侯一定会拿碗帮你盛着的。呵呵
说笑了,很感谢斑竹的提醒,我下次会注意的,3Q
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-13 01:12 , Processed in 0.258587 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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