明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2793|回复: 9

[已解答] [已解决]求高手帮忙改善下这个源码!关于entmake生成带有圆弧的多段线

[复制链接]
发表于 2014-6-3 18:33:47 | 显示全部楼层 |阅读模式
本帖最后由 qinleilei 于 2014-6-4 23:04 编辑

下面是自己写的源码。就是不知道下图中R10的圆弧如何画出来。各位高手帮忙改善下源码。

(defun c:ac()
(princ"\n画A冲")
(setvar "cmdecho" 0)
(command "ucs" "w")
(setq a (getreal "\n输入A冲直径:"))
(setq b (getreal "\n输入P端直径:"))
(setq c (getreal "\n输入P端长度:"))
(setq d (getreal "\n输入总长度:"))
(setq P (getpoint "\n放置点:"))
(setq x(car p))
(setq y(cadr p))
(setq P1 (list (- x (+ (/ a 2) 1.5)) y))
(setq P2 (list (+ x (+ (/ a 2) 1.5)) y))
(setq P3 (list (+ x (+ (/ a 2) 1.5)) (- y 5)))
(setq P4 (list (+ x (/ a 2)) (- y 5)))
(setq P5 (list (- x (/ a 2)) (- y 5)))
(setq P6 (list (- x (+ (/ a 2) 1.5)) (- y 5)))
(setq P9 (list (- x (/ b 2)) (- y (- d c))))
(setq P10 (list (+ x (/ b 2)) (- y (- d c))))
(setq P11 (list (- x (/ b 2)) (- y d)))
(setq P12 (list (+ x (/ b 2)) (- y d)))
(setq h  (sqrt (- 100(expt(- 10 (/ (- a b) 2)) 2))))
(setq P8 (list (+ x (/ a 2)) (- y (- d (+ c h)))))
(setq P7 (list (- x (/ a 2)) (- y (- d (+ c h)))))
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")  '(62 . 2) '(90 . 12) '(70 . 1) (cons 10 p1) (cons 10 p2)(cons 10 p3) (cons 10 p4) (cons 10 p8) (cons 10 p10) (cons 10 p12) (cons 10 p11) (cons 10 p9) (cons 10 p7) (cons 10 p5) (cons 10 p6)))
(entmake (list '(0 . "LINE") '(62 . 2)  (cons 10 p5) (cons 11 p4)))
(entmake (list '(0 . "LINE") '(62 . 2)  (cons 10 p7) (cons 11 p8)))
(princ))




本帖子中包含更多资源

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

x
发表于 2014-6-3 18:53:27 | 显示全部楼层
我想应该P9 P10作为起点,P7, P8作为终点, 即起点,终点,半径画弧
 楼主| 发表于 2014-6-3 19:32:47 | 显示全部楼层
lucas_3333 发表于 2014-6-3 18:53
我想应该P9 P10作为起点,P7, P8作为终点, 即起点,终点,半径画弧

那样是可以。但是我想知道的是如何用entmake生成带有圆弧的多段线 。
发表于 2014-6-3 19:37:17 | 显示全部楼层
qinleilei 发表于 2014-6-3 19:32
那样是可以。但是我想知道的是如何用entmake生成带有圆弧的多段线 。

可以参考
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109214
 楼主| 发表于 2014-6-3 19:56:55 | 显示全部楼层
lucas_3333 发表于 2014-6-3 19:37
可以参考
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109214

