明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2229|回复: 9

求斑竹高手们增强CAD轨道弯道标注程序

[复制链接]
发表于 2011-7-11 22:14:43 | 显示全部楼层 |阅读模式
本帖最后由 cumtjh 于 2011-7-11 22:16 编辑

本人工作中经常需要量取或计算圆弧曲线的α、R、T、Kp参数,作图采用cad手工作图,即缩小实际尺寸作图,最后1:1打印。

希望高手们改进增强下面的弯道标注程序
1、弯道标注选择对象前,输入要标注对象的作图比例。即测量因子,即图中标注尺寸=图实际尺寸*测量因子。输入测量因子后,保存在变量中,下次调用弯道标注时,显示当前默认的测量因子,根据需要来改变测量因子。
2、下面程序只支持圆弧对象标注,不支持多段线标注,请版主高手们编写同时兼容圆弧和多段线的弯道标注。
3、标注文字 缺少引线,能够增加标注文字的多段线引线 (粗线宽0.3)。如下图所示。如果麻烦的话,请帮忙完善上面两个功能。当然我自己也会努力,争取通过大家和自身努力,早日完成!谢谢





  1. ;CAD轨道弯道标注程序
  2. (defun c:wdbz (/)
  3.     (prompt "\n 弯道标注程序加载成功")
  4. ;;;     选取对象
  5.     (setq en1 (entsel "\n 请选取轨道中心线弧线:"))
  6. ;;;     取得对象属性列表
  7.     (setq en1_data (entget (car en1)))
  8. ;;;     提取标注半径R:
  9.     (setq radius (fix (atof (rtos (* 1000 (cdr (assoc 40 en1_data))) 2 0))))
  10. ;;;     提取起至角度50和终止角度51以及计算夹角以及T值
  11.     (setq ang1_rad (cdr (assoc 50 en1_data)))        ;ang1_rad是起至角度的弧度表示
  12.         (setq ang2_rad (cdr (assoc 51 en1_data)))        ;ang2_rad是终止角度的弧度表示
  13.     (setq ang3_rad (abs (- ang2_rad ang1_rad)))        ;ang3_rad是夹角的弧度表示
  14.     (setq ang4 (/ (* ang3_rad 180) pi))            ;ang4是夹角的度数表示
  15.     (setq ang9 (/ ang3_rad 2))                ;ang9是用弧度表述的夹角的半角
  16.         (setq tg (/ (sin ang9) (cos ang9)))            ;计算ang9的正切
  17.     (setq tt (fix (atof (rtos (* tg radius)))))
  18.     (setq ang5 (fix ang4))                    ;ang5是角度的整数部分,既标注的度数部分
  19.     (setq ang6 (* (- ang4 ang5) 60))
  20.     (setq ang7 (fix ang6))                    ;ang7是标注的分数部分,rtos是四舍五入
  21.     (setq ang8 (fix (atof (rtos (* (- ang6 ang7) 60) 2 0))));ang8是标注的秒数部分
  22. ;;;     计算弧长K值
  23.     (setq 2pi (* pi 2))
  24.     (setq d (* radius 2))
  25.     (setq c (* d pi))
  26.     (setq k (fix (atof (rtos (/ (* c ang3_rad) 2pi) 2 0))))
  27. ;;;     标注
  28. ;;;     (setvar "cmdecho" 0)
  29.     (setq pt1 (getpoint "\n请选择文本框左下点:"))
  30.     (setq x2 (+ (car pt1) 15))
  31.     (setq y2 (+ (cadr pt1) 17))
  32.     (setq pt2 (list x2 y2))
  33.     (setq ang55 (itoa ang5))
  34.     (setq ang77 (itoa ang7))
  35.     (setq ang88 (itoa ang8))
  36.     (setq radius_new (itoa radius))
  37.     (setq tt_new (itoa tt))
  38.     (setq k_new (itoa k))
  39.     (setq ang_new (strcat "α=" ang55 "°" ang77 "′" ang88 "″"))
  40.     (setq r (strcat "R=" radius_new))
  41.     (setq ttt (strcat "T=" tt_new))
  42.     (setq kkk (strcat "K=" k_new))
  43.     (command "mtext" pt1 pt2 ang_new r ttt kkk"")
  44. )


该贴已经同步到 cumtjh的微博

本帖子中包含更多资源

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

x
发表于 2011-7-11 23:21:43 | 显示全部楼层
回复 cumtjh 的帖子

