一个旋转图元底边至水平。不能批量,望朋友赐教!
本帖最后由 434939575 于 2013-12-27 14:26 编辑(defun c:tt();批量把图元旋转至水平、有问题、
(princ " \n 点选图元 ")
(setvar "CMDECHO" 0);_关闭命令提示
(Setvar "osmode" 0);_关闭捕捉
(Setq osmode_bak (getvar "osmode"));_记录捕捉
(if (setq ss (ssget))
(progn
(setq i 0)
(repeat (sslength ss)
;;;;;;;;;;;;;;;;;
(setq ss0(ssname ss i)
en (entget ss0)
i (1+ i)
)
;-----------------------------------------------------------------------------------------------------------------------
(progn
(setqpt1 (cdr(nth14en)));调取pline的0点坐标。
(setqpt2 (cdr(nth18en)));调取pline第1点坐标。
(setqang(anglept1 pt2 ))
;;;;--------------pline的0点坐标--与1点坐标的角度------
(setqang-ok (angtos ang 0 4))
(setqangint(atofang-ok));转弧度数据为实数角度值
;********************************************************
;;;;--------------pline的0点坐标--与1点坐标的中点------
(setqlong(distancept1pt2 ));两点间距离
(setq pt12-cen(polar pt1ang (/long2 )));中点
;*******************************************************
(command "ROTATE" ss "" pt12-cen (- angint ) "");
(and o_cmd (setvar "CMDECHO" o_cmd));恢复更改的变量值s
(and o_os (setvar "osmode" o_os));恢复更改的变量值
(princ)
);progn
;---------------------------------------------------------------------------------------------------------------------------------
);repeat
);progn
);if
)
顶出高版本的来 自己顶下。因为比较懒惰。所以想批量处理哈 ;批量把图元旋转至水平、有问题、
;简单修改 2013-12-27 15:49:33
;modfiy by edata@mjtd
(defun c:tt(/ ANG ANG-OK ANGINT EN I LONG OSMODE_BAK O_CMD O_OS PT1 PT12-CEN PT2 PTLST SS SS0 SS2)
(princ " \n 点选图元 ")
(setvar "CMDECHO" 0);_关闭命令提示
(Setvar "osmode" 0);_关闭捕捉
(Setq osmode_bak (getvar "osmode"));_记录捕捉
(if (setq ss (ssget))
(progn
(setq i 0)
(repeat (sslength ss)
;;;;;;;;;;;;;;;;;
(setq ss0(ssname ss i)
en (entget ss0)
i (1+ i)
)
;-----------------------------------------------------------------------------------------------------------------------
(if (and (= (cdr(assoc 8 en)) "layer1" ) ;图层限制=layer1
(= (cdr(assoc 0 en)) "LWPOLYLINE" );图元限制=LWPOLYLINE
(= (cdr(assoc 70 en)) 1 );闭合限制=1
)
(progn
(setqpt1 (cdr(nth14en)));调取pline的0点坐标。
(setqpt2 (cdr(nth18en)));调取pline第1点坐标。
(setqang(anglept1 pt2 ))
;;;;--------------pline的0点坐标--与1点坐标的角度------
(setqang-ok (angtos ang 0 4))
(setqangint(atofang-ok));转弧度数据为实数角度值
;********************************************************
;;;;--------------pline的0点坐标--与1点坐标的中点------
(setqlong(distancept1pt2 ));两点间距离
(setq pt12-cen(polar pt1ang (/long2 )));中点
;*******************************************************
(setq ptlst(vertexs ss0))
(command "_.zoom" "a")
(and ptlst (setq ss2(ssget "cp" ptlst)))
(command "_.zoom" "p")
(command "_.ROTATE" ss2 "" pt12-cen (- angint ) "");
(and o_cmd (setvar "CMDECHO" o_cmd));恢复更改的变量值s
(and o_os (setvar "osmode" o_os));恢复更改的变量值
(princ)
);progn
)
;---------------------------------------------------------------------------------------------------------------------------------
);repeat
);progn
);if
)
;;返回多段线顶点表
(defun vertexs (ename / plist pp n)
(setq obj (vlax-ename->vla-object ename))
(setq plist (vlax-safearray->list
(vlax-variant-value
(vla-get-coordinates obj))))
(setq n 0)
(repeat (/ (length plist) 2)
(setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
(setq n (+ n 2))
)
pp
) 朋友们出手真快。多谢,好像edata的不能运行。 ;; 需要e派工具箱(XCAD)的支持:http://yunpan.cn/QXQKsW9gAPmpF
;; 旋转测试
(defun c:tt ()
(xyp-CMDLA0)
(setq i -1)
(if (setq ss (ssget '((0 . "LWPOLYLINE") (8 . "layer1"))))
(while (setq s1 (ssname ss (setq i (1+ i))))
(setq ptn (xyp-get-Vertexs s1 0)
p1 (car ptn)
ang (xyp-r2d (angle (cadr ptn) p1))
ss1 (ssadd s1 (ssget "wp" ptn))
)
(xyp-SubUpd ss1 8 (xyp-DXF 8 s1))
(xyp-rotate ss1 p1 ang)
)
)
(xyp-CMDLA1)
) 感谢院长再次光临! 434939575 发表于 2013-12-27 17:49 static/image/common/back.gif
朋友们出手真快。多谢,好像edata的不能运行。
估计是vl组件未加载
程序中加一句即可
(vl-load-com) 学习思路一 edata 发表于 2013-12-27 15:52 static/image/common/back.gif
E大,怎么用了没有反应?