找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 10082|回复: 41

[曲线] 判断曲线是否封闭

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-13 22:40:23 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Curve:IsClosed
调用格式: (XD::Curve:IsClosed ent)
参数说明: ent --- 曲线实体名
返回值: T -- 封闭
函数简介: 判断曲线是否封闭
函数来源: 原创
函数作者: XDSoft
适用版本: 不限 
最后更新时间: 2013-06-13
备注: -
演示图片: -

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

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

×
  1. ;|
  2. 判断曲线是否封闭
  3. |;
  4. (defun XD::Curve:isClosed (e / ed ise)
  5.   (setq ed (entget e)
  6.         na (cdr (assoc 0 ed))
  7.   )
  8.   (cond
  9.     ((wcmatch na "CIRCLE,ELLIPSE")
  10.       t
  11.     )
  12.     ((wcmatch na "SPLINE,*POLYLINE")
  13.       (= 1 (logand (cdr (assoc 70 ed)) 1))
  14.     )
  15.     (t
  16.       nil
  17.     )
  18.   )
  19. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-13 22:52:06 | 显示全部楼层
不是有那个vlax-curve-isclosed函数吗

vlax-curve-isClosed  确定指定曲线是否闭合(即起点与端点是否重合)

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-6-13 22:57:52 | 显示全部楼层
laibinwu 发表于 2013-6-13 22:52
不是有那个vlax-curve-isclosed函数吗

vlax-curve-isClosed  确定指定曲线是否闭合(即起点与端点是否重 ...

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-6-14 00:35:40 | 显示全部楼层
参数为 Ent?既然用 Alisp,判断了后续多数要用到 elist ,所以这个函数的参数用 elist 更佳,尤其在排量操作中,函数内部就不要再浪费一次 entget 了

点评

基于对象的操作,概念更清晰些。让用户那边少行代码。  详情 回复 发表于 2013-6-14 08:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-6-14 08:21:54 | 显示全部楼层
st788796 发表于 2013-6-14 00:35
参数为 Ent?既然用 Alisp,判断了后续多数要用到 elist ,所以这个函数的参数用 elist 更佳,尤其在排量操 ...

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

使用道具 举报

已领礼包: 2688个

财富等级: 家财万贯

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

使用道具 举报

已领礼包: 207个

财富等级: 日进斗金

发表于 2013-6-14 10:47:00 | 显示全部楼层
本帖最后由 xshrimp 于 2013-6-14 10:50 编辑

绘制pline是.不是用c选项闭合,而实际是闭合的pline如何界定? 是闭合还是不闭合啊?

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

使用道具 举报

已领礼包: 3701个

财富等级: 富可敌国

发表于 2013-6-14 12:14:10 | 显示全部楼层
当多段线最后一点与第一个重合时,70的组码值为0,难道这多段线不算闭合?例如下的数据:
((-1 . <图元名: 7ef62e80>) (0 . LWPOLYLINE) (330 . <图元名: 7ef62cf8>) (5 . 90)
(100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbPolyline) (90 . 5)
(70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 16.4267 21.7325) (40 . 0.0) (41 .
0.0) (42 . 0.0) (10 23.3582 22.425) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10
21.9719 15.5459) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 15.7335 17.3465) (40 .
0.0) (41 . 0.0) (42 . 0.0) (10 16.4267 21.7325) (40 . 0.0) (41 . 0.0) (42 .
0.0) (210 0.0 0.0 1.0))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3701个

财富等级: 富可敌国

发表于 2013-6-14 12:18:11 | 显示全部楼层
大家讨论一下,如此造成的图形算不算闭合?

  1. (entmake '((0 . "LWPOLYLINE")(100 . "AcDbEntity")(100 . "AcDbPolyline") (90 . 5)
  2.            (10 16.4267 21.7325)
  3.            (10 23.3582 22.425)
  4.            (10 21.9719 15.5459)
  5.            (10 15.7335 17.3465)
  6.            (10 16.4267 21.7325)
  7.           )
  8. )
复制代码

点评

可以试试 vlax-curve-isClosed方法,对这样的返回是不是重合。 我觉得,你举的例子,应该在这个函数使用前LISP自己判断,不应该和曲线类的是否闭合放到一起,哪怕另外定义函数。 你这个例子可以用函数 http://  详情 回复 发表于 2013-6-14 12:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3701个

财富等级: 富可敌国

发表于 2013-6-14 12:35:32 | 显示全部楼层
个人认为不能称为“曲线”,例如圆、椭圆等没有70的组码,但它是闭合的,“曲线”的范围应该是很大。

点评

曲线类(AcDbCurve)是圆、椭圆、弧线、多段线、SPLINE线的父类,之所以放入名称CURVE,是因为不能对SPLINE,多段线都单独提供这样的函数。 就是ObjectARX对象类的方法里面,isClosed 也是放入曲线的基类 AcDbCurve类  详情 回复 发表于 2013-6-14 12:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-6-14 12:49:24 | 显示全部楼层
dnbcgrass 发表于 2013-6-14 12:35
个人认为不能称为“曲线”,例如圆、椭圆等没有70的组码,但它是闭合的,“曲线”的范围应该是很大。

曲线类(AcDbCurve)是圆、椭圆、弧线、多段线、SPLINE线的父类,之所以放入名称CURVE,是因为不能对SPLINE,多段线都单独提供这样的函数。
就是ObjectARX对象类的方法里面,isClosed 也是放入曲线的基类 AcDbCurve类里面的。

对于具体LISP使用而言,应该在调用该函数时候,就应该判断出是否是对圆和椭圆进行操作,所以没有加入对圆、椭圆的判断。不过,我可以加入些代码,让函数对圆和椭圆等直接返回T。

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-6-14 12:53:52 | 显示全部楼层
dnbcgrass 发表于 2013-6-14 12:18
大家讨论一下,如此造成的图形算不算闭合?

可以试试 vlax-curve-isClosed方法,对这样的返回是不是重合。

我觉得,你举的例子,应该在这个函数使用前LISP自己判断,不应该和曲线类的是否闭合放到一起,哪怕另外定义函数。 你这个例子可以用函数

http://bbs.xdcad.net/thread-668703-1-1.html

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

使用道具 举报

发表于 2013-6-14 13:44:25 来自手机 | 显示全部楼层
端点重合也不一定是闭合,在lisp没必要写这些太通用的,但是没有这个过程也体会不到lisp的内涵和局限来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2013-12-2 14:56:13 | 显示全部楼层
本帖最后由 守仁格竹GM 于 2013-12-2 15:05 编辑

老大看看这样行不行,
改进了起点端点一样但是不闭合的判断
把利用率较高的情况放到了前面
游客,如果您要查看本帖隐藏内容请回复




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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 00:15 , Processed in 0.466475 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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