根据你的代码,稍加改造,比较粗糙,你可以借鉴下:
  1. ;;;返回 (圆心 起点弧度 终点弧度 半径)
  2. (defun gxl-Bulge->ArcData ( p1 p2 bulg / ang cen rad )
  3.   (setq ang (* 2.0 (atan bulg))
  4.         rad (/ (distance p1 p2) (* 2.0 (sin ang)))
  5.         cen (polar p1 (+ (- (/ pi 2.) ang) (angle p1 p2)) rad)
  6.   )
  7.   (if (minusp bulg)
  8.     (list cen (angle cen p2) (angle cen p1) (abs rad))
  9.     (list cen (angle cen p1) (angle cen p2) (abs rad))
  10.   )
  11. )
  12. ;;;计算两点的中点
  13. ;;;==================================================================
  14. (defun gxl-MidPoint (p1 p2)
  15.   (if (and (> (length p1) 2)(> (length p2) 2))
  16.       (list (* 0.5 (+ (car p1) (car p2))) (* 0.5 (+ (cadr p1) (cadr p2))) (* 0.5 (+ (caddr p1) (caddr p2))))
  17.       (list (* 0.5 (+ (car p1) (car p2))) (* 0.5 (+ (cadr p1) (cadr p2))))
  18.   )  
  19.   )

  20. (defun c:tt (/)
  21.     (prompt "\n 弯道标注程序加载成功")
  22. ;;;     选取对象
  23.     (setq en1 (entsel "\n 请选取轨道中心线弧线:"))
  24.   
  25. ;;;     取得对象属性列表
  26.     (setq en1_data (entget (car en1)))
  27.   (if (= "ARC" (cdr (assoc 0 en1_data)))
  28.     (progn
  29.       ;;;     提取标注半径R:
  30.     (setq radius (fix (atof (rtos (* 1000 (cdr (assoc 40 en1_data))) 2 0))))
  31. ;;;     提取起至角度50和终止角度51以及计算夹角以及T值
  32.     (setq ang1_rad (cdr (assoc 50 en1_data)))        ;ang1_rad是起至角度的弧度表示
  33.         (setq ang2_rad (cdr (assoc 51 en1_data)))        ;ang2_rad是终止角度的弧度表示
  34.     (setq ang3_rad (abs (- ang2_rad ang1_rad)))        ;ang3_rad是夹角的弧度表示
  35.     (setq ang4 (/ (* ang3_rad 180) pi))            ;ang4是夹角的度数表示
  36.     (setq ang9 (/ ang3_rad 2))                ;ang9是用弧度表述的夹角的半角
  37.         (setq tg (/ (sin ang9) (cos ang9)))            ;计算ang9的正切
  38.     (setq tt (fix (atof (rtos (* tg radius)))))
  39.     (setq ang5 (fix ang4))                    ;ang5是角度的整数部分,既标注的度数部分
  40.     (setq ang6 (* (- ang4 ang5) 60))
  41.     (setq ang7 (fix ang6))                    ;ang7是标注的分数部分,rtos是四舍五入
  42.     (setq ang8 (fix (atof (rtos (* (- ang6 ang7) 60) 2 0))));ang8是标注的秒数部分
  43. ;;;     计算弧长K值
  44.     (setq 2pi (* pi 2))
  45.     (setq d (* radius 2))
  46.     (setq c (* d pi))
  47.     (setq k (fix (atof (rtos (/ (* c ang3_rad) 2pi) 2 0))))
  48. ;;;     标注
  49. ;;;     (setvar "cmdecho" 0)
  50.     (setq pt1 (getpoint "\n请选择文本框左下点:"))
  51.     (setq x2 (+ (car pt1) 15))
  52.     (setq y2 (+ (cadr pt1) 17))
  53.     (setq pt2 (list x2 y2))
  54.     (setq ang55 (itoa ang5))
  55.     (setq ang77 (itoa ang7))
  56.     (setq ang88 (itoa ang8))
  57.     (setq radius_new (itoa radius))
  58.     (setq tt_new (itoa tt))
  59.     (setq k_new (itoa k))
  60.     (setq ang_new (strcat "α=" ang55 "°" ang77 "′" ang88 "″"))
  61.     (setq r (strcat "R=" radius_new))
  62.     (setq ttt (strcat "T=" tt_new))
  63.     (setq kkk (strcat "K=" k_new))
  64.     (command "mtext" pt1 pt2 ang_new r ttt kkk"")

  65.       )
  66.     (if (= "LWPOLYLINE" (cdr (assoc 0 en1_data)))
  67.     (progn
  68.   (setq i 0 obj (vlax-ename->vla-object (car en1)))
  69.   (repeat (fix (vlax-curve-getEndParam obj))
  70.     (if (/= 0 (setq bulge (vla-GetBulge obj i)))
  71.       (progn
  72.         ;;;计算(<centre> <start angle> <end angle> <radius>)
  73.         (setq data (gxl-Bulge->ArcData (vlax-curve-getPointAtParam obj i) (vlax-curve-getPointAtParam obj (1+ i)) bulge))
  74.        
  75. ;;;     提取标注半径R:
  76.     (setq radius (fix (nth 3 data)) )
  77. ;;;     提取起至角度50和终止角度51以及计算夹角以及T值
  78.         (if (MINUSP bulge)
  79.        (setq ang1_rad (nth 2 data)        ;ang1_rad是起至角度的弧度表示
  80.         ang2_rad (nth 1 data))        ;ang2_rad是终止角度的弧度表示
  81.        (setq ang1_rad (nth 1 data)        ;ang1_rad是起至角度的弧度表示
  82.         ang2_rad (nth 2 data))        ;ang2_rad是终止角度的弧度表示
  83.           )
  84.     (setq ang3_rad (- ang2_rad ang1_rad))        ;ang3_rad是夹角的弧度表示
  85.         (if (MINUSP ang3_rad) (setq ang3_rad (+ ang3_rad pi pi)))
  86.     (setq ang4 (/ (* ang3_rad 180) pi))            ;ang4是夹角的度数表示
  87.     (setq ang9 (/ ang3_rad 2))                ;ang9是用弧度表述的夹角的半角
  88.         (setq tg (/ (sin ang9) (cos ang9)))            ;计算ang9的正切
  89.     (setq tt (fix (atof (rtos (* tg radius)))))
  90.     (setq ang5 (fix ang4))                    ;ang5是角度的整数部分,既标注的度数部分
  91.     (setq ang6 (* (- ang4 ang5) 60))
  92.     (setq ang7 (fix ang6))                    ;ang7是标注的分数部分,rtos是四舍五入
  93.     (setq ang8 (fix (atof (rtos (* (- ang6 ang7) 60) 2 0))));ang8是标注的秒数部分
  94. ;;;     计算弧长K值
  95.     (setq 2pi (* pi 2))
  96.     (setq d (* radius 2))
  97.     (setq c (* d pi))
  98.     (setq k (fix (atof (rtos (/ (* c ang3_rad) 2pi) 2 0))))
  99. ;;;     标注
  100. ;;;     (setvar "cmdecho" 0)
  101.     ;(setq pt1 (getpoint "\n请选择文本框左下点:"))
  102.         (setq pt1 (GXL-MIDPOINT (GXL-MIDPOINT cp p1) (GXL-MIDPOINT cp p2)))
  103.     (setq x2 (+ (car pt1) 15))
  104.     (setq y2 (+ (cadr pt1) 17))
  105.     (setq pt2 (list x2 y2))
  106.     (setq ang55 (itoa ang5))
  107.     (setq ang77 (itoa ang7))
  108.     (setq ang88 (itoa ang8))
  109.     (setq radius_new (itoa radius))
  110.     (setq tt_new (itoa tt))
  111.     (setq k_new (itoa k))
  112.     (setq ang_new (strcat "α=" ang55 "°" ang77 "′" ang88 "″"))
  113.     (setq r (strcat "R=" radius_new))
  114.     (setq ttt (strcat "T=" tt_new))
  115.     (setq kkk (strcat "K=" k_new))
  116.     (command "mtext" pt1 pt1 ang_new r ttt kkk"")
  117.     (command "line" (setq p1 (vlax-curve-getPointAtParam obj i)) (setq cp (car data)) (setq p2 (vlax-curve-getPointAtParam obj (1+ i))) "")
  118.     )
  119.       )
  120.     (setq i (1+ i))
  121.     )
  122.   )
  123.       )
  124.     )
  125.   (princ)
  126. )
 楼主| 发表于 2011-7-12 01:04:41 | 显示全部楼层
