找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 950|回复: 4

[LISP程序]:帮我看看这个LSP程序好吗?

[复制链接]
发表于 2005-12-10 18:47:35 | 显示全部楼层 |阅读模式

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

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

×
(defun c:bh()
;编号高度
(if (null h)
(setq h (getvar "textsize"))
)
(setq input (getreal(strcat"\\n\\t输入编号高度<" (rtos h) ">")))
(if (/= input nil)
(setq h input)
)
-------------------------------------
(initget "1 2")
(setq key (getkword"\\n\\t1-正向编号/2-反向编号<1>:"))
(setq s1 (entsel"\\n\\t选择对象<退出>"))
(setq ent (entget(car s1)))
(redraw (car s1) 3)
(setq pt0 (getpoint "\\n选择编号起号位置"))
(setq x (car pt0))
(setq y (cadr pt0))
(redraw (car s1) 4)
(setq n (cdr(assoc 90 ent)))

;正向编号
(if (or (= key 1) (= key nil))
(progn
(command "text" pt0 h "0" 1)
(setq plist (member (list 10 x y) ent))
(SETQ pplist (member(assoc 10 ent) ent))
(setq count 1)
(setq d (cdr plist))
(setq plist (member (assoc 10 d) d))
(while (/= plist nil)
(setq count (1+ count))
(setq pp_t (car plist))
(setq pp (cdr pp_t))
(command "text" pp h "0" (itoa count))
(setq d (cdr plist))
(setq plist (member (assoc 10 d) d))
)
(while (/= pplist nil)
(setq count (1+ count))
(setq pp_t (car pplist))
(setq pp (cdr pp_t))
(setq pp_x (car pp))
(setq pp_y (cadr pp))
(if (and (= pp_x x) (= pp_y y))
(exit)
(progn
(command "text" pp h "0" (itoa count))
(setq d (cdr pplist))
(setq pplist (member (assoc 10 d) d))
);end progn
);end if
);end while
);end progn
;反向编号
(progn
(command "text" pt0 h "0" (itoa n))
(setq plist (member (list 10 x y) ent))
(SETQ pplist (member(assoc 10 ent) ent))
(setq d (cdr plist))
(setq plist (member (assoc 10 d) d))
(setq n (1- n))
(while (/= plist nil)
(setq pp_t (car plist))
(setq pp (cdr pp_t))
(command "text" pp h "0" (itoa n))
(setq d (cdr plist))
(setq plist (member (assoc 10 d) d))
(setq n (1- n))
)

(while (/= pplist nil)
(setq pp_t (car pplist))
(setq pp (cdr pp_t))
(setq pp_x (car pp))
(setq pp_y (cadr pp))
(if (and (= pp_x x) (= pp_y y))
(exit)
(progn
(command "text" pp h "0" (itoa n))
(setq d (cdr pplist))
(setq pplist (member (assoc 10 d) d))
(setq n (1- n))
);end progn
);end if
);end while
);end progn
);end if
);end defun
(prompt"\\n多义线角点自动编号程序,键入:bh执行,程序设计:小谢")
(princ)

