找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8887|回复: 55

[原创]:选择集曲线断开程序详解

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-4-2 23:03:57 | 显示全部楼层 |阅读模式

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

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

×
目的:对所选择的曲线实体在交点处均断开。

与此相关帖子
1 http://www.xdcad.net/forum/showt ... d=836060#post836060
2 http://www.xdcad.net/forum/showt ... d=833657#post833657
3 http://www.xdcad.net/forum/showt ... d=860472#post860472
4 http://www.xdcad.net/forum/showt ... d=441693#post441693
5 园断开
http://www.xdcad.net/forum/showt ... d=843711#post843711

下面介绍下编程思路:

第一种方法用基本的命令Break

CAD中的曲线类实体包括Line、ARC、Circle、Lwpolyline、polyline、Spline、Ellipse,程序的第一步就是要构造这些实体的选择集,自然用到 SSGET,在上面的实体中有几个实体是不能直接用Break在一个点处打断的-------闭合的周期曲线,包括 Circle、闭合的Spline、闭合的Ellipse,对这几类先行过滤掉暂不处理。
[php]
(setq
    filter '((-4 . "< or")
             (0 . "*polyline,arc,line")
             (-4 . "<and")
             (0 . "spline")
             (-4 . "<not")
             (71 . 3)
             (-4 . "not >")
             (-4 . "and >")
             (-4 . "or >")
            )
  )
(setq ss (ssget filter))[/php]
下一步就是求出所有的交点
[php]
;;选择集交点子程序
(defun interss (e1 e2 / pts ipts)
  (setq        ipts (vlax-variant-value
               (vla-intersectwith
                 e1
                 e2
                 acExtendNone
               )
             )
  )
  (if (> (vlax-safearray-get-u-bound ipts 1) 0) ;是否有交点
    (progn
      (setq ipts
             (vlax-safearray->list ipts)
      )
      (while (> (length ipts) 0)
        (setq pts (cons        (list (car ipts)
                              (cadr ipts)
                              (caddr ipts)
                        )
                        pts
                  )                        ;此处可以在添加时判断是否有重合点
        )
        (setq ipts (cdddr ipts))
      )
    )
  )
  pts                                        ;也可以在这里单独去除重合点
)
;;所有的交点表
(setq pts (interss ss))
[/php]
好了下面写个程序结构
[php]
(defun c:BrkAll        (/ ss pts thisdrawing filter)
  (setq
    filter '((-4 . "< or")
             (0 . "*polyline,arc,line")
             (-4 . "< and")
             (0 . "spline")
             (-4 . "< not")
             (71 . 3)
             (-4 . "not >")
             (-4 . "and >")
             (-4 . "or >")
            )
  )
  (if (setq ss (ssget filter))
    (progn
      (setq pts                (interss ss)
            thisdrawing        (vla-get-activedocument
                          (vlax-get-acad-object)
                        )
      )
      (vla-startundomark thisdrawing)
      ......
     (vla-endundomark thisdrawing)
    )
  )
  (princ)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-3 21:52:23 | 显示全部楼层
最初由 aeo 发布
[B](vl-cmdf ".break" (list curve pt) "f" pt "@")
既然用了"f" 加不加点就一样了.

其实很早就用xdapi写过

关键是很多时候,求出了交点,再判断这个点在不在曲线上时,有时就不在上面了。
特别是spline时,很... [/B]

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

使用道具 举报

发表于 2004-4-3 02:14:17 | 显示全部楼层
论坛以前都是发整段程序的多,程序结构和思路的帖子少,其实这种帖子对学习交流的人来说才最有价值。希望以后多看到这样的帖子。
支持
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-3 08:49:45 | 显示全部楼层
继续,上面获得了曲线的所有交点,再看看Break命令在一个点下断开实体的方法

要将对象一分为二并且不删除某个部分,输入的第一个点和第二个点应相同。通过输入 @ 指定第二个点即可实现此过程。 ----- 《CAD联机帮助》

