标高符号源码——左击缩小grread,生成对象entmakex形成选择集应用
常用图块用代码生成,可以省去打开种子文件拷贝的麻烦。标高符号,不可或缺。
子程序elev-symbol,返回生成的对象的选择集- elev-symbol(str pt)
- ;函数elev-symbol(str pt),参数str:string pt:point,返回值,生成对象的选择集
- ;Desiged by 林霄云 2014年1月20日
复制代码 根据种子文件图例,是采用硬编码形式支座函数生成代码,即将标高符号插入点置为(0 0 0),获取其他相对点位置,为entmakex做准备。
为了将生成的对象进行其他缩放旋转操作,将entmakex的返回值,添加到选择集。所形成的选择集作为子函数的返回值。
针对标高文字,进行特殊处理,处理默认值,处理数字格式化,对于0,增加正负符号。- (if (= "" str) (setq str "Hs")
- (if (numberp (read str))
- (progn (setvar "DIMZIN" 0)
- (setq str (rtos (atof str) 2 3) ) ;格式化
- (if (= 0 (atof str))
- (setq str (strcat "%%p" str)))
- );progn
- )
- );if
对插入点进行处理,硬编码方案- (setq pt-text10 (mapcar '+ pt '(350 325 0)))
- (setq pt-text11 (mapcar '+ pt '(460 325 0)))
- (setq pt-pl1 (mapcar '+ pt '(225 225 0)))
- (setq pt-pl2 (mapcar '+ pt '(-225 225 0)))
- (setq pt-pl3 (mapcar '+ pt '(1145 225 0)))
- (setq pt-l1 (mapcar '+ pt '(-275 0 0)))
- (setq pt-l2 (mapcar '+ pt '(275 0 0)))
生成选择集并返回- (setq ss (ssadd)) ;设置选择集
- ;文字
- (ssadd (EntMakex (list '(0 . "TEXT") '(8 . "G_LEVEL(标高)") '(62 . 2) (cons 10 pt-text10) '(40 . 300) (cons 1 str) '(41 . 0.7) '(7 . "G_text") '(72 . 1) (cons 11 pt-text11) '(210 0 0 1))) ss)
- ;多线
- (ssadd (EntMakex (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(8 . "G_LEVEL(标高)") '(100 . "AcDbPolyline") '(90 . 4) '(43 . 0) (cons 10 pt-pl1) (cons 10 pt) (cons 10 pt-pl2) (cons 10 pt-pl3) '(210 0 0 1))) ss)
- ;直线
- (ssadd (EntMakex (list '(0 . "LINE") '(8 . "G_LEVEL(标高)") (cons 10 pt-l1) (cons 11 pt-l2) '(210 0 0 1))) ss)
- ss
使用entmakex生成对象时,涉及到,需要图层与字体样式检测,增加判断并使用entmake生成,代码置之前面。- (setq layername "G_LEVEL(标高)")
- (if (null (tblobjname "LAYER" layername) )
- (entmake (list '(0 . "LAYER")
- '(100 . "AcDbSymbolTableRecord")
- '(100 . "AcDbLayerTableRecord")
- '(70 . 0)
- '(6 . "Continuous") ;线型
- (cons 2 layername)
- '(62 . 7) ;颜色
- )
- )
- );if
- (setq stylename "G_text")
- (if (null (tblobjname "STYLE" stylename) )
- (entmake (list '(0 . "STYLE")
- '(100 . "AcDbSymbolTableRecord")
- '(100 . "AcDbTextStyleTableRecord")
- '(70 . 0)
- '(42 . 300) ;默认字高
- '(3 . "_bxsz.shx")
- '(4 . "_bxfs.shx")
- (cons 2 stylename)
- '(40 . 0.0) ;字高
- '(41 . 0.7) ;字宽比例
- '(50 . 0.0) ;默认旋转角度
- )
- )
- );if
最后调用主函数C:ES() Elev-Symbol 标高符号,增加左击缩放,使用grread。并且,为了有可被接受的动态,并不失捕捉,使用getpoint获取插入点。- (defun C:ES();Elev-Symbol 标高符号
- (setq pt '(0 0 0))
- (while (setq pt (getpoint pt "基点"))
-
- (setq ss (elev-symbol (getstring "输入标高值?[Hs]\n") pt))
-
- ;捕捉左键,进行缩放测试
- (prompt "\n比例为1:25时左击,1:100时右击继续\n")
- (while (and (setq ptr (grread t 15 2))
- (not (and (= 2 (car ptr)); 键盘事件
- (or (= 13 (cadr ptr)) (= 32 (cadr ptr))) ;_Enter Space
- ))
- (not (or (= (car ptr) 11) (= (car ptr) 25)));_Mouse Right button
- )
- ; (redraw)
- (cond ((= (car ptr) 3);_Mouse Left button
- (command "scale" ss "" pt 0.25) ;左键进行0.25倍缩小,测试ss选择集方式可行。
- ))
- );while
- ;捕捉左键,进行缩放测试
-
- );while
- (princ)
- );es
- (princ "\nES Elevation Symbol 标高符号命令加载成功\nDesigned by 林霄云 2014年1月20日")
- (princ)
使用左击进行比例缩小只是为了增加grread函数的应用,不同比例的输入逻辑,可以进一步改进。
结果:
详附图,能无误实现添加标高符号。
结论:
本文根据标高符号实例,测试了entmake生成图层,文字样式,测试了entmakex生成对象形成选择集,进行后续操作,测试了grread函数获取左击,右击,enter,space,进行缩放与退出操作。
|