请讲讲其编程思路好吗?我不懂LSP,我想将其改为vba
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-12-11 00:08:43 | 显示全部楼层
我大致看了一下,主要意图是给pline线节点写编号的程序,主要看了一下正向编号的程序,大致思路是这样的(一下内容为正向编号,即代码为1):
程序执行后先输入“字体高度”,依次为选择“正反向编号代码(1为正向,2为反向)”,选择pline线及需要输入编号的第一个节点(鼠标输入后程序会在该点写入编号“1”),程序自动去选择plist剩余节点然后进行相应编号,假如所选的第一个节点并非pline线的起点,程序在转回起点进行累加编号。
另:程序中还有几处错误!(if (or (= key 1) (= key nil))应改为(if (or (= key "1") (= key nil))
(command "text" pt0 h "0" 1)应改为(command "text" pt0 h "0" "1")
更改后的程序:
  1. (defun c:bh ()
  2.                                         ;编号高度
  3.   (if (null h)
  4.     (setq h (getvar "textsize"))
  5.   )
  6.   (setq input (getreal (strcat "\\n\\t输入编号高度<" (rtos h) ">")))
  7.   (if (/= input nil)
  8.     (setq h input)
  9.   )
  10.   (initget "1 2")
  11.   (setq key (getkword "\\n\\t1-正向编号/2-反向编号<1>:"))
  12.   (setq s1 (entsel "\\n\\t选择对象<退出>"))
  13.   (setq ent (entget (car s1)))
  14.   (redraw (car s1) 3)
  15.   (setq pt0 (getpoint "\\n选择编号起号位置"))
  16.   (setq x (car pt0))
  17.   (setq y (cadr pt0))
  18.   (redraw (car s1) 4)
  19.   (setq n (cdr (assoc 90 ent)))

  20.                                         ;正向编号
  21.   (if (or (= key "1") (= key nil))
  22.     (progn
  23.       (command "text" pt0 h "0" "1")
  24.       (setq plist (member (list 10 x y) ent))
  25.       (SETQ pplist (member (assoc 10 ent) ent))
  26.       (setq count 1)
  27.       (setq d (cdr plist))
  28.       (setq plist (member (assoc 10 d) d))
  29.       (while (/= plist nil)
  30.         (setq count (1+ count))
  31.         (setq pp_t (car plist))
  32.         (setq pp (cdr pp_t))
  33.         (command "text" pp h "0" (itoa count))
  34.         (setq d (cdr plist))
  35.         (setq plist (member (assoc 10 d) d))
  36.       )
  37.       (while (/= pplist nil)
  38.         (setq count (1+ count))
  39.         (setq pp_t (car pplist))
  40.         (setq pp (cdr pp_t))
  41.         (setq pp_x (car pp))
  42.         (setq pp_y (cadr pp))
  43.         (if (and (= pp_x x) (= pp_y y))
  44.           (exit)
  45.           (progn
  46.             (command "text" pp h "0" (itoa count))
  47.             (setq d (cdr pplist))
  48.             (setq pplist (member (assoc 10 d) d))
  49.           )                                ;end progn
  50.         )                                ;end if
  51.       )                                        ;end while
  52.     )                                        ;end progn
  53.                                         ;反向编号
  54.     (progn
  55.       (command "text" pt0 h "0" (itoa n))
  56.       (setq plist (member (list 10 x y) ent))
  57.       (SETQ pplist (member (assoc 10 ent) ent))
  58.       (setq d (cdr plist))
  59.       (setq plist (member (assoc 10 d) d))
  60.       (setq n (1- n))
  61.       (while (/= plist nil)
  62.         (setq pp_t (car plist))
  63.         (setq pp (cdr pp_t))
  64.         (command "text" pp h "0" (itoa n))
  65.         (setq d (cdr plist))
  66.         (setq plist (member (assoc 10 d) d))
  67.         (setq n (1- n))
  68.       )

  69.       (while (/= pplist nil)
  70.         (setq pp_t (car pplist))
  71.         (setq pp (cdr pp_t))
  72.         (setq pp_x (car pp))
  73.         (setq pp_y (cadr pp))
  74.         (if (and (= pp_x x) (= pp_y y))
  75.           (exit)
  76.           (progn
  77.             (command "text" pp h "0" (itoa n))
  78.             (setq d (cdr pplist))
  79.             (setq pplist (member (assoc 10 d) d))
  80.             (setq n (1- n))
  81.           )                                ;end progn
  82.         )                                ;end if
  83.       )                                        ;end while
  84.     )                                        ;end progn
  85.   )                                        ;end if
  86. )                                        ;end defun
  87. (prompt
  88.   "\\n多义线角点自动编号程序,键入:bh执行,程序设计:小谢"
  89. )
  90. (princ)

以下图片是程序执行结果,点1即为输入编号的第一个节点(本来想做个flash动画,可惜我的软件过期了):
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-11 22:14:05 | 显示全部楼层
我想知道它是怎样判断起始点逆时针方向下一点的算法,麻烦再看看讲详细点好吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-11 22:58:38 | 显示全部楼层
逆向标注程序主要在以下代码:
  1.     (progn
  2.       (command "text" pt0 h "0" (itoa n))
  3.       (setq plist (member (list 10 x y) ent))
  4.       (SETQ pplist (member (assoc 10 ent) ent))
  5.       (setq d (cdr plist))
  6.       (setq plist (member (assoc 10 d) d))
  7.       (setq n (1- n))
  8.       (while (/= plist nil)
  9.         (setq pp_t (car plist))
  10.         (setq pp (cdr pp_t))
  11.         (command "text" pp h "0" (itoa n))
  12.         (setq d (cdr plist))
  13.         (setq plist (member (assoc 10 d) d))
  14.         (setq n (1- n))
  15.       )

  16.       (while (/= pplist nil)
  17.         (setq pp_t (car pplist))
  18.         (setq pp (cdr pp_t))
  19.         (setq pp_x (car pp))
  20.         (setq pp_y (cadr pp))
  21.         (if (and (= pp_x x) (= pp_y y))
  22.           (exit)
  23.           (progn
  24.             (command "text" pp h "0" (itoa n))
  25.             (setq d (cdr pplist))
  26.             (setq pplist (member (assoc 10 d) d))
  27.             (setq n (1- n))
  28.           )                                ;end progn
  29.         )                                ;end if
  30.       )                                        ;end while
  31.     )                                        ;end progn
  32.   )                                        ;end if
  33. )

