乐筑天下

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

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

[复制链接]

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:18:24 | 显示全部楼层 |阅读模式
请帮助解决这个问题,我需要检查多段线是否有重复点,如果发现重复数据,如何删除重复数据或重新绘制没有重复点的多段线?
LW多段线图层:“0”
空间:模型空间
手柄=2b61
关闭
恒定宽度0.00
面积64011440.00
周长39926.72
在点X=7416.00 Y=24813.00 Z=0.00处
在点X=13106.00 Y=22431.00 Z=0.00处
在点X=13549.00 Y=16850.00 Z=0.00处
在点X=9597.00 Y=15387.00 Z=0.00处
在点X=3395.00 Y=16919.00 Z=0.00处
在点X=5269.00 Y=21036.00 Z=0.00处
在点X=7416.00 Y=24813.00 Z=0.00处
在点X=5269.00 Y=21036.00 Z=0.00处
 
  1. (defun c:pp (/ ename vla_obj thelist)
  2. (setq mspace (vla-get-modelSpace (vla-get-activeDocument
  3.    (vlax-get-acad-object))))
  4.        (setq ename (car (entsel "\n select object:"))
  5.                vla_obj (vlax-ename->vla-object ename))
  6.                         (if (=(vlax-get-property vla_obj 'objectname) "acdbpolyline")
  7.                                (progn
  8.                                  (setq thelist (vlax-get-property vla_obj 'coordinates)
  9. …….
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-6 09:23:36 | 显示全部楼层
试试看
  1. (defun C:TEST ( / pl lst vertex_lst start_width_lst end_width_lst bulge_lst )
  2. (vl-load-com)
  3. (and
  4.    (setq pl (car(entsel "Select Polyline: ")))
  5.    (= (cdr(assoc 0 (entget pl))) "LWPOLYLINE")
  6.    (setq lst (pl:get-coors&width&bulge pl)
  7.       vertex_lst (nth 0 lst)
  8.       start_width_lst (nth 1  lst)
  9.       end_width_lst   (nth 2 lst)
  10.       bulge_lst (nth 3 lst)
  11.       )
  12.    (setq vertex_lst (mip_MakeUniqueMembersOfList vertex_lst))
  13.    (pl-set-coors&width&bulge pl vertex_lst  start_width_lst end_width_lst bulge_lst)
  14.   )
  15. )
  16. ;;;Функция возвращает список координат ширин и кривизн полилинии
  17. ;;; pl-ename or vla object
  18. ;;; Возвращается список ввиде 4 списков
  19. ;;; 1-й список координат (WCS)
  20. ;;; 2-й список начальная ширина
  21. ;;; 3-й список конечная ширина
  22. ;;; 4-й список кривизн
  23. (defun pl:get-coors&width&bulge ( pl / ent_data tmp_ent start_width end_width blglist coors)
  24. (setq pl (pl:conv-ent-to-ename PL))  
  25. (setq ent_data (entget pl))
  26. (if (= (cdr(assoc 0 ent_data))  "LWPOLYLINE")
  27.    (foreach lst ent_data
  28.      (setq num (car lst))
  29.      (cond
  30.        ((= num 10)(setq coors (cons (cdr lst) coors)))
  31.        ((= num 40)(setq start_width (cons (cdr lst) start_width)))
  32.        ((= num 41)(setq end_width (cons (cdr lst) end_width)))
  33.        ((= num 42)(setq blglist (cons (cdr lst) blglist)))
  34.        (t nil)
  35.        )
  36.      )
  37.    (progn
  38.      (setq tmp_ent pl)
  39.      (while (/= "SEQEND" (cdr(assoc 0 (setq ent_data (entget(setq tmp_ent (entnext tmp_ent)))))))
  40.       
  41.             (setq coors (cons (cdr (assoc 10 ent_data))  coors))
  42.             (setq start_width (cons (cdr (assoc 40 ent_data)) start_width))
  43.             (setq end_width (cons (cdr (assoc 41 ent_data)) end_width))
  44.             (setq blglist (cons (cdr (assoc 42 ent_data)) blglist))
  45.    );_while
  46.      )
  47.    )
  48. (list (reverse coors)
  49.        (reverse start_width)
  50.        (reverse end_width)
  51.        (reverse blglist)
  52.        )
  53. )
  54. (defun pl-set-coors&width&bulge ( pl coors start_width end_width blglist / ent_data tmp_lst i)
  55. (setq pl (pl:conv-ent-to-ename PL))  
  56. (setq ent_data (entget pl))
  57. (cond ((= (cdr(assoc 0 ent_data))  "LWPOLYLINE")
  58.              (setq ent_data (vl-remove-if
  59.                           '(lambda (x)(vl-position (car x) '(40 41 42 10))) ent_data))
  60.               (mapcar '(lambda (crs sw ew blg)
  61.                          (setq tmp_lst (vl-list*
  62.                                              (cons 42 blg)
  63.                                              (cons 41 ew)
  64.                                              (cons 40 sw)
  65.                                              (cons 10 (list (car crs)(cadr crs)))
  66.                                              tmp_lst
  67.                                              )
  68.                                        )
  69.                          )
  70.                                     coors start_width end_width blglist
  71.                       )
  72.         
  73.              (setq ent_data (append ent_data (reverse tmp_lst)))
  74.              ;(mapcar '(lambda (x) (setq ent_data (append ent_data x))) tmp_lst)
  75.              (setq ent_data (subst (cons 90 (fix(* 0.25 (length tmp_lst)))) (assoc 90 ent_data) ent_data))
  76.              (entmod ent_data)
  77.              (entupd pl)
  78. )
  79.        (t  (setq i (cadddr (assoc 10 ent_data))) ;_Z value
  80.            (setq coors (mapcar '(lambda(x / Z)
  81.                                   (setq Z (caddr x))
  82.                                   (if (null Z)(setq Z i))
  83.                                   (list (car x)(cadr x) Z)) coors))
  84.            (setq tmp_lst (apply 'append coors))
  85.            (vla-put-coordinates (setq i (pl:conv-ent-to-vla PL))(vlax-make-variant (vlax-safearray-fill
  86.            (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length tmp_lst)))) tmp_lst)))
  87.          (setq pl (pl:conv-ent-to-ename i))   
  88.          (setq tmp_lst pl i 0)
  89. (while (/= "SEQEND" (cdr(assoc 0 (setq ent_data (entget(setq tmp_lst (entnext tmp_lst)))))))
  90.    (setq ent_data (entget tmp_lst))
  91.    (if (nth i start_width)
  92.      (setq ent_data (subst (cons 40 (nth i start_width))(assoc 40 ent_data) ent_data)))
  93.    (if (nth i end_width)
  94.      (setq ent_data (subst (cons 41 (nth i end_width))(assoc 41 ent_data) ent_data)))
  95.    (if (nth i blglist)
  96.      (setq ent_data (subst (cons 42 (nth i blglist))(assoc 42 ent_data) ent_data)))
  97.           (entmod ent_data)(setq i (1+ i))                 
  98.    );_while
  99. ; (entmake (cdr (entget tmp_lst)))
  100. ;(entdel ent_name)
  101.    (entupd pl)
  102. ))
  103. pl)
  104.    ;|=============================================================================
  105. *    Функция преобразования полученного значения в ename
  106. *    Параметры вызова:
  107. *        ent_value        значение, которое надо преобразовать в примитив. Может
  108. *                        быть:
  109. *                       -    именем примитива,
  110. *                       -    vla-указателем,
  111. *                       -    меткой,
  112. *                       -    спиком entget,
  113. *                       -    спиком entsel.
  114. *                        Если не принадлежит ни одному из указанных типов,
  115. *                        возвращается nil
  116. *    Примеры вызова:
  117. (pl:conv-ent-to-ename (entlast))
  118. (pl:conv-ent-to-ename (entget(entlast)))
  119. (pl:conv-ent-to-ename (cdr(assoc 5 (entget(entlast)))))
  120. (pl:conv-ent-to-ename (car(entsel)))
  121. (pl:conv-ent-to-ename (vlax-ename->vla-object (entlast)))
  122. =============================================================================|;
  123. (defun pl:conv-ent-to-ename (ent_value / ret)
  124. (cond
  125.    ((= (type ent_value) 'vla-object) (vlax-vla-object->ename ent_value))
  126.    ((= (type ent_value) 'ename) ent_value)
  127.    ((and (= (type ent_value) 'list)
  128.          (= (type (setq ret (car ent_value))) 'ename)
  129.          )
  130.     ret
  131.     )
  132.    ((and (= (type ent_value) 'str)(setq ret (handent ent_value))) ret)
  133.    ((= (type ent_value) 'list)(cdr (assoc -1 ent_value)))
  134.    (t nil)
  135.    ) ;_ end of cond
  136. ) ;_ end of defun
  137. ;|=============================================================================
  138. *    Функция преобразования полученного значения в vla-указатель.
  139. *    Параметры вызова:
  140. *        ent_value        значение, которое надо преобразовать в примитив. Может
  141. *                        быть:
  142. *                       -    именем примитива,
  143. *                       -    vla-указателем,
  144. *                       -    меткой,
  145. *                       -    спиком entget,
  146. *                       -    спиком entsel.
  147. *                        Если не принадлежит ни одному из указанных типов,
  148. *                        возвращается nil
  149. *    Примеры вызова:
  150. (pl:conv-ent-to-vla (entlast))
  151. (pl:conv-ent-to-vla (entget(entlast)))
  152. (pl:conv-ent-to-vla (cdr(assoc 5 (entget(entlast)))))
  153. (pl:conv-ent-to-vla (car(entsel)))
  154. (pl:conv-ent-to-vla (vlax-ename->vla-object (entlast)))
  155. =============================================================================|;
  156. (defun pl:conv-ent-to-vla (ent_value / ret)
  157. (cond
  158.    ((= (type ent_value) 'vla-object) ent_value)
  159.    ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
  160.    ((setq ret (pl:conv-ent-to-ename ent_value))(vlax-ename->vla-object ret))
  161.    (t nil)
  162.    ) ;_ end of cond
  163. ) ;_ end of defun
  164. (defun mip_MakeUniqueMembersOfList  ( lst / OutList head)
  165. ;;;Удаляет одинаковые (дубликаты) элементы из списка
  166. ;;; На основе http://www.theswamp.org/index.php?topic=19128.0
  167. ;;; Изменено для сравнения вещественных чисел (equal ... 1e-6)
  168. (while lst
  169.    (setq head (car lst)
  170.          OutList (cons head OutList)
  171.          lst (vl-remove-if '(lambda(pt)(equal pt head 1e-6))(cdr lst))
  172.          )
  173.    )
  174. (reverse OutList)
  175. )
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:25:57 | 显示全部楼层
 
 
非常感谢你的帮助!我需要消化你的价值信息。
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:30:24 | 显示全部楼层
尊敬的VVA:,
 
谢谢你的lisp,我正在测试lisp,发现了一个小问题。lisp无法绘制正确的多段线,如下所示:
101824wr8z2g6wr7a0u23j.jpg
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-6 09:31:36 | 显示全部楼层
附着dwg文件,plz
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:34:41 | 显示全部楼层
 
 
感谢您快速回复VVA,附上测试用图纸。
新建块。图纸
回复

使用道具 举报

VVA

1

主题

308

帖子

308

银币

初来乍到

Rank: 1

铜币
8
发表于 2022-7-6 09:40:12 | 显示全部楼层
程序运行以下算法:
仅保留第一个重复点。其他已删除。我不知道如何通过编程确定他们需要什么来保持重复点。在您的情况下,我建议尝试使用主题LISP中的命令ECO。生态-物体的外部轮廓。至少我得到了要求的结果
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:43:38 | 显示全部楼层
 
感谢您的善意协助,如果发现任何重复点,然后在其上再复制一条多段线如何。你能做到吗?
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:46:12 | 显示全部楼层
除非我完全误解了预期结果,否则这行得通吗?
 
  1. (defun c:test ( / LM:UniqueFuzz LM:MAssoc ss i el ) (vl-load-com)
  2. ;; © Lee Mac 2011
  3. (defun LM:UniqueFuzz ( lst fuzz )
  4.    (if lst
  5.      (cons (car lst)
  6.        (LM:UniqueFuzz
  7.          (vl-remove-if '(lambda ( x ) (equal x (car lst) fuzz)) (cdr lst)) fuzz
  8.        )
  9.      )
  10.    )
  11. )
  12. (defun LM:MAssoc ( key lst / pair )
  13.    (if (setq pair (assoc key lst))
  14.      (cons (cdr pair) (LM:MAssoc key (cdr (member pair lst))))
  15.    )
  16. )
  17. (if (setq ss (ssget "_:L" '((0 . "LWPOLYLINE"))))
  18.    (repeat (setq i (sslength ss)) (setq el (entget (ssname ss (setq i (1- i)))))
  19.      (if
  20.        (entmakex
  21.          (append (reverse (member (assoc 39 el) (reverse el)))
  22.            (mapcar '(lambda ( x ) (cons 10 x)) (LM:UniqueFuzz (LM:MAssoc 10 el) 1e-) (list (assoc 210 el))
  23.          )
  24.        )
  25.        (entdel (cdr (assoc -1 el)))
  26.      )
  27.    )
  28. )
  29. (princ)
  30. )
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:48:40 | 显示全部楼层
 
 
非常感谢李的帮助!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 03:16 , Processed in 0.345274 second(s), 74 queries .

© 2020-2025 乐筑天下

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