有了交点就可以使用Break命令断开曲线了

[php](vl-cmdf ".break" (list curve pt) "f" pt "@")[/php]

这里曲线要用点对的形式。

对单个曲线用上面的基本方法,现在是一些不确定的点的集合,而且在一个点处可能有数个曲线通过。如何将点和曲线对应起来呢?
这里可以用一个以点为中心的最小框再次选择曲线,然后调用Break命令。这个框就选用Pickbox
[php]
(setq pick (getvar "pickbox")
      p1   (polar pt (* -0.75 pi) (* 2. (expt (/ pick 2) 2)))
      p2   (polar pt (* 0.45 pi) (* 2. (expt (/ pick 2) 2)))
)
(setq s1 (ssget "_c" p1 p2 filter ))[/php]
对上面的总结
[php]
(setq pick (getvar "pickbox")
      p1   (polar pt (* -0.75 pi) (* 2. (expt (/ pick 2) 2)))
      p2   (polar pt (* 0.45 pi) (* 2. (expt (/ pick 2) 2)))
)
(if (ssget "_c" p1 p2 filter)
  (vlax-for i (vla-get-activeselectionset thisdrawing)
    (foreach pt pts
      (vl-cmdf ".break"
             (list (vlax-vla-object->ename i) x)
             "f"
             pt
             "@"
      )
    )
  )
)[/php]
处理点集时可以采用的方法有 repeat while mapcar foreach 根据个人喜好选择,本人推荐使用 Foreach。

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-4-3 21:09:57 | 显示全部楼层
(vl-cmdf ".break" (list curve pt) "f" pt "@")
既然用了"f" 加不加点就一样了.

其实很早就用xdapi写过

关键是很多时候,求出了交点,再判断这个点在不在曲线上时,有时就不在上面了。
特别是spline时,很无奈.

看来要判断点在不在曲线上时应该这样(< ( distance pint (vlax-curve-getClosestPointTo  curve pint))1e-3) ;pint是交点.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-3 21:41:40 | 显示全部楼层
再讲一讲选择集的处理问题,在Lisp下一般用repeat 或者 while ,有了ActiveX可以用更高效的方法,就是使用 ActiveSelectionSet ,可以使用的格式如下:

  1. (if (ssget)
  2.   (vlax-for i (vla-get-activeselectionset thisdrawing)
  3.     .....
  4.   )
  5. )
复制代码

这里可以对比下XDAPI中的 xdrx_setsstodb 和 xdrx_getentdata 函数。

需要注意的是 activeselectionset 在某些情况下会出现 Count 属性失效,可以使用下面的函数在程序运行前消除此BUG

  1. (defun ea:ClearCSet (/ cur)
  2.   (if (and (not        (vl-catch-all-error-p
  3.                   (setq        cur
  4.                          (vl-catch-all-apply
  5.                            'vla-item
  6.                            (list
  7.                              (vla-get-selectionsets
  8.                                (vla-get-activedocument (vlax-get-acad-object))
  9.                              )
  10.                              "CURRENT"
  11.                            )
  12.                          )
  13.                   )
  14.                 )
  15.            )
  16.            (vl-catch-all-error-p
  17.              (vl-catch-all-apply
  18.                'vla-get-count
  19.                (list cur)
  20.              )
  21.            )
  22.       )
  23.     (vla-delete cur)
  24.   )
  25.   (princ)
  26. )

由此完整的选择处理代码如下

  1. (ea:clearcset)
  2. (if (ssget)
  3.   (vlax-for i  (vla-get-activeselectionset thisdrawing)
  4.     ......
  5.   )
  6. )
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-4 00:14:16 | 显示全部楼层
最后一个问题,在处理打断实体时,有一种情况是没有必要调用Break命令的,就是当交点是曲线的Startpoint或者Endpoint时,此时的判断条件是

  1. (not (or (equal        (vlax-curve-getstartpoint i)
  2.                 x
  3.                 0.001
  4.          )
  5.          (equal        (vlax-curve-getendpoint i)
  6.                 x
  7.                 0.001
  8.          )
  9.      )
  10. )
