找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1181|回复: 7

[LISP函数]:移动CASS中高程块的属性(高程注记)

[复制链接]
发表于 2007-8-26 15:09:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

  1.   [FONT=courier new]
  2. ;;;--------------------------------------------------------
  3. ;;;函数:mm                               
  4. ;;;--------------------------------------------------------
  5. ;;;来源:            作者:CADDOG
  6. ;;;编制时间:2007.8.24
  7. ;;;功能    :模拟CAD的MOVE命令实现对cass中高程块属性(高程值)
  8. ;;;         的动态移动。因为CASS中高程注记不能用M来移动,只能
  9. ;;;         选择后拖动夹点。有时觉得不是很便利。刚好看到网友
  10. ;;;         编制的动态拖动程序,正好试试。虽说实际意义不大,
  11. ;;;         权作练习啦。还有就是不支持多个属性同时移动,有空时
  12. ;;;         准备再想想办法。
  13. ;;;备注  :编写中借用了XDCAD上《鼠标移动动态显示》函数。
  14. ;;;      作者的名字没能记下来,深表歉意。
  15. ;;;--------------------------------------------------------
  16. (DEFUN c:mm (/ ss1 att-en1 obj-att1 pt eveal obj-type loop_ID pt1 vptent
  17.              )
  18.   (SETQ        olderr        *error*
  19.         *error*        err
  20.         ) ;_ 结束setq
  21.   (COMMAND "_.undo" "_begin")
  22.   (SETQ        att-en1         (CAR (NENTSEL "选择块属性:")))
  23.   (while (not att-en1)
  24.     (SETQ        att-en1         (CAR (NENTSEL "选择块属性:")))
  25.     )
  26.   (SETQ        ;;att-en1         (CAR (NENTSEL "选择块属性:"))
  27.         obj-att1 (VLAX-ENAME->VLA-OBJECT att-en1)
  28.         pt         (VLAX-SAFEARRAY->LIST
  29.                    (VLAX-VARIANT-VALUE
  30.                      (VLA-GET-TEXTALIGNMENTPOINT obj-att1)
  31.                      ) ;_ 结束vlax-variant-value
  32.                    ) ;_ 结束vlax-safearray->list
  33.         eveal         (CADDR pt) ;_高程
  34.         ) ;_ 结束setq
  35.   ;;不知为何,选择了无点位高程值时,用VLA-GET-TEXTALIGNMENTPOINT得到的坐标前两位为0.0 0.0
  36.   ;;此时换VLA-GET-INSERTIONPOINT来处理
  37.   (IF (EQUAL (LIST (CAR pt) (CADR pt)) '(0.0 0.0))
  38.     ;;说明是却掉了点位的块属性
  39.       (SETQ pt             (VLAX-SAFEARRAY->LIST
  40.                        (VLAX-VARIANT-VALUE
  41.                          (VLA-GET-INSERTIONPOINT obj-att1)
  42.                          ) ;_ 结束vlax-variant-value
  43.                        ) ;_ 结束vlax-safearray->list
  44.             obj-type T ;_标记一下,后面更新块属性的位置时需根据块的不同用不同的方法
  45.             ) ;_ 结束setq
  46.     ) ;_endif
  47.   ;;构造一条直线,用以模拟CAD在MOVE时的那条指示线
  48.   (SETQ        obj-lin        (VLA-ADDLINE
  49.                   (model-space)
  50.                   (VLAX-3D-POINT pt)
  51.                   (VLAX-3D-POINT pt)
  52.                   ) ;_ 结束vla-AddLine
  53.         ) ;_ 结束setq
  54.   (vla-put-Layer obj-lin "0");_为了补救不知什么原因出现的指示线未删除的情况,将之放到0层(因我们作图时0层只放临时实体)
  55.   (PRINC "\n指定新的位置...")
  56.   (SETQ LOOP_ID T)
  57.   (WHILE LOOP_ID
  58.     (SETQ vptent (GRREAD T (+ 4 8)  0))
  59.     (COND
  60.       ((AND vptent (= (CAR vptent) 5))
  61.        (PROGN
  62.          (SETQ
  63.            pt1 (APPEND (3dPoint->2dPoint (CADR vptent)) (LIST eveal))
  64.            ) ;_ 结束setq
  65.          ;;更新指示线的终点坐标
  66.          (VLA-PUT-ENDPOINT obj-lin (VLAX-3D-POINT pt1))
  67.          ;;更新属性(高程注记)的位置
  68.          (IF obj-type ;_根据obj-type的值来确定使用的方法
  69.            (VLA-PUT-INSERTIONPOINT obj-att1 (VLAX-3D-POINT pt1))
  70.            (VLA-PUT-TEXTALIGNMENTPOINT obj-att1 (VLAX-3D-POINT pt1))
  71.            ) ;_endif
  72.          ) ;_ 结束progn
  73.        )
  74.       ((= 3 (CAR vptent)) (SETQ LOOP_ID NIL))
  75.       (T
  76.        (PROGN
  77.          (SETQ LOOP_ID NIL)
  78.          ;;
  79.          ) ;_ 结束progn

  80.        )
  81.       ) ;_ 结束cond
  82.     ) ;_ 结束while
  83.   (VLA-DELETE obj-lin);_删除指示线
  84.   (COMMAND "_.undo" "_end")
  85.   (SETQ *error* olderr)
  86.   (princ)
  87.   ) ;_ 结束defun

  88. ;;错误处理,用以在用户按下了ESC键后取消所有的修改并删除指示线。
  89. (DEFUN err (s)
  90.   ;;当用户点击了块、线等其它实体,会出现“ActiveX 服务器返回错误: 未知名称: TextAlignmentPoint”
  91.   ;;的错误,搞了个笨办法,对这种情况和用户按ESC的情况进行了区分。
  92.   ;;(princ s)
  93.   ;;本来不想用“U”,不用的话要将PT定义为全局变量。害怕有冲突,还是就这样了。
  94.   (if (vl-string-search "ActiveX" s)
  95.     (princ "\t 该实体不支持此操作!命令被取消!")
  96.     (progn
  97.       (COMMAND "u")
  98.       (if obj-lin ;_若生成了指示线且未删除则删除掉
  99.         (if (not(vlax-erased-p obj-lin))
  100.           (vla-delete obj-lin)
  101.           )
  102.         )
  103.       (princ "\t *取消操作*")
  104.       );_end progn
  105.     );_endif
  106.   (SETQ *error* olderr)
  107.   ) ;_ 结束defun




  108.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-8-28 21:33:35 | 显示全部楼层
顶楼上的一下:下面的这个功能没有那么强大:
;;;=========================================
;;1。快速移动属性文本(比如地形图中属性块压线等)
;;程序——————4-!nVade[3#],源于dream.fei的vba
(defun c:x1(/ en obj pt px typ)
        (vl-load-com)
        (while (setq en (car (nentsel "\n选择属性文字<退出>:")))
                (cond((= (cdr (assoc 0 (entget en))) "ATTRIB")
                        (setq obj (vlax-ename->vla-object en))
                        (setq pt(vlax-get obj "insertionpoint"))
                        (if (setq px (getpoint pt "新的位置:"))
                                (vlax-invoke obj 'move pt px)
                     )
                )
                        (t
                        (princ "** 并非属性对象,请重新选择**")       
                        )
                )
        )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-8-29 08:18:04 | 显示全部楼层
只能多支持啊

攒钱下载
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-8-31 09:21:27 | 显示全部楼层
1楼的程序 对属性块不起作用 只有cass中的才起作用
实际意义不大!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-8-31 10:08:03 | 显示全部楼层
2楼代码的改进:

  1. (vl-load-com)
  2. (defun C:X1 (/ EN OBJ PT PT_OLD PX TEST TMP)
  3.     (while (setq EN (car (nentsel "\n选择属性文字<退出>:")))
  4.         (if (= (cdr (assoc 0 (entget EN))) "ATTRIB")
  5.             (progn
  6.                 (setq OBJ (vlax-ename->vla-object EN))
  7.                 (setq PT     (vlax-get OBJ "insertionpoint")
  8.                       PT_OLD PT
  9.                 )
  10.                 (princ "\n指定新的位置: ")
  11.                 (setq TEST t)
  12.                 (while TEST
  13.                     (setq TMP (grread t 7 1))
  14.                     (redraw)
  15.                     (cond ((= (car TMP) 3) ;_左键
  16.                            (setq TEST NIL)
  17.                           )
  18.                           ((= (car TMP) 11) ;_右键
  19.                            (vlax-invoke OBJ 'MOVE PT PT_OLD)
  20.                            (setq TEST NIL)
  21.                           )
  22.                           ((= (car TMP) 5) ;_移动
  23.                            (setq PX (cadr TMP))
  24.                            (vlax-invoke OBJ 'MOVE PT PX)
  25.                            (grdraw PT_OLD PX 1 0)
  26.                            (setq PT PX)
  27.                           )
  28.                     )
  29.                 ) ;_结束 while
  30.             )
  31.             (princ "** 并非属性对象,请重新选择**")
  32.         )
  33.     ) ;_结束 while
  34.     (princ)
  35. ) ;_结束 defun
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-8-31 18:09:26 | 显示全部楼层
多多赐教
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-9-1 07:33:52 | 显示全部楼层
感谢184 在这里改进拉 同时也感谢你在acad.net.cn对我的解答
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-10-24 15:26:40 | 显示全部楼层
1楼、4楼的程序好,顶
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-16 15:04 , Processed in 0.266085 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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