马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
自编的一个小程序,见笑了
- [FONT=courier new]
- ;;;--------------------------------------------------------
- ;;;函数: c:RoBlock
- ;;;--------------------------------------------------------
- ;;;来源: 作者:hj
- ;;;编制时间:2006.5
- ;;;功能......根据用户指定/选取的角度,设置多个块或文本的旋转角度
- ;;;
- ;;;语法......RoBlock
- ;;;参数......
- ;;;返回值: 无
- ;;;备注 :
- ;;;--------------------------------------------------------
- (DEFUN c:RoBlock (/ ss1 ss2 #pt1 #pt2 p obj1 pp n1 n2 ang1 nuVertex)
- (PRINC "\n 本程序只能旋转块和文本!")
- (SETQ ss1 (SSGET '((0 . "insert,text"))))
- (WHILE ss1
- (SETQ #pt1 (GETPOINT "选择第一个点<直接回车以多段线参照>:"))
- (if (= #pt1 nil)
- (progn
- ;;若第一个点为空,则说明用户希望通过点取已有的多段线来确定方向
- (while (not ss2)
- (SETQ ss2 (ENTSEL "\n请选择多段线:"))
- )
- (SETQ e-Name (CAR ss2))
- (SETQ p (CAR (CDR ss2)))
- (setq ss2 nil)
- (SETQ obj1 (VLAX-ENAME->VLA-OBJECT e-Name))
- (IF (WCMATCH (VLA-GET-OBJECTNAME obj1) "LWPOLYLINE,AcDbPolyline") ;_ 结束wcmatch
- (progn
- (SETQ pp (VLAX-CURVE-GETCLOSESTPOINTTO obj1 (TRANS p 1 0)))
- ;;通过(VLAX-CURVE-GETPARAMATPOINT obj pp)取得的参数的值为小数
- ;;如0.8579说明用户所点取的P位置在0到1号点之间,且0-P/0-1为0.8579,点位接近1点
- ;;(SETQ n (ATOI (RTOS (VLAX-CURVE-GETPARAMATPOINT obj pp) 2 0)))
- (SETQ n1 (fix (VLAX-CURVE-GETPARAMATPOINT obj1 pp)))
- (SETQ n2 (fix (+ (VLAX-CURVE-GETPARAMATPOINT obj1 pp) 1)))
- ;;当用户点击的是一条用"C"封闭的多段线的最后一段时,下面的求n2坐标的语句会出错,因此要写一个判断,当N2>=最大顶点数时,N2=0
- ;;求算数组上下标,先求出Vertex的数目
- (SETQ nuVertex (+ (FIX (VLAX-CURVE-GETENDPARAM obj1)) 1))
- ;;若多段线为闭合的,通过上行语句求出的Vertex数目将会多一个
- ;;在下面的判断语句中减去
- (if (= (vla-get-Closed obj1) :vlax-true)
- (setq nuVertex (- nuVertex 1))
- )
- (IF (= n2 nuVertex)
- (setq n2 0)
- )
- ;;确定了顶点,下面提取两个顶点的坐标
- (SETQ #Pt1 (VLAX-SAFEARRAY->LIST (VLAX-VARIANT-VALUE (VLA-GET-COORDINATE obj1 n1))))
- (SETQ #Pt2 (VLAX-SAFEARRAY->LIST (VLAX-VARIANT-VALUE (VLA-GET-COORDINATE obj1 n2))))
- )
- ) ;_end if WCMATCH
- )
- ;;else
- (SETQ #pt2 (GETPOINT #PT1 "选择第二个点:"))
- )
- ;;计算PT1 PT2的角度
- (setq ang1 (angle #pt1 #pt2))
- (if (and (< ang1 (* 1.5 pi)) (> ang1 (* 0.5 pi)))
- (setq ang1 (+ ang1 pi))
- )
- ;;开始旋转
- ;;求选择的块的个数
- (setq n-len (sslength ss1))
- (setq %ID 0)
- (repeat n-len
- (setq e-Name2 (ssname ss1 %ID))
- (SETQ obj2 (VLAX-ENAME->VLA-OBJECT e-Name2))
- (vla-put-Rotation obj2 ang1)
- (setq %ID (+ 1 %ID))
- )
- (PRINC "\n 本程序只能旋转块和文本!")
- (SETQ ss1 (SSGET '((0 . "insert,text"))))
- ) ;_ 结束while
- ) ;_ 结束defun
- [/FONT]
|