gslee 发表于 2021-4-17 06:19:15

请教高手,排序问题

   (princ "\n gao_lst2=") (princ gao_lst2)
    (setqgao_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是桩号,这是在曲线上按照当前位置求最近两个点的坐标,请高手指教,哪里出现了错误,谢谢!

yshf 发表于 2021-4-17 07:53:49

将:(vlax-curve-getDistAtPoint obj (list (car (nth 0 x)) (cadr (nth 0 x))))
改为:(vlax-curve-getDistAtPoint obj (list (car x) (cadr x)))

gslee 发表于 2021-4-17 11:53:36

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))。
多谢!

tryhi 发表于 2021-4-17 15:24:12

正确的提问应该是发一段别人能跑的代码,gao_lst2的值什么,obj是什么,dx又是什么。排序依据又是什么

yshf 发表于 2021-4-17 17:34:32

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)))
                              )
                       )
              )
)

gslee 发表于 2021-4-17 23:51:18

yshf 发表于 2021-4-17 17:34
;返回沿曲线上距起点距离由小到大的的排序(不改变gao_lst2中点的坐标值,只是按要求改变了顺序)
(setq g ...
多谢您的指点!其实我是想在已知桩点坐标列表(gao_lst2)里找到距离多段线上某个桩点DX(这个桩号是变量)距离最近的两个桩号的点坐标,不是距离起点最近的两个桩号点坐标,obj为桩点所在曲线的实体名。有一点还是不明白,点表排序后的返回值,为啥不是点表?这个返回值是不是排序点的桩号与DX那个点的桩号的差值?我还想返回值是点表怎么操作?谢谢!

gslee 发表于 2021-4-18 00:02:48

tryhi 发表于 2021-4-17 15:24
正确的提问应该是发一段别人能跑的代码,gao_lst2的值什么,obj是什么,dx又是什么。排序依据又是什么

谢谢!一条多段线上(LWPOLYLINE),有的节点有高程,有的节点无高程,我想依据有高程的点把无高程的点都内插出高程值,最终画出3Dpoly。gao_lst2是曲线上已知坐标高程节点的列表,DX是曲线上某个未知高程节点的桩号,obj为桩点所在曲线的实体名,排序依据是找到距离DX最近的两个点。谢谢!

sunwei2009 发表于 2021-4-18 02:42:50

学习点知识

yshf 发表于 2021-4-18 08:12:51

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))

gslee 发表于 2021-4-18 20:46:54

yshf 发表于 2021-4-18 08:12
(setq gao_lst2 (vl-sort (mapcar '(lambda(pt)
                                     ;表gao_lst2中各 ...

多谢您的指点!这回对vl-sort函数的用法理解的更深一步了。谢谢!
页: [1]
查看完整版本: 请教高手,排序问题