找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1240|回复: 15

[分享]:波浪线绘制的LSP源程序!

[复制链接]
发表于 2003-11-5 08:41:56 | 显示全部楼层 |阅读模式

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

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

×
绘制波浪线的LSP源程序!供大家分享顺便评评看实用不?
不过我一直在用.


  1. (defun c:blx(/ lay os orth pt1 pt2 pt3 pt sel ang ang0 dist lis)
  2. (setq lay (getvar "clayer"))
  3. (setq os (getvar "osmode"))
  4. (setq orth (getvar "orthomode"))

  5. (setq temperr *error*)
  6. (setq *error* trap)
  7. (command "undo" "be")

  8. (princ "\n绘波浪线程序")
  9. (princ "\n1.两点方式    2.多点方式")
  10. (setq sel (getint "\n请选择:<1>"))
  11. (if (or (null sel) (= sel 1))
  12. (progn
  13. (setvar "osmode" 512)
  14. (setvar "orthomode" 0)
  15. (while (not (setq pt1 (getpoint "\n请拾取第一点:"))))
  16. (while (not (setq pt2 (getpoint pt1 "\n请拾取第二点:"))))
  17. (setq ang0 (angle pt1 pt2))
  18. (setq dist (/ (/ (distance pt1 pt2) 20) (sin (/ pi 3))))
  19. (setq lis (list (- 0 (/ pi 6)) (/ pi 6) (/ pi 6) (- 0 (/ pi 6))))
  20. (setvar "osmode" 0)
  21. (setvar "clayer" "0")
  22. (command "pline" pt1)
  23. (setq pt3 pt1)
  24. (repeat 5
  25. (foreach ang lis
  26. (progn
  27. (setq pt (polar pt3 (+ ang0 ang) dist))
  28. (setq pt3 pt)
  29. (command pt)
  30. )
  31. )
  32. )
  33. (command "")
  34. (command "pedit" (entlast) "s" "x")
  35. )
  36. (progn
  37. (setvar "osmode" 513)
  38. (setvar "clayer" "thin")
  39. (setvar "orthomode" 0)
  40. (setq pt(getpoint "\n请逐一选取各点:"))
  41. (command "pline" pt)
  42. (setq pt3 pt)
  43. (while (setq pt (getpoint pt3 "\n选取点(回车结束)"))
  44. (progn
  45. (setq pt3 pt)
  46. (command pt))
  47. )
  48. (command "")
  49. (command "pedit" (entlast) "s" "x")
  50. )
  51. )
  52. (setvar "orthomode" orth)
  53. (setvar "clayer" lay)
  54. (setvar "osmode" os)
  55. (command "undo" "e")
  56. (princ)
  57. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-11-5 13:04:59 | 显示全部楼层
小问题:
(setvar "clayer" "thin")
其中由于不是每个图中都有“thin”这个图层,因此当图中没有这个图层是程序将出错退出。
所以在使用这个图层前用先搜索图层表,如果有这个图层,则直接设定这个图层为当前图层,如果没有则应先进行图层的添加操作。
另外:最好能对波峰、波谷及周期进行控制。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-5 16:11:26 | 显示全部楼层
(setvar "clayer" "thin")
将其设为自有的层即可。如:(setvar "clayer" "0")  0层是都有的,不过要记得控制其打印粗细,一般波浪线是细线。

谢谢zhynt点评!!

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-11-8 12:44:39 | 显示全部楼层
要点评,哈  :)

不管线多长,波浪数量总是一样的,好象不好,应该可以控制每个波浪有多少距离,再算出波浪的数量,这样好些.或者控制一个比例.

图层也不应该就设一下,还要判断有没有,没有就建一个.

