wzg356 发表于 2014-9-12 23:42:45

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

本帖最后由 wzg356 于 2014-9-13 00:56 编辑

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

欢迎拍,但要拍出你的好东东a;坐标标注 wzg356 2014.9.12
;
(defun c:bzb ( / newerr *olderror* n hzt pt0 p1 p2 xpt ypt l pt2
               en0 ent0 en1 ent1 en2 ent2 en3 ent3 gr gr-model gr-value pt1)
;自定义新的出错函数
    (defun newerr (msg)
      (mapcar 'eval sysvarlst);恢复变量设置
      (if *olderror* (setq *error* *olderror**olderror* nil)) ;_ 恢复*error*函数
      (if (not (member msg '(nil "函数被取消" ";错误:quit / exit abort")))
      (princ (strcat ";错误:" msg))
    )
)
;;系统设置
(command "undo" "be");;命令编组开始
(setq sysvarlst(mapcar (function (lambda (n) (list 'setvar n (getvar n))))
      '( "osmode" "cmdecho" "OSNAPCOORD" "dimzin" "plinewid" "TEXTSIZE" "textstyle")));保存系统变量
(setq *olderror* *error*);保存出错函数
(setq*error* newerr);设置自定义出错函数
(setvar "cmdecho" 0);;;关闭命令响应
(setvar "OSNAPCOORD" 1);;;坐标数据优先级设为:键盘输入替代对象捕捉设置
(setvar "OSMODE" 675);;;改变捕捉模式
(setvar "dimzin" 0);;;不对主单位值作消零处理

(if (= (Tblsearch "style" "MY_ST") nil)
    (command "-style" "MY_ST" "宋体" 0 0.8 0 "n" "n");;;文字样式,字高处要设为0,否则command "_.TEXT 要改
)
    (setvar "textstyle" "MY_ST");当前文字样式

;开始标注
(if bzthzt (setq hzt bzthzt)(setq hzt 2.5));bzthzt设为全局变量 记忆字高
(princ (strcat "\n当前文字高度" (rtos hzt 2 2)))
(initget "S");带空格的关键字
    (setq pt0 (getpoint "\n点取标注点位置【或设置文字高度(S)】:"));这样可在不需设字高时直接进入标注
    (cond
      ((= pt0 "S")
      (if (setq bzthzt (getreal (strcat "\n输入文字高度<" (rtos hzt 2 2) ">:")))(setq hzt bzthzt))
      (setq pt0 nil);不要这句会出现错误提示(不影响使用),悟出来的,但搞不明白   
      (c:bzb);设置完后循环至取标注点,有递归的影子
    )
    ((= pt0 "") nil);右键、空格退出
    )      

(while pt0            ;开始循环标注
    (setq p1 (polar pt0 (* pi -0.5) (* hzt0.7)));文字位置
    (setq p2 (polar pt0 (* pi0.5) (* hzt0.7)));文字位置
    (setq xpt (rtos (cadr pt0) 2 3) ;文字内容
      ypt (rtos (car pt0) 2 3)
    )
    (setq l (* 0.72 hzt (max (strlen xpt) (strlen ypt))));依据字高的横线长度,可自己调整
    (setq pt2 (polar pt0 0 l));横线端点
    (setvar "osmode" 0)
    (command "_.LINE" pt0 pt0 "");斜引线
    (setq en0 (entlast) ent0 (entget en0));取得组码表
    (command "_.LINE" pt0 pt2 "");引线横
    (setq en1 (entlast)ent1 (entget en1))
    (command "_.TEXT" "ML" p2 hzt 0 (strcat "x=" xpt));写标注文字
    (setq en2 (entlast) ent2 (entget en2))
    (command "_.TEXT" "ML" p1 hzt0 (strcat "y=" ypt))
    (setq en3 (entlast) ent3 (entget en3))
    (setq gr 0 gr-model 0 gr-value 0 );;gr-model必须归零
    (while (/= gr-model 3) ;鼠标左键,确认标注位置,退出循环
      (setq gr (grread T 8)   
          gr-model (car gr)   
          gr-value (cadr gr);鼠标位置
      )      
      (if(and gr (=gr-model 5));鼠标移动
      (progn
          (setq pt1 gr-value)
          (if(>= (car gr-value)(car pt0));如果文字点在坐标点右边
            (setq pt2 (polar pt1 0 l)
                  p1 (polar pt1 (* pi -0.5) (* hzt0.7))
                  p2 (polar pt1 (* pi0.5) (* hzt0.7)))
            (setq pt2 (polar pt1 0 (* -1.0 l))               
                  p1 (polar pt2 (* pi -0.5) (* hzt0.7))
                  p2 (polar pt2 (* pi0.5) (* hzt0.7)));文字点在坐标点左边
          )
            (setqent0 (subst (cons 11 pt1) (assoc 11 ent0) ent0);根据鼠标位置调整图元组码表
               ent1 (subst (cons 10 pt1) (assoc 10 ent1) ent1)
               ent1 (subst (cons 11 pt2) (assoc 11 ent1) ent1)
               ent2 (subst (cons 11 p2) (assoc 11 ent2) ent2)
               ent3 (subst (cons 11 p1) (assoc 11 ent3) ent3))
          (entmod ent0);重生成更新图元,显示到鼠标 位置
          (entmod ent1)
          (entmod ent2)
          (entmod ent3)
      )
      )
    )
    (command "_erase" en0 en1 "" );删除直线引线
    (command "_.pline" pt0 "w" 0.1 0.1 pt1 pt2 "" );以多线段重画引线,以便之后编辑
    (setvar "OSMODE" 675);;;改变捕捉模式为下次循环作准备
    (setq pt0 (getpoint "\n点取下一个标注点: "))
)
;;恢复设置
    (command "_undo" "_e");;活动编组结束
(mapcar 'eval sysvarlst);恢复变量设置
(setq *error* *olderror*);;恢复出错函数
    (princ)
)

syx2014 发表于 2014-9-13 00:01:56

楼主的程序不错,希望你能解决我的问题,谢谢了

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

wzg356 发表于 2014-9-13 10:19:25

板凳自己坐

wzg356 发表于 2014-9-13 10:36:15

syx2014 发表于 2014-9-13 00:01 static/image/common/back.gif
楼主的程序不错,希望你能解决我的问题,谢谢了

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


还不太懂你的这个

wzg356 发表于 2014-9-13 21:52:42

自己躺下,eee

dbqtju 发表于 2015-1-29 09:03:40

学习者,收藏了。

dbqtju 发表于 2015-1-29 20:33:51

读懂了,不知道啥时候自己能写出自己的

pannelchen 发表于 2015-1-31 08:53:01

研究下,谢共享源码

qq1254582201 发表于 2015-2-6 17:24:03

坐标标注很不错啊,以后会用到的赞个。

xujinhua 发表于 2015-2-6 22:11:04

很不错啊,谢谢楼主
页: [1] 2
查看完整版本: 朴素实用的代码,半动态坐标标注,出错处理,另类、常规循环、grread示例