找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1722|回复: 17

[讨论]:选择集的一个奇怪的问题

[复制链接]
发表于 2006-5-23 20:54:48 | 显示全部楼层 |阅读模式

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

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

×
  1. [FONT=courier new]
  2. ;两个选择集的并集.
  3. (defun ssu(ss1 ss2 / n item)
  4. (setq n 0)
  5. (while (setq item(ssname ss1 n))
  6. (setq ss2(ssadd item ss2))
  7. (setq n(1+ n))
  8. ))

  9. 操作(setq a(ssu ss1 ss2)后,A=SS1+SS2,而SS2居然也变了,SS2=SS1+SS2!!!
  10. 为什么?[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 7348个

财富等级: 富甲天下

发表于 2006-5-23 21:18:25 | 显示全部楼层
(setq ss2(ssadd item ss2)) = (ssadd item ss2)

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

使用道具 举报

发表于 2006-5-23 21:43:37 | 显示全部楼层
参数交叉当然就会改变ss2了.而且本身程序就不是要使用返回值使用,..
(defun ssu(ss1 ss2 / n item )
(setq n 0)
(setq tmp(ssadd))
(while (setq item(ssname ss1 n))
(setq n(1+ n))
(ssadd item tmp)
)
(setq n 0)
(while (setq item(ssname ss2 n))
(setq n(1+ n))
(ssadd item tmp)
)
)
操作(setq a(ssu ss1 ss2)后,A=SS1+SS2,?很怀疑你到底怎么做的?原来的那个程序能返回正确的合集?原来的应该是A返回的是ss1的数量,也就是原来程序中的n,,,,,

怎么越想原来的程序越不对啊?原来的程序如何返回结果?利用ss2?形参和实参呢?如果我用(ssu a b)能正确返回b为合并的集?,,,,,

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

使用道具 举报

发表于 2006-5-24 00:09:09 | 显示全部楼层

Re: [讨论]:选择集的一个奇怪的问题

最初由 LADESIGNER 发布
[B];两个选择集的并集.
(defun ssu(ss1 ss2 / n item)
(setq n 0)
(while (setq item(ssname ss1 n))
(setq ss2(ssadd item ss2))
(setq n(1+ n))
)

操作(setq a(ssu ss1 ss2)后,A=SS1+SS2,而SS2居然也变了,SS... [/B]

简化版:
  1. [FONT=courier new];;;两个选择集的并集.
  2. (defun ssu (ss1 ss2 / ss)
  3.   (command "select" ss1 ss2 "")
  4.   (setq ss (ssget "p"))
  5.   ss
  6. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2006-5-24 07:52:40 | 显示全部楼层
把你的函数定义改成
(defun ssu(m_ss1 m_ss2 / ...)
.....
)
试试ss2变不变。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-24 12:03:01 | 显示全部楼层

Re: [讨论]:选择集的一个奇怪的问题

最初由 LADESIGNER 发布
[B];两个选择集的并集.
(defun ssu(ss1 ss2 / n item)
(setq n 0)
(while (setq item(ssname ss1 n))
(setq ss2(ssadd item ss2))
(setq n(1+ n))
)

操作(setq a(ssu ss1 ss2)后,A=SS1+SS2,而SS2居然也变了,SS... [/B]


;测试是否是参数交叉了的问题.
(setq ss1(ssget) ss2(ssget) t1 ss1 t2 ss2)
(setq a(ssu t1 t2))   ;这下跟 ss1 ss2 无关了吧?
--------------------运行后的结果还是-----SS2变了,SS2= SS1+ SS2!!

明白为什么要用"SLECT"命令了。只能说明选择集跟其他数据类型不同,包含同样内容的选择集只能有一个。在函数SSU中,(ssadd item ss2)改变了SS2,执行完后形成了一个新选择集=SS1+SS2,注意SSADD操作的对象是SS2!不管是形参也罢实参也罢最后都指向了一个东西!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-24 13:03:07 | 显示全部楼层
最初由 LADESIGNER 发布
[B][QUOTE]最初由 LADESIGNER 发布
[B];两个选择集的并集.
(defun ssu(ss1 ss2 / n item)
(setq n 0)
(while (setq item(ssname ss1 n))
(setq ss2(ssadd item ss2))
(setq n(1+ n))
)

操作(setq a(ss... [/B]


参数要设好,但还是复杂了:
  1. [FONT=courier new];;;两个选择集的并集.
  2. (defun ssu (ss1 ss2 / n ss item)
  3.   (setq        n  -1
  4.         ss ss2
  5.   )
  6.   (while (setq item (ssname ss1 (setq n (1+ n))))
  7.     (setq ss (ssadd item ss))
  8.   )
  9.   ss
  10. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-24 14:53:27 | 显示全部楼层
最初由 winabcd 发布
[B]把你的函数定义改成
(defun ssu(m_ss1 m_ss2 / ...)
.....
)
试试ss2变不变。 [/B]


关键一个问题,,,你检查最后返回的a的值了吗?楼上改的程序你注意看没有?都改了程序顺序,,,,,,,,,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-24 18:24:31 | 显示全部楼层
最初由 xyp1964 发布
[B][QUOTE]最初由 LADESIGNER 发布
[B][QUOTE]最初由 LADESIGNER 发布
[B];两个选择集的并集.
(defun ssu(ss1 ss2 / n item)
(setq n 0)
(while (setq item(ssname ss1 n))
(setq ss2(ssadd item s... [/B]


测试斑竹改过的程序,同样的第二个选择集还是改变了.

用斑竹提供的SSU函数:
(setq s1(ssget) s2 (ssget))
(setq a(ssu s1 s2))

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

使用道具 举报

发表于 2006-5-24 18:31:37 | 显示全部楼层
直接用扩展函数:
(acet-ss-union (list ss1 ss2))
Combines two selection sets 返回 ss1 ss2 的并集
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-24 19:13:54 | 显示全部楼层
再罗嗦点:
  1. [FONT=courier new](defun ssu (ss1 ss2 / n ss item)
  2.   (setq        n  -1
  3.         ss (ssadd)
  4.   )
  5.   (while (setq item (ssname ss1 (setq n (1+ n))))
  6.     (setq ss (ssadd item ss))
  7.   )
  8.   (setq n -1)
  9.   (while (setq item (ssname ss2 (setq n (1+ n))))
  10.     (setq ss (ssadd item ss))
  11.   )
  12.   ss
  13. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-25 01:29:43 | 显示全部楼层

  1. (defun ssU (sslst / ss a)
  2.   (defun ss2lst (ss / i lst)
  3.     (setq i -1)
  4.     (while (setq e (ssname ss (setq i(1+ i))))
  5.        (setq lst (cons e lst))
  6.     )
  7.   )
  8.   (setq ss (ssadd))
  9.   (foreach x sslst(if (setq a (ss2lst x))(foreach y a (ssadd y ss))))
  10.   ss
  11. )
  12. ;;测试
  13. (defun c:tt ()
  14.   (setq ss1 (ssget))
  15.   (setq ss2 (ssget))
  16.   (setq ss3 (ssget))
  17.   (setq ss (ssu (list ss1 ss2 ss3)))
  18. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2006-5-25 07:36:08 | 显示全部楼层
合并两个选择集的方法很多,楼主提出的问题主要是因为他在主函数与子函数中用了同样的变量名来传递数据,并在子函数中改变了其中一个变量的值(SS2),这样的改变会被返回到主函数中,所以他在主函数中发现选择集(SS2)也发生了变化。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-26 18:40:11 | 显示全部楼层
最初由 winabcd 发布
[B]合并两个选择集的方法很多,楼主提出的问题主要是因为他在主函数与子函数中用了同样的变量名来传递数据,并在子函数中改变了其中一个变量的值(SS2),这样的改变会被返回到主函数中,所以他在主函数中发现选择集(S... [/B]


你最好测试一下再发表意见,绝对不是这个原因.

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2006-5-27 17:41:36 | 显示全部楼层
问题的关键是:
ssadd ssdel ,是不要赋值的(址传递)

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 04:18 , Processed in 0.499735 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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