找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6205|回复: 49

[求助] [求助]:請教:怎樣判斷兩個選擇集是否相等?

  [复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2005-10-17 14:44:20 | 显示全部楼层 |阅读模式

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

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

×
各位高人,請教:
怎樣判斷兩個選擇集是否相等?
如:(setq ss1 (ssget  (list  (cons 0 "LINE,ARC,*POLYLINE"))))
(setq ss2 (ssget  (list  (cons 0 "LINE,ARC,*POLYLINE"))))
如果兩框選的區域是同一個區域,則應有SS1=SS2.
但是用(=  SS1 SS2)時返回nil.
請問如何比較?
(我選擇時,兩次框的區域可能不一樣大,但是包含的實體是一樣多的.另外,有沒有辦法在求ss1時(setq ss1 (ssget  (list  (cons 0 "LINE,ARC,*POLYLINE")))),將框選的對角頂點坐標求出來,供求ss2時調用?)

(通過以下測試,應該不是兩次框選區域不同引起的.
(setq c (getstring "\n請输入要聚合的层名<或回車點選要聚合的層中的任一實體>:"))
(setq ss1 (ssget "x" (list (cons 8 c) (cons 0 "LINE,ARC,*POLYLINE")))
  ss3 (ssget "x" (list (cons 8 c) (cons 0 "LINE,ARC,*POLYLINE")))
          )
(= SS1 SS3)返回NIL,希望大家幫忙)

以下是否可以当做总结?by xyp1964[/COLOR]
  1. [FONT=courier new];;;判断选择集ss1与ss2是否完全相同
  2. (defun comp-ss (ss1 ss2 / ss3)
  3.   (if (and ss1 ss2)
  4.     (progn
  5.       (command "select" ss1 ss2 "")
  6.       (setq ss3 (ssget "P"))
  7.       (if (and (= (sslength ss1) (sslength ss3))
  8.                (= (sslength ss2) (sslength ss3))
  9.           )
  10.         (princ "\n两选择集完全相同!")
  11.         (princ "\n两选择集不相同!")
  12.       )
  13.     )
  14.     (princ"\不存在要对比的选择集!")
  15.   )
  16. )
  17. (princ)[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-10-17 18:08:45 | 显示全部楼层
  1. [FONT=courier new](load "xyp_lib")
  2. ;|加载通用函数(可在签名栏直接下载)
  3. 如果已经下载xyp_lib并放到搜索路径下可以不再下载!
  4. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  5. ★1·在acad.lsp中增加(load"xyp_lib")
  6. ■2·在每个程序内增加(load"xyp_lib")
  7. ■3·在command下,输入(load"xyp_lib")
  8. ■4·在菜单.mnl中增加(load"xyp_lib")
  9. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  10. [COLOR=red] ★通用函数下载地址:[/COLOR]
  11. [url]http://www.xdcad.net/forum/attachment.php?s=&postid=1606661[/url]
  12. [url]http://www.mjtd.com/bbs/dispbbs.asp?boardID=3&ID=37554&page=1[/url]|;

  13. (defun c:test ()
  14.   (setq ss1 (ssget (list (cons 0 "LINE,ARC,*POLYLINE"))))
  15.   (setq ss2 (ssget (list (cons 0 "LINE,ARC,*POLYLINE"))))
  16.   (setq ss3 (SSUNION ss1 ss2));ss1与ss2合并
  17.   (if (and (= (sslength ss1) (sslength ss3));ss1与ss3的数量相等
  18.            (= (sslength ss2) (sslength ss3));ss2与ss3的数量相等
  19.       )
  20.     t
  21.     nil
  22.   )
  23. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-17 21:05:19 | 显示全部楼层
  1. (defun testss (s1 s2 / sl1 sl2 m tf)
  2.   (if (= (setq sl1 (sslength s1))
  3.          (setq sl2 (sslength s2))
  4.       )
  5.     (progn
  6.       (setq m 0 tf t)
  7.       (while (and tf (< m 0))
  8.         (if (equal (ssname s1 m)
  9.                    (ssname s2 m)
  10.             )
  11.           (setq m (1+ m))
  12.           (setq tf nil)
  13.         )
  14.       )
  15.     )
  16.   )
  17.   tf
  18. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-17 22:55:42 | 显示全部楼层
如果没有设置选择排序,两次选择实体集的实体排序可能是不相同的。另,(< m 0)有误

还可以这样

  1.   [FONT=courier new]
  2. ;; (testss (ssget)(ssget))
  3. (defun testss (s1 s2 / sl1 sl2 tf)
  4.   (if (= (setq sl1 (sslength s1))
  5.          (setq sl2 (sslength s2))
  6.       )
  7.     (progn
  8.       (setq tf T)
  9.       (while (and tf (>= (setq sl1(1- sl1)) 0))
  10.         (ssadd  (ssname s1 sl1)s2)
  11.         (setq tf (= sl2 (sslength s2)))
  12.       )
  13.       tf
  14.     )
  15.   )
  16. )
  17.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-17 22:58:33 | 显示全部楼层
开始想写两个 Handle 构造表比较的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-17 23:31:09 | 显示全部楼层
handle或ename表都可,分别得到两个表(slst1 slst2)后
(and (= (length slst1)(length slst2))
    (apply 'and (mapcar '(lambda(x)(member x slst2)) slst1))
)
判断即可
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-18 08:40:34 | 显示全部楼层
高手们都讲了如何比较两选集是否内容相同..讲的很好..
我也拿我以前写的一个来
[PHP]
(defun hy_samess(ss1 ss2 / aass1 i)
  (setq ok_no "ok")
  (if (/= (sslength ss1) (SSlength ss2)) (setq ok_no "no")
      (progn
  (setq i 0)
  (while (< i (sslength ss1))
    (setq aass1 (ssname ss1 i))
    (if (= (ssmemb aass1 ss2) nil) (setq ok_no "no"))
    (setq i (1+ i))
    )
    )
  ) ok_no
  );;;; the end
[/PHP]
关于如何取得选择集建立的方法(將框選的對角頂點坐標求出來)可以看一下SSNAMEX功能的介绍...
(SETQ SS (SSGET)) (SSNAMEX SS)
1....当选择集是以点取方式取得.可能返回( (1 <对象名称>) (0 <碰选点坐标>))这样一个列表
2....当选择集是以WINDOWS WPOLYGON 等多选方式建立 可能返回 ((2 <对象名称1> 0  -1)
(2 <对象名称2> 0  -1)......(-1 (0 <多选坐标点一>) (0 <多选坐标点二>) ........)))
3....当以篱选方式..(4 <对象1> 0 (0 (篱选与对象1交点1))(0 (交点2))..(4 <对象2)............))
4.....如果以CROSS方式则关键字为3..自己可以去试一下...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-18 09:51:46 | 显示全部楼层
问题的实质:判断两个子集并集的元素数量是否与子集的分别相等。
  1. [FONT=courier new](defun comp-ss        (ss1 ss2 / ss3)
  2.   (command "select" ss1 "a" ss2 "")
  3.   (setq ss3 (ssget "P"))
  4.   (if (and (= (sslength ss1) (sslength ss3))
  5.            (= (sslength ss2) (sslength ss3))
  6.       )
  7.     t
  8.     nil
  9.   )
  10. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-18 12:15:32 | 显示全部楼层
用 select 命令最简单了,如果(command ".select" ss1 "r" ss2  "") 再次 (ssget "P") 为空的时候就是相等了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-18 12:29:26 | 显示全部楼层
最初由 eachy 发布
[B]用 select 命令最简单了,如果(command ".select" ss1 "r" ss2  "") 再次 (ssget "P") 为空的时候就是相等了。 [/B]


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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-18 12:31:11 | 显示全部楼层
上一个选择集就说明相等了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-18 12:59:14 | 显示全部楼层
最初由 eachy 发布
[B]用 select 命令最简单了,如果(command ".select" ss1 "r" ss2  "") 再次 (ssget "P") 为空的时候就是相等了。 [/B]

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2005-10-18 13:26:23 | 显示全部楼层
十分感謝各位的指點!終於搞定了一個難題.再次感謝!
(但是,如果有一個選擇集爲空時,各位程序運行提示出錯,因爲 (setq ss1 (ssget "x" (list (cons 8 c) (cons 0 "LINE,ARC,*POLYLINE"))))
  (setq ss2 (ssget "x" (list (cons 8 c) (cons 0 "LINE,ARC"))))有可能是空.)

我編的程序一個小程序如下,作用是將某層上的實體連成多義線,並判斷過其是否閉合.原本是先判斷是否SS1=SS2後再用PEDIT搞定.但是,遇到了怎樣判斷SS1是否=SS2?故改編如下.
各位看了下面的一段小程後,應該明白我的問題所在.[php]
(defun c:xxx (/ c z n n1 e1 ss1 ss2 etype)
  (setq z (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command "undo" "be")
  (setq c (getstring "\n請输入要聚合的层名<或回車點選要聚合的層中的任一實體>:"))
  (if (= c "")
    (setq c (cdr (assoc 8 (entget (car (entsel "\n請點選目標層實體:"))))))
  )
  (setq ss1 (ssget "x" (list (cons 8 c) (cons 0 "LINE,ARC")))
  )
  (if (/= ss1 nil)  
    (command "pedit" "M" ss1 "" "Y" "j" "" "")
  )  
(setq ss1 (ssget "x" (list (cons 8 c) (cons 0 "*POLYLINE"))))
(command "pedit" "M" ss1 "" "j" "" "")
  (setq ss1 (ssget "x" (list (cons 8 c) (cons 0 "*POLYLINE"))))
  (setq n1 (sslength ss1))
  (setq n 0)
  (while (< n n1)
    (setq e1 (ssname ss1 n))
    (if (/= (vlax-curve-isclosed e1) t)
      (command "change" e1 "" "p" "c" 7 "")
      (command "change" e1 "" "p" "c" 30 "")
    )
    (setq n (1+ n))
  )
  (setvar "cmdecho" z)
  (command "undo" "e")
  (princ)
)[/php]
修改前的:[php]
(defun c:xxxx (/ c z n n1 e1 ss1 ss2 etype)
  (setq z (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command "undo" "be")
  (setq c (getstring "\n請输入要聚合的层名<或回車點選要聚合的層中的任一實體>:"))
  (if (= c "")
    (setq c (cdr (assoc 8 (entget (car (entsel "\n請點選目標層實體:"))))))
  )
  (setq ss1 (ssget "x" (list (cons 8 c) (cons 0 "LINE,ARC,*POLYLINE"))))
  (setq ss2 (ssget "x" (list (cons 8 c) (cons 0 "*POLYLINE"))))
  


  (if (= ss1 ss2l);有問題
   
    (command "pedit" "M" ss1 "" "j" "" "")
     (command "pedit" "M" ss1 "" "Y" "j" "" "")
  )
  (setq n1 (sslength ss1))
  (setq n 0)
  (while (< n n1)
    (setq e1 (ssname ss1 n))
    (if (/= (vlax-curve-isclosed e1) t)
      (command "change" e1 "" "p" "c" 7 "")
      (command "change" e1 "" "p" "c" 30 "")
    )
    (setq n (1+ n))
  )
  (setvar "cmdecho" z)
  (command "undo" "e")
  (princ)
)[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-18 16:14:21 | 显示全部楼层
觉得楼上写程序的风格好熟悉..
是不是富士康的...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-18 17:09:58 | 显示全部楼层
富士康??我公司卖了很多面板机(切割手机面板)进去...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 21:36 , Processed in 0.458996 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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