乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 97|回复: 6

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

[复制链接]

8

主题

35

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
67
发表于 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  "")))
  19.   )
  20. (setq trss nil)(defun c:tr ( /  ss ssx i entlist pointlist entpointlist getpo minx miny maxx maxy entlen
  21. objtype minp maxp sstemp sslen entlent distentlist distlist listlen dist
  22. trimobj trss
  23. )
  24.   (defun pointatrec ( point rec / minx miny maxx maxy   )
  25.     (setq minx (min (car (car rec)) (car (cadr rec)) (car (caddr rec)) (car (caddr rec))))
  26.     (setq maxx (max (car (car rec)) (car (cadr rec)) (car (caddr rec)) (car (caddr rec))))
  27.     (setq miny (min (cadr (car rec)) (cadr (cadr rec)) (cadr (caddr rec)) (cadr (caddr rec))))
  28.     (setq maxy (max (cadr (car rec)) (cadr (cadr rec)) (cadr (caddr rec)) (cadr (caddr rec))))
  29.     (if (and (>= (car point) minx) (= (cadr point) miny) (vla-object ent))
  30.     (cond
  31.           ((pointatrec (vlax-curve-getClosestPointTo vlaobj (car reclist)) reclist)
  32.            (setq  polistok (append polistok (list (vlax-curve-getClosestPointTo vlaobj (car reclist))))))
  33.           ((pointatrec (vlax-curve-getClosestPointTo vlaobj (cadr reclist)) reclist)
  34.            (setq  polistok (append polistok (list (vlax-curve-getClosestPointTo vlaobj (cadr reclist))))))
  35.           ((pointatrec (vlax-curve-getClosestPointTo vlaobj (caddr reclist)) reclist)
  36.            (setq  polistok (append polistok (list (vlax-curve-getClosestPointTo vlaobj (caddr reclist))))))
  37.           ((pointatrec (vlax-curve-getClosestPointTo vlaobj (cadddr reclist)) reclist)
  38.            (setq  polistok (append polistok (list (vlax-curve-getClosestPointTo vlaobj (cadddr reclist))))))
  39.            (T nil)
  40.           )
  41.     (if (zerop (length polistok))
  42.       nil
  43.       (append (list ent) polistok)
  44.       )
  45.     )
  46. (princ "\n智能TRIM由luoyaya编制,欢迎访问luoyaya.nease.net\n")
  47.     (princ "\n请用C交叉窗口方式选择对象!")
  48.   (if (setq ss (ssget (getunlocklayer)))
  49.     (progn
  50.   (setq ssx (ssnamex ss ));SSX格式为 ((选择方式ID 图元名 0 多边形选择区ID)
  51.   (setq i (1- (length ssx))) ;        (多边形选择区ID ( 0 点坐标)))
  52.   (setq entlist (list))
  53.   (setq pointlist (list))
  54.   ;(setq ts (getvar "cdate"))
  55.   (while (> i -1)
  56.     (cond
  57.       ((= (car (nth i ssx)) 3)
  58.                           ;                         取SSX中的图元名   取得多边形区ID
  59.        (setq entlist (append  entlist (list (list (last (nth i ssx)) (nth 1 (nth i ssx)))))))
  60.       (( i -1)
  61.         (if (setq getpo (getentpointlist (cadr (nth i entlist)) (cdr (assoc (car (nth i entlist)) pointlist))))
  62.         (setq entpointlist (append
  63.                              entpointlist
  64.                              (list
  65.                                getpo
  66.                                )
  67.                              )
  68.               );生成一个(被选中的对象中的端点   对象图元名)的表
  69.           )
  70.         (setq i (1- i))
  71.         );第一步完成
  72. ;(setq te (getvar "cdate") tt (* 1000000 (- te ts)))
  73. ;(princ (strcat "\n第一步完成了.共耗时"(rtos tt 2 4) "秒..."))(setq entlen (1- (length entpointlist)))
  74.       (setq ssa (ssadd))
  75.       (setq objtype '((-4 . "")))
  76.    (while (> entlen -1)
  77.      (vla-getboundingbox
  78.        (vlax-ename->vla-object (car (nth entlen entpointlist)))       'minp       'maxp
  79.      )
  80.      (if (= cadver 15)
  81.        (setq minp        (vlax-safearray->list minp)
  82.            maxp        (vlax-safearray->list maxp)
  83.      ))   ;for 200X
  84.      (if (setq sstemp (ssget "c" minp maxp  objtype  ))
  85.       (progn
  86.         (setq i (1- (sslength sstemp)))
  87.        (while (> i -1)
  88.        (setq ssa (ssadd (ssname sstemp i ) ssa ))
  89.        (setq i (1- i))
  90.        )
  91.         )
  92.                       )
  93.      (setq entlen (1- entlen))
  94.    )
  95.      
  96.         
  97. ;(setq te (getvar "cdate") tt (* 1000000 (- te ts)))
  98. ;(princ (strcat "\n第二步完成了.共耗时"(rtos tt 2 4) "秒..."))
  99.       
  100.       ;开始选择TRIM的对象
  101.        ;(setq ssa (ssget "c" (list minx miny) (list maxx maxy)   '((-4 . "")) ))
  102.         
  103.         (setq sslen (1- (sslength ss)))
  104.       (while (> sslen -1)
  105.         (if (setq sstemp (ssdel (ssname  ss sslen) ssa))
  106.           (setq ssa sstemp)
  107.           )
  108.         (setq sslen (1- sslen))
  109.         )
  110.         (if (not (zerop  (sslength ssa)))
  111.           (progn
  112.       
  113. ;判断SSA中对象和ENTPOINTLIST中对象是否有交点
  114.      (setq sslen (1- (sslength ssa))
  115.             entlen (1- (length entpointlist))
  116.             entlent entlen
  117.             sstemp ssa
  118.             ssa (ssadd))
  119.      (if (= cadver 15)
  120.                 (progn
  121.       (while (> sslen -1)
  122.         (while (> entlen -1)
  123.         (if (not (vl-catch-all-error-p
  124.               (vl-catch-all-apply 'vlax-safearray->list
  125.                 (list (vlax-variant-value (vla-IntersectWith
  126.                                             (vlax-ename->vla-object (ssname sstemp sslen))
  127.                                             (vlax-ename->vla-object (car (nth entlen entpointlist)))
  128.                                             0
  129.                                             )
  130.                         )
  131.                       )
  132.                 )
  133.               ))
  134.           (setq ssa (ssadd (ssname sstemp sslen) ssa)
  135.                 ;sslen (1- sslen)
  136.                 entlen -1)
  137.           )
  138.          
  139.           ;(setq ssa (ssdel (ssname ssa sslen) ssa)
  140.         ;        sslen (1- sslen)
  141.         ;        entlen entlent)
  142.          
  143.           ;(if ( sslen -1)
  144.         (while (> entlen -1)
  145.         (if (vla-IntersectWith    (vlax-ename->vla-object (ssname sstemp sslen))
  146.                                   (vlax-ename->vla-object (car (nth entlen entpointlist)))
  147.                                             0
  148.                                             )              
  149.           (setq ssa (ssadd (ssname sstemp sslen) ssa)
  150.                 ;sslen (1- sslen)
  151.                 entlen -1)
  152.           )
  153.          
  154.           ;(setq ssa (ssdel (ssname ssa sslen) ssa)
  155.         ;        sslen (1- sslen)
  156.         ;        entlen entlent)
  157.          
  158.           ;(if ( sslen 500)
  159.         (progn
  160.           (if (member (getstring (strcat "自动选择的对象有"
  161.                                          (vl-princ-to-string sslen)
  162.                                          "个,是否自己选择?y/n[y]"
  163.                                  )
  164.                       )
  165.                       '("n" "N")
  166.               )
  167.             (progn
  168.               (setq distentlist
  169.                      (list)
  170.                     distlist (list)
  171.               )
  172.               (while (> sslen -1)
  173.                 (setq listlen (1- (length entpointlist)))
  174.                 (setq dist -1)
  175.                 (while (> listlen -1)
  176.                   (if (= dist -1)
  177.                     (setq dist 0)
  178.                   )
  179.                   (setq        dist
  180.                          (+ (distance
  181.                               (vlax-curve-getClosestPointTo
  182.                                 (vlax-ename->vla-object (ssname ssa sslen))
  183.                                 (cadr (nth listlen entpointlist))
  184.                               )
  185.                               (cadr (nth listlen entpointlist))
  186.                             )                ;取得ENTPOINTLIST中点与SSa中线的距离
  187.                             dist
  188.                          )
  189.                   )
  190.                   (setq listlen (1- listlen))
  191.                 )
  192.                 (if (/= dist -1)
  193.                   (setq        distentlist (append
  194.                                       distentlist
  195.                                       (list (list dist (ssname ssa sslen)))
  196.                                     )
  197.                         distlist    (append distlist (list dist))
  198.                   )
  199.                 )
  200.                 (setq sslen (1- sslen))
  201.               )
  202.               (setq trimobj
  203.                      (cadr (assoc (apply 'min distlist) distentlist))
  204.                     ;trimobjcopy trimobj
  205.               )                        ;查找最近的线
  206.               (redraw trimobj 3)        ;亮显最近的线
  207.               (princ "\n如果不是这条剪切边请选择,如果是请回车:")
  208.               (setq trss (ssget))
  209.               (redraw trimobj 4)        ;不亮显最近的线
  210.               (if (not trss)
  211.                 (setq trss trimobj)
  212.               )
  213.             )
  214.             (progn
  215.               (princ "\n请选择剪切边:")
  216.               (setq trss (ssget))
  217.             )
  218.           )        )
  219.         (progn
  220.           (setq        distentlist
  221.                  (list)
  222.                 distlist (list)
  223.           )
  224.           (while (> sslen -1)
  225.             (setq listlen (1- (length entpointlist)))
  226.             (setq dist -1)
  227.             (while (> listlen -1)
  228. ;;;;```因entpointlist第一项为nil所以>0
  229.               (if (= dist -1)
  230.                 (setq dist 0)
  231.               )
  232.               (setq dist
  233.                      (+        (distance
  234.                           (vlax-curve-getClosestPointTo
  235.                             (vlax-ename->vla-object (ssname ssa sslen))
  236.                             (cadr (nth listlen entpointlist))
  237.                           )
  238.                           (cadr (nth listlen entpointlist))
  239.                         )                ;取得ENTPOINTLIST中点与SSa中线的距离
  240.                         dist
  241.                      )
  242.               )
  243.               (setq listlen (1- listlen))
  244.             )
  245.             (if        (/= dist -1)
  246.               (setq distentlist        (append        distentlist
  247.                                         (list (list dist (ssname ssa sslen)))
  248.                                 )
  249.                     distlist        (append distlist (list dist))
  250.               )
  251.             )
  252.             (setq sslen (1- sslen))
  253.           )
  254.           (setq
  255.             trimobj (cadr (assoc (apply 'min distlist) distentlist))
  256.           )                                ;查找最近的线          (if trimobj
  257.             (progn
  258.           (redraw trimobj 3)                ;亮显最近的线
  259.           (princ "\n如果不是这条剪切边请选择,如果是请回车:")
  260.           (setq trss (ssget))
  261.           (redraw trimobj 4)                ;不亮显最近的线
  262.           (if (not trss)
  263.             (setq trss trimobj)
  264.           )
  265.           )
  266.             (progn
  267.             (princ "\n找不到剪切边,请选择:")
  268.         (setq trss (ssget))
  269.             ))
  270.         )
  271.       )
  272. )
  273.         
  274.          
  275.         (progn
  276.         (princ "\n找不到剪切边,请选择:")
  277.         (setq trss (ssget))
  278.         ))
  279.       (if (not trss)
  280.         (princ "\n未选择剪切边,不剪切!")
  281.         (progn
  282.       (command "_.trim" trss "")
  283.       (setq sslen (1- (length entpointlist)))
  284.       (while (> sslen -1)
  285.         (command (nth sslen entpointlist))
  286.         (setq sslen (1- sslen))
  287.       )
  288.       (command)
  289.       ))
  290.       )
  291.   )
  292.   )
  293.     (princ "\n未选择被剪切边!"))
  294.   (princ)
  295.   )
回复

使用道具 举报

8

主题

35

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
67
发表于 2003-12-27 17:11:00 | 显示全部楼层
用法见图
回复

使用道具 举报

8

主题

35

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
67
发表于 2003-12-27 17:11:00 | 显示全部楼层
用法见图

5nvy3fm3swu.jpg

5nvy3fm3swu.jpg

回复

使用道具 举报

8

主题

35

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
67
发表于 2003-12-28 11:50:00 | 显示全部楼层
没人理,惨
回复

使用道具 举报

21

主题

86

帖子

8

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2003-12-28 15:03:00 | 显示全部楼层
用不着这么麻烦写这个!AutoCAD本身就有这个功能!在你先择要修剪物体的时候,打F就可以选择多个物体一起修剪。试试。
回复

使用道具 举报

8

主题

35

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
67
发表于 2003-12-29 14:20:00 | 显示全部楼层
不一样的啊,我这个不用F选用C选,然后是自动选线
回复

使用道具 举报

29

主题

1152

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1268
发表于 2003-12-30 16:52:00 | 显示全部楼层
再說詳細有甚麼功能好嗎?
(最好能說說思路__看不出為甚麼程序要那麼長!)
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-8 00:43 , Processed in 1.231750 second(s), 69 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表