乐筑天下

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

[编程交流] 根据距离对三维多段线排序

[复制链接]

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 18:44:10 | 显示全部楼层 |阅读模式
你好,朋友们
我试图根据实体名称列表在多段线上的位置对其进行排序
  1. (defun c:nn  (/ )   
  2. (princ "\n Select 3d polyline :")
  3. (setq entlst'())
  4. (setq sel (ssget'((0 . "POLYLINE"))))
  5. (repeat (setq idx (sslength sel))
  6.          (setq ent (ssname sel (setq idx (- idx 1)))
  7.                      enx (entget ent)
  8.                )
  9.    (setq name(cdr(assoc -1 enx)))
  10.    (setq entlst(cons name entlst))
  11.    )
  12. )

存储在entlst中的实体名称列表
我想根据列表在多段线上的位置对其进行排序
如附图所示
我稍后的目标是通过一次选择所有三维多段线来绘制横截面
谢谢
图纸2.dwg
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:50:42 | 显示全部楼层
嗨,莫蒂,
 
青色的LWpolyline远离红色的3DPolyline,因此如何知道哪个点是位置上距离LWpolyline最近的点?
 
换句话说,您需要至少有相互相交的对象(如示例中所示),才能获得相交点,并根据每个点在多段线上的位置对其进行排序。
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 18:54:00 | 显示全部楼层
嗨tharwat
是的,仅对红色的三维多段线进行排序
列表中的第一项是其在青色线上的距离为0的第一条三维多段线
第二项距离为5个单位
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:57:08 | 显示全部楼层
根本没有相交,每个多段线有许多坐标点,那么哪个点应该被视为位置点?
 
将图形的视图更改为右视图,以查看我指示的内容。
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 18:58:57 | 显示全部楼层
由于二维多段线上的偏移,有没有办法对实体名称进行排序
我不知道是否可以检索2d poline和3d poline之间的明显交点
或者可以将三维多边形的副本展平,然后获取交点,然后在删除此副本后计算位置
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 19:02:47 | 显示全部楼层
是的,如果您展平所有目标多段线,那么这是可能的。
 
如果这符合您的需要,那么您可以使用以下程序,变量“data”应该包含已排序的实体。
 
  1. (defun c:Test (/ s o d ss i p sn lst _lst l r pts data)
  2. (princ "\nPick LWpolyline :")
  3. (if (setq s (ssget "_+.:S:E" '((0 . "LWPOLYLINE"))))
  4.    (progn
  5.      (setq o (vlax-ename->vla-object (ssname s 0))
  6.            d (vlax-get-acad-object)
  7.            )
  8.      (vla-getboundingbox o 'l 'r)
  9.      (vla-zoomwindow d r l)
  10.      (setq pts (mapcar 'vlax-safearray->list (list l r)))
  11.      (if (setq ss (ssget "_C" (car pts) (cadr pts) '((0 . "POLYLINE"))))
  12.        (repeat (setq i (sslength ss))
  13.          (if (setq p (vlax-invoke
  14.                        o
  15.                        'intersectwith
  16.                        (vlax-ename->vla-object
  17.                          (setq sn (ssname ss (setq i (1- i))))
  18.                          )
  19.                        acextendnone
  20.                        )
  21.                    )
  22.            (setq lst (cons (list (vlax-curve-getdistatpoint o p)
  23.                                  (cdr (assoc -1 (entget sn)))
  24.                                  )
  25.                            lst
  26.                            )
  27.                  )
  28.            )
  29.          )
  30.        )
  31.      (if lst
  32.        (setq _lst (vl-sort lst '(lambda (j k) (< (car j) (car k))))
  33.              data (mapcar 'cadr _lst)
  34.              )
  35.        )
  36.      (vla-zoomprevious d)
  37.      )
  38.    )
  39. (princ)
  40. ) (vl-load-com)
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 19:07:16 | 显示全部楼层
谢谢你,谢谢
我会测试Lisp程序并通知你
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 19:11:16 | 显示全部楼层
也许这个。。。
 
  1. (defun c:sortenamesbyfenceselectionofpickedcurve ( / curve d fd n k p pl ss1 sss ss2 ss enames )
  2. (vl-load-com)
  3. (setq curve (car (entsel "\nPick selecting curve...")))
  4. (while (or (not curve) (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getstartpoint (list curve))))
  5.    (prompt "\nMissed or picked entity doesn't belong to curves... Please try picking correct curve entity again...")
  6.    (setq curve (car (entsel)))
  7. )
  8. (initget 7)
  9. (setq fd (getdist (strcat "\nPick or specify fence distance for selecting by fence along picked curve in interval from 0.0 to " (rtos (setq d (vlax-curve-getdistatparam curve (vlax-curve-getendparam curve))) 2 50) " : ")))
  10. (setq n (1+ (fix (/ d fd))))
  11. (setq fd (/ d n))
  12. (setq k -1)
  13. (repeat (1+ n)
  14.    (setq p (vlax-curve-getpointatdist curve (* fd (setq k (1+ k)))))
  15.    (setq pl (cons p pl))
  16. )
  17. (setq pl (reverse pl))
  18. (if (equal (car pl) (vlax-curve-getstartpoint curve) 1e-6) (setq pl (subst (vlax-curve-getstartpoint curve) (car pl) pl)))
  19. (if (equal (last pl) (vlax-curve-getendpoint curve) 1e-6) (setq pl (subst (vlax-curve-getendpoint curve) (last pl) pl)))
  20. (setq ss1 (ssget "_C" (mapcar '- (car pl) '(1e-3 1e-3)) (mapcar '+ (car pl) '(1e-3 1e-3))))
  21. (ssdel curve ss1)
  22. (setq sss (ssget "_F" pl))
  23. (ssdel curve sss)
  24. (setq ss2 (ssget "_C" (mapcar '- (last pl) '(1e-3 1e-3)) (mapcar '+ (last pl) '(1e-3 1e-3))))
  25. (ssdel curve ss2)
  26. (setq ss (acet-ss-union (list ss1 sss ss2)))
  27. (setq enames (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  28. (foreach ename enames
  29.    (redraw ename 2)
  30.    (if (or (eq ename (car enames)) (eq ename (last enames)))
  31.      (repeat 750 (redraw))
  32.      (repeat 250 (redraw))
  33.    )
  34.    (redraw ename 1)
  35. )
  36. (princ)
  37. )
  38. (defun c:sebfspc nil (c:sortenamesbyfenceselectionofpickedcurve))
HTH,M.R。
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 19:13:17 | 显示全部楼层
马库钢筋谢谢你的回复
图形中挤满了其他实体,但我清除了所有不需要的实体
因此,这种方法不是首选方法,用户没有选择与三维多段线相关的选项,所有与二维多边形相交的内容都将计算出来
tharwat我看不到我提到的实体名称列表,我想选择2dpolyline,然后选择所有三维polyline,然后获取实体名称列表
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 19:17:11 | 显示全部楼层
 
如前所述,已排序的实体将保留在变量名“data”下,因此要查看这些名称,只需在变量结束的地方直接添加以下内容:
 
  1. (princ data)

 
无需选择3Dpolyline,因为程序将代表您处理此问题。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 13:55 , Processed in 0.988963 second(s), 72 queries .

© 2020-2025 乐筑天下

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