--------------------
(princ "\n绘波浪线程序")
(princ "\n1.两点方式    2.多点方式")
(setq sel (getint "\n请选择:<1>"))
(if (or (null sel) (= sel 1))
-----------------------
这样写当然可以,但一般不这样写:用initget控制一下.

而且没必要分出来,应该是用户一直点下去,就不停的画下去比较好:
(setq p1(getpoint "\n第一点"))
(while (setq p2(getpoint"\n下一点"))
    (画波浪线 p1 p2)
    (setq p1 p2)
)
(defun 画波浪线(p1 p2)
... ...)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-12 08:12:42 | 显示全部楼层
我修改了一下:(加入波幅与波长的控制,以及采用“spline”绘制波浪线,并可连续绘制)
<img src="http://www.xdcad.net/modrator/file_upload/5453/20031112083735_blx.jpg" width="750" height="350">

注:由于波浪线的直线长度不一定能被波长整除,所以,我先用直线长除以波长取其整数(即波数)然后再用直线长除以波数,得到实际波长。也就是说实际画的波长要比你给的波长来的短。但是如果直线长恰好能被波长整除,那前后就一样了。
<font style="font-size: 14px" color=blue>修改了一下,增加了是否重新计算波长的选项</font>

  1. (defun c:blx (/ boch pt pt1 pt2 pt3 dist lis ang0 ang)
  2.   (SETQ OLDOS (GETVAR "OSMODE"))
  3.   (if (= bofu nil)
  4.     (setq bofu1 20)
  5.   )
  6.   (if (= bochang nil)
  7.     (setq bochang1 50)
  8.   )
  9.   (if (/= (setq oldcmd (getvar "cmdecho")) 0)
  10.     (setvar "cmdecho" 0)
  11.   )
  12.   (prompt "\n请输入波幅<")
  13.   (princ bofu1)
  14.   (if (= (setq bofu (getreal ">:")) nil)
  15.     (setq bofu bofu1)
  16.     (setq bofu1 bofu)
  17.   )
  18.   (prompt "\n请输入波长<")
  19.   (princ bochang1)
  20.   (if (= (setq bochang (getreal ">:")) nil)
  21.     (setq bochang bochang1)
  22.     (setq bochang1 bochang)
  23.   )
  24.   (initget "Yes No")
  25.   (setq id (getkword "\n是否重新计算波长?Yes [No]:"))
  26.   (if (= id nil)
  27.     (setq id "No")
  28.   )
  29.   (if (setq pt1 (getpoint "\n开始画波浪线(回车退出):"))
  30.     (progn
  31.       (while (setq pt2 (getpoint pt1 "\n下一点(回车退出):"))
  32.         (setq dist (distance pt1 pt2))
  33.         (setq ang0 (angle pt1 pt2))
  34.         (setq n (fix (/ dist bochang)))
  35.         (while (= n 0)
  36.           (prompt "\n该段长度比波长小,请重新输入:")
  37.           (setq pt2 (getpoint pt1 "\n下一点(回车退出):"))
  38.           (if (/= pt2 nil)
  39.             (progn
  40.               (setq dist (distance pt1 pt2))
  41.               (setq ang0 (angle pt1 pt2))
  42.               (setq n (fix (/ dist bochang)))
  43.             )
  44.             (setq n nil)
  45.           )
  46.         )
  47.         (if (/= pt2 nil)
  48.           (progn
  49.             (if        (= id "No")
  50.               (setq boch (/ bochang 4))
  51.               (setq boch (/ dist (* n 4)))             
  52.             )
  53.             (setq dist (sqrt (+ (* boch boch) (* bofu bofu))))
  54.             (setq lis (list (atan bofu boch)
  55.                             (- 0 (atan bofu boch))
  56.                             (- 0 (atan bofu boch))
  57.                             (atan bofu boch)
  58.                       )
  59.             )
  60.             (setq pt3 pt1)
  61.             (IF        (< (- OLDOS 16384) 0)
  62.               (SETVAR "OSMODE" (+ OLDOS 16384))
  63.             )
  64.             (command "spline" pt1)
  65.             (repeat n
  66.               (foreach ang lis
  67.                 (setq pt (polar pt3 (+ ang0 ang) dist))
  68.                 (setq pt3 pt)
  69.                 (command pt)
  70.               )
  71.             )
  72.             (command "" "" "")
  73.             (setq pt1 pt)
  74.             (SETVAR "OSMODE" OLDOS)
  75.           )
  76.         )
  77.       )
  78.     )
  79.   )
  80.   (SETVAR "OSMODE" OLDOS)
  81.   (setvar "cmdecho" OLDCMD)
  82. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-12 11:59:30 | 显示全部楼层

Re: [分享]:波浪线绘制的LSP源程序!

最初由 刻录机 发布
[B]绘制波浪线的LSP源程序!供大家分享顺便评评看实用不?
不过我一直在用.
[code]

(defun c:blx(/ lay os orth pt1 pt2 pt3 pt sel ang ang0 dist lis)
(setq lay (getvar "clayer"))
(setq os (getvar "osmode")... [/B]


建议你用entmake,可以随意图层,新加旧引很方便.
你可以搜寻cy956的旧贴,专门针对entmake的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-16 01:22:51 | 显示全部楼层
建议 getreal 改为 getdist
另外试了一下,发现画出来的波长比实际的短 (测试时总长不是波长的倍数)
修改后的程序可以画到头,但是波长会变更短
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-18 09:19:02 | 显示全部楼层
最初由 陌生人 发布
[B]建议 getreal 改为 getdist
另外试了一下,发现画出来的波长比实际的短 (测试时总长不是波长的倍数)
修改后的程序可以画到头,但是波长会变更短 [/B]


我在说明中不是已经说了吗?为此我加上了是否重新计算波长的选项。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-18 12:43:42 | 显示全部楼层
很感兴趣的是: 这个程序,楼主一般用在什么地方呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-11-28 23:05:13 | 显示全部楼层
我也写了两个程序,请各位PP.
VLISP:

  1. (defun c:blx ( / mspace pt1 pt2 p1 p2 pt ptt pt11 p0 n a b c e f h tmp myobj)
  2.   (vl-load-com)
  3.   (setq mspace (vla-get-modelspace(vla-get-activedocument(vlax-get-acad-object))))
  4.   (setq pt1 (getpoint "\请输入起点: "))
  5.   (setq p1 (list (car pt1)(cadr pt1)))
  6.   (terpri)
  7.   (setq pt2 (getpoint pt1 "\请输入终点: "))
  8.   (setq p2 (list (car pt2)(cadr pt2)))
  9.   (setq L (distance pt1 pt2))
  10.   (setq b (angle p1 p2))
  11.   (terpri)
  12.   (setq n (getint "\请输入踏步阶数:"))
  13.   (terpri)
  14.   (setq h (getdist pt1 "\请输入波浪线的幅度:"))
  15.   (setq a (* 2 n))
  16.   (setq p0 p1)

  17.   (repeat a
  18.     (setq pt11 (polar p0 b (/ L a)))
  19.     (setq pt (append pt pt11))
  20.     (setq p0 pt11)
  21.     (setq ptt pt)
  22.   )
  23.    (setq ptt (append p1 ptt))
  24.    (setq tmp (vlax-make-safearray vlax-vbDouble(cons 0 (- (length ptt) 1))))
  25.    (vlax-safearray-fill tmp ptt)
  26.    (setq myobj (vla-addlightweightpolyline mspace tmp))

  27.    (setq c (/ (* 4 n h) L))
  28.    (setq e 0 )
  29.    (while (<= e (- a 1))
  30.      (setq f (+ e 1))
  31.      (vla-SetBulge myobj e (- 0 c))
  32.      (vla-setbulge myobj f c)
  33.      (setq e (+ e 2))
  34.      (setq f (+ f 2))
  35.    )
  36. (princ)
  37. )

VBA:

  1. Sub blx()
  2. Dim blx As AcadLWPolyline
  3. Dim points() As Double
  4. Dim a, n As Long
  5. Dim L, h, c As Double
  6. Dim pa, pb As Variant
  7. Const PI = 3.1415926535

  8. pa = ThisDrawing.Utility.GetPoint(, "请输入波浪线起点:")
  9. pb = ThisDrawing.Utility.GetPoint(pa, "请输入波浪线终点:")
  10. n = ThisDrawing.Utility.GetReal("请输入波浪线周波数:")
  11. h = ThisDrawing.Utility.GetDistance(pa, "请输入波浪线的幅度:")
  12. ReDim points(0 To 4 * n + 1) As Double
  13. L = dis(pa, pb)
  14. b = ThisDrawing.Utility.AngleFromXAxis(pa, pb)
  15. c = 4 * n * h / L

  16. For a = 0 To 4 * n + 1 Step 2
  17. points(a) = pa(0) + (0.25 * a / n) * L * Cos(b)
  18. points(a + 1) = pa(1) + (0.25 * a / n) * L * Sin(b)
  19. Next
  20. Set blx = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)

  21. For a = 0 To 2 * n - 1 Step 2
  22. blx.SetBulge a, -c
  23. blx.SetBulge a + 1, c
  24. Next

  25. End Sub
  26. Function dis(pa, pb As Variant) As Double
  27. dis = ((pa(0) - pb(0)) ^ 2 + (pa(1) - pb(1)) ^ 2) ^ 0.5
  28. End Function
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-11-30 10:35:28 | 显示全部楼层
多谢zhynt对波长控制的补充,但加载使用取点时有些不便,不知你以为如何?
(斑竹对我的源程序好像不屑一顾?不然怎么没有表示,我很少花精力做LISP,所以这样的分享很难得啊?!)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2003-12-1 08:37:40 | 显示全部楼层
最初由 刻录机 发布
[B]多谢zhynt对波长控制的补充,但加载使用取点时有些不便,不知你以为如何?
(斑竹对我的源程序好像不屑一顾?不然怎么没有表示,我很少花精力做LISP,所以这样的分享很难得啊?!) [/B]

怎么这样说?我的程序就是在你的程序基础上该的,怎么是不屑一顾?不是怪我没有给你加分吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-1 16:44:55 | 显示全部楼层
最初由 zhynt 发布
[B][QUOTE]最初由 刻录机 发布
[[/B... [/B]


对于一个不是很精通LISP的,却做来了LISP源程序,能没有这样的想法吗?,希望你能体谅!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-1 16:49:50 | 显示全部楼层
如果仅仅要的是一种波浪形状,用程序画图不如直接做一个波浪线型,具有线型的一切特征,修改起来又方便。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 21:00 , Processed in 0.369104 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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