找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 878|回复: 7

[求助] 萌新求助关于foreach的用法

[复制链接]

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-3-24 11:53:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 1121443108qaz 于 2018-3-24 11:57 编辑

首先我获得一个plist顶点列表,我想用这个顶点列表创建一个多段线,(foreach n plist (command "polyline" n))我是这样写的哪里有问题呢。有时我的顶点列表并不是首尾一个循环的(正常点列表 12341,我的顶点列表是1234,那么多段线闭合不了),那么我就应该在多段线画完用pedit 闭合一下,用foreach怎么表示。还有就是,用mapcar可以实现吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-3-26 01:05:49 | 显示全部楼层
1121443108qaz 发表于 2018-3-26 00:46
感谢啊,另外,foreach到底是不是我那样用啊,目前没用成功过foreach

foreach没什么难的啊,就是一个循环结构啊

  1. (defun c:tt ()
  2.   (setq lst '(1 2 3 4 5 6 7 8 9))
  3.   (setq i 0)
  4.   (foreach n lst
  5.     ;;依次把lst的每个元素赋值给n
  6.     (princ (strcat "\n表lst第 " (itoa (setq i (1+ i))) " 个元素是:"))
  7.     (princ n)
  8.   )
  9.   (princ)
  10. )



相当于repeat的下面代码:
  1. (defun c:tt ()
  2.   (setq lst '(1 2 3 4 5 6 7 8 9))
  3.   (setq i -1)
  4.   (repeat (length lst)
  5.     (setq v (nth (setq i (1+ i)) lst))
  6.     (princ (strcat "\n表lst第 " (itoa (1+ i)) " 个元素是:"))
  7.     (princ v)
  8.   )
  9.   (princ)
  10. )



相当于while循环的下面代码
  1. (defun c:tt ()
  2.   (setq lst '(1 2 3 4 5 6 7 8 9))
  3.   (setq i 0)
  4.   (while (setq v (car lst))
  5.     (princ (strcat "\n表lst第 " (itoa (setq i (1+ i))) " 个元素是:"))
  6.     (princ v)
  7.     (setq lst (cdr lst))
  8.   )
  9.   (princ)
  10. )



相当于mapcar循环的下面:
  1. (defun c:tt ()
  2.   (setq lst '(1 2 3 4 5 6 7 8 9))
  3.   (setq i 0)
  4.   (mapcar '(lambda (x)
  5.              (princ (strcat "\n表lst第 " (itoa (setq i (1+ i))) " 个元素是:"))
  6.              (princ x)
  7.            )
  8.           lst
  9.   )
  10.   (princ)
  11. )



上面四种循环结构的代码执行的结果都是下面:

命令: tt

表lst第 1 个元素是:1
表lst第 2 个元素是:2
表lst第 3 个元素是:3
表lst第 4 个元素是:4
表lst第 5 个元素是:5
表lst第 6 个元素是:6
表lst第 7 个元素是:7
表lst第 8 个元素是:8
表lst第 9 个元素是:9

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2018-3-24 12:22:55 来自手机 | 显示全部楼层

回帖奖励 +5 D豆

foreach 后面加上(command "c")

点评

懂了,谢谢,你看看楼下我代码哪里出了问题  详情 回复 发表于 2018-3-24 12:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-3-24 12:29:43 | 显示全部楼层
  1. (defun c:tt ()
  2.   (setq ss (ssget)
  3. i  0
  4. j  0
  5.   )
  6.   (while (< i (sslength ss))
  7.     (setq ename (ssname ss i)
  8.    ent (entget ename)
  9.     )
  10.     (setq plist (mapcar 'cdr
  11.    (vl-remove-if '(lambda (x) (/= (car x) 10)) ent)
  12.   )
  13.    lth (length plist)
  14.     )
  15.     (if (= (rem lth 2) 0)
  16.       (setq half (/ lth 2))
  17.       (setq half (/ (+ lth 1) 2))
  18.     )
  19.     (while (< j half)
  20.       (setq plist1 (cons (nth j plist) plist1))
  21.       (setq j (+ j 1))
  22.     )
  23.     (while (< j lth)
  24.       (setq plist2 (cons (nth j plist) plist2))
  25.       (setq j (+ j 1))
  26.     )
  27.     (setq j  0
  28.    fstpt1 (car plist1)
  29.    fstpt2 (car plist2)
  30.     )
  31.     (setq plist1 (cons fstpt1 (reverse plist1))
  32.    plist2 (cons fstpt2 (reverse plist2))
  33.     )
  34.     (foreach n (command "polyline" n))
  35.     (foreach m (command "polyline" m))
  36.     (setq i (+ i 1))
  37.   )
  38. )


为什么我这段代码,plist2没有问题,!plist1却陷入无限循环,我的原意是取一多段线顶点集,把这顶点集分为两半,再对分出的两个顶点集画多段线,这样一个多段线就变成了两个,然后他们合起来和之前的多段线面积是一样的,foreach也有问题,谁能帮我改改呢。尤其是plist1那里,我觉得不会无限循环的啊,要是无限循环了plist2就出不来了,求大神解答
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-3-24 12:31:04 | 显示全部楼层
iLisp 发表于 2018-3-24 12:22
foreach 后面加上(command "c")

懂了,谢谢,你看看楼下我代码哪里出了问题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2018-3-24 13:14:46 | 显示全部楼层
在循环里面,ptlist1,ptlist2用之前要
  1. (setq ptlist1 nil ptlist2 nil)


否则,你处理多个多段线时候,后面多段线就包括前面多段线的数据了。

还有,求后半个表,不比用循环了了,前面半个求出后,用 (cdr (member (last ptlist1) ptlist) 就得到后面的了.

点评

感谢啊,另外,foreach到底是不是我那样用啊,目前没用成功过foreach  详情 回复 发表于 2018-3-26 00:46
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-3-26 00:46:01 来自手机 | 显示全部楼层
Lisphk 发表于 2018-3-24 13:14
在循环里面,ptlist1,ptlist2用之前要



感谢啊,另外,foreach到底是不是我那样用啊,目前没用成功过foreach
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2018-3-29 00:57:08 | 显示全部楼层
学习一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 08:51 , Processed in 0.321547 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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