乐筑天下

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

[编程交流] 排序上的混合顺序点

[复制链接]

2

主题

7

帖子

5

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 16:21:28 | 显示全部楼层 |阅读模式
你好
 
有谁能帮我写一个lisp函数来排序多段线上的点(假设交点)?
 
在我的代码中,我有一个多段线对象和一组交点。我需要连续计算这些点和顶点之间的累积距离。
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:41:07 | 显示全部楼层
以下函数将根据点沿多段线的位置对其进行排序:
 
  1. (defun sortpoints ( ent lst )
  2.    (vl-sort lst
  3.        (function
  4.            (lambda ( a b )
  5.                (<  (vlax-curve-getparamatpoint ent a)
  6.                    (vlax-curve-getparamatpoint ent b)
  7.                )
  8.            )
  9.        )
  10.    )
  11. )
或者,如果点不一定位于对象上:
 
上述函数应使用相关多段线的实体名称和WCS点列表调用,例如:
 
  1. (sortpoints <entity-name> <point-list>)

 
您还需要确保在使用上述函数之前调用(vl load com)。
回复

使用道具 举报

2

主题

7

帖子

5

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 16:47:41 | 显示全部楼层
谢谢你的回答。但是sortpoints函数似乎不起作用。我用样本数据在代码中尝试了这个函数。
样本数据是多段线的顶点。我混合了顶点的顺序,我希望你的函数(sortpoints)对这些点进行排序。但它给了我相同的分数顺序。也许是我的错。
 
以下是采样点(多段线的顶点)
(370961.248 310947.465) ;1.
(371118.717 311119.493) ;2.
(371016.444 311267.177) ;3.
(371083.002 311526.843) ;4.
(371232.353 311705.362) ;5.
(370930.404 311919.585) ;6.
 
