标高符号源码解析与测试(左击缩小grread,生成对象entmakex应用)
标高符号源码——左击缩小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 "输入标高值?\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 "\nESElevation Symbol 标高符号命令加载成功\nDesigned by 林霄云 2014年1月20日")
(princ)使用左击进行比例缩小只是为了增加grread函数的应用,不同比例的输入逻辑,可以进一步改进。
结果:
详附图,能无误实现添加标高符号。
结论:
本文根据标高符号实例,测试了entmake生成图层,文字样式,测试了entmakex生成对象形成选择集,进行后续操作,测试了grread函数获取左击,右击,enter,space,进行缩放与退出操作。
LZ很强大。 支持小林一下 很感谢老大的支持,但我必须更新一个版本,支持UCS,加强的grread应用。
标高符号v2源码解析与测试(左击缩小grread,生成对象entmakex应用,支持UCS)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109092&fromuid=7303580
本帖最后由 自贡黄明儒 于 2014-1-25 09:03 编辑
为什么要缩小呢?对于一张图而言,大小基本上是个定值吧?这个grread不容易控制大小吧? 自贡黄明儒 发表于 2014-1-25 08:41 static/image/common/back.gif
为什么要缩小呢?对于一张图而言,大小基本上是个定值吧?这个grread不容易控制大小吧?
黄老,感谢关照。缩小是为了实现在1:1的比例下做1:25的图。关于这个grread的操作,在v2版本上,我做了逻辑上的调整。也就是生成之后,可以进行大小,方向调整。当不需要此类调整时,可以右击,空格,enter退出。 意义真不大 xyp1964 发表于 2014-1-25 11:27 static/image/common/back.gif
意义真不大
谢谢院长光顾,v2版本有更大的操作性。
关于这个标高符号,统一格式是我做这个的初衷。在任何情况下调用(即会补充图层和文字样式)。
一般对于结构专业,标高值,是手动或者用内容刷输入。
对于建筑专业,画立剖面时,需要计算数值,自动填充,对于我,意义真不大。 没有钱啊,免费就好了。 同步学习…………
页:
[1]
2