林霄云 发表于 2014-1-20 21:15:32

标高符号源码解析与测试(左击缩小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,进行缩放与退出操作。

xiaoyuzj-503 发表于 2014-1-20 22:01:04

LZ很强大。

252218 发表于 2014-1-21 08:15:35

支持小林一下

林霄云 发表于 2014-1-21 12:21:33

很感谢老大的支持,但我必须更新一个版本,支持UCS,加强的grread应用。
标高符号v2源码解析与测试(左击缩小grread,生成对象entmakex应用,支持UCS)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109092&fromuid=7303580

自贡黄明儒 发表于 2014-1-25 08:41:36

本帖最后由 自贡黄明儒 于 2014-1-25 09:03 编辑

为什么要缩小呢?对于一张图而言,大小基本上是个定值吧?这个grread不容易控制大小吧?

林霄云 发表于 2014-1-25 11:24:04

自贡黄明儒 发表于 2014-1-25 08:41 static/image/common/back.gif
为什么要缩小呢?对于一张图而言,大小基本上是个定值吧?这个grread不容易控制大小吧?

黄老,感谢关照。缩小是为了实现在1:1的比例下做1:25的图。关于这个grread的操作,在v2版本上,我做了逻辑上的调整。也就是生成之后,可以进行大小,方向调整。当不需要此类调整时,可以右击,空格,enter退出。

xyp1964 发表于 2014-1-25 11:27:10

意义真不大

林霄云 发表于 2014-1-25 11:48:15

xyp1964 发表于 2014-1-25 11:27 static/image/common/back.gif
意义真不大

谢谢院长光顾,v2版本有更大的操作性。
关于这个标高符号,统一格式是我做这个的初衷。在任何情况下调用(即会补充图层和文字样式)。
一般对于结构专业,标高值,是手动或者用内容刷输入。
对于建筑专业,画立剖面时,需要计算数值,自动填充,对于我,意义真不大。

天园地方 发表于 2014-1-25 16:10:29

没有钱啊,免费就好了。

知行ooo李肖坪 发表于 2015-12-26 21:15:55

同步学习…………
页: [1] 2
查看完整版本: 标高符号源码解析与测试(左击缩小grread,生成对象entmakex应用)