本帖最后由 ttmc 于 2015-9-12 22:53 编辑
最近一直做结构设计,大量遇到在线形上标注文字的情况。但单行文本没有多行或标注一样的文本遮罩功能。而wipeout命令又太难用,需要点几个点才完成一个。我这个小程序,也是利用了在文字上面wipeput,把文字再复制回来。我是利用文字框放大1.1倍的方式实际框与文字出现间距。只是文字太长,两边空格较大就不美观了。欢迎大家修改完善这个功能。初学,请- <div class="blockcode"><blockquote>(defun c:wpt(/ os i ii ss ssn ssdata key box p1 p3 p2 p4 px1 py1 px3 py3 mx my mpt ee )
- (setvar "cmdecho" 0)
- (setq os (getvar "osmode")) ;取得捕捉形式
- (setvar "osmode" 0) ;取消捕捉,如果不取消,会出错
- (setq clay (getvar "CLAYER")) ;层初始状态
- ;创建符号层sign颜色31
- (if (null (tblsearch "LAYER" "sign"))
- (command "_layer" "_m" "sign" "_c" 31 "" "_lt" "continuous" "" "")
- )
- (command "_layer" "_s" "sign" "") ;设为符号层
-
- (setq i 0) ;设循环起始点
- (setq ii 0)
- (setq ss (ssget)) ;多选目标
- (repeat (sslength ss) ;循环目标数的次数
- (setq ssn (ssname ss i)) ;筛选出目标中的第i+1个对象名称
- (setq ssdata (entget ssn)) ;取出ssn中的数据
- (setq key (cdr (assoc 0 ssdata))) ;取出关键字为0的列表
- (if (= key "TEXT") ;如果是单行文本
- (progn
- (setq ii (1+ ii))
- ;(setq ee1 (entlast)) ;文字临时赋值
- (command "ucs" "e" ssn) ;以文字为参考坐标系
- (setq box (textbox ssdata)) ;测量并返回文字方框的对角坐标
- (setq p1 (car box)) ;取得一个角坐标
- (setq p3 (cadr box)) ;取得另对角坐标
- (setq p2 (list (car p3)(cadr p1))) ;取得另外角坐标
- (setq p4 (list (car p1)(cadr p3))) ;取得另外角坐标
- (command "wipeout" p1 p2 p3 p4 "") ;画遮罩部分
-
- (setq ee (entlast)) ;临时赋值
-
- ;以下求中心mpt
- (setq px1 (car p1))
- (setq py1 (cadr p1))
- (setq px3 (car p3))
- (setq py3 (cadr p3))
- (setq mx (/ (+ px1 px3) 2))
- (setq my (/ (+ py1 py3) 2))
-
- (setq mpt (list mx my))
-
- (command "scale" ee "" mpt 1.1)
- (command "copy" ssn "" mpt mpt )
- (entdel ssn) ;删除原文字
-
- )
-
- ;(progn
- ;(prompt "无单行文字选项,退出!")
- ;(exit)
- ;)
- )
-
- (setq i (1+ i)) ;循环+1
- )
- (command "ucs" "") ;返回世界坐标系
- (prin1)
- (setvar "osmode" os) ;返回原始捕捉状态
- (setvar "CLAYER" clay) ;返回图层初始状态
- (princ "\n 共处理了")(princ i ) (princ "个目标中的")(princ ii)(princ "个单行文字。感谢使用!")
- (prin1)
-
- )
- (prompt "单行文字加外框遮罩程序<代替wipeout命令>***** <<wpt>>******")
- (prin1)
-
大家指教。 |