明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2642|回复: 6

发一个TRIM工具,主要是自动选择修剪对象,

[复制链接]
发表于 2003-12-27 11:55:00 | 显示全部楼层 |阅读模式
希望大家帮我完善一下,看看有没有什么不好的地方
  1. (if  (= (getvar "acadver") "14.0" )
  2.   (setq cadver 14)
  3.   (setq cadver 15)
  4.   )
  5. (if (= cadver 15) (vl-load-com))

  6. (defun getunlocklayer(/ layer lay_list )
  7. (setq layer (tblnext "layer" T))
  8.   (if (= (cdr (assoc 70 layer) ) 0)
  9. (setq lay_list (list (cons 8 (cdr (assoc 2 layer)))))
  10.     )
  11. (setq layer (tblnext "layer"))
  12. (while layer
  13.   (if (= (cdr (assoc 70 layer) ) 0)
  14.      (setq lay_list (append lay_list (list (cons 8 (cdr (assoc 2 layer))))))
  15.     )
  16.         (setq layer (tblnext "layer"))
  17.          )
  18.    (append (cons (cons -4  "<OR") lay_list) (list (cons -4  "OR>")))

  19.   )


  20. (setq trss nil)



  21. (defun c:tr ( /  ss ssx i entlist pointlist entpointlist getpo minx miny maxx maxy entlen
  22. objtype minp maxp sstemp sslen entlent distentlist distlist listlen dist
  23. trimobj trss
  24. )
  25.   (defun pointatrec ( point rec / minx miny maxx maxy   )
  26.     (setq minx (min (car (car rec)) (car (cadr rec)) (car (caddr rec)) (car (caddr rec))))
  27.     (setq maxx (max (car (car rec)) (car (cadr rec)) (car (caddr rec)) (car (caddr rec))))
  28.     (setq miny (min (cadr (car rec)) (cadr (cadr rec)) (cadr (caddr rec)) (cadr (caddr rec))))
  29.     (setq maxy (max (cadr (car rec)) (cadr (cadr rec)) (cadr (caddr rec)) (cadr (caddr rec))))
  30.     (if (and (>= (car point) minx) (<= (car point) maxx) (>= (cadr point) miny) (<= (cadr point) maxy))
  31.       T
  32.       nil
  33.     )
  34.     )
  35.   (defun getentpointlist( ent reclist / entlist polistok vlaobj )
  36.     (setq entlist (entget ent)
  37.      ;          enttype (cdr (assoc 0 entlist))
  38.           polistok (list)
  39.           vlaobj (vlax-ename->vla-object ent))
  40.     (cond
  41.           ((pointatrec (vlax-curve-getClosestPointTo vlaobj (car reclist)) reclist)
  42.            (setq  polistok (append polistok (list (vlax-curve-getClosestPointTo vlaobj (car reclist))))))
  43.           ((pointatrec (vlax-curve-getClosestPointTo vlaobj (cadr reclist)) reclist)
  44.            (setq  polistok (append polistok (list (vlax-curve-getClosestPointTo vlaobj (cadr reclist))))))
  45.           ((pointatrec (vlax-curve-getClosestPointTo vlaobj (caddr reclist)) reclist)
  46.            (setq  polistok (append polistok (list (vlax-curve-getClosestPointTo vlaobj (caddr reclist))))))
  47.           ((pointatrec (vlax-curve-getClosestPointTo vlaobj (cadddr reclist)) reclist)
  48.            (setq  polistok (append polistok (list (vlax-curve-getClosestPointTo vlaobj (cadddr reclist))))))
  49.            (T nil)
  50.           )
  51.     (if (zerop (length polistok))
  52.       nil
  53.       (append (list ent) polistok)
  54.       )
  55.     )





  56. (princ "\n智能TRIM由luoyaya编制,欢迎访问luoyaya.nease.net\n")
  57.     (princ "\n请用C交叉窗口方式选择对象!")
  58.   (if (setq ss (ssget (getunlocklayer)))
  59.     (progn
  60.   (setq ssx (ssnamex ss ));SSX格式为 ((选择方式ID 图元名 0 多边形选择区ID)
  61.   (setq i (1- (length ssx))) ;        (多边形选择区ID ( 0 点坐标)))
  62.   (setq entlist (list))
  63.   (setq pointlist (list))
  64.   ;(setq ts (getvar "cdate"))
  65.   (while (> i -1)
  66.     (cond
  67.       ((= (car (nth i ssx)) 3)
  68.                           ;                         取SSX中的图元名   取得多边形区ID
  69.        (setq entlist (append  entlist (list (list (last (nth i ssx)) (nth 1 (nth i ssx)))))))
  70.       ((< (car (nth i ssx)) 0)
  71.          (setq pointlist (append pointlist (list (list
  72.                                                    (car (nth i ssx))
  73.                                                    (trans (cadr (cadr (nth i ssx))) 1 0)
  74.                                                    (trans (cadr (caddr (nth i ssx))) 1 0)
  75.                                                    (trans (cadr (cadddr (nth i ssx))) 1 0)
  76.                                                    (trans (cadr (last (nth i ssx))) 1 0)
  77.                                                    )
  78.                                                  )
  79.                                  )
  80.                )
  81.        )
  82.       (T nil)
  83.       )
  84.     (setq i (1- i))
  85.     )
  86.   (if (zerop (length entlist))
  87.     (princ "\n请用C交叉窗口方式选择对象!")
  88.     (progn
  89.       (setq i (1- (length entlist)))
  90.       (setq entpointlist nil)
  91.       (while (> i -1)
  92.         (if (setq getpo (getentpointlist (cadr (nth i entlist)) (cdr (assoc (car (nth i entlist)) pointlist))))
  93.         (setq entpointlist (append
  94.                              entpointlist
  95.                              (list
  96.                                getpo
  97.                                )
  98.                              )
  99.               );生成一个(被选中的对象中的端点   对象图元名)的表
  100.           )
  101.         (setq i (1- i))
  102.         );第一步完成
  103. ;(setq te (getvar "cdate") tt (* 1000000 (- te ts)))
  104. ;(princ (strcat "\n第一步完成了.共耗时"(rtos tt 2 4) "秒..."))



  105. (setq entlen (1- (length entpointlist)))
  106.       (setq ssa (ssadd))
  107.       (setq objtype '((-4 . "<OR") (0 . "LINE") (0 . "CIRCLE") (0 . "ellipse") (0 . "ARC") (0 . "SPLINE") (0 . "LWPOLYLINE") (-4 . "OR>")))
  108.    (while (> entlen -1)
  109.      (vla-getboundingbox
  110.        (vlax-ename->vla-object (car (nth entlen entpointlist)))       'minp       'maxp
  111.      )
  112.      (if (= cadver 15)
  113.        (setq minp        (vlax-safearray->list minp)
  114.            maxp        (vlax-safearray->list maxp)
  115.      ))   ;for 200X
  116.      (if (setq sstemp (ssget "c" minp maxp  objtype  ))
  117.       (progn
  118.         (setq i (1- (sslength sstemp)))
  119.        (while (> i -1)
  120.        (setq ssa (ssadd (ssname sstemp i ) ssa ))
  121.        (setq i (1- i))
  122.        )
  123.         )
  124.                       )
  125.      (setq entlen (1- entlen))
  126.    )




  127.      
  128.        
  129. ;(setq te (getvar "cdate") tt (* 1000000 (- te ts)))
  130. ;(princ (strcat "\n第二步完成了.共耗时"(rtos tt 2 4) "秒..."))


  131.       
  132.       ;开始选择TRIM的对象
  133.        ;(setq ssa (ssget "c" (list minx miny) (list maxx maxy)   '((-4 . "<OR") (0 . "LINE") (0 . "CIRCLE") (0 . "ellipse") (0 . "ARC") (0 . "SPLINE") (0 . "LWPOLYLINE") (-4 . "OR>")) ))
  134.         
  135.         (setq sslen (1- (sslength ss)))
  136.       (while (> sslen -1)
  137.         (if (setq sstemp (ssdel (ssname  ss sslen) ssa))
  138.           (setq ssa sstemp)
  139.           )
  140.         (setq sslen (1- sslen))
  141.         )
  142.         (if (not (zerop  (sslength ssa)))
  143.           (progn

  144.       
  145. ;判断SSA中对象和ENTPOINTLIST中对象是否有交点
  146.      (setq sslen (1- (sslength ssa))
  147.             entlen (1- (length entpointlist))
  148.             entlent entlen
  149.             sstemp ssa
  150.             ssa (ssadd))
  151.      (if (= cadver 15)
  152.                 (progn
  153.       (while (> sslen -1)
  154.         (while (> entlen -1)
  155.         (if (not (vl-catch-all-error-p
  156.               (vl-catch-all-apply 'vlax-safearray->list
  157.                 (list (vlax-variant-value (vla-IntersectWith
  158.                                             (vlax-ename->vla-object (ssname sstemp sslen))
  159.                                             (vlax-ename->vla-object (car (nth entlen entpointlist)))
  160.                                             0
  161.                                             )
  162.                         )
  163.                       )
  164.                 )
  165.               ))
  166.           (setq ssa (ssadd (ssname sstemp sslen) ssa)
  167.                 ;sslen (1- sslen)
  168.                 entlen -1)
  169.           )
  170.           
  171.           ;(setq ssa (ssdel (ssname ssa sslen) ssa)
  172.         ;        sslen (1- sslen)
  173.         ;        entlen entlent)
  174.           
  175.           ;(if (< sslen 0)(setq entlen -2))
  176.           (setq entlen (1- entlen))
  177.           )
  178.         (setq sslen (1- sslen)
  179.               entlen entlent)
  180.         ))
  181.        (progn
  182.       (while (> sslen -1)
  183.         (while (> entlen -1)
  184.         (if (vla-IntersectWith    (vlax-ename->vla-object (ssname sstemp sslen))
  185.                                   (vlax-ename->vla-object (car (nth entlen entpointlist)))
  186.                                             0
  187.                                             )             
  188.           (setq ssa (ssadd (ssname sstemp sslen) ssa)
  189.                 ;sslen (1- sslen)
  190.                 entlen -1)
  191.           )
  192.           
  193.           ;(setq ssa (ssdel (ssname ssa sslen) ssa)
  194.         ;        sslen (1- sslen)
  195.         ;        entlen entlent)
  196.           
  197.           ;(if (< sslen 0)(setq entlen -2))
  198.           (setq entlen (1- entlen))
  199.           )
  200.         (setq sslen (1- sslen)
  201.               entlen entlent)
  202.         ))
  203.        )


  204.     ;  (setq te (getvar "cdate") tt (* 1000000 (- te ts)))
  205. ;(princ (strcat "\n第三步完成了.共耗时"(rtos tt 2 4) "秒..."))


  206.       
  207.       (setq sslen (1- (sslength ssa)));取得SS个数
  208.       (if (> sslen 500)
  209.         (progn
  210.           (if (member (getstring (strcat "自动选择的对象有"
  211.                                          (vl-princ-to-string sslen)
  212.                                          "个,是否自己选择?y/n[y]"
  213.                                  )
  214.                       )
  215.                       '("n" "N")
  216.               )
  217.             (progn
  218.               (setq distentlist
  219.                      (list)
  220.                     distlist (list)
  221.               )
  222.               (while (> sslen -1)
  223.                 (setq listlen (1- (length entpointlist)))
  224.                 (setq dist -1)
  225.                 (while (> listlen -1)
  226.                   (if (= dist -1)
  227.                     (setq dist 0)
  228.                   )
  229.                   (setq        dist
  230.                          (+ (distance
  231.                               (vlax-curve-getClosestPointTo
  232.                                 (vlax-ename->vla-object (ssname ssa sslen))
  233.                                 (cadr (nth listlen entpointlist))
  234.                               )
  235.                               (cadr (nth listlen entpointlist))
  236.                             )                ;取得ENTPOINTLIST中点与SSa中线的距离
  237.                             dist
  238.                          )
  239.                   )


  240.                   (setq listlen (1- listlen))
  241.                 )
  242.                 (if (/= dist -1)
  243.                   (setq        distentlist (append
  244.                                       distentlist
  245.                                       (list (list dist (ssname ssa sslen)))
  246.                                     )
  247.                         distlist    (append distlist (list dist))
  248.                   )
  249.                 )
  250.                 (setq sslen (1- sslen))
  251.               )

  252.               (setq trimobj
  253.                      (cadr (assoc (apply 'min distlist) distentlist))
  254.                     ;trimobjcopy trimobj
  255.               )                        ;查找最近的线


  256.               (redraw trimobj 3)        ;亮显最近的线
  257.               (princ "\n如果不是这条剪切边请选择,如果是请回车:")

  258.               (setq trss (ssget))
  259.               (redraw trimobj 4)        ;不亮显最近的线
  260.               (if (not trss)
  261.                 (setq trss trimobj)
  262.               )
  263.             )
  264.             (progn
  265.               (princ "\n请选择剪切边:")
  266.               (setq trss (ssget))
  267.             )
  268.           )



  269.         )
  270.         (progn
  271.           (setq        distentlist
  272.                  (list)
  273.                 distlist (list)
  274.           )
  275.           (while (> sslen -1)
  276.             (setq listlen (1- (length entpointlist)))
  277.             (setq dist -1)
  278.             (while (> listlen -1)
  279. ;;;;```因entpointlist第一项为nil所以>0
  280.               (if (= dist -1)
  281.                 (setq dist 0)
  282.               )
  283.               (setq dist
  284.                      (+        (distance
  285.                           (vlax-curve-getClosestPointTo
  286.                             (vlax-ename->vla-object (ssname ssa sslen))
  287.                             (cadr (nth listlen entpointlist))
  288.                           )
  289.                           (cadr (nth listlen entpointlist))
  290.                         )                ;取得ENTPOINTLIST中点与SSa中线的距离
  291.                         dist
  292.                      )
  293.               )


  294.               (setq listlen (1- listlen))
  295.             )
  296.             (if        (/= dist -1)
  297.               (setq distentlist        (append        distentlist
  298.                                         (list (list dist (ssname ssa sslen)))
  299.                                 )
  300.                     distlist        (append distlist (list dist))
  301.               )
  302.             )
  303.             (setq sslen (1- sslen))
  304.           )
  305.           (setq
  306.             trimobj (cadr (assoc (apply 'min distlist) distentlist))
  307.           )                                ;查找最近的线



  308.           (if trimobj
  309.             (progn
  310.           (redraw trimobj 3)                ;亮显最近的线
  311.           (princ "\n如果不是这条剪切边请选择,如果是请回车:")

  312.           (setq trss (ssget))
  313.           (redraw trimobj 4)                ;不亮显最近的线
  314.           (if (not trss)
  315.             (setq trss trimobj)
  316.           )
  317.           )
  318.             (progn
  319.             (princ "\n找不到剪切边,请选择:")
  320.         (setq trss (ssget))
  321.             ))
  322.         )
  323.       )


  324. )


  325.        
  326.           
  327.         (progn
  328.         (princ "\n找不到剪切边,请选择:")
  329.         (setq trss (ssget))
  330.         ))
  331.       (if (not trss)
  332.         (princ "\n未选择剪切边,不剪切!")
  333.         (progn
  334.       (command "_.trim" trss "")
  335.       (setq sslen (1- (length entpointlist)))
  336.       (while (> sslen -1)
  337.         (command (nth sslen entpointlist))
  338.         (setq sslen (1- sslen))
  339.       )
  340.       (command)
  341.       ))
  342.       )
  343.   )
  344.   )
  345.     (princ "\n未选择被剪切边!"))
  346.   (princ)
  347.   )
 楼主| 发表于 2003-12-27 17:11:00 | 显示全部楼层
用法见图
 楼主| 发表于 2003-12-27 17:11:00 | 显示全部楼层
用法见图

本帖子中包含更多资源

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

x
 楼主| 发表于 2003-12-28 11:50:00 | 显示全部楼层
没人理,惨
发表于 2003-12-28 15:03:00 | 显示全部楼层
用不着这么麻烦写这个!AutoCAD本身就有这个功能!在你先择要修剪物体的时候,打F就可以选择多个物体一起修剪。试试。
 楼主| 发表于 2003-12-29 14:20:00 | 显示全部楼层
不一样的啊,我这个不用F选用C选,然后是自动选线
发表于 2003-12-30 16:52:00 | 显示全部楼层
再說詳細有甚麼功能好嗎?
(最好能說說思路__看不出為甚麼程序要那麼長!)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 12:51 , Processed in 0.199390 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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