Gu_xl 发表于 2011-7-11 23:21
回复 cumtjh 的帖子

根据你的代码,稍加改造,比较粗糙,你可以借鉴下:

非常感谢,已经基本解决问题 我会再接再厉 完善的
发表于 2011-7-12 08:54:04 | 显示全部楼层
能否请Gu_xl版主加上这样的功能,就是对整个一条多段线而言,可能由几个这样的弧段组成,点击这条多段线多自动全部予以标注。
发表于 2011-7-12 09:55:59 | 显示全部楼层
回复 zbwei120 的帖子

什么意思?上面的代码就是可以将多段线全部弧段标注的!
发表于 2011-7-12 11:12:02 | 显示全部楼层
一第多段线如果包含直线及弧段组成,运行程序后出现“选取轨道中心线弧线:; 错误: 参数类型错误: numberp: nil”,如果将其分解成单个的弧段,则可以正常标注。
我的意思是多段线不分解成单个的弧线段,点选哪个弧段即标注到那个弧段。
发表于 2011-7-12 11:31:03 | 显示全部楼层
本帖最后由 Gu_xl 于 2011-7-12 11:35 编辑

回复 zbwei120 的帖子

看下面代码:
  1. (setq en (car (entsel "\n选取弧段:"))
  2.       pt (cadr en)
  3.       en (car en)
  4.       pt (vlax-curve-getclosestpointto en) ;_ 弧段上点
  5.       param (fix (vlax-curve-getParamAtPoint en pt)) ;_ 弧段起点参数
  6.       bulge (vla-GetBulge (vlax-ename->vla-object en)) ;_ 弧段弓弦比
  7.       p1 (vlax-curve-getPointAtParam en param) ;_ 弧段起点
  8.       p2 (vlax-curve-getPointAtParam en (1+ param)) ;_ 弧段终点
  9.       )
发表于 2011-11-18 20:46:50 | 显示全部楼层

感觉很不错的谢谢楼主啊
发表于 2012-3-31 21:10:44 | 显示全部楼层
去看看,是否对你有帮助
http://bbs.mjtd.com/thread-92752-1-3.html
发表于 2012-8-16 16:07:40 | 显示全部楼层
楼主。你这快捷键设的是什么啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-25 17:32 , Processed in 0.218105 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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