明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2181|回复: 9

[提问] 【源码分享】动态绘制示坡线

  [复制链接]
发表于 2018-10-31 17:04 | 显示全部楼层 |阅读模式
本帖最后由 20060510412 于 2022-3-7 21:55 编辑
  1. ;;
  2. ;;动态示坡线   by 明经通道  QQ9034598  小蜜蜂  2013-5-22
  3. ;;
  4. (defun c:swx( / ss n m jdp jdp2 sntt txt1 txt2 xpj pt cg pl hh ssList end1 SumL1)
  5. (setvar "DIMZIN" 1)
  6. (setq ss (car (entsel "\n请选择曲线边界:")))
  7. (if (and ss (vl-position (dxf 0 (entget ss))
  8.      '("POLYLINE" "LINE" "LWPOLYLINE" "CIRCLE" "ARC" "SPLINE" "ELLIPSE")))
  9. (progn
  10. (setq Jdp (getpoint "\n [d]间距增加0.05倍 / [s]间距减小0.05倍 / 长度及方向 <给点>:"))
  11. (if jdp (progn
  12. (setq hh (/ (getvar "VIEWSIZE") 25)
  13.       Jdp1 (polar jdp (* 0.25 pi) (* 0.2 hh))
  14.       Jdp2 (polar jdp1 (* 0.5 pi) (* 1.2 hh))
  15.       oba (vlax-ename->vla-object ss)
  16.       end1 (vlax-curve-getEndParam oba)  ;;端点参数
  17.       SumL1 (vlax-curve-getDistAtParam  oba end1) ;;曲线总长
  18.       dis (/ SumL1 25)
  19.       sntt (treaSline oba dis)
  20.       txt1 (cretxt (strcat "间距: " (rtos dis 2 3)) jdp2)
  21.       txt2 (cretxt (strcat "长度: " (rtos 5 2 3)) jdp1))
  22. (creL jdp jdp)(setq xpj (entlast) pt jdp)

  23. (while (or (= (car (setq mouse (grread t 5 0))) 5)(= (car mouse) 2))
  24.   (setq pt (if (= (car mouse) 2) pt (cadr mouse))
  25.          n 0
  26.         cg (cos (angle jdp pt))  ;;橡皮筋线的角度余弦
  27.         PL (* (distance pt Jdp)(if (> cg 0) 1 -1)))

  28.   (entmod (subst (cons 11 pt)(assoc 11 (entget xpj))(entget xpj)))
  29.   (if (and (= (car mouse) 2) (or (= (cadr mouse) 100)(= (cadr mouse) 115)))
  30.     (progn
  31.        (mapcar '(lambda(x)(entdel (car x))) sntt)
  32.        (if (= (cadr mouse) 100)(setq dis (+ (* 0.05 dis) dis)))
  33.        (if (= (cadr mouse) 115)(setq dis (- dis (* 0.05 dis))))
  34.        (setq sntt (treaSline oba dis)))
  35.    ) ;;增加或减小间距
  36.   (modentxt txt1 txt2 dis (abs pl) pt)
  37.   (setq n 0)
  38.   (repeat (length sntt)
  39.     (if (= 1 (rem n 2)) (modent (nth n sntt) pl) (modent (nth n sntt) (/ pl 2)))
  40.     (setq n (1+ n))
  41.   )
  42. )(entdel xpj) (entdel txt1) (entdel txt2)
  43. ))))
  44. (setvar "DIMZIN" 0)
  45. (princ)
  46. )
  47. ;;刷新文本
  48. (defun modentxt(ent1 ent2 d L pt0 / t1 t2 pt1 pt2 h en1 en2)
  49. (setq en1 (entget ent1)
  50.        en2 (entget ent2)
  51.        h (/ (getvar "VIEWSIZE") 25)
  52.    pt1 (polar pt0 (* 0.25 pi) (* 0.2 h))
  53.    t1 (subst (cons 1 (strcat "间距: " (rtos d 2 3 )))(assoc 1 en1)en1)
  54.    t1 (subst (cons 10 pt1)(assoc 10 t1)t1)
  55.    t1 (subst (cons 40 h)(assoc 40 t1)t1)
  56.    t2 (subst (cons 1 (strcat "长度: " (rtos L 2 3)))(assoc 1 en2)en2)
  57.    pt2 (polar pt1 (* 0.5 pi) (* 1.2 h))
  58.    t2 (subst (cons 10 pt2)(assoc 10 t2)t2)
  59.    t2 (subst (cons 40 h)(assoc 40 t2)t2))
  60.    (entmod t1) (entmod t2)
  61. )

  62. ;;刷新直线线
  63. (defun modent(en L / ent mp)
  64. (setq ent (entget (car en))
  65.       mp (polar (dxf 10 ent) (cadr en) L))
  66. (entmod (subst (cons 11 mp)(assoc 11 ent) ent))
  67. )

  68. ;;曲线处理
  69. (defun treaSline(obs d / n en end SumL Lpa La ds AG sy Lxy)
  70. (setq n 0  en '()
  71.        end (vlax-curve-getEndParam obs)  ;;端点参数
  72.        SumL (vlax-curve-getDistAtParam  obs end)) ;;曲线总长
  73. (while (progn
  74.       (setq Lpa (vlax-curve-getParamAtDist obs (* n d)) ;;指定距离的参数
  75.              La (vlax-curve-getDistAtParam  obs Lpa)   ;;开始到指定点长度
  76.              Ds (vlax-curve-getFirstDeriv obs Lpa)     ;;一阶导数,切线
  77.              Ag (+ (atan (cadr ds)(car ds)) (* 0.5 pi))  ;;斜角
  78.              Sy (- SumL La)  ;;剩余长度
  79.             Lxy (vlax-curve-getPointAtDist obs (* n d))) ;;指定长度的坐标
  80.             (creL Lxy Lxy)
  81.        (setq en (cons (list (entlast) Ag) en) n (+ n 1))
  82.        (> Sy d))
  83. ) en
  84. )

  85. ;;画单线
  86. (defun creL(p1 p2)(entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2))))
  87. ;;写字
  88. (defun cretxt(txt pt)
  89. (entmake (list '(0 . "TEXT") (cons 1 txt) (cons 7 (getvar "TEXTSTYLE"))
  90. (cons 10 pt) '(41 . 0.76) (cons 40 (/ (getvar "VIEWSIZE") 25))))(entlast)
  91. )
  92. ;;dxf码
  93. (defun dxf(n ent) (cdr (assoc n ent)))

  94. (princ)
http://bbs.mjtd.com/forum.php?mo ... %C6%C2%CF%DF&page=1
这个网页上有关于动态示坡线的源码,感觉很不错,只不过一般情况下,示坡线都是一长一短的线型,经过自己修改,已经可以实现自己想要的效果了,在这里先谢谢原作者了。


本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
yanshengjiang + 1 程序不错 你的币很少 呵呵

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2018-10-31 19:20 | 显示全部楼层
不好意思,不知道怎么做gif动画演示
发表于 2018-11-1 08:36 | 显示全部楼层
本帖最后由 panliang9 于 2018-11-1 08:38 编辑

非常好,用起来超级爽!
 楼主| 发表于 2018-11-1 08:51 | 显示全部楼层
又修改了一下,主要是对于过长的曲线,还是用默认1.4的间隔,调整起来太麻烦了。我修改为默认将曲线分为25份,然后d增加0.05倍间距,s减小0.05倍间距。
同时,在生成示坡线之后,删除那两行长度与间距的文本
发表于 2019-1-17 09:13 | 显示全部楼层
真棒,很实用
发表于 2019-1-17 22:45 | 显示全部楼层
非常好,很实用,谢谢分享!!!!!
发表于 2020-2-26 13:18 | 显示全部楼层
感谢感谢,非常好用
发表于 2020-3-20 19:41 | 显示全部楼层
很好用,谢谢!!
发表于 2020-3-20 23:31 | 显示全部楼层
感谢感谢,非常好用
发表于 2020-7-2 19:19 | 显示全部楼层
这个厉害,感谢楼主~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 19:28 , Processed in 0.335988 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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