乐筑天下

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

[编程交流] 检查多段线是否具有duplic

[复制链接]

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:51:57 | 显示全部楼层
 
运行lisp后,多边形变为另一个形状。我认为这和VVA说的一样,很难确定需要保留哪一点。
LWPOLYLINE空间:模型空间
手柄=2cab
关闭
恒定宽度0.00
面积14153723.23
周长21581.35
 
点X=-9771.00 Y=-7388.00 Z=0.00
点X=-9771.00 Y=-7388.00 Z=0.00
点X=-8116.00 Y=-9826.00 Z=0.00
点X=-9771.00 Y=-7388.00 Z=0.00
点X=-13222.00 Y=-11647.00 Z=0.00
点X=-10528.48 Y=-13202.10 Z=0.00
点X=-8116.00 Y=-9826.00 Z=0.00
 
 
 
LW多段线
空间:模型空间
颜色:9线型:“BYLAYER”
手柄=2da0
关闭
恒定宽度0.00
面积6952768.87
周长17341.12
 
点X=-9771.00 Y=-7388.00 Z=0.00
点X=-8116.00 Y=-9826.00 Z=0.00
点X=-13222.00 Y=-11647.00 Z=0.00
点X=-10528.48 Y=-13202.10 Z=0.00
 
让我详细解释一下我的情况。虽然这是一条闭合的多段线,但一条线段内部有两条重叠的直线。有一些重复点显示重叠位置。我想使用lisp检查多段线,如果发现任何重复的线,它会自动删除它。如果难以确定需要保留哪些直线/点,是否可以显示哪些多段线仅具有此重叠。
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:55:52 | 显示全部楼层
这将选择具有重复点的所有LWD多段线:
 
  1. (defun c:test ( / LM:UniqueFuzz LM:MAssoc ss i e ) (vl-load-com)
  2. ;; © Lee Mac 2011
  3. (defun LM:UniqueFuzz-p ( lst fuzz )
  4.    (or (null lst)
  5.      (and (not (vl-member-if '(lambda ( x ) (equal x (car lst) fuzz)) (cdr lst)))
  6.        (LM:UniqueFuzz-p (cdr lst) fuzz)
  7.      )
  8.    )
  9. )
  10. (defun LM:MAssoc ( key lst / pair )
  11.    (if (setq pair (assoc key lst))
  12.      (cons (cdr pair) (LM:MAssoc key (cdr (member pair lst))))
  13.    )
  14. )
  15. (if (setq ss (ssget "_X" '((0 . "LWPOLYLINE"))))
  16.    (repeat (setq i (sslength ss))
  17.      (if (LM:UniqueFuzz-p (LM:MAssoc 10 (entget (setq e (ssname ss (setq i (1- i)))))) 1e-
  18.        (ssdel e ss)
  19.      )
  20.    )
  21. )
  22. (sssetfirst nil ss)
  23. (princ)
  24. )
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-6 09:57:48 | 显示全部楼层
试试看
  1. (defun c:testVVA (/ UniqueLineFuzz  ss i el ss1 lst1)
  2. (vl-load-com)
  3. (defun UniqueLineFuzz (lst fuzz)
  4.    (if lst
  5.      (cons
  6.        (car lst)
  7.        (UniqueLineFuzz
  8.          (vl-remove-if
  9.            '(lambda (x)
  10.               (apply 'and
  11.                      (mapcar '(lambda (l1 l2 / sl1 el1 sl2 el2)
  12.                                 (setq
  13.                                   sl1 (mapcar '+
  14.                                               (vlax-curve-getstartpoint l1)
  15.                                               '(0 0)
  16.                                       ) ;_ end of mapcar
  17.                                   el1 (mapcar '+
  18.                                               (vlax-curve-getendpoint l1)
  19.                                               '(0 0)
  20.                                       ) ;_ end of mapcar
  21.                                   sl2 (mapcar '+
  22.                                               (vlax-curve-getstartpoint l2)
  23.                                               '(0 0)
  24.                                       ) ;_ end of mapcar
  25.                                   el2 (mapcar '+
  26.                                               (vlax-curve-getendpoint l2)
  27.                                               '(0 0)
  28.                                       ) ;_ end of mapcar
  29.                                 ) ;_ end of setq
  30.                                 (or
  31.                                   (and
  32.                                     (equal (car sl1) (car sl2) fuzz)
  33.                                     (equal (cadr sl1) (cadr sl2) fuzz)
  34.                                     (equal (car el1) (car el2) fuzz)
  35.                                     (equal (cadr el1) (cadr el2) fuzz)
  36.                                   ) ;_ end of and
  37.                                   (and
  38.                                     (equal (car sl1) (car el2) fuzz)
  39.                                     (equal (cadr sl1) (cadr el2) fuzz)
  40.                                     (equal (car el1) (car sl2) fuzz)
  41.                                     (equal (cadr el1) (cadr sl2) fuzz)
  42.                                   ) ;_ end of and
  43.                                 ) ;_ end of or
  44.                               ) ;_ end of lambda
  45.                              (list x)
  46.                              lst
  47.                      ) ;_ end of mapcar
  48.               ) ;_ end of apply
  49.             ) ;_ end of lambda
  50.            (cdr lst)
  51.          ) ;_ end of vl-remove-if
  52.          fuzz
  53.        ) ;_ end of LM:UniqueSegFuzz
  54.      ) ;_ end of cons
  55.    ) ;_ end of if
  56. ) ;_ end of defun
  57. (if (setq ss (ssget "_:L" '((0 . "LWPOLYLINE"))))
  58.    (repeat (setq i (sslength ss))
  59.      (setq el (ssname ss (setq i (1- i))))
  60.      (setq lst (vlax-safearray->list
  61.                  (vlax-variant-value
  62.                    (vla-explode (vlax-ename->vla-object el))
  63.                  ) ;_ end of vlax-variant-value
  64.                ) ;_ end of vlax-safearray->list
  65.            lst (vl-remove-if '(lambda (x)(equal (vlax-curve-getDistAtParam x(vlax-curve-getEndParam x)) 0.0 1e-6)) lst)
  66.      ) ;_ end of setq
  67.      (setq lst1
  68.             (mapcar 'vlax-vla-object->ename (UniqueLineFuzz lst 1e-6))
  69.      ) ;_ end of setq
  70.      (setq ss1 (ssadd (car lst1)))
  71.      (mapcar '(lambda (x) (ssadd x ss1)) (cdr lst1))
  72.      (if (and (getvar "PEDITACCEPT") (= (getvar "PEDITACCEPT") 1))
  73.        (vl-cmdf "_pedit" "_Multiple" ss1 "" "_Join" 0 "")
  74.        (vl-cmdf "_pedit" "_Multiple" ss1 "" "_Y" "_Join" 0 "")
  75.      ) ;_ end of if
  76.      (entdel el)
  77.      (mapcar '(lambda (x)
  78.                 (if (not (vlax-erased-p x))
  79.                   (vla-delete x)
  80.                 ) ;_ end of if
  81.               ) ;_ end of lambda
  82.              lst
  83.      ) ;_ end of mapcar
  84.    ) ;_ end of repeat
  85. ) ;_ end of if
  86. (princ)
  87. ) ;_ end of defun
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 10:01:58 | 显示全部楼层
 
谢谢你的代码李Mac!
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 10:02:59 | 显示全部楼层
 
非常感谢您的帮助VVA,这段代码正在运行!再次感谢VVA和李·麦克的友好协助。
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 10:06:25 | 显示全部楼层
 
我尝试在多段线上使用此lisp,程序返回以下错误消息:
ActiveX服务器返回错误:未知名称:长度
它只在网上工作吗?
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-6 10:10:06 | 显示全部楼层
正确#13(多么幸运)重试
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:12:56 | 显示全部楼层
VVA,只是好奇,为什么:
 
  1. (mapcar '+ < .. >  '(0 0))

 
显然,(0 0)不会以任何方式影响结果,因此您是否使用此方法来确保从mapcar返回的是2D点?
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 10:21:25 | 显示全部楼层
我相信李不会介意的:
它广泛使用递归。。。你会在lisp中找到很多东西。一、 e.以形成循环的方式调用自身的函数。这有时比使用正常的while/repeat/etc.循环更好/更容易/更有效。在上述情况下,这是其中之一。
 
还请注意Lee从最后一个实体开始逐步遍历列表-递减i(index)变量。这背后有两个原因:(1)它的效率略高于另一种方式;(2)因为他正在从选择集中删除元素,所以长度会发生变化-因此,如果删除#4,则旧的#5会成为新的#4,因此增加值我会跳过一些项目。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 02:55 , Processed in 0.619255 second(s), 79 queries .

© 2020-2025 乐筑天下

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