乐筑天下

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

[编程交流] Vla中与f相交的问题

[复制链接]
gS7

35

主题

244

帖子

212

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-6 02:56:43 | 显示全部楼层
>>pBe谢谢你的提示
 
>>李,你的示例程序说不出话来,非常感谢
 
>>你的程序很好,我必须选择多个对象,所以我要考虑李的程序
也非常感谢你的花费
有价值的
是时候解决我的问题了
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 02:59:31 | 显示全部楼层
非常欢迎gS7-
 
但是,请注意,我的程序和GP的程序正在计算两个不同的点:GP的程序正在计算三维多段线上的交点,而我的程序返回LW多段线上的交点。
回复

使用道具 举报

GP_

8

主题

248

帖子

245

银币

初来乍到

Rank: 1

铜币
42
发表于 2022-7-6 03:07:06 | 显示全部楼层
不客气,gS7
 
Lee,small clarification,my lisp计算第一条选定多段线(二维/三维)上的交点。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 03:09:00 | 显示全部楼层
 
谢谢GP
 
以下是计算三维多段线上交点的另一种方法,允许进行多次选择:
  1. ([color=BLUE]defun[/color] c:test ( [color=BLUE]/[/color] e i j s1 s2 )
  2.    ([color=BLUE]if[/color]
  3.        ([color=BLUE]and[/color]
  4.            ([color=BLUE]princ[/color] [color=MAROON]"\nSelect LWPolylines..."[/color])
  5.            ([color=BLUE]setq[/color] s1 ([color=BLUE]ssget[/color] '((0 . [color=MAROON]"LWPOLYLINE"[/color]))))
  6.            ([color=BLUE]princ[/color] [color=MAROON]"\nSelect 3D Polylines..."[/color])
  7.            ([color=BLUE]setq[/color] s2 ([color=BLUE]ssget[/color] '((0 . [color=MAROON]"POLYLINE"[/color]) (-4 . [color=MAROON]"&="[/color]) (70 . )))
  8.        )
  9.        ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] i ([color=BLUE]sslength[/color] s1))
  10.            ([color=BLUE]setq[/color] e ([color=BLUE]ssname[/color] s1 ([color=BLUE]setq[/color] i ([color=BLUE]1-[/color] i))))
  11.            ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] j ([color=BLUE]sslength[/color] s2))
  12.                ([color=BLUE]foreach[/color] x (3D-poly-inters e ([color=BLUE]ssname[/color] s2 ([color=BLUE]setq[/color] j ([color=BLUE]1-[/color] j))))
  13.                    ([color=BLUE]entmake[/color] ([color=BLUE]list[/color] '(0 . [color=MAROON]"CIRCLE"[/color]) '(40 . 1.0) ([color=BLUE]cons[/color] 10 x)))
  14.                )
  15.            )
  16.        )
  17.    )
  18.    ([color=BLUE]princ[/color])
  19. )
  20. ([color=BLUE]defun[/color] 3D-poly-inters ( lwp 3dp [color=BLUE]/[/color] enx ls1 ls2 )
  21.    ([color=BLUE]setq[/color] ls1 ([color=BLUE]mapcar[/color] '[color=BLUE]cdr[/color] ([color=BLUE]vl-remove-if-not[/color] '([color=BLUE]lambda[/color] ( x ) ([color=BLUE]=[/color] 10 ([color=BLUE]car[/color] x))) ([color=BLUE]entget[/color] lwp)))
  22.          3dp ([color=BLUE]entnext[/color] 3dp)
  23.          enx ([color=BLUE]entget[/color]  3dp)
  24.    )
  25.    ([color=BLUE]while[/color] ([color=BLUE]=[/color] [color=MAROON]"VERTEX"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 enx)))
  26.        ([color=BLUE]setq[/color] ls2 ([color=BLUE]cons[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 enx)) ls2)
  27.              3dp ([color=BLUE]entnext[/color] 3dp)
  28.              enx ([color=BLUE]entget[/color]  3dp)
  29.        )
  30.    )
  31.    ([color=BLUE]if[/color] ([color=BLUE]=[/color] 1 ([color=BLUE]logand[/color] 1 ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 70 ([color=BLUE]entget[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 330 enx)))))))
  32.        ([color=BLUE]setq[/color] ls2 ([color=BLUE]cons[/color] ([color=BLUE]last[/color] ls2) ls2))
  33.    )
  34.    ([color=BLUE]if[/color] ([color=BLUE]=[/color] 1 ([color=BLUE]logand[/color] 1 ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 70 ([color=BLUE]entget[/color] lwp)))))
  35.        ([color=BLUE]setq[/color] ls1 ([color=BLUE]cons[/color] ([color=BLUE]last[/color] ls1) ls1))
  36.    )
  37.    ([color=BLUE]apply[/color] '[color=BLUE]append[/color]
  38.        ([color=BLUE]mapcar[/color]
  39.            ([color=BLUE]function[/color]
  40.                ([color=BLUE]lambda[/color] ( a b )
  41.                    ([color=BLUE]vl-remove[/color] [color=BLUE]nil[/color]
  42.                        ([color=BLUE]mapcar[/color]
  43.                            ([color=BLUE]function[/color]
  44.                                ([color=BLUE]lambda[/color] ( c d [color=BLUE]/[/color] p )
  45.                                    ([color=BLUE]if[/color] ([color=BLUE]setq[/color] p ([color=BLUE]inters[/color] a b c d))
  46.                                        ([color=BLUE]inters[/color] a b ([color=BLUE]append[/color] p '(0.0)) ([color=BLUE]append[/color] p '(1.0)) [color=BLUE]nil[/color])
  47.                                    )
  48.                                )
  49.                            )
  50.                            ls1 ([color=BLUE]cdr[/color] ls1)
  51.                        )
  52.                    )
  53.                )
  54.            )
  55.            ls2 ([color=BLUE]cdr[/color] ls2)
  56.        )
  57.    )
  58. )
