jaminth 发表于 2007-9-12 20:24:00

<p>了解情况</p>

ygp820601 发表于 2012-12-18 21:00:19

呵呵,求差集的函数有问题,当两个选择集相同时,差集应该为nil,这种情况没有考虑到。
(defun ssinter (ss1 ss2 / ss3 sn1 sn2 sn3 );求两个选择集的交集
        (if (or (equal ss1 nil) (equal ss2 nil))
                nil
                (progn
                        (setq sn1 (sslength ss1) sn2 (sslength ss2))
                        (if (> sn1 sn2)
                                (setq ss3 ss1 ss1 ss2 ss2 ss3 sn3 sn1 sn1 sn2 sn2 sn3)
                        )
                        (setq ss3 (ssadd) n 0)
                        (repeat sn1
                                (if (ssmemb (ssname ss1 n) ss2)
                                        (ssadd (ssname ss1 n) ss3)
                                )
                                (setq n (1+ n))
                        )
                        ss3
                )
        )
)
(defun ssunion (SS1 SS2 / n);求两个选择集的并集
        (cond
                ((and (equal ss1 nil) (not (equal ss2 nil))) ss2)
                ((and (equal ss2 nil) (not (equal ss1 nil))) ss1)
                ((and (equal ss1 nil) (equal ss2 nil)) nil)
                (
                        (and (not(equal ss2 nil))(not (equal ss1 nil)))
                        (progn
                                (setq n 0)
                                (repeat (sslength ss1)
                                        (if (not(ssmemb (ssname ss1 n) ss2))
                                                (ssadd (ssmemb ss2 n) ss1)
                                        )
                                        (setq n (1+ n))
                                )
                                ss1
                        )
                )
        )
)

(defun sssubtract (SS1 SS2 / n ss3);求两个选择集的差集: SS1-SS2
        (if (setq ss2 (ssinter ss1 ss2))
                (progn
                        (setq n 0)
                        (repeat (sslength ss1)
                                (if (not(ssmemb (ssname ss1 n) ss2))
                                        (ssadd (ssname ss1 n) ss3)
                                )
                                (setq n (1+ n))
                        )
                        ss3
                )
                ss1
        )
)

ygp820601 发表于 2012-12-18 21:04:37

原因在于, (ssget "P")得到的是,最近一次非空选择集,而非最近一次选择集

yjtdkj 发表于 2013-12-14 17:07:41

ygp820601 发表于 2012-12-18 21:00 static/image/common/back.gif
呵呵,求差集的函数有问题,当两个选择集相同时,差集应该为nil,这种情况没有考虑到。
(defun ssinter (ss ...

这位朋友写的代码有很多问题呀,我重改了一个
(defun ssunion (SS1 SS2 / n);求两个选择集的并集
      (cond
                ((and (equal ss1 nil) (not (equal ss2 nil))) ss2)
                ((and (equal ss2 nil) (not (equal ss1 nil))) ss1)
                ((and (equal ss1 nil) (equal ss2 nil)) nil)
                (
                        (and (not(equal ss2 nil))(not (equal ss1 nil)))
                        (progn
                              (setq n 0)
                              (repeat (sslength ss2)
                                        (if (not(ssmemb (ssname ss2 n) ss1))
                                                (setq ss1 (ssadd (ssname ss2 n) ss1))
                                        )
                                        (setq n (1+ n))
                              )
                              ss1
                        )
                )
      )
)

qiannianhuazi 发表于 2020-10-23 10:56:07

yjtdkj 发表于 2013-12-14 17:07
这位朋友写的代码有很多问题呀,我重改了一个

感谢代码,取走用了
页: 1 [2]
查看完整版本: 怎样合并两个选择集?