找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 635|回复: 1

[LISP函数]:旋转块和注记的小程序

[复制链接]
发表于 2006-8-26 21:35:18 | 显示全部楼层 |阅读模式

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

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

×
自编的一个小程序,见笑了

  1.   [FONT=courier new]
  2. ;;;--------------------------------------------------------
  3. ;;;函数: c:RoBlock                               
  4. ;;;--------------------------------------------------------
  5. ;;;来源:            作者:hj
  6. ;;;编制时间:2006.5
  7. ;;;功能......根据用户指定/选取的角度,设置多个块或文本的旋转角度
  8. ;;;         
  9. ;;;语法......RoBlock
  10. ;;;参数......
  11. ;;;返回值:   无
  12. ;;;备注  :
  13. ;;;--------------------------------------------------------
  14. (DEFUN c:RoBlock (/ ss1 ss2 #pt1 #pt2 p obj1 pp n1 n2 ang1 nuVertex)
  15.   (PRINC "\n 本程序只能旋转块和文本!")
  16.   (SETQ ss1 (SSGET '((0 . "insert,text"))))
  17.   (WHILE ss1
  18.       (SETQ #pt1 (GETPOINT "选择第一个点<直接回车以多段线参照>:"))
  19.       (if (= #pt1 nil)
  20.         (progn
  21.           ;;若第一个点为空,则说明用户希望通过点取已有的多段线来确定方向
  22.           (while (not ss2)
  23.             (SETQ ss2 (ENTSEL "\n请选择多段线:"))
  24.             )
  25.             (SETQ e-Name (CAR ss2))
  26.               (SETQ p (CAR (CDR ss2)))
  27.             (setq ss2 nil)
  28.               (SETQ obj1 (VLAX-ENAME->VLA-OBJECT e-Name))
  29.             (IF (WCMATCH (VLA-GET-OBJECTNAME obj1) "LWPOLYLINE,AcDbPolyline") ;_ 结束wcmatch
  30.               (progn
  31.                        (SETQ pp (VLAX-CURVE-GETCLOSESTPOINTTO obj1 (TRANS p 1 0)))
  32.                  ;;通过(VLAX-CURVE-GETPARAMATPOINT obj pp)取得的参数的值为小数
  33.                  ;;如0.8579说明用户所点取的P位置在0到1号点之间,且0-P/0-1为0.8579,点位接近1点               
  34.                   ;;(SETQ n (ATOI (RTOS (VLAX-CURVE-GETPARAMATPOINT obj pp) 2 0)))
  35.                 (SETQ n1 (fix (VLAX-CURVE-GETPARAMATPOINT obj1 pp)))
  36.                 (SETQ n2 (fix (+ (VLAX-CURVE-GETPARAMATPOINT obj1 pp) 1)))
  37.                 ;;当用户点击的是一条用"C"封闭的多段线的最后一段时,下面的求n2坐标的语句会出错,因此要写一个判断,当N2>=最大顶点数时,N2=0
  38.                 ;;求算数组上下标,先求出Vertex的数目
  39.                (SETQ nuVertex (+ (FIX (VLAX-CURVE-GETENDPARAM obj1)) 1))
  40.                ;;若多段线为闭合的,通过上行语句求出的Vertex数目将会多一个
  41.                ;;在下面的判断语句中减去
  42.                (if (= (vla-get-Closed obj1) :vlax-true)
  43.                  (setq nuVertex (- nuVertex 1))
  44.                )
  45.                 (IF (= n2 nuVertex)
  46.                   (setq n2 0)
  47.                   )
  48.                 ;;确定了顶点,下面提取两个顶点的坐标
  49.                 (SETQ #Pt1 (VLAX-SAFEARRAY->LIST (VLAX-VARIANT-VALUE  (VLA-GET-COORDINATE obj1 n1))))
  50.                 (SETQ #Pt2 (VLAX-SAFEARRAY->LIST (VLAX-VARIANT-VALUE  (VLA-GET-COORDINATE obj1 n2))))
  51.                 )

  52.               ) ;_end if WCMATCH
  53.          )
  54.         ;;else
  55.         (SETQ #pt2 (GETPOINT #PT1 "选择第二个点:"))
  56.         )
  57.       ;;计算PT1 PT2的角度
  58.     (setq ang1 (angle #pt1 #pt2))
  59.     (if (and (< ang1 (* 1.5 pi)) (> ang1 (* 0.5 pi)))
  60.       (setq ang1 (+ ang1 pi))
  61.       )
  62.     ;;开始旋转
  63.     ;;求选择的块的个数
  64.     (setq n-len (sslength ss1))
  65.     (setq %ID 0)
  66.     (repeat n-len
  67.       (setq e-Name2 (ssname ss1 %ID))
  68.       (SETQ obj2 (VLAX-ENAME->VLA-OBJECT e-Name2))
  69.       (vla-put-Rotation obj2 ang1)
  70.       (setq %ID (+ 1 %ID))
  71.       )   
  72.     (PRINC "\n 本程序只能旋转块和文本!")
  73.     (SETQ ss1 (SSGET '((0 . "insert,text"))))
  74.   ) ;_ 结束while
  75. ) ;_ 结束defun
  76.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-8-30 11:18:33 | 显示全部楼层
试了一下,还不错.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 11:44 , Processed in 0.387681 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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