模板上有大小不一样的圆



网友答:
xiaxiang 发表于 2011-11-16 16:41

修剪多段线出了点故障,请完善一下



网友答:
  1. ;; ctrim.lsp  v1.1
  2. ;; Modified By Xiaxiang

  3. (defun c:ctrim ( / circ_pts lst ang inc tmp seg pt ent ss1 num
  4.                    ctrim_err x f_pts svd_os svd_cmd svd_err)

  5. (defun ctrim_err (s)
  6.   (if(/= s "Function cancelled")
  7.   (princ(strcat "\n\n" s))     )
  8.   (setvar "cmdecho" svd_cmd)
  9.   (setvar "osmode" svd_os)
  10.   (setq *error* svd_err)
  11. )

  12. (defun circ_pts (enm)
  13.   (setq lst    (entget enm)
  14.         ang    (* pi 2)
  15.         inc    (/ ang 64)
  16.         tmp    '()
  17.         seg    65
  18.   )
  19.   (repeat seg
  20.    (setq pt (polar(cdr(assoc 10 lst))ang
  21.             (-(cdr(assoc 40 lst))0.01))
  22.         ang (+ inc ang)
  23.    )
  24.    (setq tmp(cons pt tmp))
  25.   )
  26.   tmp
  27. )

  28. ;;add ssget function
  29. (setq num 0)
  30. (prompt "\nSelect circles: ")
  31. (setq ss1 (ssget '((0 . "CIRCLE"))))
  32. (setq ;ent     (car(entsel "\nSelect circle: ")) ;;entsel
  33.        svd_err *error*
  34.        *error* ctrim_err
  35.        svd_os  (getvar "osmode")
  36.        svd_cmd (getvar "cmdecho")
  37. )
  38. (setvar "cmdecho" 0)
  39. (setvar "osmode" 0)
  40. (repeat (sslength ss1)
  41. (setq ent(ssname ss1 num))
  42. (setq num(1+ num))
  43. (if(and ent
  44.      (=(cdr(assoc 0(entget ent)))"CIRCLE")
  45.     )
  46.   (progn
  47.    (setq f_pts(circ_pts ent))
  48.    (command "trim" ent "" "f")   ;run twice in case the same
  49.    (foreach x f_pts(command x))  ;object intersects circle twice
  50.    (command "" "")
  51.    (command "trim" ent "" "f")
  52.    (foreach x f_pts(command x))
  53.    (command "" "")
  54.    (if(setq x(ssget "wp" f_pts))
  55.     (command "erase" x "")
  56.    )
  57.   )
  58. )
  59. )
  60. (setvar "cmdecho" svd_cmd)
  61. (setvar "osmode" svd_os)
  62. (setq *error* svd_err)
  63. (princ)
  64. )


网友答:
  1. (defun c:ctrim ( / circ_pts lst ang inc tmp seg pt ent
  2.                    ctrim_err x f_pts svd_os svd_cmd svd_err)


  3. (defun ctrim_err (s)
  4.   (if(/= s "Function cancelled")
  5.   (princ(strcat "\n\n" s))     )
  6.   (setvar "cmdecho" svd_cmd)
  7.   (setvar "osmode" svd_os)
  8.   (setq *error* svd_err)
  9. )


  10. (defun circ_pts (enm)
  11.   (setq lst    (entget enm)
  12.         ang    (* pi 2)
  13.         inc    (/ ang 64)
  14.         tmp    '()
  15.         seg    65
  16.   )
  17.   (repeat seg
  18.    (setq pt (polar(cdr(assoc 10 lst))ang
  19.             (-(cdr(assoc 40 lst))0.01))
  20.         ang (+ inc ang)
  21.    )
  22.    (setq tmp(cons pt tmp))
  23.   )
  24.   tmp
  25. )


  26. (setq ent     (car(entsel "\nSelect circle: "))
  27.        svd_err *error*
  28.        *error* ctrim_err
  29.        svd_os  (getvar "osmode")
  30.        svd_cmd (getvar "cmdecho")
  31. )
  32. (setvar "cmdecho" 0)
  33. (setvar "osmode" 0)
  34. (if(and ent
  35.      (=(cdr(assoc 0(entget ent)))"CIRCLE")
  36.     )
  37.   (progn
  38.    (setq f_pts(circ_pts ent))
  39.    (command "trim" ent "" "f")   ;run twice in case the same
  40.    (foreach x f_pts(command x))  ;object intersects circle twice
  41.    (command "" "")
  42.    (command "trim" ent "" "f")
  43.    (foreach x f_pts(command x))
  44.    (command "" "")
  45.    (if(setq x(ssget "wp" f_pts))
  46.     (command "erase" x "")
  47.    )
  48.   )
  49. )
  50. (setvar "cmdecho" svd_cmd)
  51. (setvar "osmode" svd_os)
  52. (setq *error* svd_err)
  53. (princ)
  54. )



网友答:
xiaxiang 发表于 2011-11-16 15:47

您好,能不能改成框选呀,就是框选后,把框选中所有圆内的东东全剪了,谢谢!

网友答:
xiaxiang 发表于 2011-11-16 16:41

谢谢您,效果很好

网友答:
443971181 发表于 2011-11-16 16:47
谢谢您,效果很好

非常感谢!怎么给您加分呢?

网友答: 有没有c#版的?

网友答: 不错,效果很好。

网友答: 路过,学习了
  • 上一篇:[LISP]Lisp文件的加密工具和解密工具,请下载!
  • 下一篇:没有了