乐筑天下

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

[编程交流] 垂直lin的交点

[复制链接]

56

主题

284

帖子

231

银币

后起之秀

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

铜币
289
发表于 2022-7-6 06:47:00 | 显示全部楼层 |阅读模式
你好,
 
如何计算交点(i1,i2,i3,…),包括一些垂直线和多段线,如下图所示:
 
074700s33690isc24x0zli.jpg
 
第1i1、2i2、3i3行不存在。
 
  1. ; j = 1 to 3 ...
  2. i[j] = (mapcar '+ '(0 100) [j] ))

有什么想法吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 06:52:46 | 显示全部楼层
这将为您指明正确的方向:相交函数
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 06:58:11 | 显示全部楼层
这只适用于线路。。
 
  1. (defun c:Test (/ _Ang s e sad ss i sn ent)
  2. (defun _Ang (e) (angle (cdr (assoc 10 e)) (cdr (assoc 11 e))))
  3. (if (and (setq ss (ssget "_X" '((0 . "LINE"))))
  4.           (setq sad (ssadd)
  5.                 s   (car (entsel "\n Select polyline :"))
  6.           )
  7.           (eq (cdr (assoc 0 (setq e (entget s)))) "LWPOLYLINE")
  8.      )
  9.    (repeat (setq i (sslength ss))
  10.      (setq ent (entget (setq sn (ssname ss (setq i (1- i))))))
  11.      (if (and (vlax-invoke (vlax-ename->vla-object s) 'IntersectWith (vlax-ename->vla-object sn) acExtendNone)
  12.               (or (equal (_Ang ent) (* pi 0.5) 1e-4) (equal (_Ang ent) (* pi 1.5) 1e-4))
  13.          )
  14.        (ssadd sn sad)
  15.      )
  16.    )
  17. )
  18. (sssetfirst nil sad)
  19. (princ)
  20. )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 07:06:49 | 显示全部楼层
  1. (defun c:WhereYouAt (/ e int pts mn mx dist tmpht i HtList p1 p2 p3p4)
  2. (setq os (getvar 'osmode ))
  3. (setvar 'osmode  0)
  4. (cond ((and (setq HtList nil
  5.                    e      (car (entsel "\nSelect Polyline:"))
  6.              )
  7.              (setq int (getdist "\nEnter Interval:"))
  8.              (Setq pts (mapcar 'cdr (vl-remove-if-not '(lambda (ent) (= (car ent) 10)) (entget e))))
  9.              (progn (vla-GetBoundingBox (vlax-ename->vla-object e) 'mn 'mx)
  10.                     (setq mn    (vlax-safearray->list mn)
  11.                           mx    (vlax-safearray->list mx)
  12.                           dist  (- (car mx) (car mn))
  13.                           tmpht (- (cadr mx) (cadr mn))
  14.                           i     int
  15.                     )
  16.              )
  17.              (while (< i dist)
  18.                (setq p1 (polar mn 0 i)
  19.                      p2 (polar p1 (/ pi 2.0) tmpht)
  20.                )
  21.                (setq p3p4 (vl-some '(lambda (x y)
  22.                                       (if (<= (car x) (car p1) (car y))
  23.                                         (list x y)
  24.                                       )
  25.                                     )
  26.                                    pts
  27.                                    (cdr pts)
  28.                           )
  29.                )
  30.                (setq HtList (append HtList (list (inters p1 p2 (car p3p4) (cadr p3p4))))
  31.                      i      (+ i int)
  32.                )
  33.                (setq pts (member (car p3p4) pts))
  34.              )
  35.              (foreach p HtList (command "_point"  p))
  36.         )
  37.        )
  38. )(setvar 'osmode os)
  39. (princ)
  40. )

 
 
但在您的示例(Tharwat)中,我看到了一种更简单的方法:
 
  1. (setq length-polylinelist  (length polylinelist ) i 0)
  2. (while (< i length-polylinelist )
  3. (setq p1 (nth i polylinelist)  i (1+ i)   p2 (nth i polylinelist) )
  4. (foreach p listpoints123...
  5. (if [color=red](setq pc (inters p1 p2 p (mapcar '+ '(0 100) p ))[/color]
  6. ...
  7. )
  8. )
  9. )

 
这是一种比最初想法更直接的方法。
 
但是可以给列表坐标而不是对象名称吗?
回复

使用道具 举报

56

主题

284

帖子

231

银币

后起之秀

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

铜币
289
发表于 2022-7-6 07:09:22 | 显示全部楼层
查看此线程:
www.theswamp。组织/索引。php?主题=43630
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:16:36 | 显示全部楼层
谢谢李。
 
_polyinters函数运行速度比下面的代码快?
 
  1. pc = (vlax-invoke (vlax-ename->vla-object poly) 'IntersectWith (vlax-ename->vla-object line)
  2.    acExtendOtherEntity)
  3. (195.558 111.199 0.0)
回复

使用道具 举报

56

主题

284

帖子

231

银币

后起之秀

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

铜币
289
发表于 2022-7-6 07:22:58 | 显示全部楼层
_polyinters不会创建任何临时对象,因此应该执行得更快,但是该功能仅限于用于直段LWD多段线,如果测试多个线向量的相交,则可以优化该功能。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:26:28 | 显示全部楼层
听起来你想创建个人资料
看看这是否有帮助,底线已经画出来了
在您的个人资料网格上
  1. ; polylinie = polyline object
  2. ; lisXYLin = list with coordinates of points 1, 2, 3, ...
  3. (foreach p lisXYLin
  4. (setq linie (vla-AddLine MSpace (vlax-3d-point p) (vlax-3d-point (mapcar '+ (list 0 100) p))) )
  5. ; vertical line
  6. (if [color=red](setq pc (vlax-invoke polylinie 'IntersectWith linie acExtendBoth))[/color] ;_ end of setq
  7.   (progn
  8.     (setq dad (distance p pc)) ;_ end of set
  9.     ; ....... (entmake (list '(0 . "TEXT") ... )) ; write a text
  10.     )) ;_ end of if pc
  11.     (if (and linie (not (vlax-erased-p linie)) ) (vla-Delete linie) ) ;_ end of if and
  12. ) ; f
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 07:32:33 | 显示全部楼层
非常感谢你的帮助。我找到了我所寻找的最佳功能。
 
我已替换:
  1. (defun c:profL(/ *error* adoc en en2 ent ent2 ept ni obj pts)
  2. (vl-load-com)
  3. (defun *error* (msg)
  4. (vla-endundomark (vla-get-activedocument
  5. (vlax-get-acad-object))
  6. )
  7. (cond ((or (not msg)
  8. (member msg '("console break" "Function cancelled" "quit / exit abort"))
  9. )
  10. )
  11. ((princ (strcat "\nError: " msg)))
  12. )
  13. (princ)
  14. )
  15. (setq adoc (vla-get-activedocument (vlax-get-acad-object)) )
  16. (vla-startundomark adoc )
  17. (if (and (setq ent (entsel "\nSelect top curve : "))
  18. (setq ent2 (entsel "\nSelect bottom curve >>")))
  19. (progn
  20. (setq en (car ent)
  21. pts (vl-remove-if 'not (mapcar '(lambda (x)(if (= 10 (car x))(trans (cdr x) 1 0)))(entget en)))
  22. en2 (car ent2)
  23. obj (vlax-ename->vla-object en2)
  24. )
  25. (foreach pt pts
  26. (setq ept (vlax-curve-getclosestpointto obj pt))
  27. (command "_line" "_non" pt "_non" ept "")
  28. )
  29. )
  30. )
  31. (*error* nil)
  32. (princ)
  33. )

 
使用:
  1. [color=black](setq pc (vlax-invoke polylinie 'IntersectWith linie acExtendBoth))[/color]

并且不需要创建临时线。
 
谢谢fixo,你的例子很有帮助。
我尝试使用函数vlax curve getclosestpointto,但这不是我需要的。
是的,是一个轮廓,但并非所有线都指向顶点PLOLINEI段(#1)。
回复

使用道具 举报

56

主题

284

帖子

231

银币

后起之秀

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

铜币
289
发表于 2022-7-6 07:40:59 | 显示全部楼层
好的解决方案Costinbos
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 14:49 , Processed in 0.488496 second(s), 75 queries .

© 2020-2025 乐筑天下

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