复制代码

至此程序就全部完成了,加上其他必要的设置代码如下:
[php]
(defun xcopyright ()
  (princ
    "\n\t☆☆☆晓东家园 [www . xdcad. net] 工具,作者: eachy☆☆☆"
  )
  (princ)
)
(defun ea:ClearCSet (/ cur)
  (if (and (not        (vl-catch-all-error-p
                  (setq        cur
                         (vl-catch-all-apply
                           'vla-item
                           (list
                             (vla-get-selectionsets
                               (vla-get-activedocument (vlax-get-acad-object))
                             )
                             "CURRENT"
                           )
                         )
                  )
                )
           )
           (vl-catch-all-error-p
             (vl-catch-all-apply
               'vla-get-count
               (list cur)
             )
           )
      )
    (vla-delete cur)
  )
  (princ)
)
(defun interss (ss / n1 ssl aobj1 aobj2 n2 ipts pts)
  (setq        n1  0
        ssl (sslength ss)
  )
  (while (< n1 (1- ssl))
    (setq aobj1        (ssname ss n1)
          aobj1        (vlax-ename->vla-object aobj1)
          n2        (1+ n1)
    )
    (while (< n2 ssl)
      (setq aobj2 (ssname ss n2)
            aobj2 (vlax-ename->vla-object aobj2)
            ipts  (vla-intersectwith
                    aobj1
                    aobj2
                    0
                  )
            ipts  (vlax-variant-value ipts)
      )
      (if (> (vlax-safearray-get-u-bound ipts 1) 0)
        (progn
          (setq        ipts
                 (vlax-safearray->list ipts)
          )
          (while (> (length ipts) 0)
            (setq pts (cons (list (car ipts)
                                  (cadr ipts)
                                  (caddr ipts)
                            )
                            pts
                      )
            )
            (setq ipts (cdddr ipts))
          )
        )
      )
      (setq n2 (1+ n2))
    )
    (setq n1 (1+ n1))
  )
  pts
)
(defun c:BrkAll        (/ filter ss pts pick thisdrawing oldos)
  (xcopyright)
  (setq
    filter '((-4 . "<or")
             (0 . "*polyline,arc,line")
             (-4 . "<and")
             (0 . "spline")
             (-4 . "<not")
             (71 . 3)
             (-4 . "not>")
             (-4 . "and>")
             (-4 . "or>")
            )
  )
  (if (setq ss (ssget filter))
    (progn
      (setq pts                (interss ss)
            pick        (getvar "pickbox")
            thisdrawing        (vla-get-activedocument
                          (vlax-get-acad-object)
                        )
            oldos        (getvar "osmode")
      )
      (setvar "osmode" 0)
      (vla-startundomark thisdrawing)
      (ea:clearcset)
      (foreach x pts
        (if (ssget
              "_C"
              (polar x (* -0.75 pi) (* 2. (expt (/ pick 2) 2)))
              (polar x (* 0.45 pi) (* 2. (expt (/ pick 2) 2)))
              filter
            )
          (vlax-for i (vla-get-activeselectionset thisdrawing)
            (if
              (not (or (equal (vlax-curve-getstartpoint i)
                              x
                              0.001
                       )
                       (equal (vlax-curve-getendpoint i)
                              x
                              0.001
                       )
                   )
              )
               (vl-cmdf        ".break"
                        (list (vlax-vla-object->ename i) x)
                        "f"
                        x
                        "@"
               )
            )
          )
        )
      )
    )
    (setvar "osmode" oldos)
    (vla-endundomark thisdrawing)
  )
  (princ)
)
(princ
  "\n\t【晓东家园 [www . xdcad.net] 交点断开工具,作者:eachy】"
)
(princ)[/php]

