csalh 发表于 2013-11-21 08:03:16

怎么提取表中相同两个坐标之间的坐标

各位大侠帮帮忙,我这里有一个表((500039.0 299990.0) (500056.0 299987.0) (500053.0 299975.0) (500044.0 299968.0) (500039.0 299990.0) (500056.0 299987.0) (500070.0 299991.0)
(500070.0 299983.0) (500053.0 299975.0) (500056.0 299987.0) (500070.0 299991.0)
(500084.0 299991.0) (500084.0 299968.0) (500069.0 299968.0) (500070.0 299983.0)
(500070.0 299991.0))

我想把其中红色的两个坐标和中间的坐标提成一个表,黄色的提成一个表,绿色的提成一个表,红色的 (500039.0 299990.0) (500056.0 299987.0) (500053.0 299975.0) (500044.0 299968.0) (500039.0 299990.0)   。
黄色的(500056.0 299987.0) (500070.0 299991.0) (500070.0 299983.0) (500053.0 299975.0) (500056.0 299987.0)
绿色的(500070.0 299991.0) (500084.0 299991.0) (500084.0 299968.0) (500069.0 299968.0) (500070.0 299983.0) (500070.0 299991.0)

我应该怎么样做呀,谢谢!!!

ZZXXQQ 发表于 2013-11-21 08:09:30

最终的结果是什么样的呢?是单个的表,还是分别的表?

ll_j 发表于 2013-11-21 08:12:48

还有什么其它的条件么,表原本是没有颜色的。
仅仅求两个子表之间的内容,就顺序读过去,遇到第一个子表开始记录,遇到第二个子表结束记录。

倔强的蚂蚁 发表于 2013-11-21 08:46:53

我有个思路,大概是这样
假设表为(x y 1 2 3 y z)
用member,提取得到 y 以后的表即 (y 1 2 3 y z)
用cdr 去掉第一个 y 得到 (1 2 3 y z)
用reverse 倒置上表得到 (z y 3 2 1)
再用member,提取得到 y 以后的表即 (y 3 2 1)
用cdr去掉第一个 y 以后得到新表(3 2 1)
最后用reverse倒置该表得到最终表(1 2 3)

csalh 发表于 2013-11-21 08:49:18

ZZXXQQ 发表于 2013-11-21 08:09
最终的结果是什么样的呢?是单个的表,还是分别的表?

分别的三个表,因为我要把坐标提取到text文件内,把这三个表分成三个部分,

llsheng_73 发表于 2013-11-21 18:25:23

本帖最后由 llsheng_73 于 2013-11-26 13:58 编辑

(defun xxxx(lst / a b c s)
(setq a(car lst)lst(cdr lst) s (list a))
(while (/=(vl-princ-to-string(setq b(car lst)))(vl-princ-to-string a))
    (setq s(append s(list b))lst(cdr lst)))
(setq s(append s(list(car lst)))
lst(cdr lst)
a(car lst)lst(cdr lst) s1 (list a))
(while (/=(vl-princ-to-string(setq b(car lst)))(vl-princ-to-string a))
    (setq s1(append s1(list b))lst(cdr lst)))
(setq s1(append s1(list(car lst)))
lst(cdr lst)
a(car lst)lst(cdr lst) s2 (list a))
(while (/=(vl-princ-to-string(setq b(car lst)))(vl-princ-to-string a))
    (setq s2(append s2(list b))lst(cdr lst)))
(setq s2(append s2(list a)))
(list s s1 s2)
)

;xxxx可以任意改为你喜欢的,表被分成三段返回为一个表(list s s1 s2) s((500039.0 299990.0)...(500039.0 299990.0))s1((500056.0 299987.0)...(500056.0 299987.0))s2((500070.0 299991.0) ...(500070.0 299991.0))
不知道能不能满足楼主需求

nzl1116 发表于 2013-11-21 18:52:28

本帖最后由 nzl1116 于 2013-11-21 19:13 编辑


<BLOCKQUOTE>(defun myfunc (Lst / Lst0 Lst1 var Lst2)
(setq Lst0 nil)
(while (setq Item (car Lst))
    (setq Lst1 nil)
    (if (setq Lst2 (vl-member-if
       '(lambda (x)
   (setq var (equal x item))
   (if (not var)
   (setq Lst1 (cons x Lst1))
   )
   var
      )
       (cdr Lst)
   )
)
      (setq Lst(cdr Lst2)
   Lst0 (cons (reverse Lst1) Lst0)
      )
      (setq Lst (cdr Lst))
    )
)
(reverse Lst0)
)

csalh 发表于 2013-11-26 07:40:57

nzl1116 发表于 2013-11-21 18:52 static/image/common/back.gif


谢谢了,,

csalh 发表于 2013-11-26 13:13:26

llsheng_73 发表于 2013-11-21 18:25 static/image/common/back.gif
不知道能不能满足楼主需求

谢了,我先看看,,
页: [1]
查看完整版本: 怎么提取表中相同两个坐标之间的坐标