明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6243|回复: 13

[基础] 朴素实用的代码,半动态坐标标注,出错处理,另类、常规循环、grread示例

[复制链接]
发表于 2014-9-12 23:42:45 | 显示全部楼层 |阅读模式
本帖最后由 wzg356 于 2014-9-13 00:56 编辑

坐标标注的工具很全、很强、很多,但有时使用觉得反而复杂化了,好的代码至今未见。
仿写了个,可以拿去根据自己的需要加工。主要是出错处理,另类、常规循环、grread的应用对菜鸟们很有用。
本人菜鸟一个,因工作需要今年才接触lsp,借用明经里大师们的示例,一句一句凑得 ,但个人觉得比较有难度的部分搞出了。
感谢明经

欢迎拍,但要拍出你的好东东a
  1. ;坐标标注 wzg356 2014.9.12
  2. ;
  3. (defun c:bzb ( / newerr *olderror* n hzt pt0 p1 p2 xpt ypt l pt2
  4.                en0 ent0 en1 ent1 en2 ent2 en3 ent3 gr gr-model gr-value pt1)
  5.   ;自定义新的出错函数
  6.     (defun newerr (msg)
  7.       (mapcar 'eval sysvarlst);恢复变量设置
  8.       (if *olderror* (setq *error* *olderror*  *olderror* nil)) ;_ 恢复*error*函数
  9.       (if (not (member msg '(nil "函数被取消" ";错误:quit / exit abort")))
  10.         (princ (strcat ";错误:" msg))
  11.     )
  12.   )
  13.   ;;系统设置
  14.   (command "undo" "be");;命令编组开始
  15.   (setq sysvarlst(mapcar (function (lambda (n) (list 'setvar n (getvar n))))
  16.       '( "osmode" "cmdecho" "OSNAPCOORD" "dimzin" "plinewid" "TEXTSIZE" "textstyle")));保存系统变量
  17.   (setq *olderror* *error*);保存出错函数
  18.   (setq  *error* newerr);设置自定义出错函数  
  19.   (setvar "cmdecho" 0);;;关闭命令响应
  20.   (setvar "OSNAPCOORD" 1);;;坐标数据优先级设为:键盘输入替代对象捕捉设置
  21.   (setvar "OSMODE" 675);;;改变捕捉模式
  22.   (setvar "dimzin" 0);;;不对主单位值作消零处理
  23.   
  24.   (if (= (Tblsearch "style" "MY_ST") nil)
  25.     (command "-style" "MY_ST" "宋体" 0 0.8 0 "n" "n");;;文字样式,字高处要设为0,否则command "_.TEXT 要改
  26.   )  
  27.     (setvar "textstyle" "MY_ST")  ;当前文字样式
  28.   
  29.   ;开始标注
  30.   (if bzthzt (setq hzt bzthzt)(setq hzt 2.5));bzthzt设为全局变量 记忆字高
  31.   (princ (strcat "\n当前文字高度" (rtos hzt 2 2)))
  32.   (initget "S  ")  ;带空格的关键字
  33.     (setq pt0 (getpoint "\n点取标注点位置【或设置文字高度(S)】:"));这样可在不需设字高时直接进入标注
  34.     (cond
  35.       ((= pt0 "S")
  36.         (if (setq bzthzt (getreal (strcat "\n输入文字高度<" (rtos hzt 2 2) ">:")))(setq hzt bzthzt))
  37.         (setq pt0 nil)  ;不要这句会出现错误提示(不影响使用),悟出来的  ,但搞不明白   
  38.       (c:bzb);设置完后循环至取标注点,有递归的影子
  39.     )
  40.     ((= pt0 "") nil);右键、空格退出
  41.     )      
  42.   
  43.   (while pt0            ;开始循环标注
  44.     (setq p1 (polar pt0 (* pi -0.5) (* hzt  0.7)));文字位置
  45.     (setq p2 (polar pt0 (* pi  0.5) (* hzt  0.7)));文字位置
  46.     (setq xpt (rtos (cadr pt0) 2 3) ;文字内容
  47.         ypt (rtos (car pt0) 2 3)
  48.     )
  49.     (setq l (* 0.72 hzt (max (strlen xpt) (strlen ypt))));依据字高的横线长度,可自己调整
  50.     (setq pt2 (polar pt0 0 l));横线端点
  51.     (setvar "osmode" 0)
  52.     (command "_.LINE" pt0 pt0 "");斜引线
  53.     (setq en0 (entlast) ent0 (entget en0));取得组码表
  54.     (command "_.LINE" pt0 pt2 "");引线横
  55.     (setq en1 (entlast)  ent1 (entget en1))
  56.     (command "_.TEXT" "ML" p2 hzt 0 (strcat "x=" xpt));写标注文字
  57.     (setq en2 (entlast) ent2 (entget en2))
  58.     (command "_.TEXT" "ML" p1 hzt  0 (strcat "y=" ypt))
  59.     (setq en3 (entlast) ent3 (entget en3))
  60.     (setq gr 0 gr-model 0 gr-value 0 );;gr-model必须归零
  61.     (while (/= gr-model 3) ;鼠标左键,确认标注位置,退出循环
  62.       (setq gr (grread T 8)   
  63.           gr-model (car gr)   
  64.           gr-value (cadr gr);鼠标位置
  65.       )      
  66.       (if  (and gr (=  gr-model 5));鼠标移动
  67.         (progn
  68.           (setq pt1 gr-value)
  69.           (if(>= (car gr-value)(car pt0));如果文字点在坐标点右边
  70.               (setq pt2 (polar pt1 0 l)
  71.                   p1 (polar pt1 (* pi -0.5) (* hzt  0.7))
  72.                   p2 (polar pt1 (* pi  0.5) (* hzt  0.7)))
  73.               (setq pt2 (polar pt1 0 (* -1.0 l))               
  74.                   p1 (polar pt2 (* pi -0.5) (* hzt  0.7))
  75.                   p2 (polar pt2 (* pi  0.5) (* hzt  0.7)));文字点在坐标点左边
  76.           )
  77.             (setq  ent0 (subst (cons 11 pt1) (assoc 11 ent0) ent0);根据鼠标位置调整图元组码表
  78.                  ent1 (subst (cons 10 pt1) (assoc 10 ent1) ent1)
  79.                  ent1 (subst (cons 11 pt2) (assoc 11 ent1) ent1)
  80.                  ent2 (subst (cons 11 p2) (assoc 11 ent2) ent2)
  81.                  ent3 (subst (cons 11 p1) (assoc 11 ent3) ent3))
  82.           (entmod ent0);重生成更新图元,显示到鼠标 位置
  83.           (entmod ent1)
  84.           (entmod ent2)
  85.           (entmod ent3)
  86.         )
  87.       )
  88.     )
  89.     (command "_erase" en0 en1 "" );删除直线引线
  90.     (command "_.pline" pt0 "w" 0.1 0.1 pt1 pt2 "" );以多线段重画引线,以便之后编辑
  91.     (setvar "OSMODE" 675);;;改变捕捉模式为下次循环作准备
  92.     (setq pt0 (getpoint "\n点取下一个标注点: "))
  93.   )
  94.   ;;恢复设置
  95.     (command "_undo" "_e");;活动编组结束
  96.   (mapcar 'eval sysvarlst);恢复变量设置
  97.   (setq *error* *olderror*);;恢复出错函数
  98.     (princ)  
  99. )

复制代码

本帖子中包含更多资源

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

x
"觉得好,就打赏"
    共1人打赏

本帖被以下淘专辑推荐:

发表于 2014-9-13 00:01:56 | 显示全部楼层
楼主的程序不错,希望你能解决我的问题,谢谢了

http://bbs.mjtd.com/thread-111391-1-1.html
如何实现使用快捷提取多段线转为3dr格式?

点评

确实不太懂你说的  发表于 2014-9-13 10:43
 楼主| 发表于 2014-9-13 10:19:25 | 显示全部楼层
板凳自己坐
 楼主| 发表于 2014-9-13 10:36:15 | 显示全部楼层
syx2014 发表于 2014-9-13 00:01
楼主的程序不错,希望你能解决我的问题,谢谢了

http://bbs.mjtd.com/thread-111391-1-1.html

还不太懂你的这个
 楼主| 发表于 2014-9-13 21:52:42 | 显示全部楼层
自己躺下,eee
发表于 2015-1-29 09:03:40 | 显示全部楼层
学习者,收藏了。
发表于 2015-1-29 20:33:51 | 显示全部楼层
读懂了,不知道啥时候自己能写出自己的
发表于 2015-1-31 08:53:01 | 显示全部楼层
研究下,谢共享源码
发表于 2015-2-6 17:24:03 | 显示全部楼层
坐标标注很不错啊,以后会用到的赞个。
发表于 2015-2-6 22:11:04 | 显示全部楼层
很不错啊,谢谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 07:49 , Processed in 0.189891 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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