批量给圆孔、圆弧画中心线的程序
(defun C:mc (/ circle-ssget arc-ssget temp-int<BR> temp-entname var-osmode var-layer var-cmdecho<BR> p1 p2 p3 p4<BR> dia-value center-point<BR> )<BR> (setq var-osmode (getvar "osmode"))<BR> (setq var-layer (getvar "clayer"))<BR> (setq var-cmdecho (getvar "cmdecho"))<BR> (setvar "cmdecho" 0)<BR> (if (= (tblsearch "layer" "center") nil)<BR> (command "layer" "new" "center" "color" 1<BR> "center" "ltype" "center" "center" "set"<BR> "center" ""<BR> )<BR> (command "layer" "set" "center" "")<BR> )<BR> (setq circle-ssget<BR> (ssget<BR> "c"<BR> (setq p1<BR> (getpoint<BR> "\n您选择框内的所有圆和圆弧都画上中心线。\n 请给出选择框的第一个点:"<BR> )<BR> )<BR> (progn<BR> (print "请给出选择框的对角点:")<BR> (while (/= 3 (car (setq p2 (grread 1 1 0))))<BR> (redraw)<BR> (grdraw p1 (list (car p1) (nth 1 (cadr p2))) -1 1)<BR> (grdraw p1 (list (nth 0 (cadr p2)) (nth 1 p1)) -1 1)<BR> (grdraw (cadr p2)<BR> (list (nth 0 (cadr p2)) (nth 1 p1))<BR> -1<BR> 1<BR> )<BR> (grdraw (cadr p2)<BR> (list (nth 0 p1) (nth 1 (cadr p2)))<BR> -1<BR> 1<BR> )(setq p2 (cadr p2))
)<BR> )<BR> '((0 . "circle"))
)<BR> )<BR> (redraw)<BR> (setvar "osmode" 0)<BR> (setq arc-ssget (ssget "c" p1 (cadr p2) '((0 . "arc"))))<BR> (setq temp-int 0)<BR> (if (/= circle-ssget nil)<BR> (repeat (sslength circle-ssget)<BR> (setq temp-entname (ssname circle-ssget temp-int))<BR> (setq center-point (cdr (assoc 10 (entget temp-entname))))<BR> (setq dia-value (cdr (assoc 40 (entget temp-entname))))<BR> (setq dia-value (* 1.3 dia-value))<BR> (setq<BR> p1<BR> (list (car center-point) (- (nth 1 center-point) dia-value))<BR> )<BR> (setq<BR> p2<BR> (list (car center-point) (+ (nth 1 center-point) dia-value))<BR> )<BR> (setq p3 (list (- (nth 0 center-point) dia-value)<BR> (nth 1 center-point)<BR> )<BR> )<BR> (setq p4 (list (+ (nth 0 center-point) dia-value)<BR> (nth 1 center-point)<BR> )<BR> )<BR> (command "line" p1 p2 "")<BR> (command "line" p3 p4 "")<BR> (setq temp-int (+ temp-int 1))<BR> )<BR> )<BR> (princ)<BR> (princ)
(setq temp-int 0)<BR> (if (/= arc-ssget nil)<BR> (repeat (sslength arc-ssget)<BR> (setq temp-entname (ssname arc-ssget temp-int))<BR> (setq center-point (cdr (assoc 10 (entget temp-entname))))<BR> (setq dia-value (cdr (assoc 40 (entget temp-entname))))<BR> (setq dia-value (* 1.3 dia-value))<BR> (setq<BR> p1<BR> (list (car center-point) (- (nth 1 center-point) dia-value))<BR> )<BR> (setq<BR> p2<BR> (list (car center-point) (+ (nth 1 center-point) dia-value))<BR> )<BR> (setq p3 (list (- (nth 0 center-point) dia-value)<BR> (nth 1 center-point)<BR> )<BR> )<BR> (setq p4 (list (+ (nth 0 center-point) dia-value)<BR> (nth 1 center-point)<BR> )<BR> )<BR> (command "line" p1 p2 "")<BR> (command "line" p3 p4 "")
(setq temp-int (+ temp-int 1))<BR> )<BR> )<BR> (setvar "osmode" var-osmode)<BR> (command "layer" "set" var-layer "")<BR> (setvar "cmdecho" var-cmdecho)<BR> (princ)<BR> (princ)<BR>)
1 该程序可以在你框选内自动识别圆孔、圆弧;<BR>2 该程序将画好的中心线放在CENTER图层里(如果你没有建这个层,命令会自动建立该层),该图层设为中心线层。<BR>
刚刚学习用LISP,写得不好,请不要丢西红柿。
<A href="http://bbs.mjtd.com/forum.php?mod=viewthread&tid=8251" target="_blank" >http://bbs.mjtd.com/forum.php?mod=viewthread&tid=8251</A> 我丢一个:
选择圆为何不直接用:(ssget '((0 . "circle")))?前面加个提示:
(prompt "请选择圆...")<BR> (ssget '((0 . "circle")))
这样不一定采用C的方式,选择方式由用户去决定,还可以多种方式并存,不是更好? ;;重来不用画这个,纯玩玩:),现编一个(defun c:cenline ( / ss i ocen e pt out2) ;; out 全局.
(princ "\n画圆心标志,选择标注实体:")
(vl-cmdf ".undo" "be")
(setq ss (ssget '((0 . "CIRCLE,ARC")))
out2 (getdist (strcat "\n线出头长度" (if out (rtos out 2 2) "") ":"))
i -1
ocen (getvar "dimcen"))
(if out2 (setq out out2))
(while (setq e (ssname ss (setq i (1+ i))))
(setvar "dimcen" (+ out (cdr (assoc 40 (entget e)))))
(setq pt (vlax-curve-getstartpoint e))
(vl-cmdf "dimcenter" (princ (list e pt)))
)
(setvar "dimcen" ocen)
(vl-cmdf ".undo" "e")
(princ)
) 本帖最后由 作者 于 2004-9-17 23:08:02 编辑 <br /><br /> 无痕发表于2004-9-17 4:38:00static/image/common/back.gif;;重来不用画这个,纯玩玩:),现编一个
getdist (strcat \"\n线出头长度\"
岂不麻烦?应该改,(按直径的15%比较好)<BR> 怎么适合怎么改啦,我不用这个的,也不知道出头长度的通常要求 有批量删除圆孔中心线的插件吗? ;;有!
(defun c:11 (/ ss i circle center radius ssLines line)
(vl-load-com)
;; 提示用户选择多个圆
(setq ss (ssget '((0 . "CIRCLE")))); 选择所有圆对象
;; 检查是否选择了圆
(if ss
(progn
(setq i 0); 初始化索引
(setvar "cmdecho" 0);_关闭命令提示
;; 遍历选择集中的每个圆
(repeat (sslength ss)
(setq circle (ssname ss i)); 获取当前圆
(setq center (cdr (assoc 10 (entget circle)))); 获取圆心
(setq radius (cdr (assoc 40 (entget circle)))); 获取半径
;; 在圆心 0.1 范围内查找中心线
(setq ssLines (ssget "_C"
(list (- (car center) 0.1) (- (cadr center) 0.1)); 左下角点
(list (+ (car center) 0.1) (+ (cadr center) 0.1)); 右上角点
'((0 . "LINE") (6 . "CENTER")))); 只选择中心线
;; 检查是否有中心线
(if ssLines
(progn
;; 遍历找到的中心线并删除
(repeat (sslength ssLines)
(setq line (ssname ssLines 0)); 获取当前中心线
(entdel line); 删除中心线
(setq ssLines (ssdel line ssLines)); 从选择集中删除已删除的线
)
)
)
(setq i (1+ i)); 递增索引
)
(setvar "cmdecho" 1);_打开命令提示
(princ "\n处理完成。"); 提示用户处理完成
)
(princ "\n未选择任何圆。"); 如果没有选择圆,输出提示
)
(princ); 静默退出
)
页:
[1]