我想你是问如何取得下一个点吧?
程序通过member函数搜索图元列表中包含的节点,并从节点的第一次出现处返回表的其余部分,即(setq plist (member (assoc 10 d) d))一句,然后用cadr函数取得去除该点表达式的其余部分返回给表pp 即(setq pp (cdr pp_t))一句,重复以上步骤直到点取完为止(该步骤通过(while (/= plist nil)以下语句实现)!
我的表达能力有限,感觉说得我都糊涂了!呵呵!
其实vlisp编辑器中有设置断点和添加监视功能(即实时查看变量)!可以结合这个方法让程序一步一步运行,这样检查程序比较方便!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-11 23:49:17 | 显示全部楼层
最初由 cqsnowfox 发布
[B]我想知道它是怎样判断起始点逆时针方向下一点的算法,麻烦再看看讲详细点好吗? [/B]

对于非封闭多段线是没有“起始点逆时针方向”之说的。
画图的顺序为正向,否则为反向。
  1. [FONT=courier new](load "xyp_lib.vlx")  ;版本 V.20051205 (1781)
  2. ;|下载和加载通用函数(可在签名栏直接下载后放到搜索路径下)
  3. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  4. ★1·在acad.lsp中增加(load"xyp_lib.vlx")
  5. ■2·在每个程序内增加(load"xyp_lib.vlx")
  6. ■3·在command下,输入(load"xyp_lib.vlx")
  7. ■4·在菜单.mnl中增加(load"xyp_lib.vlx")
  8. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  9. [COLOR=red] ★通用函数下载地址:[/COLOR]
  10. [url]http://www.xdcad.net/forum/attachment.php?s=&postid=1606661[/url]
  11. |;

  12. ;;;功能 : 多义线顶点序号及坐标标注,可输出坐标数据到文本文件。
  13. ;;;适用于 POLYLINE 及 LWPOLYLINE 图元
  14. (defun c:test065 ()
  15.   (CMDLASC0)
  16.   (setq        tx1 (UKWORD 1 "1 2" "\n确定顶点顺序 : 1-正向/2-反向" tx1)
  17.         tx2 (UKWORD 1 "Y N" "\n是否输出顶点坐标数据 : Y-是/N-否" tx2)
  18.   )
  19.   (if (= tx2 "Y")
  20.     (setq ffn (getfiled "\n保存的坐标文件" "坐标" "txt" 1)
  21.           ff  (open ffn "w")
  22.     )
  23.   )
  24.   (while (setq en (car (entsel "\n选择对象<退出> : ")))
  25.     (if        (or (= (xyp-get-DXF 0 en) "POLYLINE")
  26.             (= (xyp-get-DXF 0 en) "LWPOLYLINE")
  27.         )
  28.       (progn
  29.         (setq ptn (xyp-get-Vertexs en 1)
  30.               i          -1
  31.               j          0
  32.         )
  33.         ;;反向
  34.         (if (= tx1 "2")
  35.           (setq ptn (reverse ptn))
  36.         )
  37.         (foreach pt ptn
  38.           (MKLA "坐标编号" 1)
  39.           (xyp-Text 3 pt (itoa (setq j (1+ j))))
  40.           (MKLA "坐标" 3)
  41.           (xyp-ZB pt)
  42.           (if (= tx2 "Y")
  43.             (wr-tx pt ff)
  44.           )
  45.         )
  46.       )
  47.     )
  48.   )
  49.   (if (= tx2 "Y")
  50.     (progn
  51.       (close ff)
  52.       (princ (strcat "\n 坐标写至=>" ffn))
  53.     )
  54.   )
  55.   (CMDLA1)
  56. )
  57. (defun wr-tx (point filename / tx)
  58.   (setq        tx (strcat
  59.              (rtos (car point) 2)
  60.              " "
  61.              (rtos (cadr point) 2)
  62.              " "
  63.              (rtos (caddr point) 2)
  64.            )
  65.   )
  66.   (write-line tx filename)
  67. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 14:52 , Processed in 0.370583 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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