明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: abcxyz0517

怎样合并两个选择集?

  [复制链接]
发表于 2007-9-12 20:24:00 | 显示全部楼层

了解情况

发表于 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
        )
)
发表于 2012-12-18 21:04:37 | 显示全部楼层
原因在于, (ssget "P")得到的是,最近一次非空选择集,而非最近一次选择集
发表于 2013-12-14 17:07:41 | 显示全部楼层
ygp820601 发表于 2012-12-18 21:00
呵呵,求差集的函数有问题,当两个选择集相同时,差集应该为nil,这种情况没有考虑到。
(defun ssinter (ss ...

这位朋友写的代码有很多问题呀,我重改了一个
  1. (defun ssunion (SS1 SS2 / n);求两个选择集的并集
  2.         (cond
  3.                 ((and (equal ss1 nil) (not (equal ss2 nil))) ss2)
  4.                 ((and (equal ss2 nil) (not (equal ss1 nil))) ss1)
  5.                 ((and (equal ss1 nil) (equal ss2 nil)) nil)
  6.                 (
  7.                         (and (not(equal ss2 nil))(not (equal ss1 nil)))
  8.                         (progn
  9.                                 (setq n 0)
  10.                                 (repeat (sslength ss2)
  11.                                         (if (not(ssmemb (ssname ss2 n) ss1))
  12.                                                 (setq ss1 (ssadd (ssname ss2 n) ss1))
  13.                                         )
  14.                                         (setq n (1+ n))
  15.                                 )
  16.                                 ss1
  17.                         )
  18.                 )
  19.         )
  20. )
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-23 10:56:07 | 显示全部楼层
yjtdkj 发表于 2013-12-14 17:07
这位朋友写的代码有很多问题呀,我重改了一个

感谢代码,取走用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-6-26 04:39 , Processed in 0.164571 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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