下一部分内容将是交点断开的改进算法部分,支持 circle ellipse 对以后内容将采取积分限制,3分为起点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-4 01:39:34 | 显示全部楼层
游客,如果您要查看本帖隐藏内容请回复
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-4 12:03:57 | 显示全部楼层
[HIDE]

  1. 继续讨论上面得到的表,在得到曲线实体和实体上面一系列的点后,对断开的处理可以采用几个处理方法:
  2. 1 仍旧用Break方法
  3. 2 删除旧实体,根据实体类型和点表分段重新生成
  4.   可以采用的方式
  5.   a command
  6.     b entmake
  7.     c vla-add 方式
  8. a 方式效率问题不予考虑,b、c根据代码的方便程度和习惯均可采用
  9. 另外需要注意的是以上方法对 多义线 和 spline 仍旧不方便,有兴趣的考验再深入,
  10. 本例程中对这两类实体仍采用Break方式。

  11. 在重新生成实体时,有两个问题:

  12. 1 保证点是沿曲线按一定方向排列
  13. 2 重复点是要排除的

  14. 第一点保证生成的曲线不会重叠并且连续,第二点保证不出现0长度线的错误。

  15. 第一点需要的函数参加本版的 [点沿曲线排序]  主题。

  16. 第二点可以有几种处理方法:
  17. a 在上帖中提到的求表时直接滤掉重复点
  18. b 单独写去除点集重复点的函数
  19. c 在生成实体的时候予以判断
  20. 三种方法中个人觉得效率上差异不大,在毫秒级的不用太多关注。

  21. 下面讲讲各个实体的处理方式(以下提到的点是已经完成排序的点集)

  22. 表形式

  23. elst = (Object (p1 p2 p3 .... pn))

  24. 1  Line  
  25. (setq pts (cadr elst)
  26.       obj (car elst))
  27. (if (= (vla-get-objectname obj) "AcDbLine")
  28.   (while (> (length pts) 1)
  29.      (vla-addline modelspace (vlax-3d-point (car pts))
  30.                              (vlax-3d-point (cadr pts))
  31.      )
  32.      (setq pts (cdr pts))
  33.   )
  34. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-4 14:12:17 | 显示全部楼层
(setq
    filter '((-4 . "< or")
         (0 . "*polyline,arc,line")
         (-4 . "<and")
         (0 . "spline")
         (-4 . "<not")
         (71 . 3)
         (-4 . "not >")
         (-4 . "and >")
         (-4 . "or >")
        )
  )
(setq ss (ssget filter))

判断spline闭合应该70组码. 另外应该把circle包括进来,在程序内处理。闭合spline不能用break单点打断,也很难重新生成打断实体,能否打断一段很小的距离,如1e-4,近似的做出打断效果。另外,用&逻辑运算符, not 不能排除全部闭合情况.

对单个曲线用上面的基本方法,现在是一些不确定的点的集合,而且在一个点处可能有数个曲线通过。如何将点和曲线对应起来呢?
这里可以用一个以点为中心的最小框再次选择曲线,然后调用Break命令。这个框就选用Pickbox

对点表的处理是关键,但是程序的核心(最基本处理单元),我觉得不是在从交点表上取交点来打断实体,而是在要打断的实体上求交点表(对点表处理重复及端头点)然后打断。不建议程序中做重新选则的操作,而且这样(第一种方法)不能很有效的处理闭合曲线,因此推荐第二种方法(将要打断实体和其交点表组表)。

aeo: (vl-cmdf ".break" (list curve pt) "f" pt "@")
既然用了"f" 加不加点就一样了.

也可以说是:既然用了(实体 . 点) 用不用"f"都一样了. 以下两种均可用:
(vl-cmdf ".break" (list curve pt)  "@")
(vl-cmdf ".break" curve  "f" pt  "@")


对 ActiveSelectionSet  count 的bug处理,可否不论是否count正常,均直接删除"current"当前选集?(探讨)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-4 14:53:15 | 显示全部楼层
[php] 已知: 要打断的曲线实体选集("被剪集")
      用来打断的实体集("剪集")
