明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3466|回复: 7

Grread应用的动态弯道标注

[复制链接]
发表于 2012-3-30 23:42:39 | 显示全部楼层 |阅读模式
本帖最后由 xgr 于 2012-3-30 23:46 编辑

前不久看到有人需要动态弯道标注的程序,正好自己也有这样的想法,就写了一个。
  1. ;;  通用grread定义
  2. (defun ZML-GRREAD (LST / test tmp mode val tmp2)
  3.   (setq test t)
  4.   (while test
  5.     (setq tmp  (grread 2)
  6.     mode (car tmp)
  7.     val  (cadr tmp)
  8.     )
  9.     (cond ((= mode 2)
  10.      (if (and (setq tmp2 (assoc mode lst)) (setq tmp2 (cdr tmp2)) (setq tmp2 (assoc val tmp2)))
  11.        (eval (cons 'progn (cdr tmp2)))
  12.        ()
  13.      )
  14.     )
  15.     ((setq tmp2 (assoc mode lst)) (eval (cons 'progn (cdr tmp2))))
  16.     (t (princ tmp))
  17.     )
  18.   )
  19. )
  1. ;;;动态弯道标注
  2. (defun c:wdbz ()
  3.    (prompt "\n 弯道标注程序加载成功,只支持圆弧线!")
  4.   (setq oldosmode (getvar "osmode"))
  5.   (setq  l   (getvar "ltscale")
  6.   scale   1.0
  7.   textsize (* l 3.0)
  8.   )
  9.   (vl-load-com)
  10.   (if (and (setq en1 (entsel "\n 请选取轨道中心线弧线:"))
  11.      (setq arcobj (vlax-ename->vla-object (car en1)))
  12.      ;;得到起点坐标
  13.      (setq Startpt (vla-get-StartPoint arcobj))
  14.      (setq Startpt (vlax-variant-value Startpt))
  15.      (setq StartPoint (vlax-safearray->list Startpt))
  16.      ;;得到终点坐标
  17.      (setq Endpt (vla-get-EndPoint arcobj))
  18.      (setq Endpt (vlax-variant-value Endpt))
  19.      (setq EndPoint (vlax-safearray->list Endpt))
  20.      ;;得到圆心坐标
  21.      (setq Centerpt (vla-get-Center arcobj))
  22.      (setq Centerpt (vlax-variant-value Centerpt))
  23.      (setq CenterPoint (vlax-safearray->list Centerpt))
  24.      ;;得到弧的夹角
  25.      (setq totalangle (vla-get-totalangle arcobj))
  26.      ;;得到d-f-m
  27.      (setq ang_d (fix (/ (* totalangle 180) pi))
  28.      ang_f (fix (* (- (/ (* totalangle 180) pi) ang_d) 60))
  29.      ang_m (fix (* (- (/ (* totalangle 180) pi) ang_d (/ ang_f 60.0)) 3600))
  30.      )
  31.      ;;得到转角数
  32.      (setq ang (strcat "θ="
  33.            (itoa ang_d)
  34.            "°"
  35.            (if (> ang_f 10)
  36.              (itoa ang_f)
  37.              (strcat "0" (itoa ang_f))
  38.            )
  39.            "′"
  40.            (if (> ang_m 10)
  41.              (itoa ang_m)
  42.              (strcat "0" (itoa ang_m))
  43.            )
  44.            "″"
  45.          )
  46.      )
  47.      ;;获取半径
  48.      (setq radius (fix (* (vla-get-radius arcobj) 1000)))
  49.      ;;取弧长
  50.      (setq ArcLength (fix (* (vla-get-ArcLength arcobj) 1000)))
  51.      ;;-----------------------------------------      
  52.      ;;绘制引线                                     θ
  53.      (setq pt1 (getpoint "\n选择标注点: "))
  54.      ;; 这个范例在模型空间中建立具有一个关联式注释的一条引线,
  55.      ;; 接着显示新的引线的注释对象。
  56.      (setq AcadObject   (vlax-get-acad-object)
  57.      AcadDocument (vla-get-ActiveDocument Acadobject)
  58.      mSpace        (vla-get-ModelSpace Acaddocument)
  59.      )
  60.      ;; 定义新的 MText 对象
  61.      (setq textString (strcat ang "\n" (strcat "R=" (itoa radius)) "\n" (strcat "L=" (itoa ArcLength))))
  62.      (setq insertionPnt (vlax-make-safearray vlax-vbDouble '(0 . 2)))
  63.      (vlax-safearray-fill insertionPnt pt1)
  64.      (setq width (distance (car (textbox (list (cons 1 ang)))) (cadr (textbox (list (cons 1 ang))))))
  65.      ;; 在模型空间中建立MText 对象
  66.      (setq MTextObj (vla-AddMText mSpace insertionPnt width textString))
  67.      ;;填满wenzi
  68.      (setq wenzi (vlax-make-safearray vlax-vbString '(1 . 9)))
  69.      (vlax-safearray-fill
  70.        wenzi
  71.        '("TopLeft" "TopCenter" "TopRight"  "MiddleLeft" "MiddleCenter" "MiddleRight" "BottomLeft" "BottomCenter" "BottomRight")
  72.      )
  73.      ;; 引线数据
  74.      (setq pnts (vlax-make-safearray vlax-vbDouble '(0 . 5)))
  75.      (vlax-safearray-fill pnts (append pt1 (polar pt1 0 1)))
  76.      ;;是否显示箭头
  77.      (setq leaderType acLineWithArrow)
  78.      ;;设置初始箭头为"实心闭合"
  79.      (setq ArrowheadType 0)
  80.      ;;创建箭头类型列表
  81.      (setq ArrowheadTypeList (vlax-make-safearray vlax-vbstring '(1 . 20)))
  82.      (vlax-safearray-fill
  83.        ArrowheadTypeList
  84.        '("实心闭合" "空心闭合" "闭合" "点" "建筑标记" "倾斜" "打开" "指示原点" "指示原点2" "直角"  "30度角" "小点"  "空心点" "空心小点" "方框" "实心方框" "基准三角形" "实心基准三角形" "积分" "无")
  85.      )
  86.      ;; 在模型中建立Leader 对象,接着将MText对象设成
  87.      ;; Leader注释,使新的MText对象和新的Leader对象建立关联
  88.      (setq annotationObject MTextObj)
  89.      (setq leaderObj (vla-AddLeader mSpace pnts annotationObject leaderType))
  90.      (princ "\n")
  91.       )
  92.     (progn (setq LST (list '(5
  93.            (grdraw CenterPoint StartPoint 1)
  94.            (grdraw CenterPoint EndPoint 1)
  95.            (setq pt val)
  96.            ;;更新文字插入点
  97.            (vla-put-InsertionPoint MTextObj (vlax-3d-point pt))
  98.            ;;更新文字插入点
  99.            ;;设置文字的对齐点
  100.            (vla-put-AttachmentPoint MTextObj acAttachmentPointBottomLeft)
  101.            ;;修改文字颜色
  102.            (vla-put-Color MTextObj 3)
  103.            (vla-put-Layer MTextObj "zj")
  104.            (vla-put-Width MTextObj width)
  105.            (if
  106.             (<= (car pt) (car pt1))
  107.             ;;如果鼠标移动点的x坐标值小于等于最近点的X坐标值
  108.             (vla-put-AttachmentPoint MTextObj 9)
  109.             ;;更改文字的贴附点为9(右下角)
  110.             (vla-put-AttachmentPoint MTextObj 7)
  111.             ;;更改文字的贴附点为7(左下角)
  112.            )
  113.            ;;end_if
  114.            (setq pnts1 (vlax-make-safearray vlax-vbDouble '(0 . 5)))
  115.            (vlax-safearray-fill pnts1 (append pt1 (polar pt 0 1)))
  116.            (vla-put-Coordinates leaderObj pnts1)
  117.            ;;更新引线插入点
  118.            ;;设置文字标注在上方
  119.            (vla-put-VerticalTextPosition leaderObj acAbove)
  120.            ;;设置文字与标注线的垂直距离
  121.            (vla-put-TextGap leaderObj (* l 1))
  122.            ;;设置标注线的图层
  123.            (vla-put-layer leaderObj "zj")
  124.            ;;设置标注线的颜色
  125.            (vla-put-DimensionLineColor leaderObj 1)
  126.            ;;设置初始箭头大小
  127.            (vla-put-ArrowheadSize leaderObj scale)
  128.            (princ "\n按加减号改变箭头大小<+/->,按 </> 键改变文字高度,按Tab键改变箭头样式:")
  129.           )
  130.          '(2
  131.            ;;按TAB键
  132.            (9
  133.             (setq ArrowheadType (+ ArrowheadType 1))
  134.             (if
  135.              (> ArrowheadType 19)
  136.              (setq ArrowheadType 0)
  137.             )
  138.             ;;修改箭头大小
  139.             (vla-put-ArrowheadType leaderObj ArrowheadType)
  140.             (princ
  141.              (strcat
  142.         "\n箭头变换啦***"
  143.         " 当前箭头样式为->"
  144.         (vlax-safearray-get-element ArrowheadTypeList (+ ArrowheadType 1))
  145.              )
  146.             )
  147.            )
  148.            (43
  149.             (setq scale (+ scale 0.1))
  150.             ;;修改箭头大小
  151.             (vla-put-ArrowheadSize leaderObj scale)
  152.             (princ (strcat "\n箭头增大啦***" " 当前比例=" (rtos scale 2 1)))
  153.            )
  154.            (45
  155.             (setq scale (- scale 0.1))
  156.             ;;修改箭头大小
  157.             (if
  158.              (> scale 0.18)
  159.              (progn
  160.         (vla-put-ArrowheadSize leaderObj scale)
  161.         (princ (strcat "\n箭头减小啦***" " 当前比例=" (rtos scale 2 1)))
  162.              )
  163.              (princ "\n箭头已经是最小了!")
  164.             )
  165.            )
  166.            ;;修改文字高度
  167.            (44
  168.             (setq width (* width (/ (+ textsize 0.1) textsize)))
  169.             (setq textsize (+ textsize 0.1))
  170.             (vla-put-Height MTextObj textsize)
  171.             (princ (strcat "\n文字高度增大啦***" " 当前高度=" (rtos textsize 2 1)))
  172.            )
  173.            (46
  174.             (setq width (* width (/ (- textsize 0.1) textsize)))
  175.             (setq textsize (- textsize 0.1))
  176.             (vla-put-Height MTextObj textsize)
  177.             (princ (strcat "\n文字高度减小啦***" " 当前高度=" (rtos textsize 2 1)))
  178.            )
  179.           )
  180.          ;;左击
  181.          '
  182.           (3 (setq pt val)
  183.              (initget 1 " y n Y N  ")
  184.              (setq xunwen (getkword "\n是否绘制半径[Y/N或回车退出]:"))
  185.              (if (or (= xunwen "y") (= xunwen "Y") (= xunwen " "))
  186.          (progn (command "line" CenterPoint StartPoint "") (command "line" CenterPoint EndPoint ""))
  187.              )
  188.              (redraw)
  189.              (setq TEST NIL)
  190.              (setvar "osmode" oldosmode)
  191.           )
  192.              '(25 (redraw) (setq TEST NIL))
  193.              '(11 (redraw) (setq TEST NIL))
  194.           )
  195.      )
  196.      (ZML-GRREAD lst)
  197.     )
  198.   )
  199.   (princ)
  200. )
(ZML-GRREAD lst)为网上搜集。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2012-3-30 23:57:04 | 显示全部楼层
有源码,支持一下
发表于 2012-4-11 18:51:13 | 显示全部楼层
现在还只会LISP类函数
发表于 2012-5-18 20:13:47 | 显示全部楼层
win7 cad2011显示 :错误: Automation 错误。 未找到主键
发表于 2012-9-24 14:04:12 | 显示全部楼层
ZML-GRREAD 连作者信息都被去掉了,太不厚道了
发表于 2012-9-24 16:03:26 | 显示全部楼层
zml84 发表于 2012-9-24 14:04
ZML-GRREAD 连作者信息都被去掉了,太不厚道了

呵呵,这种事情太多了,第一个转载没有作者信息,后面再转载的就更木有了,不过你的函数有前缀ZML大家一看就知道了
发表于 2013-5-28 23:24:03 | 显示全部楼层
学习学习  先收藏了
发表于 2013-5-29 07:53:13 | 显示全部楼层
感谢xgr 分享学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 15:14 , Processed in 0.219828 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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