看了一下,不怎么明白,不知道他那个圆是怎么控制方位的,兄弟方便的话,帮我改善下这个代码好不?感激不尽!
发表于 2014-6-4 15:43:54 | 显示全部楼层
凸度=拱高/弦长的一半,如果弧从起点到终点是顺时针走向则凸度为负数,0表示直线,1表示半圆。
dxf组码 42
  1. ;;两点半径求凸度
  2. (defun sk_2pr->bulge (p1 p2 r / mpt a b k bulge)
  3.   (if (and p1
  4.            p2
  5.            r
  6.            (= (type p1) 'LIST)
  7.            (= (type p2) 'LIST)
  8.            (numberp r)
  9.       )
  10.     (progn
  11.       (setq mpt          (mapcar '(lambda (x y) (* 0.5 (+ x y))) p1 p2)
  12.             a          (distance p1 mpt)
  13.             b          (sqrt (- (* r r) (* a a)))
  14.             k          (- r b)
  15.             bulge (/ k a)
  16.       )
  17.     )
  18.   )
  19. )
  20. (defun c:ac()
  21. (princ"\n画A冲")
  22. (setvar "cmdecho" 0)
  23. (command "ucs" "w")
  24. (setq a (getreal "\n输入A冲直径:"))
  25. (setq b (getreal "\n输入P端直径:"))
  26. (setq c (getreal "\n输入P端长度:"))
  27. (setq d (getreal "\n输入总长度:"))
  28. (setq P (getpoint "\n放置点:"))
  29. (setq x(car p))
  30. (setq y(cadr p))
  31. (setq P1 (list (- x (+ (/ a 2) 1.5)) y))
  32. (setq P2 (list (+ x (+ (/ a 2) 1.5)) y))
  33. (setq P3 (list (+ x (+ (/ a 2) 1.5)) (- y 5)))
  34. (setq P4 (list (+ x (/ a 2)) (- y 5)))
  35. (setq P5 (list (- x (/ a 2)) (- y 5)))
  36. (setq P6 (list (- x (+ (/ a 2) 1.5)) (- y 5)))
  37. (setq P9 (list (- x (/ b 2)) (- y (- d c))))
  38. (setq P10 (list (+ x (/ b 2)) (- y (- d c))))
  39. (setq P11 (list (- x (/ b 2)) (- y d)))
  40. (setq P12 (list (+ x (/ b 2)) (- y d)))
  41. (setq h  (sqrt (- 100 (expt(- 10 (/ (- a b) 2)) 2))))
  42. (setq P8 (list (+ x (/ a 2)) (- y (- d (+ c h)))))
  43. (setq P7 (list (- x (/ a 2)) (- y (- d (+ c h)))))
  44. (setq p8_bulge (sk_2pr->bulge p8 p10 10))
  45. (setq p9_bulge (sk_2pr->bulge p9 p7 10))
  46. (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")  '(62 . 2) '(90 . 12) '(70 . 1) (cons 10 p1) (cons 10 p2)(cons 10 p3) (cons 10 p4) (cons 10 p8)(cons 42 p8_bulge) (cons 10 p10) (cons 10 p12) (cons 10 p11) (cons 10 p9)(cons 42 p9_bulge) (cons 10 p7) (cons 10 p5) (cons 10 p6)))
  47. (entmake (list '(0 . "LINE") '(62 . 2)  (cons 10 p5) (cons 11 p4)))
  48. (entmake (list '(0 . "LINE") '(62 . 2)  (cons 10 p7) (cons 11 p8)))
  49. (princ))

评分

参与人数 2明经币 +1 金钱 +50 收起 理由
qinleilei + 1 很给力!
lucas_3333 + 50 E大,明经的活雷锋!

查看全部评分

 楼主| 发表于 2014-6-4 22:53:53 | 显示全部楼层
本帖最后由 qinleilei 于 2014-6-4 22:55 编辑
edata 发表于 2014-6-4 15:43
凸度=拱高/弦长的一半,如果弧从起点到终点是顺时针走向则凸度为负数,0表示直线,1表示半圆。
dxf组码 42
...

非常感谢 E大 的耐心解答,虽说你的代码我还看不懂,但至少我知道了圆弧是由 dxf组码 42 凸度来控制的了,E大的热心让我心服口服!
下面的源码是我自己改进了一下。也达到了预期的效果。
(defun c:ac()
(princ"\n画A冲")
(setvar "cmdecho" 0)
(command "ucs" "w")
(setq a (getreal "\n输入A冲直径:"))
(setq b (getreal "\n输入P端直径:"))
(setq c (getreal "\n输入P端长度:"))
(setq d (getreal "\n输入总长度:"))
(setq P (getpoint "\n放置点:"))
(setq x(car p))
(setq y(cadr p))
(setq P1 (list (- x (+ (/ a 2) 1.5)) y))
(setq P2 (list (+ x (+ (/ a 2) 1.5)) y))
(setq P3 (list (+ x (+ (/ a 2) 1.5)) (- y 5)))
(setq P4 (list (+ x (/ a 2)) (- y 5)))
(setq P5 (list (- x (/ a 2)) (- y 5)))
(setq P6 (list (- x (+ (/ a 2) 1.5)) (- y 5)))
(setq P9 (list (- x (/ b 2)) (- y (- d c))))
(setq P10 (list (+ x (/ b 2)) (- y (- d c))))
(setq P11 (list (- x (/ b 2)) (- y d)))
(setq P12 (list (+ x (/ b 2)) (- y d)))
(setq h  (sqrt (- 100(expt(- 10 (/ (- a b) 2)) 2))))
(setq P8 (list (+ x (/ a 2)) (- y (- d (+ c h)))))
(setq P7 (list (- x (/ a 2)) (- y (- d (+ c h)))))
(setq m (list (/ (+ (car p8) (car p10)) 2) (/ (+ (cadr p8) (cadr p10)) 2)));点P8到点P10之间的中点
(setq m1(list (+ x (/ b 2) 10) (- y (- d c))));R10圆心坐标
(setq m2 (- 10 (distance m m1)));拱高
(setq m3 (/ m2 (/ (distance p8 p10) 2))) ;凸度
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")  '(62 . 2) '(90 . 12) '(70 . 1) (cons 10 p1) (cons 10 p2)(cons 10 p3) (cons 10 p4) (cons 10 p8) (cons 42 m3) (cons 10 p10) (cons 10 p12) (cons 10 p11) (cons 10 p9) (cons 42 m3) (cons 10 p7) (cons 10 p5) (cons 10 p6)))
(entmake (list '(0 . "LINE") '(62 . 2)  (cons 10 p5) (cons 11 p4)))
(entmake (list '(0 . "LINE") '(62 . 2)  (cons 10 p7) (cons 11 p8)))
(princ))

 楼主| 发表于 2014-6-4 23:06:22 | 显示全部楼层
怎么将帖子设置为已解决,谁能告诉我一下

点评

浏览器右侧有一个黄色按钮  发表于 2014-6-5 14:45
发表于 2014-6-4 23:13:00 | 显示全部楼层
据我所知,你这个两个直径相差20,P段直径是不可以省略输入,如果是,那么凸度也算是固定的,直接用用这个固定的凸度也可以。
发表于 2015-5-29 21:59:44 | 显示全部楼层
edata 发表于 2014-6-4 15:43
凸度=拱高/弦长的一半,如果弧从起点到终点是顺时针走向则凸度为负数,0表示直线,1表示半圆。
dxf组码 42
...

(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")  '(62 . 2) '(90 . 12) '(70 . 1) (cons 10 p1) (cons 10 p2)(cons 10 p3) (cons 10 p4) (cons 10 p8)(cons 42 p8_bulge) (cons 10 p10) (cons 10 p12) (cons 10 p11) (cons 10 p9)(cons 42 p9_bulge) (cons 10 p7) (cons 10 p5) (cons 10 p6)))
这段真长。。,,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-21 18:23 , Processed in 0.180892 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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