程序结构:
(repeat ;也可以用vla方法.详ea的activeselectionsets段.
  取"被剪集"单个实体cur
  求cur 与 "剪集"交点表
  交点表处理(过滤端头点及重复项,按照曲线排序)
  (cond
    (实体=circle,按交点表生成arc)
    (实体=闭合spline,第一个点处打断很小一段距离,其余用"break")
    (实体=闭合polyline,
       (if 仅有一个交点 ;如果要打断,将会变成从交点到pl线起点打断为2条pl线.
           (不处理)
           (大于1个交点时,
             (if 第一个交点pt0不等于pl线起点)
                (将pt0将第一个交点加入pl线并设置为起点)
             )
             打断,其余用"break")
             ;如第一个点不设为起点,会出现与打断1个交点时候相同情况!.
       )
    )
    (其它,用"break"命令打断)
  )
)
[/php]
其中,对交点表是否与端点重复的处理.如果是闭合pl线,可以不过滤.因为闭合pl线支持单点在端头打断.

其中,将circle转为arc可参考程序如下(用实体表部分替代的方法,可以很好的保持circle的原有属性,如层,颜色等,且程序很简洁)
起终点角度可从排序的交点表中取点计算
[php]
;;将圆打断变为arc-dxf实体表转换:------------------------lxx.2004.4
;测试: (cir2arc (car(entsel "\n选择要转为半圆弧的圆实体:")) 0 Pi T)
(defun cir2arc (cir strang endang delkey / el) ;delkey 为是否删除原有cir的参数.
  (if (not cir)(setq cir (car(entsel "\n选择圆:"))))
  (setq el (entget cir)
        el (vl-remove-if '(lambda(x) (or (= -1 (car x))(= 0 (car x)))) el)
        el (append (list '(0 . "ARC")) el (list '(100 . "AcDbArc") (cons 50 strang)(cons 51 endang))))
  (entmake el)
  (if delkey (entdel cir))
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-4 15:02:03 | 显示全部楼层
最初由 梦断江南 发布
[B][quote](setq
    filter '((-4 . "< or")
         (0 . "*polyline,arc,line")
         (-4 . "<and")
         (0 . "spline")
         (-4 . "<not")
         (71 . 3)
         (-4 . "not >"... [/B]

因为写这个帖子,前面贴的过滤表用的是最早的一个文件中的,没有细看。谢谢指出错误。最后使用的是下面这个表
[php]
(setq
    filter '((-4 . "<or")
             (0 . "*polyline,arc,line,circle,ellipse")
             (-4 . "<and")
             (0 . "spline")
             (-4 . "<not")
             (-4 . "<or")
             (70 . 3)
             (70 . 5)
             (70 . 7)
             (70 . 9)
             (70 . 11)
             (70 . 13)
             (70 . 17)
             (70 . 15)
             (70 . 19)
             (70 . 21)
             (70 . 23)
             (70 . 25)
             (-4 . "or>")
             (-4 . "not>")
             (-4 . "and>")
             (-4 . "or>")
            )
  )[/php]
关于排除闭合 Spline 问题,我一直没有找到好的方法,暂时用排列组合的方法把可能 含1 的情况都列上(当然CAD中不一定有这样的实体),个人观点:程序只写一次,在过滤时多排除一种情况,后面就少一次循环判断,理论上效率高一点吧,毕竟程序以后使用的次数会很多。

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-4 15:14:49 | 显示全部楼层
最初由 梦断江南 发布
[B][php] 已知: 要打断的曲线实体选集("被剪集")
      用来打断的实体集("剪集")
程序结构:
(repeat ;也可以用vla方法.详ea的activeselectionsets段.
  取"被剪集"单个实体cur
  求cur 与 "剪集"交点表
  交点表... [/B]


Entmake 无疑是一个好方法,但是在这个程序里面要处理多种(Line、Arc、Circle、Pline、Spline、Ellipse)实体,我觉得是用哪种方便就用哪种,最后要统一考虑决定取舍。比如 Vla-add 函数返回的是 Object,而物体的属性常用的无怪乎 层、线形、颜色,不常用的 Lightweight、elevation、Normal,这了都可以先行提取出来,待生成新实体后再次 Put 属性。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-4 15:27:14 | 显示全部楼层
最初由 eachy 发布
[B][QUOTE]最初由 梦断江南 发布
[B][quote](setq
    filter '((-4 . "< or")
         (0 . "*polyline,arc,line")
         (-4 . "<and")
         (0 . "spline")
         (-4 . "<not")
   ... [/B]

测试过程:[php]
(setq i -1 lst '())
(repeat 26
  (setq lst (append lst (list (setq i (+ i 1)))) )
)
-> (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25)
(mapcar '(lambda (x) (logand x 1)) lst)
->(0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1)
(mapcar '(lambda (x) (logior x 1)) lst)
->(1 1 3 3 5 5 7 7 9 9 11 11 13 13 15 15 17 17 19 19 21 21 23 23 25 25)
[/php]
因此过滤表可以是:
[php]
(setq filter
       '((-4 . "<or")
         (0 . "*polyline,arc,line,circle,ellipse")
         (-4 . "<and")
         (0 . "spline")
         (-4 . "<not")
         (-4 . "&")
         (70 . 1)
         (-4 . "not>")
         (-4 . "or>")
         (-4 . "not>")
         (-4 . "and>")
         (-4 . "or>")
        )
)[/php]
补充ssget参数资料:
;ssget 过滤表支持的运算操作:
*
通用字符(表示所有的意思)
=
等于
! =
/=
<>
不等于
<
小于
<=
小于等于
>
大于
>=
大于等于
&
Bitwise AND (仅用于整型数群组)
&=
Bitwise marked equals (仅用于整型数群组)

对整型数值群组而言, bitwise 操作(“&”和“&=”) 都是有效的。如果 ((integer_group & filter) /= 0),
则bitwise 操作“&”将为真, 意即如果有任何的位设定在记号内, 则也将设定在整型数群组中。
如果((integer_group & filter) = filter), 则 bitwise 操作“&=”将为真, 意即如果有任何的位设定在记号内,
则也将设定在 integer_group 中。其他群组也许设定在 integer_group 中, 但并不检查。
[php]
*********
如何理解 & 和 &= ? 我是这么理解的:
如上例,
关于&
当70=5(组码分解为 1+4),过滤条件70=1,(logand 5 1)=1 /=0, 即((1 4) & 1) /= 0)为真.
当70=6(组码分解为 2+4),过滤条件70=1,(logand 6 1)=0 , 即((2 4) & 1) /= 0)为假.

关于&=
当70=13(组码分解为 1+4+8),过滤条件70=2 (logand 13 2)=0 , 即((1 4 8) & 2) = 0)为假(如等于2为真).
当70=15(组码分解为 1+2+4+8),过滤条件70=2 (logand 15 2)=2 , 即((1 2 4 8) & 2) = 2)为真.
********
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-4-4 15:48:05 | 显示全部楼层
最初由 梦断江南 发布
[B][QUOTE]最初由 eachy 发布
[B][QUOTE]最初由 梦断江南 发布
[B][quote](setq
    filter '((-4 . "< or")
         (0 . "*polyline,arc,line")
         (-4 . "<and")
         (0 . "spl... [/B]

后面多了几个
[php]
(setq filter
       '((-4 . "<or")
         (0 . "*polyline,arc,line,circle,ellipse")
         (-4 . "<and")
         (0 . "spline")
         (-4 . "<not")
         (-4 . "&")
         (70 . 1)
         (-4 . "not>")
         (-4 . "and>")
         (-4 . "or>")
        )
)
[/php]
看看 spline 的 70 组码特性:

样条曲线标志(位编码):  

1 = 闭合的样条曲线;  

2 = 周期性样条曲线;  

4 = 有理样条曲线;  

8 = 平面;  

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 10:59 , Processed in 0.200737 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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