明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2695|回复: 15

[源码] 带grread捕捉绘制螺纹孔程序

[复制链接]
发表于 2021-12-30 11:33:49 | 显示全部楼层 |阅读模式
本帖最后由 langjs 于 2022-2-14 13:03 编辑

有很多人觉得 grread加捕捉挺难,以前研究过大神的程序,自己整了个grread带捕捉的子函数,感觉挺好用,需要grread带捕捉功能直接调用子函数。下面是我最新编的画螺纹孔程序用到了,发出来仅供参考。




;;; ===================================================
;;; 功能:螺纹孔程序
;;; 作者:langjs      命令:lwk     日期:2022年02月14日
;;; ===================================================
(defun c:lwk (/ #err $orr bl code color d dbl dd ent ent1 ent2 ent3 ent4 gr h i k loop lst n name1 name2 name3 name4 nearpt
                nearpt2 old_lay osmo p pt pt1 pt2 pt3 pt4 pt5 ptx pty ss x
             )
  (defun osnappt (ss pt / color d h i k lst nearpt nearpt2 osmo pt1 pt2 pt3 pt4 pt5 ptx pty x) ; grread捕捉子函数
    (if (= (type ss) 'ename)
      (entdel ss)
    )
    (if (= (type ss) 'pickset)
      (repeat (setq i (sslength ss))
        (entdel (ssname ss (setq i (1- i))))
      )
    )
    (redraw)
    (if (< (getvar "osmode") 16384)
      (progn
        (setq color (vla-get-autosnapmarkercolor (vla-get-drafting (vla-get-preferences (vlax-get-acad-object))))
              h (/ (getvar "viewsize") (cadr (getvar "screensize")))
              d (getvar "pickbox")
              lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h))
              k (* 1.5 d h)
        )
        (if (setq nearpt (osnap pt "_END,_CEN,_NOD,_QUA,_INS,_TAN,_EXT"))
          (setq osmo 1)
        )
        (if (and
              (setq nearpt2 (osnap pt "_NEA"))
              (not (equal nearpt nearpt2 k))
            )
          (setq osmo 2
                nearpt nearpt2
          )
        )
        (if (and
              (setq nearpt2 (osnap pt "_MID"))
              (equal nearpt nearpt2 k)
            )
          (setq osmo 3
                nearpt nearpt2
          )
        )
        (if (and
              (setq nearpt2 (osnap pt "_INT"))
              (equal nearpt nearpt2 k)
            )
          (setq osmo 4
                nearpt nearpt2
          )
        )
      )
    )
    (if (= (type ss) 'ename)
      (entdel ss)
    )
    (if (= (type ss) 'pickset)
      (repeat (setq i (sslength ss))
        (entdel (ssname ss (setq i (1- i))))
      )
    )
    (if nearpt
      (progn
        (setq ptx (car nearpt)
              pty (cadr nearpt)
        )
        (foreach x lst
          (setq pt1 (list (- ptx x) (- pty x))
                pt2 (list (+ ptx x) (- pty x))
                pt3 (list (+ ptx x) (+ pty x))
                pt4 (list (- ptx x) (+ pty x))
                pt5 (list ptx (+ pty x))
          )
          (cond
            ((= osmo 1)                       ; 正方形
              (grvecs (list color pt1 pt2 pt2 pt3 pt3 pt4 pt4 pt1))
            )
            ((= osmo 2)                       ; 俩三角
              (grvecs (list color pt1 pt2 pt2 pt4 pt3 pt4 pt3 pt1))
            )
            ((= osmo 3)                       ; 三角
              (grvecs (list color pt1 pt2 pt2 pt5 pt5 pt1))
            )
            ((= osmo 4)                       ; 交叉
              (grvecs (list color pt1 pt3 color pt2 pt4))
            )
          )
        )
        (setq pt nearpt)
      )
    )
    pt
  )
  (defun emod (ent i n)                       ; 更新图元函数
    (subst
      (cons i n)
      (assoc i ent)
      ent
    )
  )
  (defun #err (s / i)                       ; 出错处理子函数
    (redraw)
    (if ss
      (repeat (setq i (sslength ss))
        (entdel (ssname ss (setq i (1- i))))
      )
    )
    (command ".UNDO" "E")
    (setq *error* $orr)
  )
  (setq $orr *error*)
  (setq *error* #err)
  (setvar "cmdecho" 0)
  (command ".UNDO" "BE")
  (setq old_lay (getvar "clayer"))
  (if (not (tblsearch "layer" "02细实线层"))
    (vl-cmdf "_layer" "make" "02细实线层" "Color" 3 "" "L" "Continuous" "" "")
  )
  (if (not (tblsearch "layer" "03中心线层"))
    (vl-cmdf "_layer" "make" "03中心线层" "Color" 5 "" "L" "CENTER" "" "")
  )
  (setvar "clayer" old_lay)
  (if (null d)
    (setq d (getreal "\n螺纹孔尺寸M:"))
  )
  (princ (strcat "\n螺纹孔尺寸:<M" (rtos d 2 2) ">"))
  (setq lst (list '(1.2 0.25) '(1.4 0.3) '(1.8 0.35) '(2 0.4) '(2.5 0.45) '(3 0.5) '(3.5 0.6) '(4 0.7) '(4.5 0.75) '
                  (5.5 0.8) '(6 1) '(9 1.25) '(11 1.5) '(12 1.75) '(16 2) '(22 2.5) '(27 3) '(33 3.5) '(39 4) '(45 4.5) '
                  (52 5) '(60 5.5) '(149 6) '(1000000 8)
            )
  )
  (foreach x lst
    (if (and
          (null p)
          (<= d (car x))
        )
      (setq p (cadr x))
    )
  )
  (if (<= d 1.2)
    (setq p (* 0.2 d))
  )
  (setq dbl (getvar "DIMSCALE"))
  (if (< d (* 3 dbl))
    (setq dd d)
    (setq dd (+ (* 0.5 d) (* 3 dbl)))
  )
  (if (< (setq n (* 2 dd))
         (* 2 dbl)
      )
    (setq bl (/ n (cdr (assoc 40 (tblsearch "ltype" "CENTER"))) (getvar "LTSCALE")))
    (setq bl (/ (* 2 dbl) (cdr (assoc 40 (tblsearch "ltype" "CENTER"))) (getvar "LTSCALE")))
  )
  (setq ss (ssadd))
  (entmake (list '(0 . "LINE") (cons 8 "03中心线层") (cons 48 bl) (cons 10 '(0.0 0.0)) (cons 11 '(0.0 0.0))))
  (setq name1 (entlast)
        ent1 (entget name1)
        ss (ssadd)
        ss (ssadd name1 ss)
  )
  (entmake (list '(0 . "LINE") (cons 8 "03中心线层") (cons 48 bl) (cons 10 '(0.0 0.0)) (cons 11 '(0.0 0.0))))
  (setq name2 (entlast)
        ss (ssadd name2 ss)
        ent2 (entget name2)
  )
  (entmake (list '(0 . "ARC") (cons 8 "02细实线层") (cons 10 '(0.0 0.0)) (cons 40 (* 0.5 d)) (cons 50 (* 1.5 pi))
                 (cons 51 pi)
           )
  )
  (setq name3 (entlast)
        ent3 (entget name3)
        ss (ssadd name3 ss)
  )
  (entmake (list '(0 . "CIRCLE") (cons 10 '(0.0 0.0)) (cons 40 (* 0.5 (- d p)))))
  (setq name4 (entlast)
        ent4 (entget name4)
        ss (ssadd name4 ss)
  )
  (setq loop t)
  (while loop
    (setq gr (grread t 15 1)
          code (car gr)
          pt (cadr gr)
    )
    (cond
      ((= code 5)                       ; 鼠标移动
        (redraw)
        (setq pt (osnappt ss pt))      ; 取得grread捕捉点

       
        (setq ent1 (emod ent1 10 (polar pt 0.0 dd)))
        (entmod (emod ent1 11 (polar pt pi dd)))
        (setq ent2 (emod ent2 10 (polar pt (* 0.5 pi) dd)))
        (entmod (emod ent2 11 (polar pt (* -0.5 pi) dd)))
        (entmod (emod ent3 10 pt))
        (entmod (emod ent4 10 pt))
      )
      ((= code 3)                       ; 鼠标左键
        (redraw)
(setq pt (osnappt ss pt))
        (entmake (list '(0 . "LINE") (cons 8 "03中心线层") (cons 48 bl) (cons 10 (polar pt 0.0 dd)) (cons 11 (polar pt pi dd))))
        (entmake (list '(0 . "LINE") (cons 8 "03中心线层") (cons 48 bl) (cons 10 (polar pt (* 0.5 pi) dd)) (cons 11
                                                                                                                 (polar pt
                                                                                                                        (* -0.5
                                                                                                                           pi
                                                                                                                        ) dd
                                                                                                                 )
                                                                                                           )
                 )
        )
        (entmake (list '(0 . "ARC") (cons 8 "02细实线层") (cons 10 pt) (cons 40 (* 0.5 d)) (cons 50 (* 1.5 pi)) (cons 51 pi)))
        (entmake (list '(0 . "CIRCLE") (cons 10 pt) (cons 40 (* 0.5 (- d p)))))
      )
      ((member code '(11 25))               ; 鼠标右击
        (redraw)
        (setq loop nil)
        (repeat (setq i (sslength ss))
          (entdel (ssname ss (setq i (1- i))))
        )
      )
    )
  )
  (setq *error* $orr)
  (command ".UNDO" "E")
  (princ)
)

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
start4444 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-12-30 15:12:19 | 显示全部楼层
感谢分享,牛牛牛
回复 支持 0 反对 1

使用道具 举报

发表于 2022-8-17 06:04:14 | 显示全部楼层
((= code 3)(setq loop nil) )  这样就行了  不需要再生成,然后删除原来的。速度还会更快
发表于 2022-9-7 09:59:54 | 显示全部楼层
命令: LWK
螺纹孔尺寸 M:30
螺纹孔尺寸:<M30>参数太少
这是怎么回事
发表于 2021-12-30 11:53:05 | 显示全部楼层
谢谢! langjs 分享程序!!!
发表于 2021-12-30 11:53:47 | 显示全部楼层
谢谢! langjs 分享程序!!!
发表于 2021-12-30 13:28:40 | 显示全部楼层
学习一下grread函数!
发表于 2021-12-30 17:55:28 | 显示全部楼层
刚测试   捕捉不到端点

本帖子中包含更多资源

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

x
发表于 2022-1-2 09:09:11 | 显示全部楼层
感谢分享精神
发表于 2022-1-2 09:35:04 | 显示全部楼层
我对 grread 命令没有什么认识,需要好好学习。
发表于 2022-1-4 14:13:43 | 显示全部楼层
请问lang大师,图中元素数量比较多的时候,捕捉子程序的速度怎么样啊?
发表于 2022-1-4 18:47:26 | 显示全部楼层
捕捉端点会跑偏
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 01:35 , Processed in 0.200310 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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