明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 664|回复: 9

[测绘] 请教高手,排序问题

[复制链接]
发表于 2021-4-17 06:19 | 显示全部楼层 |阅读模式
   (princ "\n gao_lst2=") (princ gao_lst2)
    (setq  gao_lst2 (vl-sort                 
            (mapcar '(lambda(x)
                (abs (- dx (vlax-curve-getDistAtPoint obj (list (car (nth 0 x)) (cadr (nth 0 x))))))) gao_lst2)
               '<)
      )

上面的程序执行结果如下:
gao_lst2=((513692.0 322764.0 27.489) (513690.0 322742.0 27.522) (513683.0
322741.0 27.153) (513683.0 322762.0 27.754)); 错误: 参数类型错误: consp 513692.0

dx是桩号,这是在曲线上按照当前位置求最近两个点的坐标,请高手指教,哪里出现了错误,谢谢!
发表于 2021-4-17 07:53 | 显示全部楼层
将:(vlax-curve-getDistAtPoint obj (list (car (nth 0 x)) (cadr (nth 0 x))))
改为:(vlax-curve-getDistAtPoint obj (list (car x) (cadr x)))
 楼主| 发表于 2021-4-17 11:53 | 显示全部楼层
yshf 发表于 2021-4-17 07:53
将:(vlax-curve-getDistAtPoint obj (list (car (nth 0 x)) (cadr (nth 0 x))))
改为:(vlax-curve-getDi ...

多谢指点,把X看作表中的一项而不是表。这样改完,排序的问题解决了,为啥返回值不是原来的坐标列表,而是一组数值。
gao_lst2=(2.04546 23.919 31.4152 52.8976)

应当返回如下这个格式才对,只不过要求点的位置顺序改变而已。
gao_lst2=((513692.0 322764.0 27.489) (513690.0 322742.0 27.522) (513683.0
322742.0 27.153) (513683.0 322763.0 27.754))。
多谢!
发表于 2021-4-17 15:24 | 显示全部楼层
正确的提问应该是发一段别人能跑的代码,gao_lst2的值什么,obj是什么,dx又是什么。排序依据又是什么
发表于 2021-4-17 17:34 | 显示全部楼层
gslee 发表于 2021-4-17 11:53
多谢指点,把X看作表中的一项而不是表。这样改完,排序的问题解决了,为啥返回值不是原来的坐标列表,而 ...

;返回沿曲线上距起点距离由小到大的的排序(不改变gao_lst2中点的坐标值,只是按要求改变了顺序)
(setq gao_lst2 (vl-sort gao_lst2
                        '(lambda(a b)
                              (< (vlax-curve-getDistAtPoint obj (list (car a) (cadr a)))
                                 (vlax-curve-getDistAtPoint obj (list (car b) (cadr b)))
                              )
                         )
              )
)
 楼主| 发表于 2021-4-17 23:51 | 显示全部楼层
yshf 发表于 2021-4-17 17:34
;返回沿曲线上距起点距离由小到大的的排序(不改变gao_lst2中点的坐标值,只是按要求改变了顺序)
(setq g ...

多谢您的指点!其实我是想在已知桩点坐标列表(gao_lst2)里找到距离多段线上某个桩点DX(这个桩号是变量)距离最近的两个桩号的点坐标,不是距离起点最近的两个桩号点坐标,obj为桩点所在曲线的实体名。有一点还是不明白,点表排序后的返回值,为啥不是点表?这个返回值是不是排序点的桩号与DX那个点的桩号的差值?我还想返回值是点表怎么操作?谢谢!
 楼主| 发表于 2021-4-18 00:02 | 显示全部楼层
tryhi 发表于 2021-4-17 15:24
正确的提问应该是发一段别人能跑的代码,gao_lst2的值什么,obj是什么,dx又是什么。排序依据又是什么

谢谢!一条多段线上(LWPOLYLINE),有的节点有高程,有的节点无高程,我想依据有高程的点把无高程的点都内插出高程值,最终画出3Dpoly。gao_lst2是曲线上已知坐标高程节点的列表,DX是曲线上某个未知高程节点的桩号,obj为桩点所在曲线的实体名,排序依据是找到距离DX最近的两个点。谢谢!
发表于 2021-4-18 02:42 | 显示全部楼层
学习点知识
发表于 2021-4-18 08:12 | 显示全部楼层
gslee 发表于 2021-4-17 23:51
多谢您的指点!其实我是想在已知桩点坐标列表(gao_lst2)里找到距离多段线上某个桩点DX(这个桩号是变量 ...

(setq gao_lst2 (vl-sort (mapcar '(lambda(pt)
                                     ;表gao_lst2中各点里程
                                     (setq lcz (vlax-curve-getDistAtPoint obj (list (car pt) (cadr pt))))
                                     ;各点里程与里程dx差值的绝对值
                                     (setq dx-pt (abs (- lcz dx)))
                                     ;组成新表:'((里程差值绝对值1 点1) (里程差值绝对值2 点2) ... )
                                     (list dx-pt pt)
                                 )
                                 gao_lst2
                         )
                         ;按与里程DX差值绝对值由小到大排序
                        '(lambda(a b)(< (car a) (car b)))
                )
)
;如果只想得到排序后坐标值,不需要与里程DX差值绝对值,则如下操作
;(setq gao_lst2 (mapcar 'cadr gao_lst2))
 楼主| 发表于 2021-4-18 20:46 | 显示全部楼层
yshf 发表于 2021-4-18 08:12
(setq gao_lst2 (vl-sort (mapcar '(lambda(pt)
                                     ;表gao_lst2中各 ...

多谢您的指点!这回对vl-sort函数的用法理解的更深一步了。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-4 23:22 , Processed in 0.254296 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表