badgirl 发表于 2004-9-16 15:29:00

批量给圆孔、圆弧画中心线的程序

(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,写得不好,请不要丢西红柿。

BDYCAD 发表于 2004-9-16 16:39:00

<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>

meflying 发表于 2004-9-16 16:42:00

我丢一个:


选择圆为何不直接用:(ssget '((0 . "circle")))?前面加个提示:


       (prompt "请选择圆...")<BR>       (ssget '((0 . "circle")))


这样不一定采用C的方式,选择方式由用户去决定,还可以多种方式并存,不是更好?

无痕 发表于 2004-9-17 04:38:00

;;重来不用画这个,纯玩玩:),现编一个(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 15:42:00

本帖最后由 作者 于 2004-9-17 23:08:02 编辑 <br /><br /> 无痕发表于2004-9-17 4:38:00static/image/common/back.gif;;重来不用画这个,纯玩玩:),现编一个



getdist (strcat \"\n线出头长度\"

岂不麻烦?应该改,(按直径的15%比较好)<BR>

无痕 发表于 2004-9-17 19:28:00

怎么适合怎么改啦,我不用这个的,也不知道出头长度的通常要求

至今没学会 发表于 2025-2-12 17:51:14

有批量删除圆孔中心线的插件吗?

GEGEYANG88 发表于 2025-2-12 22:26:07

;;有!
(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]
查看完整版本: 批量给圆孔、圆弧画中心线的程序