明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1971|回复: 9

[讨论] 表的比较,以及测绘专业标高的问题

[复制链接]
发表于 2015-4-13 21:47:23 | 显示全部楼层 |阅读模式
本帖最后由 荒野孤行 于 2015-4-16 23:14 编辑

请见图片,表比较的如何用foreach、mapcar写出lisp程序?求指点,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-4-14 17:13:50 | 显示全部楼层
技术不高,代码冗杂,原理应该是这样

  1. (apply
  2. (function(lambda (a b)
  3. (if
  4. (and
  5. (equal (list(car(cadr(car a)))(cadr (cadr(car a )) ))
  6.        (list(car(car b))(cadr (car b )) ))
  7. (equal (list(car(cadr(cadr a)))(cadr (cadr(cadr a )) ))
  8.        (list(car(cadr b))(cadr (cadr b ) )))
  9. (equal (list(car(cadr(caddr a)))(cadr (cadr(caddr a ))) )
  10.        (list(car(caddr b))(cadr (caddr b )) ))
  11. )
  12. (setq c
  13. (list
  14. (list (car(car a)) (car(cadr (car a)))(cadr (cadr(car a))) (caddr (car b)))
  15. (list (car(cadr a)) (car(cadr (cadr a)))(cadr (cadr(cadr a))) (caddr (cadr b)))
  16. (list (car(caddr a)) (car(cadr (caddr a)))(cadr (cadr(caddr a))) (caddr (caddr b)))
  17. )
  18. )
  19. )))
  20. (list
  21. (list
  22. (list 1 '( 1 2 3))
  23. (list 2 '(4 5 6 ))
  24. (list 3 '(7 8 9)))
  25. (list
  26. '( 1 2 3.5)
  27. '(4 5 6.2)
  28. '(7 8 9.8)
  29. '(9 10 9.5)
  30. '(11 12 19.8)))
  31. )


返回结果 ((1 1 2 3.5) (2 4 5 6.2) (3 7 8 9.8))
发表于 2015-4-14 17:18:15 | 显示全部楼层
就是不知道你的两个表长度,确定一个表 是3个元素,第二个表是5个元素就好办了,
直接 (lambda (a b c d e f g h))
发表于 2015-4-15 10:14:37 | 显示全部楼层
本帖最后由 菜卷鱼 于 2015-4-15 10:42 编辑

稍微精简点的

  1. (setq list1(list '(1 (1 2 3))'(2 (4 5 6 )) '(3(7 8 9))))
  2. (setq list2(list '(1 2 3.5) '(4 5 6.2)'(7 8 9.8)'(9 10 9.5)'(11 12 19.8)))

  3. (if
  4. (equal
  5. (reverse
  6. (mapcar '(lambda(x) (cdr(reverse (cadr x)))) list1))
  7. (cdr(cdr
  8. (reverse
  9. (mapcar '(lambda(x) (cdr(reverse  x))) list2))))
  10. )
  11. (mapcar '(lambda(x) (reverse x))
  12. (mapcar 'cons
  13. (mapcar '(lambda(x) (car (reverse x))) list2)
  14. (mapcar '(lambda(x) (cdr(reverse(cons (car x) (cadr x))))) list1)
  15. )))

评分

参与人数 1明经币 +1 金钱 +15 收起 理由
荒野孤行 + 1 + 15 很给力!

查看全部评分

 楼主| 发表于 2015-4-16 23:12:30 | 显示全部楼层
菜卷鱼 发表于 2015-4-15 10:14
稍微精简点的

抱歉,遇见了新的问题,望解答。
附件程序是关于测绘方面导出标高的问题,程序需求及执行步骤为:
1、由用户选取保存dat文件的位置;
2、选取多段线(测绘描述出来的),并将多段线的顶点序号&对应顶点坐标组成表→即一楼图片中的list1;
3、选取名称为gc200的块参照,将块参照的坐标组成表→即一楼图片中的list2;
4、对比list1与list2中的x,y坐标,如果在误差范围内且相同,那么重新组成表list_ok(可见附件lisp源码)→即一楼图片中的输出结果;
5、读取表list_ok,通过mapcar将每个表元素输出到dat文件(就在这里出问题了,list_ok为什么为nil?)

以上,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-4-17 14:05:31 | 显示全部楼层
荒野孤行 发表于 2015-4-16 23:12
抱歉,遇见了新的问题,望解答。
附件程序是关于测绘方面导出标高的问题,程序需求及执行步骤为:
1、由 ...

程序不是通用的,只限于 list2比list1 多两个元素,所以程序里有 (cdr (cdr ......))
发表于 2015-4-17 14:19:40 | 显示全部楼层
荒野孤行 发表于 2015-4-16 23:12
抱歉,遇见了新的问题,望解答。
附件程序是关于测绘方面导出标高的问题,程序需求及执行步骤为:
1、由 ...

  1. ;;;*****导出多段线顶点坐标 程序开始*****
  2. (defun c:t1 (/ entnam dwg)
  3.   (setvar "cmdecho" 0)
  4.   (princ "\n★功能:导出多段线顶点坐标至文本文件.\n")
  5.   (setq nam (rtos (* (getvar "cdate") 1E8)))
  6.   (setq ffn (getfiled "指定文件存储路径及文件名" nam "dat" 1))
  7.   (setq ff (open ffn "w"))
  8.   (close ff)
  9.   (princ "\n选取要导出标高的多段线:")
  10.   (setq ss (ssget '((0 . "POLYLINE,LWPOLYLINE"))))
  11.   (princ "\n选取要导出标高的多段线顶点处的块参照:")
  12.   (setq ss_block (ssget '((0 . "INSERT") (2 . "GC200"))))
  13.   (setq  m 0
  14.   i 0
  15.   list_block
  16.    nil
  17.   )
  18.   (setvar "pdmode" 35)
  19.   (vl-load-com)
  20.   (repeat (sslength ss_block)
  21.     (setq ent_block  (ssname ss_block m)
  22.     data_block (entget ent_block)
  23.     pt_block   (cdr (assoc 10 data_block))
  24.     list_block (cons pt_block list_block)
  25.     )
  26.     (setq m (1+ m))
  27.   )
  28.   (setq ff (open ffn "a"))
  29.   (princ "Y坐标 X坐标 Z坐标\n" ff)
  30.   (close ff)
  31.   (repeat (sslength ss)
  32.     (setq entnam  (ssname ss i)
  33.     obj    (vlax-ename->vla-object entnam)
  34.     pt_list nil
  35.     list_ok nil
  36.     )
  37.     (setq j -1)
  38.     (while (setq pp (vlax-curve-getpointatparam obj (setq j (1+ j))))
  39.       (setq pt_list (cons (list (+ j 1) pp) pt_list))
  40.     )


  41. (if (= nil (vl-position "nil"
  42. (mapcar '(lambda(a b) (equal a b 0.01))
  43. (mapcar '(lambda(x) (cdr(reverse (cadr x)))) pt_list)
  44. (mapcar '(lambda(x) (cdr(reverse  x))) list_block))))
  45. (setq list_ok
  46. (mapcar '(lambda(x) (reverse x))
  47. (mapcar 'cons
  48. (mapcar '(lambda(x) (car (reverse x))) list_block)
  49. (mapcar '(lambda(x) (cdr(reverse(cons (car x) (cadr x))))) pt_list)
  50. ))))



  51.     (setq ff (open ffn "a"))
  52.     (mapcar '(lambda (x)
  53.          (princ (strcat (itoa (car x))
  54.             " "
  55.             (rtos (cadr x) 2 4)
  56.             " "
  57.             (rtos (caddr x) 2 4)
  58.             " "
  59.             (rtos (last x) 2 4)
  60.           )
  61.           ff
  62.          )
  63.        )
  64.       list_ok
  65.     )
  66.     (setq i (1+ i))
  67.     (princ (strcat "↑第 " (itoa i) " 条多段线对应的顶点导出完毕。\n")
  68.      ff
  69.     )
  70.     (princ "\n" ff)
  71.     (close ff)
  72.   )
  73.   (princ (strcat "\n文件已保存至:" ffn))
  74.   (princ)
  75. )
  76. ;;;*****导出多段线顶点坐标 程序结束*****

 楼主| 发表于 2015-4-17 22:25:27 | 显示全部楼层
菜卷鱼 发表于 2015-4-17 14:05
程序不是通用的,只限于 list2比list1 多两个元素,所以程序里有 (cdr (cdr ......))

那个我看到了,貌似我已经改了的吧。。。
 楼主| 发表于 2015-4-17 22:44:07 | 显示全部楼层
本帖最后由 荒野孤行 于 2015-4-17 23:50 编辑
菜卷鱼 发表于 2015-4-17 14:19

非常感谢!可以了。
另:重新修改了下,把list_ok表reverse了下,加了\n,对应转出数据有了对应的描述。
  1. ;;;*****导出多段线顶点坐标 程序开始*****
  2. (defun c:t1 (/ entnam dwg)
  3.   (setvar "cmdecho" 0)
  4.   (princ "\n★功能:导出多段线顶点坐标至文本文件.\n")
  5.   (setq nam (rtos (* (getvar "cdate") 1E8)))
  6.   (setq ffn (getfiled "指定文件存储路径及文件名" nam "dat" 1))
  7.   (setq ff (open ffn "w"))
  8.   (close ff)
  9.   (princ "\n选取要导出标高的多段线:")
  10.   (setq ss (ssget '((0 . "POLYLINE,LWPOLYLINE"))))
  11.   (princ "\n选取要导出标高的多段线顶点处的块参照:")
  12.   (setq ss_block (ssget '((0 . "INSERT") (2 . "GC200"))))
  13.   (setq  m 0
  14.   i 0
  15.   list_block
  16.    nil
  17.   )
  18.   (setvar "pdmode" 35)
  19.   (vl-load-com)
  20.   (repeat (sslength ss_block)
  21.     (setq ent_block  (ssname ss_block m)
  22.     data_block (entget ent_block)
  23.     pt_block   (cdr (assoc 10 data_block))
  24.     list_block (cons pt_block list_block)
  25.     )
  26.     (setq m (1+ m))
  27.   )
  28.   (setq ff (open ffn "a"))
  29.   (princ "顶点坐标的序号 X坐标 Y坐标 Z坐标\n" ff)
  30.   (close ff)
  31.   (repeat (sslength ss)
  32.     (setq entnam  (ssname ss i)
  33.     obj    (vlax-ename->vla-object entnam)
  34.     pt_list nil
  35.     list_ok nil
  36.     )
  37.     (setq j -1)
  38.     (while (setq pp (vlax-curve-getpointatparam obj (setq j (1+ j))))
  39.       (setq pt_list (cons (list (+ j 1) pp) pt_list))
  40.     )


  41.     (if
  42.       (=
  43.   nil
  44.   (vl-position
  45.     "nil"
  46.     (mapcar '(lambda (a b) (equal a b 0.01))
  47.       (mapcar '(lambda (x) (cdr (reverse (cadr x)))) pt_list)
  48.       (mapcar '(lambda (x) (cdr (reverse x))) list_block)
  49.     )
  50.   )
  51.       )
  52.        (setq list_ok
  53.         (reverse
  54.     (mapcar
  55.       '(lambda (x) (reverse x))
  56.       (mapcar
  57.         'cons
  58.         (mapcar '(lambda (x) (car (reverse x))) list_block)
  59.         (mapcar
  60.           '(lambda (x) (cdr (reverse (cons (car x) (cadr x)))))
  61.           pt_list
  62.         )
  63.       )
  64.     )
  65.         )
  66.        )
  67.     )
  68.     (setq ff (open ffn "a"))
  69.     (mapcar '(lambda (x)
  70.          (princ (strcat (itoa (car x))
  71.             ","
  72.             (rtos (cadr x) 2 4)
  73.             ","
  74.             (rtos (caddr x) 2 4)
  75.             ","
  76.             (rtos (last x) 2 4)
  77.             "\n"
  78.           )
  79.           ff
  80.          )
  81.        )
  82.       list_ok
  83.     )
  84.     (setq i (1+ i))
  85.     (princ (strcat "↑第 " (itoa i) " 条多段线对应的顶点导出完毕。\n")
  86.      ff
  87.     )
  88.     (princ "\n" ff)
  89.     (close ff)
  90.   )
  91.   (princ (strcat "\n文件已保存至:" ffn))
  92.   (princ)
  93. )
  94. ;;;*****导出多段线顶点坐标 程序结束*****
发表于 2016-1-16 15:35:38 | 显示全部楼层
试了一下:1、x、y坐标跟你输出表格里面的相反。2、高程数据跟线方向恰好相反。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 09:39 , Processed in 0.286366 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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