明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4883|回复: 13

[讨论] 标高符号v2源码解析与测试(左击缩小grread,生成对象entmakex应用,支持UCS)

[复制链接]
发表于 2014-1-21 12:14:30 | 显示全部楼层 |阅读模式
本帖最后由 林霄云 于 2014-1-21 12:16 编辑

标高符号v2——调整逻辑,支持UCS
原版本 标高符号源码解析与测试(左击缩小grread,生成对象entmakex应用)
http://bbs.mjtd.com/forum.php?mo ... 087&fromuid=7303580
子程序
  1. elev-symbol(str pt)
  2. ;函数elev-symbol(str pt),参数str:string pt:point(UCS下),返回值,生成对象的选择集
  3. ;Desiged by 林霄云 2014年1月20日
复制代码
进行如下修改,以增加UCS支持,感谢G版照顾与其坐标系统解读。
  1. (setq ucszdir (trans '(0 0 1) 1 0 T ));生成OCS法向量
  2. (setq ang (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 ucszdir)));生成UCS在OCS的角度,不通过组码,通过旋转实现
  3. (setq pte (trans (trans pt 1 0) 0 ucszdir ));将插入点从UCS转WCS后转OCS
对硬编码的点,转换到OCS坐标系下
  1. (setq pt-text10 (mapcar '+ pte (trans '(350 325 0) 0 ucszdir)))
  2. (setq pt-text11 (mapcar '+ pte (trans '(460 325 0) 0 ucszdir )))

  3. (setq pt-pl1 (mapcar '+ pte (trans '(225 225 0) 0 ucszdir )))
  4. (setq pt-pl2 (mapcar '+ pte (trans '(-225 225 0) 0 ucszdir )))
  5. (setq pt-pl3 (mapcar '+ pte (trans '(1145 225 0) 0 ucszdir )))

  6. (setq pt-l1 (mapcar '+ pte (trans '(-275 0 0) 0 ucszdir )))
  7. (setq pt-l2 (mapcar '+ pte (trans '(275 0 0) 0 ucszdir )))
将entmakex里的组码210修改为
  1. (cons 210 ucszdir)
复制代码
加入旋转,通过command实现,pt为UCS下的点
  1. (command "rotate" ss "" pt (angtos ang 0))
主函数
  1. C:ES();Elev-Symbol 标高符号
复制代码
逻辑修改,主要针对grread函数
  1. (prompt "\n缩小一半左击或S,放大一倍A,逆时针旋转R,顺时针旋转E,右击确认继续")
  2.       (while (and (setq ptr (grread t 15 2))
  3.               (not (and (= 2 (car ptr)); 键盘事件
  4.                     (or (= 13 (cadr ptr)) (= 32 (cadr ptr))) ;_Enter Space
  5.             ))
  6.              (not (or (= (car ptr) 11) (= (car ptr) 25)));_Mouse Right button
  7.                           )   
  8.                  ; (redraw)
  9.       (cond ((= (car ptr) 3);_Mouse Left button
  10.          (command "scale" ss "" pt 0.5) ;左键进行0.5倍缩小,测试ss选择集方式可行。
  11.            ))
  12.        (cond ((= (car ptr) 2);键盘事件
  13.          (if (or (= (ascii "S") (cadr ptr)) (= (ascii "s") (cadr ptr))) (command "scale" ss "" pt 0.5))
  14.          (if (or (= (ascii "A") (cadr ptr)) (= (ascii "a") (cadr ptr))) (command "scale" ss "" pt 2))
  15.          (if (or (= (ascii "R") (cadr ptr)) (= (ascii "r") (cadr ptr))) (command "rotate" ss "" pt 90))
  16.          (if (or (= (ascii "E") (cadr ptr)) (= (ascii "e") (cadr ptr))) (command "rotate" ss "" pt -90))
  17.            ))
  18.            );while