以下是完整代码:
 
  1. (vl-load-com)
  2. ;*
  3. ;* NK_FINT : Find intersection points
  4. ;*           (intersections points of selected polyline with lines)
  5. ;*
  6. (defun C:nk_fint (/ plObj line_ss int_ss intP inc ent verts ptList)
  7. (setq
  8.    plObj (vlax-ename->vla-object (car (entsel "\nSelect Polyline: "))); = Polyline OBJect
  9.    line_ss (ssget "_X" '((0 . "LINE"))); = Line Selection Set
  10.    int_ss (ssadd); = things that intersect -- start empty
  11.    inc -1
  12. ); setq
  13. (setq ptList '(
  14.    ;(370961.248 310947.465) ;1
  15.    (371118.717 311119.493) ;2
  16.    (371016.444 311267.177) ;3
  17.    (370961.248 310947.465) ;1
  18.    (371083.002 311526.843) ;4
  19.    (371232.353 311705.362) ;5
  20.    (370930.404 311919.585) ;6
  21.    )
  22. )
  23. (princ "\n\Before: \n")
  24. (writepoints ptList) ;for testing purpose
  25. (repeat (sslength line_ss)
  26.    (setq ent (ssname line_ss (setq inc (1+ inc)))); = line ENTity
  27.    (if
  28.      (setq intP  ; intersection point
  29.      (vlax-invoke plObj 'intersectWith (vlax-ename->vla-object ent) acExtendNone); vlax-invoke
  30.    ); setq
  31.    (progn
  32.      (setq verts (getverts plObj intP))
  33.      (princ "\nVerts:\n")  (writepoints verts)  ;for testing purpose
  34.      (ssadd ent int_ss)
  35.    ) ; progn
  36.    ); if
  37. ); repeat
  38. (sortpoints plObj ptList)
  39. (princ "\n\nAfter: \n")
  40. (writepoints ptList)  ;for testing purpose
  41. (princ)
  42. ); defun
  43. ;*
  44. ;* WRITEPOINTS: write points (test-purpose)
  45. ;*
  46. (defun writepoints ( plst / x1 y1 ptmp)
  47. (while (setq ptmp (car plst))
  48.    (princ (rtos (car ptmp) 2 3))(princ " ")(princ (rtos (cadr ptmp) 2 3))(princ "\n")
  49.    (setq plst (cdr plst))
  50. )
  51. (princ)
  52. )
  53. ;*
  54. ;* SORTPOINTS: sorts given points along with selected polyline
  55. ;*
  56. (defun sortpoints ( ent lst )
  57. (vl-sort lst
  58.    (function
  59.      (lambda ( a b )
  60.        (<  (vlax-curve-getparamatpoint ent a)
  61.            (vlax-curve-getparamatpoint ent b)
  62.       )
  63.      )
  64.    )
  65. )
  66. )
  67. ;*
  68. ;* GETVERTS: Gives vertex points of selected Polyline.
  69. ;*
  70. (defun getverts (pObj iPt / PtOnObj DistPick DistV1 PtV1 VNum distFlag DistV2 PtV2)
  71. (setq PtOnObj (vlax-curve-getClosestPointTo pObj iPt))
  72. (setq DistPick (vlax-curve-getDistatPoint pObj PtOnObj))
  73. (setq DistV1 0.0)
  74. (setq PtV1 (vlax-curve-getPointatparam pObj 0));;Pl start point
  75. (setq VNum 1.0)
  76. (setq distFlag T)
  77. (while distFlag
  78.    (setq DistV2 (vlax-curve-getDistatParam pObj Vnum))
  79.    (setq PtV2 (vlax-curve-getPointatParam pObj Vnum))
  80.    (if (> DistV2 DistPick)
  81.      (setq DistFlag nil)
  82.      (setq Vnum (+ 1 Vnum) PtV1 PtV2)
  83.    )
  84. )
  85. (list PtV1 PtV2);;returns list of 2 vertices bounding pick point
  86. )

 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:59:44 | 显示全部楼层
由于您的坐标值列表以文字表示,并且仅提供3 d.p.精度,因此vlax curve getparamatpoint函数可能无法识别该点位于给定的多段线实体上;您是否尝试了我建议的第二个函数,该函数使用vlax curve getclosestpointto函数将坐标“捕捉”到多段线?
 
此外,请注意,我已经说过,上述函数需要实体名称参数,而不是VLA对象;vlax曲线-*函数将在这两种类型的参数(ename/vla对象)下正确执行,但是,当在vla对象上提供实体名称时,函数将更快(此外,不需要使用vlax ename->vla对象进行转换)。
 
编辑:仔细检查代码后,在调用我的sortpoints函数后,您没有更新ptList变量的值:
您需要将排序函数返回的值赋给ptList变量:
这一推理适用,因为我们传递的排序函数的值由ptList变量持有,而不是指向变量本身的“指针”(如传递带引号的符号)。
回复

使用道具 举报

2

主题

7

帖子

5

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 17:02:16 | 显示全部楼层
是的,我只是犯了一个很简单的错误。我忘了作业:
  1. 5

 
但它使用vlax curve getclosestpointto函数给出了预期结果,正如您所解释的:
  1. 7

 
非常感谢你
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:17:44 | 显示全部楼层
不客气!
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 17:28:02 | 显示全部楼层
先生
 
我急需这个lisp程序来完成我的紧急工作。我也试过这个程序,但出现如下错误:
 
命令:NK\u FINT
 
选择多段线:
之前:
371118.717 311119.493
371016.444 311267.177
370961.248 310947.465
371083.002 311526.843
371232.353 311705.362
370930.404 311919.585
; 错误:错误的参数类型:lselsetp nil
 
 
这是我谦虚的请求,如果你们有时间,请上传更正了这个程序为我在txt格式。
 
提前谢谢。
顺致敬意,
拉詹·纳提亚尔
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 18:30 , Processed in 0.848610 second(s), 77 queries .

© 2020-2025 乐筑天下

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