明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4122|回复: 16

[已解答] 请问用lisp能不能画这样的图?

[复制链接]
发表于 2014-8-8 16:19 | 显示全部楼层 |阅读模式


我知道像这样的情况可以用块做出来,不知道用lisp能不能行?有没有高手愿意帮我写个?

弧的半径可以设定,根据设定的半径绘制,拾取点为圆弧的中心,箭头的长度等于圆弧半径的一半,箭头的宽度等于三分之一的箭头长,箭头角度为20度左右


该贴已经同步到 sibelle_hu的微博

本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

发表于 2014-8-8 16:51 | 显示全部楼层
你可以参考一下大师的程序 http://lee-mac.com/arrowarc.html
 楼主| 发表于 2014-8-8 16:57 | 显示全部楼层
谢谢,lisp我不会,刚学会怎么使用lisp程序,这个程序可以画弧形的箭头,可是与我的要求有很多差别的
发表于 2014-8-8 17:30 | 显示全部楼层
  1. ;; Arc to Bulge  -  Lee Mac
  2. ;; c     - center
  3. ;; a1,a2 - start, end angle
  4. ;; r     - radius
  5. ;; Returns: (<vertex> <bulge> <vertex>)

  6. (defun LM:Arc->Bulge ( c a1 a2 r )
  7.     (list
  8.         (polar c a1 r)
  9.         (   (lambda ( a ) (/ (sin a) (cos a)))
  10.             (/ (rem (+ pi pi (- a2 a1)) (+ pi pi)) 4.0)
  11.         )
  12.         (polar c a2 r)
  13.     )
  14. )
  15. ;;绘制圆弧 pt 圆心  r 半径 ang1 起始弧度 ang2 结束弧度 l_lay 图层 l_col 颜色 l_lt 线型 l_lts 线型比例 l_lw 线宽
  16. ;;(sk_mk_arc01 pt r ang1 ang2 l_lay l_col l_lt l_lts l_lw)
  17. (defun sk_mk_arc01(pt r ang1 ang2 l_lay l_col l_lt l_lts l_lw)
  18.   (if(and pt r ang1 ang2)
  19.     (entmakex (list '(0 . "ARC")
  20.                     (cons 8 (if l_lay l_lay (getvar 'clayer)))
  21.                     (if l_col (cons 62 l_col)(cons 62 256))
  22.                     (if l_lt (cons 6 l_lt)(cons 6 "bylayer"))
  23.                     (cons 48 (if l_lts l_lts (getvar 'celtscale)))
  24.                     (if l_lw (cons 370 l_lw)(cons 370 0))
  25.                     (cons 10 pt)
  26.                     (cons 40 r)
  27.                     (cons 50 ang1)
  28.                     (cons 51 ang2)
  29.                     )
  30.                   )
  31.     )
  32.   )

  33. (defun c:tt(/  ANG1 ARC_LEN EN L OBJ P1 P2 PT R W ANG2 BULGE P3)
  34.   (if(and (setq r(getdist "\n半径:"))
  35.           (setq pt(getpoint "\n圆心:"))
  36.           )
  37.     (progn
  38.       (setq l(* 0.5 r))
  39.       (setq w(/ l 3.0))
  40.       (setq en(sk_mk_arc01 pt r 0 pi nil nil nil nil nil))
  41.       (setq obj(vlax-ename->vla-object en))
  42.       (setq arc_len(vla-get-arclength obj))
  43.       (setq p1(vlax-curve-getstartpoint obj))
  44.       (setq p2(vlax-curve-getPointAtDist obj (- arc_len l)))
  45.       (setq p3(vlax-curve-getEndpoint obj))      
  46.       (setq ang1(angle pt p2 ))
  47.       (setq ang2 0)
  48.       (setq bulge(cadr(LM:Arc->Bulge pt ang2 ang1 r)))
  49.       (vla-delete obj)      
  50.       (entmakex (list '(0 . "LWPOLYLINE")
  51.                       '(100 . "AcDbEntity")
  52.                       '(100 . "AcDbPolyline")
  53.                       (cons 90 3)
  54.                       (cons 10 p1)
  55.                       (cons 42 bulge)
  56.                       (cons 10 p2)
  57.                       (cons 40 w)
  58.                       (cons 41 0)                     
  59.                       (cons 10 p3)))
  60.       )
  61.     )
  62.   (princ)
  63.   )

评分

参与人数 1明经币 +1 收起 理由
lucas_3333 + 1 乐于助人!

查看全部评分

发表于 2014-8-8 18:16 | 显示全部楼层
本帖最后由 lucas_3333 于 2014-8-8 18:17 编辑
edata 发表于 2014-8-8 17:30

E大,厉害!乐于助人!明经的活雷锋!
 楼主| 发表于 2014-8-8 18:19 | 显示全部楼层
谢谢大师,请问能不能再帮忙加个选项?即输入L,箭头就在左侧,输入R箭头就在右侧?
 楼主| 发表于 2014-8-8 20:21 | 显示全部楼层
edata 发表于 2014-8-8 17:30

大师,能不能也帮帮我这个问题?
http://bbs.mjtd.com/thread-111031-1-1.html
发表于 2014-8-8 20:35 | 显示全部楼层
  1. ;; Arc to Bulge  -  Lee Mac
  2. ;; c     - center
  3. ;; a1,a2 - start, end angle
  4. ;; r     - radius
  5. ;; Returns: (<vertex> <bulge> <vertex>)

  6. (defun LM:Arc->Bulge ( c a1 a2 r )
  7.     (list
  8.         (polar c a1 r)
  9.         (   (lambda ( a ) (/ (sin a) (cos a)))
  10.             (/ (rem (+ pi pi (- a2 a1)) (+ pi pi)) 4.0)
  11.         )
  12.         (polar c a2 r)
  13.     )
  14. )
  15. ;;绘制圆弧 pt 圆心  r 半径 ang1 起始弧度 ang2 结束弧度 l_lay 图层 l_col 颜色 l_lt 线型 l_lts 线型比例 l_lw 线宽
  16. ;;(sk_mk_arc01 pt r ang1 ang2 l_lay l_col l_lt l_lts l_lw)
  17. (defun sk_mk_arc01(pt r ang1 ang2 l_lay l_col l_lt l_lts l_lw )
  18.   (if(and pt r ang1 ang2)
  19.     (entmakex (list '(0 . "ARC")
  20.                     (cons 8 (if l_lay l_lay (getvar 'clayer)))
  21.                     (if l_col (cons 62 l_col)(cons 62 256))
  22.                     (if l_lt (cons 6 l_lt)(cons 6 "bylayer"))
  23.                     (cons 48 (if l_lts l_lts (getvar 'celtscale)))
  24.                     (if l_lw (cons 370 l_lw)(cons 370 0))
  25.                     (cons 10 pt)
  26.                     (cons 40 r)
  27.                     (cons 50 ang1)
  28.                     (cons 51 ang2)
  29.                     )
  30.                   )
  31.     )
  32.   )

  33. (defun c:tt(/  ANG1 ARC_LEN EN L OBJ P1 P2 PT R W ANG2 BULGE P3 keys)
  34.   (or *sk_rad_jt001* (setq *sk_rad_jt001* 10.0))
  35.   (setq *sk_rad_jt001*(cond((getdist (strcat "\n输入半径<" (rtos *sk_rad_jt001* 2 4) ">:")))(*sk_rad_jt001*)))
  36.   (princ (strcat "\r当前半径<" (rtos *sk_rad_jt001* 2 4) ">:"))
  37.   (if(setq pt(getpoint "\n圆心:"))
  38.     (progn
  39.       (setq r *sk_rad_jt001*)
  40.       (initget "L R _l r")      
  41.       (setq keys(cond((getkword "\r输入左右方向[L/R]<L>: "))("l")))
  42.       (setq l(* 0.5 r))
  43.       (setq w(/ l 3.0))
  44.       (setq en(sk_mk_arc01 pt r 0 pi nil nil nil nil nil))
  45.       (setq obj(vlax-ename->vla-object en))
  46.       (setq arc_len(vla-get-arclength obj))
  47.       (setq p1(if (= keys "l") (vlax-curve-getstartpoint obj) (vlax-curve-getEndpoint obj)))
  48.       (setq p2(vlax-curve-getPointAtDist obj (if (= keys "l") (- arc_len l) l)))
  49.       (setq p3(if (= keys "l") (vlax-curve-getEndpoint obj)(vlax-curve-getstartpoint obj) ))      
  50.       (setq ang1(angle pt p2 ))
  51.       (setq ang2 (if (= keys "l") 0 pi ))
  52.       (setq bulge(cadr(LM:Arc->Bulge pt (if (= keys "l") ang2 ang1 ) (if (= keys "l") ang1 ang2 ) r)))
  53.       (vla-delete obj)      
  54.       (entmakex (list '(0 . "LWPOLYLINE")
  55.                       '(100 . "AcDbEntity")
  56.                       '(100 . "AcDbPolyline")
  57.                       (cons 90 3)
  58.                       (cons 10 p1)
  59.                       (cons 42 (if (= keys "l") bulge (* -1.0 bulge) ))
  60.                       (cons 10 p2)
  61.                       (cons 40 w)
  62.                       (cons 41 0)                     
  63.                       (cons 10 p3)))
  64.       )
  65.     )
  66.   (princ)
  67.   )

评分

参与人数 1明经币 +1 收起 理由
lucas_3333 + 1 很给力!

查看全部评分

 楼主| 发表于 2014-8-8 20:46 | 显示全部楼层
edata 发表于 2014-8-8 20:35

大师,非常好!谢谢了!
发表于 2014-8-8 22:04 | 显示全部楼层
本帖最后由 ysq101 于 2014-8-9 12:17 编辑

Z版主直接给了鱼
我来点思路,楼主想学LIPS还是自己动手来吧
说说我的思路:
2段多线段   修改剪头部分的线宽即可
自己研究一下吧

其它箭头可以做成动态的好点吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-20 20:48 , Processed in 0.314712 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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