值得注意的是,command Rotate 时,可以接收string类型作为角度值。
结论:
较强的逻辑性,更加丰富的grread应用。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
liuhaixin88 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-1-21 12:32:24 | 显示全部楼层
感觉好高深啊,像楼主学习
发表于 2014-1-21 13:21:19 | 显示全部楼层
  1. ;;-----------------------=={ Elevation Marker }==-----------------------;;
  2. ;;                                                                      ;;
  3. ;;  This program continuously prompts the user to specify a point and   ;;
  4. ;;  constructs an elevation marker composed of a variable width         ;;
  5. ;;  polyline & single-line text object at the specified point, with     ;;
  6. ;;  the text content displaying the UCS Y-coordinate of the point.      ;;
  7. ;;                                                                      ;;
  8. ;;----------------------------------------------------------------------;;
  9. ;;  Author:  Lee Mac, Copyright © 2013  -  www.lee-mac.com              ;;
  10. ;;----------------------------------------------------------------------;;

  11. (defun c:em ( / *error* ang hgt len ocs pt1 pt2 pt3 pt4 str )

  12.     (defun *error* ( msg )
  13.         (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  14.             (princ (strcat "\nError: " msg))
  15.         )
  16.         (princ)
  17.     )

  18.     (setq hgt (getvar 'textsize)
  19.           ocs (trans '(0.0 0.0 1.0) 1 0 t)
  20.           ang (angle '(0.0 0.0) (trans (getvar 'ucsxdir) 0 ocs t))
  21.     )
  22.     (terpri)
  23.     (while (setq pt1 (getpoint "\rSpecify point <exit>: "))
  24.         (setq str (rtos (cadr pt1))
  25.               len (strlen str)
  26.               pt2 (list (car  pt1) (+ (cadr pt1) (* hgt 0.5 (sqrt 3))))
  27.               pt3 (list (- (car pt1) (* hgt len)) (cadr pt2))
  28.               pt4 (list (- (car pt2) (* hgt 0.5 len)) (+ (cadr pt2) hgt))
  29.         )
  30.         (foreach sym '(pt1 pt2 pt3 pt4)
  31.             (set sym (trans (eval sym) 1 ocs))
  32.         )
  33.         (entmake
  34.             (list
  35.                '(000 . "LWPOLYLINE")
  36.                '(100 . "AcDbEntity")
  37.                '(100 . "AcDbPolyline")
  38.                '(090 . 3)
  39.                '(070 . 0)
  40.                 (cons 038 (caddr pt1))
  41.                 (cons 010 pt1)
  42.                '(040 . 0.0)
  43.                 (cons 041 hgt)
  44.                 (cons 010 pt2)
  45.                 (cons 040 (* hgt 0.05))
  46.                 (cons 041 (* hgt 0.05))
  47.                 (cons 010 pt3)
  48.                 (cons 210 ocs)
  49.             )
  50.         )
  51.         (entmake
  52.             (list
  53.                '(000 . "TEXT")
  54.                 (cons 007 (getvar 'textstyle))
  55.                 (cons 001 str)
  56.                 (cons 050 ang)
  57.                 (cons 040 hgt)
  58.                 (cons 010 pt4)
  59.                 (cons 011 pt4)
  60.                '(072 . 1)
  61.                '(073 . 2)
  62.                 (cons 210 ocs)
  63.             )
  64.         )
  65.     )
  66.     (princ)
  67. )


 楼主| 发表于 2014-1-21 16:05:37 来自手机 | 显示全部楼层
sachindkini 发表于 2014-1-21 13:21

嗯,lee版本将各特征点与字高发生关系,是一种方式。
发表于 2014-1-24 08:09:03 | 显示全部楼层
很实用的工具,谢谢分享
发表于 2014-1-24 08:37:40 | 显示全部楼层
为什么不能自动算取标高
发表于 2014-1-24 13:17:37 | 显示全部楼层
为什么我这里即使输入文字也只生成标高符号,没有标高的文字?
 楼主| 发表于 2014-1-24 16:51:54 | 显示全部楼层
adc 发表于 2014-1-24 13:17
为什么我这里即使输入文字也只生成标高符号,没有标高的文字?

因为你没有字体。你得修改生成G_text字体样式,对应的字体文字。这是主要用于结构,不需要自动计算。
发表于 2014-1-24 23:52:12 | 显示全部楼层

回复用以学习
发表于 2014-2-12 14:23:52 | 显示全部楼层
不错,要是能加入动态标高就好了!跟天正一样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-22 03:35 , Processed in 0.188246 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表