乐筑天下

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

[编程交流] 转换为区域不成功

[复制链接]

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 08:35:24 | 显示全部楼层 |阅读模式
尊敬的各位:,
 
我想把一些多段线转换成面域,但其中一条做不到。在检查is折线后,我发现折线与自身相交。由于角点很小,可以用lisp检查这种多段线吗?谢谢
 
  1. (defun c:test ()
  2. (setq cset (ssget "_A" (list '(0 . "lwpolyline") (cons 410 (getvar "CTAB")) )))
  3. (setq ctr 0 sobj 0 oobj 0)
  4. (repeat (sslength cset)
  5. (setq item (ssname cset ctr))
  6. (if (= (vlax-property-available-p (vlax-ename->vla-object item ) "closed" T) T)
  7. (progn
  8.   (setq lastitem (entlast))
  9.   (command "region" item "")
  10.      (setq drawitem (entlast))
  11.   (if (not (equal lastitem drawitem))
  12.      (progn
  13.    (alert "object converted to region")
  14.     (setq sobj (1+ sobj))
  15.   )progn
  16.   (progn
  17.   (alert "This object unable convert to region")
  18.   (setq oobj (1+ oobj))
  19.   )prgon
  20. )if
  21. );progn
  22. (alert "All object can't convert to region")
  23.   );if
  24. (setq ctr (1+ ctr))
  25. );repeat
  26. )

 
093525unu45me9nu4t5d45.jpg
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 08:47:26 | 显示全部楼层
试试这个。。。。
 
  1. (defun c:test (/ spc selectionset)
  2. ;;; Tharwat 08. Dec. 2011 ;;;
  3. (vl-load-com)
  4. (cond ((not acdoc)
  5.         (setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
  6.        )
  7. )
  8. (setq spc (if (> (vla-get-activespace acdoc) 0)
  9.              (vla-get-modelspace acdoc)
  10.              (vla-get-paperspace acdoc)
  11.            )
  12. )
  13. (if (setq ss (ssget "_:L"
  14.                      (list '(0 . "LWPOLYLINE")
  15.                            '(-4 . "&=")
  16.                            '(70 . 1)
  17.                            (cons 410 (getvar "CTAB"))
  18.                      )
  19.               )
  20.      )
  21.    (progn
  22.      (vlax-for obj
  23.                (setq selectionset (vla-get-ActiveSelectionSet acdoc))
  24.        (vlax-invoke spc 'addregion (list obj))
  25.      )
  26.      (vla-delete selectionset)
  27.    )
  28.    (princ)
  29. )
  30. (princ)
  31. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:00:59 | 显示全部楼层
以下函数将返回LWPolyline的自交点,如果LWPolyline不与自身相交,则返回nil。
  1. [color=GREEN];; Get Self-Intersections  -  Lee Mac  -  2011  -  www.lee-mac.com[/color]
  2. [color=GREEN];; Returns a list of self-intersections points of an LWPolyline.[/color]
  3. ([color=BLUE]defun[/color] _GetSelfIntersections ( obj [color=BLUE]/[/color] _LWVertices _Group3D )
  4.    ([color=BLUE]defun[/color] _LWVertices ( l z )
  5.        ([color=BLUE]if[/color] l ([color=BLUE]cons[/color] ([color=BLUE]list[/color] ([color=BLUE]car[/color] l) ([color=BLUE]cadr[/color] l) z) (_LWVertices ([color=BLUE]cddr[/color] l) z)))
  6.    )
  7.    ([color=BLUE]defun[/color] _Group3D ( l )
  8.        ([color=BLUE]if[/color] l ([color=BLUE]cons[/color] ([color=BLUE]list[/color] ([color=BLUE]car[/color] l) ([color=BLUE]cadr[/color] l) ([color=BLUE]caddr[/color] l)) (_Group3D ([color=BLUE]cdddr[/color] l))))
  9.    )
  10.    (
  11.        ([color=BLUE]lambda[/color] ( l )
  12.            ([color=BLUE]vl-remove-if[/color]
  13.                ([color=BLUE]function[/color]
  14.                    ([color=BLUE]lambda[/color] ( a )
  15.                        ([color=BLUE]vl-some[/color] ([color=BLUE]function[/color] ([color=BLUE]lambda[/color] ( b ) ([color=BLUE]equal[/color] a b 1e-)) l)
  16.                    )
  17.                )
  18.                (_Group3D ([color=BLUE]vlax-invoke[/color] obj 'intersectwith obj [color=BLUE]acextendnone[/color]))
  19.            )
  20.        )
  21.        (_LWVertices ([color=BLUE]vlax-get[/color] obj 'coordinates) ([color=BLUE]vlax-get[/color] obj 'elevation))
  22.    )
  23. )

 
对于直接位于多段线顶点上的自交点,上述操作将失败。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 09:03:58 | 显示全部楼层
这一个也将检查旧的二维多段线和三维多段线,并附加重叠顶点到列表与相交点。。。基于李的代码和我对所有*多段线对象的顶点列表的贡献。。。代码已更新,以支持位于多段线上并按其位置相交的顶点,这些顶点具有实参数,而不是固定参数。
 
[编辑]:另请注意,使用此代码可以检查pline是否已正确生成。。。
如果没有自相交,并且此代码返回零,则正确生成pline(如果使用“C”-关闭选项关闭)。。。如果它报告点,pline是自交的或在同一位置上有重复的顶点。。。我的下一个代码-张贴在下面的帖子#7不会通知这些verexes,只是那些自相交或点的位置,即普林斯线段的交点自相交。。。
 
  1. (defun _GetSelfIntersections ( obj / _Vertices _Group3D )
  2.    (vl-load-com)
  3.    (defun _Vertices ( pl / nvert pt ptlst n )
  4.        (if (eq 1 (logand 1 (cdr (assoc 70 (entget (vlax-vla-object->ename pl))))))
  5.            (setq nvert (fix (vlax-curve-getendparam pl)))
  6.            (setq nvert (+ (fix (vlax-curve-getendparam pl)) 1))
  7.        )
  8.        (setq n 0.0)
  9.        (repeat nvert
  10.            (setq pt (vlax-curve-getpointatparam pl n))
  11.            (setq ptlst (cons pt ptlst))
  12.            (setq n (+ n 1.0))
  13.        )
  14.        (setq ptlst (reverse ptlst))
  15.        ptlst
  16.    )
  17.    (defun _Group3D ( l )
  18.        (if l (cons (list (car l) (cadr l) (caddr l)) (_Group3D (cdddr l))))
  19.    )
  20.    (defun _Duplicates ( l / lst lstrem )
  21.        (setq lstrem (acet-list-remove-duplicates (setq lst l) 1e-6))
  22.        (foreach el lstrem
  23.            (if (not
  24.                    (vl-member-if
  25.                       '(lambda ( x )
  26.                          (equal el x 1e-6)
  27.                        )
  28.                        (cdr
  29.                            (vl-member-if
  30.                               '(lambda ( x )
  31.                                  (equal el x 1e-6)
  32.                                )
  33.                                lst
  34.                            )
  35.                        )
  36.                    )
  37.                )
  38.                (setq lst (vl-remove-if
  39.                             '(lambda ( x )
  40.                                (equal el x 1e-6)
  41.                              )
  42.                              lst
  43.                          )
  44.                )
  45.            )
  46.        )
  47.        lst
  48.    )
  49.    (append
  50.        (
  51.            (lambda ( l )
  52.                (vl-remove-if
  53.                    (function
  54.                        (lambda ( a )
  55.                            (vl-some (function (lambda ( b ) (equal a b 1e-)) l)
  56.                        )
  57.                    )
  58.                    (_Group3D (vlax-invoke obj 'intersectwith obj acextendnone))
  59.                )
  60.            )
  61.            (_Vertices obj)
  62.        )
  63.        (if (_Duplicates (_Vertices obj)) (acet-list-remove-duplicates (_Duplicates (_Vertices obj)) 1e-6))
  64.    )
  65. )
测试:
  1. (_GetSelfIntersections (vlax-ename->vla-object (ssname (ssget "_+.:E:S:L" '((0 . "*POLYLINE"))) 0)))
M.R。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 09:15:20 | 显示全部楼层
代码已更新,
 
您好,M.R。
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:26:38 | 显示全部楼层
感谢Tharwat、Lee Mac和Marko_ribar提供的程序代码,我将对其进行测试。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 09:29:41 | 显示全部楼层
如果只想在多段线上进行检查以创建区域,则无需检查多段线创建阵列中的重叠顶点,只需检查与其他顶点相交的顶点。。。在这种情况下,这将返回相交点的列表,如果返回零,则可以创建区域。。。
 
[编辑]:更新代码以包括开放/闭合样条线图元
 
  1. (defun _GetSelfIntersections ( obj / _Vertices _Group3D )
  2.    (vl-load-com)
  3.    (defun _Vertices ( pl / nvert pt ptlst n )
  4.        (if (eq 1 (logand 1 (cdr (assoc 70 (entget (vlax-vla-object->ename pl))))))
  5.            (setq nvert (fix (vlax-curve-getendparam pl)))
  6.            (setq nvert (+ (fix (vlax-curve-getendparam pl)) 1))
  7.        )
  8.        (setq n 0.0)
  9.        (repeat nvert
  10.            (setq pt (vlax-curve-getpointatparam pl n))
  11.            (setq ptlst (cons pt ptlst))
  12.            (setq n (+ n 1.0))
  13.        )
  14.        (setq ptlst (reverse ptlst))
  15.        ([highlight]acet-list-remove-adjacent-dups[/highlight] ptlst)
  16.    )
  17.    (defun _Group3D ( l )
  18.        (if l (cons (list (car l) (cadr l) (caddr l)) (_Group3D (cdddr l))))
  19.    )
  20.    (defun _Duplicates ( l / lst lstrem )
  21.        (setq lstrem (acet-list-remove-duplicates (setq lst l) 1e-6))
  22.        (foreach el lstrem
  23.            (if (not
  24.                    (vl-member-if
  25.                       '(lambda ( x )
  26.                          (equal el x 1e-6)
  27.                        )
  28.                        (cdr
  29.                            (vl-member-if
  30.                               '(lambda ( x )
  31.                                  (equal el x 1e-6)
  32.                                )
  33.                                lst
  34.                            )
  35.                        )
  36.                    )
  37.                )
  38.                (setq lst (vl-remove-if
  39.                             '(lambda ( x )
  40.                                (equal el x 1e-6)
  41.                              )
  42.                              lst
  43.                          )
  44.                )
  45.            )
  46.        )
  47.        lst
  48.    )
  49.    (append
  50.        (
  51.            (lambda ( l )
  52.                (vl-remove-if
  53.                    (function
  54.                        (lambda ( a )
  55.                            (vl-some (function (lambda ( b ) (equal a b 1e-)) l)
  56.                        )
  57.                    )
  58.                    (_Group3D (vlax-invoke obj 'intersectwith obj acextendnone))
  59.                )
  60.            )
  61.            (_Vertices obj)
  62.        )
  63.        (if (_Duplicates (_Vertices obj)) (acet-list-remove-duplicates (_Duplicates (_Vertices obj)) 1e-6))
  64.    )
  65. )
测试:
  1. (_GetSelfIntersections (vlax-ename->vla-object (car (entsel))))
M.R。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:41:21 | 显示全部楼层
 
非常好的结果。
 
如果不麻烦的话,请用另一种方式重新编写代码,而不使用lambda(在这种情况下可能重复函数工作)??
 
非常感谢。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 09:15 , Processed in 0.459597 second(s), 71 queries .

© 2020-2025 乐筑天下

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