明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2938|回复: 6

[已解答] 修剪并倒角程序修改倒角大小请教

[复制链接]
发表于 2014-2-16 20:45 | 显示全部楼层 |阅读模式
下面的程序,修剪后只能倒直角,现在想改为提示输入倒角大小。我将(setvar "filletrad" 0.0)里面的0.0改为5.0后还是直角,请教该如何修改。原帖链接:http://bbs.mjtd.com/forum.php?mod=viewthread&tid=96716&page=1#pid553496
源程序:
(defun cutnum_lst (oldlst num / k templst)
  (setq        k 0
        templst        '()
  )
  (foreach n oldlst
    (if        (/= k num)
      (setq templst (cons n templst)
            k            (1+ k)
      )
    )
    (setq k (1+ k))
  )
  (setq newlst (reverse templst))
)
;;去除表中指定项
(defun drop (lst item)
  (append (reverse (cdr (member item (reverse lst))))
          (cdr (member item lst))
  )
)
;;将点表中在方框内的点组成新表
(defun pt_inm (oldlst PT1 PT2 PT3 PT4 /        oldlist        n pt1 pt2 pt3 pt4
               templst newlst)
  (setq templst '())
  (foreach n oldlst
    (if        (/= (point_inm n pt1 pt2 pt3 pt4) nil)
      (setq templst (cons n templst))
    )
  )
  (setq newlst (reverse templst))
)
;;将点表中在多边形内的点组成新表
(defun pt_inmx (oldlst pm)
  (setq templst '())
  (foreach n oldlst
    (if        (ea:point_inm n pm)
      (setq templst (cons n templst))
    )
  )
  (setq newlst (reverse templst))
)
;;判断两点是否等
(defun eq_point        (pt1 pt2)
  (if (and (equal (car pt1) (car pt2) 1e-5)
           (equal (cadr pt1) (cadr pt2) 1e-5)
      )
    t
    nil
  )
)
;;判断两直线是否相交
(defun line_int        (se1 se2)
  (if (/= (inters (cdr (assoc 10 (entget se1)))
                  (cdr (assoc 11 (entget se1)))
                  (cdr (assoc 10 (entget se2)))
                  (cdr (assoc 11 (entget se2)))
                  t
          )
          nil
      )
    t
    nil
  )
)
;;点到直线的垂直距离
(defun point_line (pt pt1 pt2 / ptangle ptn pt pt1 pt2 dist jptx)
  (setq        ptangle        (angle pt1 pt2)
        ptn        (polar pt (+ (* 0.5 pi) ptangle) 0.01)
        jptx        (inters pt ptn pt1 pt2 nil)
        dist        (distance pt jptx)
  )
  dist
)
;;判断点是否在方框内
(defun point_inm (pt pt1 pt2 pt3 pt4 / dist1 dist2 dist3 dist4 pt pt1
                  pt2 pr3 pt4)
  (setq        dist1 (point_line pt pt1 pt2)
        dist2 (point_line pt pt2 pt3)
        dist3 (point_line pt pt1 pt4)
        dist4 (point_line pt pt3 pt4)
  )
  (if (equal (+ dist1 dist2 dist3 dist4)
             (+ (distance pt1 pt2) (distance pt2 pt3))
             1e-10
      )
    t
    nil
  )
)
;;测试点是否在多边形内.
(defun ea:point_inm
       (p pm / point_x mx px1 pm edge_int_num pt_online_num)
  (setq        point_x        (mapcar '(lambda (x) (car x)) pm)
        mx        (abs (- (apply 'max point_x) (car p)))
        px1        (polar p 0 (* mx 2))
  )
  (setq        pm              (append pm (list (nth 0 pm)))
        edge_int_num  0
        pt_online_num 0
  )
  (while (> (length pm) 1)
    (setq pc (nth 0 pm)
          pn (nth 1 pm)
    )
    (if        (inters p px1 pc pn)
      (setq edge_int_num (+ 1 edge_int_num))
    )
    (if        (equal (angle p pc) 0 1e-5)
      (setq pt_online_num (+ 1 pt_online_num))
    )
    (if        (and (equal (angle p pc) 0 1e-5)
             (equal (angle p pn) 0 1e-5)
        )
      (setq pt_online_num (- pt_online_num 1))
    )
    (setq pm (cdr pm))
    (if        (= (rem (+ pt_online_num edge_int_num) 2) 1)
      t
      nil
    )
  )
)
;;清理表中的重复项
(defun purge_lst (lst / n m lst1 tmplist)
  (setq        tmplist        '()
        tmplist        (cons (car lst) tmplist)
        lsttmp        (cutnum_lst lst 0)
  )
  (setq        n (length lsttmp)
        m 0
  )
  (while (/= m n)
    (setq id   '()
          lst1 (nth m lsttmp)
    )
    (foreach na        tmplist
      (if (= (eq_point na lst1) nil)
        (setq id (cons 0 id))
        (setq id (cons 1 id))
      )
    )
    (if        (= (member '1 id) nil)
      (setq tmplist (cons lst1 tmplist))
    )
    (setq m (1+ m))
  )
  (setq tmplist (reverse tmplist))
)
;;计算两点的中点
(defun mpt (mpt1 mpt2)
  (polar mpt1 (angle mpt1 mpt2) (/ (distance mpt1 mpt2) 2))
)

(defun se_426 (pt)
  (setq        sex1           (ssname (ssget "c" pt pt) 0)
        sex1ent           (entget sex1)
        sex1name   (cdr (assoc -1 sex1ent))
        sex1pt1           (cdr (assoc 10 sex1ent))
        sex1pt2           (cdr (assoc 11 sex1ent))
        newse           (drop selist sex1name)
        newsen           (length newse)
        newsem           0
        newjptlist '()
  )
  (while (/= newsem newsen)
    (setq newse1   (nth newsem newse)
          newsept1 (cdr (assoc 10 (entget newse1)))
          newsept2 (cdr (assoc 11 (entget newse1)))
    )
    (if
      (setq newjpt1 (inters sex1pt1 sex1pt2 newsept1 newsept2))
       (setq newjptlist (cons newjpt1 newjptlist))
    )
    (setq newsem (1+ newsem))
  )
  (setq        newjptx        (car newjptlist)
        newjpty        (cadr newjptlist)
  )
  (if (> (distance newjptx pt) (distance newjpty pt))
    (setq newjpt newjptx)
    (setq newjpt newjpty)
  )
  (command "break" sex1 newjpt pt)
)
(defun se_123 (lst)
  (setq se1 lst)
  (setq        dptx (cdr (assoc 10 (entget se1)))
        dpty (cdr (assoc 11 (entget se1)))
  )
  (if (or (equal dptlist (list dptx dpty))
          (equal dptlist (list dpty dptx))
      )
    (command "erase" se1 "")
  )
)
;;;
;;; 主程序
;;;
(defun c:ttr (/              pta     ptb     ptax    ptay    ptbx    ptby
              ptaxby  ptbxay  ptbox   se      n              m              nn
              mm      nnn     mmm     ptlist  ptl     lse     sename
              pt1     pt2     pt3     pt4     ptlist1 n1      m1
              ptl     tmplist templist              na      nb      nab
              ptl3    ptl4    jpt1    jpt2    jpt3    jpt4    se1
              jptx    jpty    dptx    dpty    sex1    sex1net sex1name
              sex1pt1 sex1pt2 newse   newsen  newsem  newjptlist
              newsept1              newsept2              newjpt1 newjpt2 newjptx
              newjpty dpt1    dpt2    dpt3    dpt4    se2     se3
             )
  (setq cadver (substr (getvar "acadver") 1 2))
  (setq oldos (getvar "osmode"))
  (if (< oldos 16384)
    (setvar "osmode" (+ oldos 16384))
  )
  (setq oldcmd (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (prompt "\n请选择修剪区域,直接选取(左键)为窗选,右键为栅选<任意键结束>:")
  ;(if (= cadver "14")
    ;(setq pta (grread (grread)))
  (setq pta (grread))
   ; )
  (while (/= (car pta) 2)
    (if        (and (/= (car pta) 12)(listp (cadr pta)))
      (progn
        (setq pta (cadr pta))
        (setq ptb (getcorner pta "\n修剪区域对角:"))
        (if (/= ptb nil)
          (progn
            (setq ptax (car pta)
                  ptay (cadr pta)
                  ptbx (car ptb)
                  ptby (cadr ptb)
            )
            (setq ptaxby (list ptax ptby)
                  ptbxay (list ptbx ptay)
            )
            (setq sebox (list pta ptaxby ptb ptbxay))
            (setq se (ssget "c" pta ptb '((0 . "LINE"))))
          )
          (setq se nil)
        )
      )
    )
    (if        (or (= (car pta) 12)(= (car pta) 25))      
      (progn
        (SETQ PTA (CAR PTA))
        (setq sebox '())
        (setq aa (getpoint "\n选取多边形区域的一个顶点"))
        (if (/= aa nil)
          (progn
            (setq sebox (cons aa sebox))
            (setq dd aa)
            (while
              (setq cc (getpoint aa "\n选取多边形区域的下一顶点"))
               (grdraw aa cc 7 1)
               (setq aa cc)
               (setq sebox (cons aa sebox))
            )
            (grdraw aa dd 7 1)
            (setq se (ssget "cp" sebox '((0 . "LINE"))))
            (redraw)
          )
          (setq se nil)
        )
      )
    )
    (IF        (/= SE NIL)
      (PROGN
        (SETQ n             (sslength se)
              selist '()
              ptl    '()
              ptlist '()
              m             0
        )
        (while (/= m n)
          (setq        lse    (entget (ssname se m))
                sename (cdr (assoc -1 lse))
                selist (cons sename selist)
                pt1    (cdr (assoc 10 lse))
                pt2    (cdr (assoc 11 lse))
                ptl    (cons pt2 ptl)
                ptl    (cons pt1 ptl)
                ptlist (cons ptl ptlist)
                ptl    '()
                m      (1+ m)
          )
        )
        (setq n              (length ptlist)
              m              0
              jptlist '()
        )
        (while (/= m n)
          (setq        ptl1        (car (nth m ptlist))
                ptl2        (cadr (nth m ptlist))
                ptlist1        (cutnum_lst ptlist m)
                m        (1+ m)
                n1        (length ptlist1)
                m1        0
          )
          (while (/= m1 n1)
            (setq ptl3 (car (nth m1 ptlist1))
                  ptl4 (cadr (nth m1 ptlist1))
            )
            (if        (setq jpt (inters ptl1 ptl2 ptl3 ptl4 t))
              (setq jptlist (cons jpt jptlist))
            )
            (setq m1 (1+ m1))
          )
        )
        (setq jptlist (purge_lst jptlist))
        (setq tmptlist '()
              n               (length ptlist)
              m               0
        )
        (while (/= m n)
          (setq        dpt1         (car (nth m ptlist))
                tmptlist (cons dpt1 tmptlist)
                dpt2         (cadr (nth m ptlist))
                tmptlist (cons dpt2 tmptlist)
                m         (1+ m)
          )
        )
        (setq dptlist (reverse tmptlist))
        (if (listp pta)
          (progn
            (if        (= (equal jptlist '(nil)) nil)
              (setq jptlist (pt_inm jptlist pta ptbxay ptb ptaxby)
              )
            )
            (setq dptlist (pt_inm dptlist pta ptbxay ptb ptaxby)
            )
          )
          (progn
            (if        (= (equal jptlist '(nil)) nil)
              (setq jptlist (pt_inmx jptlist sebox))
            )
            (setq dptlist (pt_inmx dptlist sebox)
            )
          )
        )
        (if (/= dptlist nil)
          (setq dptlist (purge_lst dptlist))
        )
        (if (equal jptlist '(nil))
          (setq na 0)
          (setq na (length jptlist))
        )
        (setq nb    (length dptlist)
              nab   (+ na nb)
              nlist (list na nb nab)
        )
;;;
;;;执行操作
;;;
        (if (equal nlist '(2 0 2))
          (command "trim"
                   se
                   ""
                   (mpt (car jptlist) (cadr jptlist))
                   ""
          )
        )
        (if (equal nlist '(4 8 12))
          (command "trim"
                   se
                   ""
                   (car dptlist)
                   (cadr dptlist)
                   (caddr dptlist)
                   (cadddr dptlist)
                   (cadddr (cdr dptlist))
                   (cadddr (cddr dptlist))
                   (cadddr (cdddr dptlist))
                   (cadddr (cdddr (cdr dptlist)))
                   ""
          )
        )
        (if (and (= (* 2 (length selist)) nb) (= na 0))
          (command "ERASE" se "")
        )
        (if
          (and (= na 0) (= (- (length selist) (length dptlist)) 1))
           (progn
             (setq n (length dptlist)
                   m 0
             )
             (while (/= m n)
               (setq dpt (nth m dptlist))
               (setq m (1+ m))
               (command "EXTEND" se "" dpt "")
             )
             (setq yorn (getstring "\n需要修剪吗?Y or N <Y>"))
             (if (or (= yorn "y") (= yorn "") (= yorn nil))
               (progn
                 (setq jptxlist '())
                 (setq n (length selist)
                       m 0
                 )
                 (while        (/= m n)
                   (setq sexx (nth m selist))
                   (setq sexlist (cutnum_lst selist m))
                   (setq nn (length sexlist)
                         mm 0
                   )
                   (while (/= mm nn)
                     (setq sexy (nth mm sexlist))
                     (if (setq
                           jptx
                            (inters (cdr (assoc 10 (entget sexx)))
                                    (cdr (assoc 11 (entget sexx)))
                                    (cdr (assoc 10 (entget sexy)))
                                    (cdr (assoc 11 (entget sexy)))
                            )
                         )
                       (setq jptxlist (cons jptx jptxlist))
                     )
                     (setq mm (1+ mm))
                   )
                   (setq m (1+ m))
                 )
                 (setq jptxlist (purge_lst jptxlist))
                 (while        (>= (length jptxlist) 2)
                   (setq jptx1 (nth 0 jptxlist)
                         jptx2 (nth 1 jptxlist)
                   )
                   (command "trim"
                            se
                            ""
                            (mpt jptx1 jptx2)
                            ""
                   )
                   (setq jptxlist (cdr jptxlist))
                 )
               )
             )
           )
        )
        (if (equal nlist '(4 0 4))
          (progn
            (setq jpt1 (car jptlist)
                  jpt2 (cadr jptlist)
                  jpt3 (caddr jptlist)
                  jpt4 (cadddr jptlist)
            )
            (cond
              ((= (ssget (mpt jpt1 jpt2)) nil)
               (command        "trim"
                        se
                        ""
                        (mpt jpt1 jpt3)
                        (mpt jpt1 jpt4)
                        (mpt jpt2 jpt3)
                        (mpt jpt2 jpt4)
                        ""
               )
              )
              ((= (ssget (mpt jpt1 jpt3))nil)
               (command        "trim"
                        se
                        ""
                        (mpt jpt1 jpt2)
                        (mpt jpt1 jpt4)
                        (mpt jpt2 jpt3)
                        (mpt jpt3 jpt4)
                        ""
               )
              )
              ((= (ssget (mpt jpt1 jpt4))nil)
               (command        "trim"
                        se
                        ""
                        (mpt jpt1 jpt2)
                        (mpt jpt1 jpt3)
                        (mpt jpt2 jpt4)
                        (mpt jpt3 jpt4)
                        ""
               )
              )
            )
          )
        )
        (if (equal nlist '(1 2 3))
          (progn
            (se_123 (car selist))
            (se_123 (cadr selist))
            (command "trim" se "" (car dptlist) (cadr dptlist) "")
          )
        )
        (if (equal nlist '(2 2 4))
          (progn
            (se_123 (car selist))
            (se_123 (cadr selist))
            (se_123 (caddr selist))
            (command "trim"
                     se
                     ""
                     (car dptlist)
                     (cadr dptlist)
                     (mpt (car jptlist) (cadr jptlist))
                     ""
            )
          )
        )
        (if (equal nlist '(4 2 6))
          (progn
            (setq dpt1 (car dptlist)
                  dpt2 (cadr dptlist)
            )
            (se_426 dpt1)
            (setq newjptn newjpt)
            (se_426 dpt2)
            (command "trim" se "" (mpt newjptn newjpt) "")
          )
        )
        (if (and (= (length selist) 2) (equal nlist '(0 2 2)))
          (command "FILLET" (car dptlist) (cadr dptlist))
        )
        (if (equal nlist '(1 1 2))
          (command "trim" se "" (car dptlist) "")
        )
        (if (and (= (length selist) 2) (equal nlist '(1 3 4)))
          (command "ERASE" se "")
        )
        (if (and (= (length selist) 4)
                 (or (equal nlist '(1 3 4)) (equal nlist '(1 4 5)))
            )
          (progn
            (setq sen (length selist)
                  sem 0
            )
            (while (/= sem sen)
              (setq sex1 (nth sem selist))
              (setq newselist (drop selist sex1))
              (foreach n newselist
                (if (line_int sex1 n)
                  (setq        sexa sex1
                        sexb n
                  )
                )
              )
              (setq sem (1+ sem))
            )
            (setq newselist (drop selist sexa)
                  newselist (drop newselist sexb)
            )
            (if        (listp pta)
              (progn
                (if
                  (= (point_inm
                       (setq
                         fpt1
                          (cdr (assoc 10 (entget (car newselist)))
                          )
                       )
                       pta
                       ptbxay
                       ptb
                       ptaxby
                     )
                     nil
                  )
                   (setq
                     fpt1 (cdr (assoc 11 (entget (car newselist))))
                   )
                )
                (if
                  (= (point_inm
                       (setq fpt2
                              (cdr (assoc 10 (entget (cadr newselist))))
                       )
                       pta
                       ptbxay
                       ptb
                       ptaxby
                     )
                     nil
                  )
                   (setq fpt2
                          (cdr (assoc 11 (entget (cadr newselist))))
                   )
                )
              )
              (progn
                (if
                  (= (ea:point_inm
                       (setq
                         fpt1
                          (cdr (assoc 10 (entget (car newselist)))
                          )
                       )
                       sebox
                     )
                     nil
                  )
                   (setq
                     fpt1 (cdr (assoc 11 (entget (car newselist))))
                   )
                )
                (if (= (ea:point_inm
                         (setq
                           fpt2
                            (cdr (assoc 10 (entget (cadr newselist))))
                         )
                         sebox
                       )
                       nil
                    )
                  (setq        fpt2
                         (cdr (assoc 11 (entget (cadr newselist))))
                  )
                )
              )
            )
            (setq oldfillet (getvar "filletrad"))
            (setvar "filletrad" 0.0)
            (command "FILLET" fpt1 fpt2)
            (setvar "filletrad" oldfillet)
            (setq dptlist1 (drop dptlist fpt1)
                  dptlist1 (drop dptlist1 fpt2)
            )
            (command "trim" se "" (car dptlist1) (cadr dptlist1) "")
          )
        )
        (princ nlist)
     (setvar "osmode" 4791)
(setq old (getvar "osmode"))
      )
    )
    (prompt "\n请选择修剪区域,直接选取为窗选,右键为栅选<任意键结束>:")

    (setq pta (grread))   
  )
  (setvar "osmode" oldos)
    (setvar "cmdecho" oldcmd)
)
(PRINC
  "\n智能剪程序已经加载成功,用“TTR”命令运行。"
)
(PRINC)





本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-2-17 09:21 | 显示全部楼层
支持一下!!!!!
发表于 2014-2-18 13:38 | 显示全部楼层
程序太长,就只添加圆角部分。
  1. (defun cutnum_lst (oldlst num / k templst)
  2.   (setq        k 0
  3.         templst        '()
  4.   )
  5.   (foreach n oldlst
  6.     (if        (/= k num)
  7.       (setq templst (cons n templst)
  8.             k            (1+ k)
  9.       )
  10.     )
  11.     (setq k (1+ k))
  12.   )
  13.   (setq newlst (reverse templst))
  14. )
  15. ;;去除表中指定项
  16. (defun drop (lst item)
  17.   (append (reverse (cdr (member item (reverse lst))))
  18.           (cdr (member item lst))
  19.   )
  20. )
  21. ;;将点表中在方框内的点组成新表
  22. (defun pt_inm (oldlst PT1 PT2 PT3 PT4 /        oldlist        n pt1 pt2 pt3 pt4
  23.                templst newlst)
  24.   (setq templst '())
  25.   (foreach n oldlst
  26.     (if        (/= (point_inm n pt1 pt2 pt3 pt4) nil)
  27.       (setq templst (cons n templst))
  28.     )
  29.   )
  30.   (setq newlst (reverse templst))
  31. )
  32. ;;将点表中在多边形内的点组成新表
  33. (defun pt_inmx (oldlst pm)
  34.   (setq templst '())
  35.   (foreach n oldlst
  36.     (if        (ea:point_inm n pm)
  37.       (setq templst (cons n templst))
  38.     )
  39.   )
  40.   (setq newlst (reverse templst))
  41. )
  42. ;;判断两点是否等
  43. (defun eq_point        (pt1 pt2)
  44.   (if (and (equal (car pt1) (car pt2) 1e-5)
  45.            (equal (cadr pt1) (cadr pt2) 1e-5)
  46.       )
  47.     t
  48.     nil
  49.   )
  50. )
  51. ;;判断两直线是否相交
  52. (defun line_int        (se1 se2)
  53.   (if (/= (inters (cdr (assoc 10 (entget se1)))
  54.                   (cdr (assoc 11 (entget se1)))
  55.                   (cdr (assoc 10 (entget se2)))
  56.                   (cdr (assoc 11 (entget se2)))
  57.                   t
  58.           )
  59.           nil
  60.       )
  61.     t
  62.     nil
  63.   )
  64. )
  65. ;;点到直线的垂直距离
  66. (defun point_line (pt pt1 pt2 / ptangle ptn pt pt1 pt2 dist jptx)
  67.   (setq        ptangle        (angle pt1 pt2)
  68.         ptn        (polar pt (+ (* 0.5 pi) ptangle) 0.01)
  69.         jptx        (inters pt ptn pt1 pt2 nil)
  70.         dist        (distance pt jptx)
  71.   )
  72.   dist
  73. )
  74. ;;判断点是否在方框内
  75. (defun point_inm (pt pt1 pt2 pt3 pt4 / dist1 dist2 dist3 dist4 pt pt1
  76.                   pt2 pr3 pt4)
  77.   (setq        dist1 (point_line pt pt1 pt2)
  78.         dist2 (point_line pt pt2 pt3)
  79.         dist3 (point_line pt pt1 pt4)
  80.         dist4 (point_line pt pt3 pt4)
  81.   )
  82.   (if (equal (+ dist1 dist2 dist3 dist4)
  83.              (+ (distance pt1 pt2) (distance pt2 pt3))
  84.              1e-10
  85.       )
  86.     t
  87.     nil
  88.   )
  89. )
  90. ;;测试点是否在多边形内.
  91. (defun ea:point_inm
  92.        (p pm / point_x mx px1 pm edge_int_num pt_online_num)
  93.   (setq        point_x        (mapcar '(lambda (x) (car x)) pm)
  94.         mx        (abs (- (apply 'max point_x) (car p)))
  95.         px1        (polar p 0 (* mx 2))
  96.   )
  97.   (setq        pm              (append pm (list (nth 0 pm)))
  98.         edge_int_num  0
  99.         pt_online_num 0
  100.   )
  101.   (while (> (length pm) 1)
  102.     (setq pc (nth 0 pm)
  103.           pn (nth 1 pm)
  104.     )
  105.     (if        (inters p px1 pc pn)
  106.       (setq edge_int_num (+ 1 edge_int_num))
  107.     )
  108.     (if        (equal (angle p pc) 0 1e-5)
  109.       (setq pt_online_num (+ 1 pt_online_num))
  110.     )
  111.     (if        (and (equal (angle p pc) 0 1e-5)
  112.              (equal (angle p pn) 0 1e-5)
  113.         )
  114.       (setq pt_online_num (- pt_online_num 1))
  115.     )
  116.     (setq pm (cdr pm))
  117.     (if        (= (rem (+ pt_online_num edge_int_num) 2) 1)
  118.       t
  119.       nil
  120.     )
  121.   )
  122. )
  123. ;;清理表中的重复项
  124. (defun purge_lst (lst / n m lst1 tmplist)
  125.   (setq        tmplist        '()
  126.         tmplist        (cons (car lst) tmplist)
  127.         lsttmp        (cutnum_lst lst 0)
  128.   )
  129.   (setq        n (length lsttmp)
  130.         m 0
  131.   )
  132.   (while (/= m n)
  133.     (setq id   '()
  134.           lst1 (nth m lsttmp)
  135.     )
  136.     (foreach na        tmplist
  137.       (if (= (eq_point na lst1) nil)
  138.         (setq id (cons 0 id))
  139.         (setq id (cons 1 id))
  140.       )
  141.     )
  142.     (if        (= (member '1 id) nil)
  143.       (setq tmplist (cons lst1 tmplist))
  144.     )
  145.     (setq m (1+ m))
  146.   )
  147.   (setq tmplist (reverse tmplist))
  148. )
  149. ;;计算两点的中点
  150. (defun mpt (mpt1 mpt2)
  151.   (polar mpt1 (angle mpt1 mpt2) (/ (distance mpt1 mpt2) 2))
  152. )

  153. (defun se_426 (pt)
  154.   (setq        sex1           (ssname (ssget "c" pt pt) 0)
  155.         sex1ent           (entget sex1)
  156.         sex1name   (cdr (assoc -1 sex1ent))
  157.         sex1pt1           (cdr (assoc 10 sex1ent))
  158.         sex1pt2           (cdr (assoc 11 sex1ent))
  159.         newse           (drop selist sex1name)
  160.         newsen           (length newse)
  161.         newsem           0
  162.         newjptlist '()
  163.   )
  164.   (while (/= newsem newsen)
  165.     (setq newse1   (nth newsem newse)
  166.           newsept1 (cdr (assoc 10 (entget newse1)))
  167.           newsept2 (cdr (assoc 11 (entget newse1)))
  168.     )
  169.     (if
  170.       (setq newjpt1 (inters sex1pt1 sex1pt2 newsept1 newsept2))
  171.        (setq newjptlist (cons newjpt1 newjptlist))
  172.     )
  173.     (setq newsem (1+ newsem))
  174.   )
  175.   (setq        newjptx        (car newjptlist)
  176.         newjpty        (cadr newjptlist)
  177.   )
  178.   (if (> (distance newjptx pt) (distance newjpty pt))
  179.     (setq newjpt newjptx)
  180.     (setq newjpt newjpty)
  181.   )
  182.   (command "break" sex1 newjpt pt)
  183. )
  184. (defun se_123 (lst)
  185.   (setq se1 lst)
  186.   (setq        dptx (cdr (assoc 10 (entget se1)))
  187.         dpty (cdr (assoc 11 (entget se1)))
  188.   )
  189.   (if (or (equal dptlist (list dptx dpty))
  190.           (equal dptlist (list dpty dptx))
  191.       )
  192.     (command "erase" se1 "")
  193.   )
  194. )
  195. ;;;
  196. ;;; 主程序
  197. ;;;
  198. (defun c:ttr (/              pta     ptb     ptax    ptay    ptbx    ptby
  199.               ptaxby  ptbxay  ptbox   se      n              m              nn
  200.               mm      nnn     mmm     ptlist  ptl     lse     sename
  201.               pt1     pt2     pt3     pt4     ptlist1 n1      m1
  202.               ptl     tmplist templist              na      nb      nab
  203.               ptl3    ptl4    jpt1    jpt2    jpt3    jpt4    se1
  204.               jptx    jpty    dptx    dpty    sex1    sex1net sex1name
  205.               sex1pt1 sex1pt2 newse   newsen  newsem  newjptlist
  206.               newsept1              newsept2              newjpt1 newjpt2 newjptx
  207.               newjpty dpt1    dpt2    dpt3    dpt4    se2     se3
  208.               sef2 ent1 ent2 p1 p2 p3 p4 ipts se2com entlst2
  209.              )
  210.   (setq cadver (substr (getvar "acadver") 1 2))
  211.   (setq oldos (getvar "osmode"))
  212.   (if (< oldos 16384)
  213.     (setvar "osmode" (+ oldos 16384))
  214.   )
  215.   (setq oldcmd (getvar "cmdecho"))
  216.   (setvar "cmdecho" 0)
  217.   (or sk_frad (setq sk_frad 0.0));;;设置sk_frad为全局变量
  218.   (if (setq sk_fr(getreal (strcat "\n请输入圆角半径<" (rtos sk_frad 2 2)  ">:")))(setq sk_frad sk_fr))
  219.   (prompt "\n请选择修剪区域,直接选取(左键)为窗选,右键为栅选<任意键结束>:")
  220.   ;(if (= cadver "14")
  221.     ;(setq pta (grread (grread)))
  222.   (setq pta (grread))
  223.    ; )
  224.   (while (/= (car pta) 2)
  225.     (if        (and (/= (car pta) 12)(listp (cadr pta)))
  226.       (progn
  227.         (setq pta (cadr pta))
  228.         (setq ptb (getcorner pta "\n修剪区域对角:"))
  229.         (if (/= ptb nil)
  230.           (progn
  231.             (setq ptax (car pta)
  232.                   ptay (cadr pta)
  233.                   ptbx (car ptb)
  234.                   ptby (cadr ptb)
  235.             )
  236.             (setq ptaxby (list ptax ptby)
  237.                   ptbxay (list ptbx ptay)
  238.             )
  239.             (setq sebox (list pta ptaxby ptb ptbxay))
  240.             (setq se (ssget "c" pta ptb '((0 . "LINE"))))
  241.           )
  242.           (setq se nil)
  243.         )
  244.       )
  245.     )
  246.     (if        (or (= (car pta) 12)(= (car pta) 25))      
  247.       (progn
  248.         (SETQ PTA (CAR PTA))
  249.         (setq sebox '())
  250.         (setq aa (getpoint "\n选取多边形区域的一个顶点"))
  251.         (if (/= aa nil)
  252.           (progn
  253.             (setq sebox (cons aa sebox))
  254.             (setq dd aa)
  255.             (while
  256.               (setq cc (getpoint aa "\n选取多边形区域的下一顶点"))
  257.                (grdraw aa cc 7 1)
  258.                (setq aa cc)
  259.                (setq sebox (cons aa sebox))
  260.             )
  261.             (grdraw aa dd 7 1)
  262.             (setq se (ssget "cp" sebox '((0 . "LINE"))))
  263.             (redraw)
  264.           )
  265.           (setq se nil)
  266.         )
  267.       )
  268.     )
  269.     (IF        (/= SE NIL)
  270.       (PROGN
  271.         (SETQ n             (sslength se)
  272.               selist '()
  273.               ptl    '()
  274.               ptlist '()
  275.               m             0
  276.         )
  277.         (while (/= m n)
  278.           (setq        lse    (entget (ssname se m))
  279.                 sename (cdr (assoc -1 lse))
  280.                 selist (cons sename selist)
  281.                 pt1    (cdr (assoc 10 lse))
  282.                 pt2    (cdr (assoc 11 lse))
  283.                 ptl    (cons pt2 ptl)
  284.                 ptl    (cons pt1 ptl)
  285.                 ptlist (cons ptl ptlist)
  286.                 ptl    '()
  287.                 m      (1+ m)
  288.           )
  289.         )
  290.         (setq n              (length ptlist)
  291.               m              0
  292.               jptlist '()
  293.         )
  294.         (while (/= m n)
  295.           (setq        ptl1        (car (nth m ptlist))
  296.                 ptl2        (cadr (nth m ptlist))
  297.                 ptlist1        (cutnum_lst ptlist m)
  298.                 m        (1+ m)
  299.                 n1        (length ptlist1)
  300.                 m1        0
  301.           )
  302.           (while (/= m1 n1)
  303.             (setq ptl3 (car (nth m1 ptlist1))
  304.                   ptl4 (cadr (nth m1 ptlist1))
  305.             )
  306.             (if        (setq jpt (inters ptl1 ptl2 ptl3 ptl4 t))
  307.               (setq jptlist (cons jpt jptlist))
  308.             )
  309.             (setq m1 (1+ m1))
  310.           )
  311.         )
  312.         (setq jptlist (purge_lst jptlist))
  313.         (setq tmptlist '()
  314.               n               (length ptlist)
  315.               m               0
  316.         )
  317.         (while (/= m n)
  318.           (setq        dpt1         (car (nth m ptlist))
  319.                 tmptlist (cons dpt1 tmptlist)
  320.                 dpt2         (cadr (nth m ptlist))
  321.                 tmptlist (cons dpt2 tmptlist)
  322.                 m         (1+ m)
  323.           )
  324.         )
  325.         (setq dptlist (reverse tmptlist))
  326.         (if (listp pta)
  327.           (progn
  328.             (if        (= (equal jptlist '(nil)) nil)
  329.               (setq jptlist (pt_inm jptlist pta ptbxay ptb ptaxby)
  330.               )
  331.             )
  332.             (setq dptlist (pt_inm dptlist pta ptbxay ptb ptaxby)
  333.             )
  334.           )
  335.           (progn
  336.             (if        (= (equal jptlist '(nil)) nil)
  337.               (setq jptlist (pt_inmx jptlist sebox))
  338.             )
  339.             (setq dptlist (pt_inmx dptlist sebox)
  340.             )
  341.           )
  342.         )
  343.         (if (/= dptlist nil)
  344.           (setq dptlist (purge_lst dptlist))
  345.         )
  346.         (if (equal jptlist '(nil))
  347.           (setq na 0)
  348.           (setq na (length jptlist))
  349.         )
  350.         (setq nb    (length dptlist)
  351.               nab   (+ na nb)
  352.               nlist (list na nb nab)
  353.         )
  354. ;;;
  355. ;;;执行操作
  356. ;;;
  357.         (if (equal nlist '(2 0 2))
  358.           (command "trim"
  359.                    se
  360.                    ""
  361.                    (mpt (car jptlist) (cadr jptlist))
  362.                    ""
  363.           )
  364.         )
  365.         (if (equal nlist '(4 8 12))
  366.           (command "trim"
  367.                    se
  368.                    ""
  369.                    (car dptlist)
  370.                    (cadr dptlist)
  371.                    (caddr dptlist)
  372.                    (cadddr dptlist)
  373.                    (cadddr (cdr dptlist))
  374.                    (cadddr (cddr dptlist))
  375.                    (cadddr (cdddr dptlist))
  376.                    (cadddr (cdddr (cdr dptlist)))
  377.                    ""
  378.           )
  379.         )
  380.         (if (and (= (* 2 (length selist)) nb) (= na 0))
  381.           (command "ERASE" se "")
  382.         )
  383.         (if
  384.           (and (= na 0) (= (- (length selist) (length dptlist)) 1))
  385.            (progn
  386.              (setq n (length dptlist)
  387.                    m 0
  388.              )
  389.              (while (/= m n)
  390.                (setq dpt (nth m dptlist))
  391.                (setq m (1+ m))
  392.                (command "EXTEND" se "" dpt "")
  393.              )
  394.              (setq yorn (getstring "\n需要修剪吗?Y or N <Y>"))
  395.              (if (or (= yorn "y") (= yorn "") (= yorn nil))
  396.                (progn
  397.                  (setq jptxlist '())
  398.                  (setq n (length selist)
  399.                        m 0
  400.                  )
  401.                  (while        (/= m n)
  402.                    (setq sexx (nth m selist))
  403.                    (setq sexlist (cutnum_lst selist m))
  404.                    (setq nn (length sexlist)
  405.                          mm 0
  406.                    )
  407.                    (while (/= mm nn)
  408.                      (setq sexy (nth mm sexlist))
  409.                      (if (setq
  410.                            jptx
  411.                             (inters (cdr (assoc 10 (entget sexx)))
  412.                                     (cdr (assoc 11 (entget sexx)))
  413.                                     (cdr (assoc 10 (entget sexy)))
  414.                                     (cdr (assoc 11 (entget sexy)))
  415.                             )
  416.                          )
  417.                        (setq jptxlist (cons jptx jptxlist))
  418.                      )
  419.                      (setq mm (1+ mm))
  420.                    )
  421.                    (setq m (1+ m))
  422.                  )
  423.                  (setq jptxlist (purge_lst jptxlist))
  424.                  (while        (>= (length jptxlist) 2)
  425.                    (setq jptx1 (nth 0 jptxlist)
  426.                          jptx2 (nth 1 jptxlist)
  427.                    )
  428.                    (command "trim"
  429.                             se
  430.                             ""
  431.                             (mpt jptx1 jptx2)
  432.                             ""
  433.                    )
  434.                    (setq jptxlist (cdr jptxlist))
  435.                  )
  436.                )
  437.              )
  438.            )
  439.         )
  440.         (if (equal nlist '(4 0 4))
  441.           (progn
  442.             (setq jpt1 (car jptlist)
  443.                   jpt2 (cadr jptlist)
  444.                   jpt3 (caddr jptlist)
  445.                   jpt4 (cadddr jptlist)
  446.             )
  447.             (cond
  448.               ((= (ssget (mpt jpt1 jpt2)) nil)
  449.                (command        "trim"
  450.                         se
  451.                         ""
  452.                         (mpt jpt1 jpt3)
  453.                         (mpt jpt1 jpt4)
  454.                         (mpt jpt2 jpt3)
  455.                         (mpt jpt2 jpt4)
  456.                         ""
  457.                )
  458.               )
  459.               ((= (ssget (mpt jpt1 jpt3))nil)
  460.                (command        "trim"
  461.                         se
  462.                         ""
  463.                         (mpt jpt1 jpt2)
  464.                         (mpt jpt1 jpt4)
  465.                         (mpt jpt2 jpt3)
  466.                         (mpt jpt3 jpt4)
  467.                         ""
  468.                )
  469.               )
  470.               ((= (ssget (mpt jpt1 jpt4))nil)
  471.                (command        "trim"
  472.                         se
  473.                         ""
  474.                         (mpt jpt1 jpt2)
  475.                         (mpt jpt1 jpt3)
  476.                         (mpt jpt2 jpt4)
  477.                         (mpt jpt3 jpt4)
  478.                         ""
  479.                )
  480.               )
  481.             )
  482.           )
  483.         )
  484.         (if (equal nlist '(1 2 3))
  485.           (progn
  486.             (se_123 (car selist))
  487.             (se_123 (cadr selist))
  488.             (command "trim" se "" (car dptlist) (cadr dptlist) "")
  489.           )
  490.         )
  491.         (if (equal nlist '(2 2 4))
  492.           (progn
  493.             (se_123 (car selist))
  494.             (se_123 (cadr selist))
  495.             (se_123 (caddr selist))
  496.             (command "trim"
  497.                      se
  498.                      ""
  499.                      (car dptlist)
  500.                      (cadr dptlist)
  501.                      (mpt (car jptlist) (cadr jptlist))
  502.                      ""
  503.             )
  504.           )
  505.         )
  506.         (if (equal nlist '(4 2 6))
  507.           (progn
  508.             (setq dpt1 (car dptlist)
  509.                   dpt2 (cadr dptlist)
  510.             )
  511.             (se_426 dpt1)
  512.             (setq newjptn newjpt)
  513.             (se_426 dpt2)
  514.             (command "trim" se "" (mpt newjptn newjpt) "")
  515.           )
  516.         )
  517.        
  518.         (if (and (= (length selist) 2) (equal nlist '(0 2 2)))
  519.           (command "FILLET" (car dptlist) (cadr dptlist))
  520.         )
  521.         (if (equal nlist '(1 1 2))
  522.           (command "trim" se "" (car dptlist) "")
  523.         )
  524.         (if (and (= (length selist) 2) (equal nlist '(1 3 4)))
  525.           (command "ERASE" se "")
  526.         )
  527.         (if (and (= (length selist) 4)
  528.                  (or (equal nlist '(1 3 4)) (equal nlist '(1 4 5)))
  529.             )
  530.           (progn
  531.             (setq sen (length selist)
  532.                   sem 0
  533.             )
  534.             (while (/= sem sen)
  535.               (setq sex1 (nth sem selist))
  536.               (setq newselist (drop selist sex1))
  537.               (foreach n newselist
  538.                 (if (line_int sex1 n)
  539.                   (setq        sexa sex1
  540.                         sexb n
  541.                   )
  542.                 )
  543.               )
  544.               (setq sem (1+ sem))
  545.             )
  546.             (setq newselist (drop selist sexa)
  547.                   newselist (drop newselist sexb)
  548.             )
  549.             (if        (listp pta)
  550.               (progn
  551.                 (if
  552.                   (= (point_inm
  553.                        (setq
  554.                          fpt1
  555.                           (cdr (assoc 10 (entget (car newselist)))
  556.                           )
  557.                        )
  558.                        pta
  559.                        ptbxay
  560.                        ptb
  561.                        ptaxby
  562.                      )
  563.                      nil
  564.                   )
  565.                    (setq
  566.                      fpt1 (cdr (assoc 11 (entget (car newselist))))
  567.                    )
  568.                 )
  569.                 (if
  570.                   (= (point_inm
  571.                        (setq fpt2
  572.                               (cdr (assoc 10 (entget (cadr newselist))))
  573.                        )
  574.                        pta
  575.                        ptbxay
  576.                        ptb
  577.                        ptaxby
  578.                      )
  579.                      nil
  580.                   )
  581.                    (setq fpt2
  582.                           (cdr (assoc 11 (entget (cadr newselist))))
  583.                    )
  584.                 )
  585.               )
  586.               (progn
  587.                 (if
  588.                   (= (ea:point_inm
  589.                        (setq
  590.                          fpt1
  591.                           (cdr (assoc 10 (entget (car newselist)))
  592.                           )
  593.                        )
  594.                        sebox
  595.                      )
  596.                      nil
  597.                   )
  598.                    (setq
  599.                      fpt1 (cdr (assoc 11 (entget (car newselist))))
  600.                    )
  601.                 )
  602.                 (if (= (ea:point_inm
  603.                          (setq
  604.                            fpt2
  605.                             (cdr (assoc 10 (entget (cadr newselist))))
  606.                          )
  607.                          sebox
  608.                        )
  609.                        nil
  610.                     )
  611.                   (setq        fpt2
  612.                          (cdr (assoc 11 (entget (cadr newselist))))
  613.                   )
  614.                 )
  615.               )
  616.             )
  617.             (setq oldfillet (getvar "filletrad"))
  618.             (setvar "filletrad" 10.0)
  619.             (command "FILLET" fpt1 fpt2)
  620.             (setvar "filletrad" oldfillet)
  621.             (setq dptlist1 (drop dptlist fpt1)
  622.                   dptlist1 (drop dptlist1 fpt2)
  623.             )
  624.             (command "trim" se "" (car dptlist1) (cadr dptlist1) "")
  625.           )
  626.         )
  627.         (princ nlist)
  628.      (setvar "osmode" 4791)
  629. (setq old (getvar "osmode"))
  630.       )
  631.     )
  632.     (if(setq sef2 (ssget "cp" sebox '((0 . "LINE"))))
  633.       (progn
  634.         (setq se2lst (ss2lst sef2))
  635.         (setq se2com (combination se2lst 2)
  636.               entlst2 '())
  637.         (while (setq ent1(car se2com))
  638.           (setq p1 (sk_dxf (car ent1) 10 )
  639.                 p2 (sk_dxf (car ent1) 11 )
  640.                 p3 (sk_dxf (cadr ent1) 10 )
  641.                 p4 (sk_dxf (cadr ent1) 11 )
  642.                 ipts(inters p1 p2 p3 p4))
  643.           (if ipts(setq entlst2(cons ent1 entlst2)))
  644.           (setq se2com(cdr se2com))
  645.           )
  646.         (setq entlst2(reverse entlst2))
  647.         (if (/= entlst2 '())
  648.           (progn
  649.             (setq oldfillet (getvar "filletrad"))
  650.             (setvar "filletrad" sk_frad)
  651.             (while (setq ent2(car entlst2))
  652.             (command "FILLET" (car ent2)(cadr ent2))
  653.               (setq entlst2(cdr entlst2))
  654.               )
  655.             (setvar "filletrad" oldfillet)
  656.             )
  657.           )
  658.        
  659.         )
  660.       )
  661.     (prompt "\n请选择修剪区域,直接选取为窗选,右键为栅选<任意键结束>:")

  662.     (setq pta (grread))   
  663.   )
  664.   (setvar "osmode" oldos)
  665.     (setvar "cmdecho" oldcmd)
  666. )
  667. (PRINC
  668.   "\n智能剪程序已经加载成功,用“TTR”命令运行。"
  669. )
  670. ;;选择集转表
  671. (defun ss2lst(ss / en lst)
  672.   (if (= (type ss) 'PICKSET)
  673.     (progn
  674.       (setq lst '())
  675.       (while (setq en (ssname ss 0))
  676.         (setq lst(cons en lst))
  677.         (setq ss(ssdel en ss))
  678.         )
  679.       (setq lst(reverse lst))
  680.       )
  681.     )
  682.   )
  683. ;;;组合函数
  684. (defun combination (lst m)
  685.   (cond        ((zerop m) '(()))
  686.         ((null lst) '())
  687.         (T
  688.          (append (mapcar '(lambda (y) (cons (car lst) y))
  689.                          (combination (cdr lst) (- m 1))
  690.                  )
  691.                  (combination (cdr lst) m)
  692.          )
  693.         )
  694.   )
  695. )

  696. ;;;组码值提取(sk_dxf 图元名 组码)
  697. (defun sk_dxf(en code)
  698.     (if(and(=(type en) 'ENAME)(= (type code) 'INT))
  699.       (cdr(assoc code (entget en))))
  700.   )
  701. (PRINC)
 楼主| 发表于 2014-2-18 18:01 | 显示全部楼层
edatad大大还是厉害,我把问题还是想的太简单了,以为只需要修改其中的参数就可以了。谢谢edatad大大。
发表于 2014-2-20 18:24 | 显示全部楼层
edatad大大,还有PL线不支持啊!
发表于 2014-11-17 09:32 | 显示全部楼层
最好支持PL线倒角!
发表于 2016-2-20 15:04 | 显示全部楼层
看看怎么样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-18 02:59 , Processed in 0.199334 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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