乐筑天下

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

[编程交流] 删除边界外的对象

[复制链接]

21

主题

80

帖子

59

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-6 06:40:54 | 显示全部楼层 |阅读模式
大家好。
我需要一个例程,可以删除aotucad绘图中闭合多段线或边界(基于我的选择点输入或输出)内外的所有对象。
有什么解决办法吗?
谢谢
回复

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-6 06:46:40 | 显示全部楼层
这里有一个在闭合多段线内松弛的例程。
 
http://cadtips.cadalyst.com/polylines/erase-inside-a-closed-pline
回复

使用道具 举报

21

主题

80

帖子

59

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-6 06:49:41 | 显示全部楼层
谢谢你的评论。
我以前测试过。但它总是显示出这样的错误:
“多段线未闭合。。。
未选择任何内容。。。
选择对象:“
我不明白这个错误的原因。因为我自己画了一个闭合的折线。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 06:53:24 | 显示全部楼层
这里有一个关于内部的快速示例:
 
  1. (defun c:pDel (/ GroupByNum _GetLocked lst->str ENT I LK OBJ PTLST SS)
  2. (vl-load-com)
  3. ;; Lee Mac  ~  02.04.10
  4. (defun GroupByNum (lst num / rtn)
  5.    (setq rtn nil)
  6.    
  7.    (if lst
  8.      (cons (reverse
  9.              (repeat num
  10.                (progn
  11.                  (setq rtn (cons (car lst) rtn)
  12.                        lst (cdr lst))
  13.                  rtn)))
  14.            (GroupByNum lst num))))
  15. (defun _GetLocked (/ tdef lk)
  16.    (while (setq tdef (tblnext "LAYER" (not tdef)))
  17.      (if (= 4 (logand 4 (cdr (assoc 70 tdef))))
  18.        (setq lk (cons (cdr (assoc 2 tdef)) lk)))))
  19. (defun lst->str (lst del / str)
  20.    (setq str (car lst))
  21.    (while (setq lst (cdr lst)) (setq str (strcat str del (car lst))))
  22. str)  
  23. (while
  24.    (progn
  25.      (setq ent (car (entsel "\nSelect Polyline: ")))
  26.      (cond (  (eq 'ENAME (type ent))
  27.               (if (wcmatch (cdr (assoc 0 (entget ent))) "*POLYLINE")
  28.                 (progn
  29.                   (setq ptLst
  30.                     (GroupByNum
  31.                       (vlax-get
  32.                         (setq obj (vlax-ename->vla-object ent)) 'Coordinates)
  33.                       (if (eq "AcDbPolyline" (vla-get-ObjectName obj)) 2 3)))
  34.                   (if (cadr
  35.                         (sssetfirst nil
  36.                           (setq i -1 ss
  37.                             (ssget "_WP" ptLst
  38.                                    (if (setq lk (_GetLocked))
  39.                                      (list (cons -4 "<NOT")
  40.                                            (cons 8 (lst->str lk ",")) (cons -4 "NOT>")))))))
  41.                     (if (progn
  42.                           (initget "Yes No")
  43.                           (not (eq "No" (getkword "\nDelete Objects? [Yes/No] <Yes> : "))))
  44.                       (while (setq ent (ssname ss (setq i (1+ i))))
  45.                         (entdel ent))
  46.                       (sssetfirst nil nil))
  47.                     (princ "\n** No Objects Found **")))
  48.                 (princ "\n** Object Must be a Polyline **"))))))
  49. (princ))
回复

使用道具 举报

4

主题

940

帖子

961

银币

初来乍到

Rank: 1

铜币
12
发表于 2022-7-6 06:55:20 | 显示全部楼层
试试这个,一个快速、无错误的控制
我试了几次就成功了
  1. ;;; Erase in or out of polyline  LPS 2010-04-02
  2. (defun c:test (/ idx obj endparam cnt pnt ss1)
  3. (vl-load-com)
  4. (setq ptlst nil)
  5. (setq ss1 nil)
  6. (setq obj (vlax-ename->vla-object (car (setq pl (entsel "\nSelect polyline boundary: ")))))
  7. (if (or; test if polyline and has area
  8.    (/= (vlax-get-property obj 'ObjectName) "AcDbPolyline")
  9.    (zerop (vlax-get-property obj 'Area))
  10.    )
  11.    (princ "\nSelected entity is not a polyline or can not be used for a section window")
  12.    )
  13. (setq p1 (getpoint "Pick side to erase: ")
  14.    pnt (entmakex
  15.        (list (cons 0 "point")
  16.           (cons 10 p1))
  17.         )
  18.    )
  19.          
  20. (setq ptlst (list (vlax-curve-getStartPoint obj))   
  21.    idx 1)
  22. (if (zerop (vlax-get obj 'Closed))
  23.        (setq endparam (vlax-curve-getParamAtPoint obj (vlax-curve-getEndPoint obj)));if open param at end point
  24.    (setq endparam (cdr (assoc 90 (entget (vlax-vla-object->ename obj)))));if closed # vertices
  25.    )
  26.    
  27. (while
  28.    (<= idx endparam)
  29.      (if;test for curve -  thanks to Lee Mac and others
  30.    (not
  31.      (equal
  32.            (angle '(0 0 0)
  33.              (vlax-curve-getSecondDeriv obj (1- idx))) 0.0 1e-
  34.      );not
  35.    (progn
  36.      (setq cnt (1- idx))
  37.      (repeat 15;divide curve
  38.        (setq ptlst(cons (vlax-curve-getPointAtParam obj (+ cnt 0.0625)) ptlst)
  39.              cnt (+ 0.0625 cnt))
  40.        );repeat
  41.      );progn
  42.    );if
  43.   (setq ptlst (cons (vlax-curve-getPointAtParam obj idx) ptlst)
  44.     idx (1+ idx))
  45.   );while
  46. (setq ptlst (reverse ptlst))
  47. (setq ss1  (ssget "_WP" ptlst))
  48. (if
  49.    (ssmemb pnt ss1)
  50.      (vl-cmdf "erase" ss1 "")
  51.    (progn
  52.      (setq ss1  (ssget "_CP" ptlst))
  53.      (vl-cmdf "erase" "all" "r" ss1 pl ""))
  54.    )
  55.   (princ)
  56. );defun
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 06:58:03 | 显示全部楼层
我使用Autodesk Map中的MAPTRIM。
回复

使用道具 举报

KJB

3

主题

26

帖子

19

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 07:00:44 | 显示全部楼层
我非常感谢李、伊普赛弗和阿兰·杰特。
在测试了您在这个线程中发布的所有代码后,我发现了一些错误或无操作。
根据李的代码:
选择多段线:
**未找到任何对象**
根据ipseifert的代码:
选择多段线边界:
拾取要擦除的边:;错误:错误的参数类型:
LSETP零
根据alanjt的代码:
按“i”字表示内部,什么也没发生。
通过键入“o”表示外部,所有图元都会删除,但选定的lwpolyline除外。
如果我的画操作错误,请帮助我。
回复

使用道具 举报

21

主题

80

帖子

59

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-6 07:03:42 | 显示全部楼层
 
对我来说效果很好。对象是否接触选定的LW多段线?
你能举个例子吗?
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 07:08:21 | 显示全部楼层
是否在多段线边界外拾取了内部没有可选择实体的多段线边界?如果是这样的话,你真的不需要例行公事。
回复

使用道具 举报

4

主题

940

帖子

961

银币

初来乍到

Rank: 1

铜币
12
发表于 2022-7-6 07:11:13 | 显示全部楼层
这将擦除选定线内或接触选定线的对象。。。
 
  1. (defun c:EIO (/ _p2ss o ent ssIn ssOut)
  2. ;; Erase Inside/Outside of selected LWPolyline
  3. ;; Alan J. Thompson, 04.02.10
  4. (vl-load-com)
  5. (or *EIO:Opt* (setq *EIO:Opt* "Inside"))
  6. (setq _p2ss (lambda (ename)
  7.                (ssget "_WP"
  8.                       ((lambda (e / l)
  9.                          (foreach x e (and (eq 10 (car x)) (setq l (cons (cdr x) l))))
  10.                          (reverse l)
  11.                        ) ;_ lambda
  12.                         (entget ename)
  13.                       )
  14.                ) ;_ ssget
  15.              ) ;_ lambda
  16. ) ;_ setq
  17. (and (setq o (car (entsel "\nSelect LWPolyline: ")))
  18.       (or (eq "LWPOLYLINE" (cdr (assoc 0 (setq ent (entget o)))))
  19.           (alert "Invalid object!")
  20.       ) ;_ or
  21.       (not (initget 0 "Inside Outside"))
  22.       (setq *EIO:Opt*
  23.              (cond
  24.                ((getkword (strcat "\nSpecify erase option [inside/Outside] <" *EIO:Opt* ">: ")))
  25.                (*EIO:Opt*)
  26.              ) ;_ cond
  27.       ) ;_ setq
  28.       (cond
  29.         ((and (eq *EIO:Opt* "Inside") (setq ssIn (_p2ss o)))
  30.          ((lambda (i)
  31.             (while (setq e (ssname ssIn (setq i (1+ i))))
  32.               (or (eq o e) (vl-catch-all-apply (function entdel) (list e)))
  33.             ) ;_ while
  34.           ) ;_ lambda
  35.            -1
  36.          )
  37.         )
  38.         ((eq *EIO:Opt* "Outside")
  39.          (setq ssIn  (_p2ss o)
  40.                ssOut (ssget "_X" (list (cons 410 (getvar 'ctab))))
  41.          ) ;_ setq
  42.          ((lambda (i)
  43.             (while (setq e (ssname ssOut (setq i (1+ i))))
  44.               (if ssIn
  45.                 (or (ssmemb e ssIn) (eq o e) (vl-catch-all-apply (function entdel) (list e)))
  46.                 (or (eq o e) (vl-catch-all-apply (function entdel) (list e)))
  47.               ) ;_ if
  48.             ) ;_ while
  49.           ) ;_ lambda
  50.            -1
  51.          )
  52.         )
  53.       ) ;_ cond
  54. ) ;_ and
  55. (princ)
  56. ) ;_ defun
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 14:59 , Processed in 0.921007 second(s), 72 queries .

© 2020-2025 乐筑天下

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