回复

使用道具 举报

gS7

35

主题

244

帖子

212

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-6 03:13:54 | 显示全部楼层
在这里,我做了一些小改动,以获取3d点
用李的示例程序。。
 
  1. (defun c:test ( / e i j s1 s2 )
  2.    (if
  3.        (and
  4.            (princ "\nSelect LWPolylines...")
  5.            (setq s1 (ssget '((0 . "LWPOLYLINE"))))
  6.            (princ "\nSelect 3D Polylines...")
  7.            (setq s2 (ssget '((0 . "POLYLINE") (-4 . "&=") (70 . )))
  8.        )
  9.        (repeat (setq i (sslength s1))
  10.            (setq e (ssname s1 (setq i (1- i))))
  11.            (repeat (setq j (sslength s2))
  12.                (foreach x (2D-poly-inters e[color="blue"] (setq e2 (ssname s2 (setq j (1- j)))))[/color]
  13.                    (entmake (list '(0 . "CIRCLE") '(40 . 1.0) [color="blue"](cons 10 (vlax-curve-getclosestpointto e2 x))))[/color]
  14.                                                                                        
  15.                )
  16.            )
  17.        )
  18.    )
  19.    (princ)
  20. )
  21. (defun 2D-poly-inters ( lwp 3dp / enx ls1 ls2 vtx )
  22.    (setq ls1 (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget lwp)))
  23.          3dp (entnext 3dp)
  24.          enx (entget  3dp)
  25.    )
  26.    (while (= "VERTEX" (cdr (assoc 0 enx)))
  27.        (setq vtx (assoc 10 enx)
  28.              ls2 (cons (list (cadr vtx) (caddr vtx)) ls2)
  29.              3dp (entnext 3dp)
  30.              enx (entget  3dp)
  31.        )
  32.    )
  33.    (if (= 1 (logand 1 (cdr (assoc 70 (entget (cdr (assoc 330 enx)))))))
  34.        (setq ls2 (cons (last ls2) ls2))
  35.    )
  36.    (if (= 1 (logand 1 (cdr (assoc 70 (entget lwp)))))
  37.        (setq ls1 (cons (last ls1) ls1))
  38.    )
  39.    (apply 'append
  40.        (mapcar
  41.            (function
  42.                (lambda ( a b )
  43.                    (vl-remove nil
  44.                        (mapcar
  45.                            (function
  46.                                (lambda ( c d )
  47.                                    (inters a b c d)
  48.                                )
  49.                            )
  50.                            ls1 (cdr ls1)
  51.                        )
  52.                    )
  53.                )
  54.            )
  55.            ls2 (cdr ls2)
  56.        )
  57.    )
  58. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 03:16:31 | 显示全部楼层
 
请注意,如果三维多段线的任何部分比“明显”交点更接近LWD多段线,则修改后的代码将返回错误的点,这在交点不位于顶点的任何情况下都很可能发生。
 
我建议要么使用vlax curve getclosestpointtoprojection函数,要么使用上面第14篇文章中的代码。
 
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-17 09:46 , Processed in 1.213137 second(s), 62 queries .

© 2020-2025 乐筑天下

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