明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6797|回复: 21

发了个动态桩号标注的程序,望高手不吝赐教

[复制链接]
发表于 2015-1-19 16:51:54 | 显示全部楼层 |阅读模式
本帖最后由 newbuser 于 2015-1-22 09:39 编辑

以此抛出个茅坑又脏又硬的砖头,希望引来更多的美玉。现将小程序发于此处,程序运行过程中扔有些瑕疵,正如gif动画中在圆上标注桩号时演示的那样,程序总是在无键盘和鼠标左右键交互的指令下自动终止,还请高手多多指教,鄙人愿闻其详。此程序仍需完善,比如加入捕捉或者循环标注等功能。还望高手不吝赐教啊。
  1. (defun c:zh (/ os e obj  loop el  code mod val p l K m mstr ptmun  m.back
  2.          plist)
  3.   (setq dim (getvar "DIMZIN"))
  4.   (setq unt (getvar "UNITMODE"))
  5.   (setvar "DIMZIN" 0)
  6.   (setvar "UNITMODE" 0)
  7.   (setq os (getvar "osmode"))
  8.   (setq e (car (entsel "\n 请选择需要标注的多段线=>> ")))
  9.   (prompt "\n <<****欢迎使用逐桩标注程序****>>")
  10.   (setq obj (vlax-ename->vla-object e))
  11.   (entmake (list '(0 . "TEXT")
  12.      (cons 1 "0")
  13.      '(10 0 0 0)
  14.      (cons 40 1)
  15.      (cons 62 3)
  16.      (cons 8 "桩号标注")
  17.      )
  18.   )
  19.   (setq el (entget (entlast)))
  20. ;;;  (setq p (getpoint "\n 请选择需要标注的点位 "))
  21.   (setq loop T)
  22.   (while loop
  23.     (setq code (grread T 4 1)
  24.     mod  (car code)
  25.     val  (cadr code)
  26.     )
  27.     (cond ((= 5 mod)
  28.      ;;获取离曲线最近的点
  29.      (setq p (vlax-curve-getClosestPointTo
  30.          obj
  31.          val
  32.        )
  33.      )
  34.      (redraw)
  35.      (grdraw val p 3)
  36.      ;;指定点到起点的距离
  37.      (setq l (vlax-curve-getDistAtPoint obj p)
  38.      K (fix (* 0.001 l))
  39.      m (- (* 0.001 l) K)
  40.      )
  41.      (setq mstr (rtos m 2 6))
  42.      (setq ptnum (vl-string-search "." mstr))
  43.      (setq m.back (substr mstr (+ 5 ptnum) 3))
  44.      (setq
  45.        m.back (cond ((= 0 (strlen m.back)) (strcat m.back "000"))
  46.                           ((= 1 (strlen m.back)) (strcat m.back "00"))
  47.         ((= 2 (strlen m.back)) (strcat m.back "0"))
  48.         ((= 3 (strlen m.back)) m.back)
  49.         )
  50.      )
  51.      ;;里程桩内容
  52.      (setq str (strcat "K"
  53.            (itoa K)
  54.            "+"
  55.            (substr mstr (+ 2 ptnum) 3)
  56.            "."
  57.            m.back

  58.          )
  59.      )
  60.      ;;找出X或者Y坐标值小的点
  61.      (setq plist (if (= (car val) (car p))
  62.        (progn
  63.          (vl-sort (list val p)
  64.             (function (lambda (e1 e2)
  65.             (< (cadr e1) (cadr e2))
  66.                 )
  67.             )
  68.          )
  69.        )
  70.        ;;如果X值相等,Y值小的在前面
  71.        (progn
  72.          (vl-sort
  73.            (list val p)
  74.            (function (lambda (e1 e2)
  75.            (< (car e1) (car e2))
  76.                )
  77.            )
  78.          )
  79.        )
  80.        ;;否则X值小的在前面
  81.            )
  82.      )
  83.      (setq ang (angle (car plist) (cadr plist)))
  84.      (setq el (subst (cons 1 str) (assoc 1 el) el))
  85.      ;;坐标
  86.      (setq el (subst (cons 10 val) (assoc 10 el) el))
  87.      ;;角度
  88.      (setq el (subst (cons 50 ang) (assoc 50 el) el))
  89.      ;;高度
  90.      (setq el (subst (cons 40 (* 0.05 (distance val p)))
  91.          (assoc 40 el)
  92.          el
  93.         )
  94.      )
  95.      ;;更新图元名列表
  96.      (entmod el)
  97.     )
  98.     ;;鼠标左键、右键退出画线
  99.     ((or (= 25 mod) (= 3 mod))
  100.      (entmake (list '(0 . "LINE")
  101.         (cons 10 p)
  102.         (cons 11 val)
  103.         (cons 8 "桩号标注")
  104.         (cons 62 1)
  105.         )
  106.      )
  107.      (setq loop nil)
  108.     )
  109.     )
  110.   )
  111.     (setvar "DIMZIN" dim)
  112.   (setvar "UNITMODE" unt)
  113.   (setvar "osmode" os)
  114. ;;;  (redraw)
  115. )

本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

发表于 2015-1-20 08:51:00 | 显示全部楼层
给一个测试grread返回值的程序,估计是因按“回车键”时的同时,产生了附加码引起的
;;;============================================
;;; 测试 (grread t 4 2) 返回值,按键盘上的“空格”键结束,屏蔽了鼠标移动过程中的显示值
(while(/=(cadr(setq tmp(grread t 4 2)))32)(if(/=(car tmp)5)(progn(princ"\n")(princ tmp))))
;;;============================================
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2015-1-22 09:35:51 | 显示全部楼层
找到原因了,问题出在那个里程桩号生成的那个函数上。
在程序开始时保存dimzin和unitmode变量并将该两项变量设置为0,程序运行完后再回复该两项系统变量即可。代码已更新,在楼顶。
发表于 2015-1-22 10:39:08 | 显示全部楼层
帮楼主顶贴
发表于 2015-3-13 11:14:12 | 显示全部楼层
楼主这个赞,动态的不错哦!
发表于 2015-4-23 22:34:57 | 显示全部楼层
赞,不错啊  支持啊··~~~
发表于 2015-5-11 09:05:29 | 显示全部楼层
支持下  能指定标注桩号就更好!!
发表于 2015-5-16 13:16:07 | 显示全部楼层
顶!!!!!!!!!!!
发表于 2015-7-28 17:20:07 | 显示全部楼层
帮顶一个   
发表于 2015-11-8 23:47:30 | 显示全部楼层
这个程序不错,很实用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-27 03:36 , Processed in 0.189660 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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