找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 15563|回复: 54

[教学] 利用晓东API进行多边形拓扑的应用示例

[复制链接]
发表于 2013-6-23 11:07:09 | 显示全部楼层 |阅读模式

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

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

×
利用晓东API,可以对选择的曲线选择集进行快速拓扑,生成封闭多边形: regionpoly.gif

  1. ;;交点打断、region拓扑多边形
  2. (defun c:t13 ()
  3.   (setq cmd (getvar 'cmdecho))
  4.   (setvar 'cmdecho 0)
  5.   (princ "\n选择直线、多段线、圆弧、圆:")
  6.   (setq ss (ssget '((0 . "line,*polyline,circle,arc"))))
  7.   (if ss
  8.     (progn
  9.       (setq ent (entlast))               ; 曲线交点打断
  10.       (XDRX_CURVE_INTERSECTBREAK ss 0)
  11.       (setq ss (ssadd))
  12.       (while (setq ent (entnext ent))
  13.         (ssadd ent ss)
  14.       )
  15.       (setq ent (entlast))               ; 生成面域
  16.       (XDRX_CURVE->REGION ss)
  17.       (setq lst nil)
  18.       (while (setq ent (entnext ent))
  19.         (setq lst (cons ent lst))
  20.       )                                       ; 面域按面积从大到小排序
  21.       (setq lst (vl-sort lst '(lambda (a b)
  22.                                 (> (XDRX_REGION_GETAREA a) (XDRX_REGION_GETAREA b))
  23.                               )
  24.                 )
  25.       )                                       ; 删除最外围的面域
  26.       (entdel (car lst))
  27.       (setq lst (cdr lst))               ; 将面域转成多段线
  28.       (foreach a lst
  29.         (command "explode" a)
  30.         (setq s (ssget "p"))
  31.         (command "pedit" (ssname s 0) "y" "j" s "" "")
  32.       )
  33.       (setq ent (entlast))
  34.       (setq ss (ssadd))
  35.       (while (setq ent (entnext ent))
  36.         (ssadd ent ss)
  37.       )
  38.       (setvar 'cmdecho cmd)               ; 返回多段线选择集
  39.       ss
  40.     )
  41.   )
  42. )


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

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

发表于 2013-6-23 13:04:49 来自手机 | 显示全部楼层
直接explode region 选择集,pedit ssget p 是不是一样效果,未经测试来自: Android客户端

点评

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

使用道具 举报

发表于 2013-6-23 13:17:27 | 显示全部楼层
XDRX_CURVE_INTERSECTBREAK
这个的链接在哪?

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-23 13:39:45 | 显示全部楼层
帮你优化下代码

  1. (defun c:t13 ()
  2.   (setq cmd (getvar 'cmdecho))
  3.   (setvar 'cmdecho 0)
  4.   (princ "\n选择直线、多段线、圆弧、圆:")
  5.   (setq ss (ssget '((0 . "line,*polyline,circle,arc"))))
  6.   (if ss
  7.     (progn
  8.       (xxdrx_setmark)
  9.       (XDRX_CURVE_INTERSECTBREAK ss 0) ; 曲线交点打断
  10.       (setq ss (xdrx_getss))
  11.       (sxdrx_setmark)               
  12.       (XDRX_CURVE->REGION ss); 生成面域
  13.       (ssetq ss (xdrx_getss))
  14.        
  15.       (ssetq lst (XD::SS:Ents ss))

  16.                              ; 面域按面积从大到小排序
  17.       (setq lst (vl-sort lst '(lambda (a b)
  18.                                 (> (XDRX_REGION_GETAREA a) (XDRX_REGION_GETAREA b))
  19.                               )
  20.                 )
  21.       )                                       ; 删除最外围的面域
  22.       (entdel (car lst))
  23.       (setq lst (cdr lst))               ; 将面域转成多段线
  24.       (foreach a lst
  25.         (command "explode" a)
  26.         (setq s (ssget "p"))
  27.         (command "pedit" (ssname s 0) "y" "j" s "" "")
  28.       )
  29.       (setq ent (entlast))
  30.       (xdrx_setmark)
  31.       (setvar 'cmdecho cmd)               ; 返回多段线选择集
  32.       (xxdrx_getss)
  33.     )
  34.   )
  35. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-23 13:44:29 | 显示全部楼层
拉契 发表于 2013-6-23 13:17
XDRX_CURVE_INTERSECTBREAK
这个的链接在哪?

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

使用道具 举报

 楼主| 发表于 2013-6-23 19:05:58 | 显示全部楼层
Free-Lancer 发表于 2013-6-23 13:04
直接explode region 选择集,pedit ssget p 是不是一样效果,未经测试

这肯定不行!

点评

写了 xdrx_region->curve ,发给你,测试下。 可以把region直接变为多段线了。  详情 回复 发表于 2013-6-23 19:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-23 19:27:52 | 显示全部楼层

写了 xdrx_region->curve ,发给你,测试下。

可以把region直接变为多段线了。

点评

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

使用道具 举报

 楼主| 发表于 2013-6-23 20:45:01 | 显示全部楼层
XDSoft 发表于 2013-6-23 19:27
写了 xdrx_region->curve ,发给你,测试下。

可以把region直接变为多段线了。

用xdrx_region->curve函数修改了下代码,代码简单多了:
  1. ;;交点打断、region拓扑多边形
  2. (defun c:t13 ()
  3.   (setq cmd (getvar 'cmdecho))
  4.   (setvar 'cmdecho 0)
  5.   (princ "\n选择直线、多段线、圆弧、圆:")
  6.   (setq ss (ssget '((0 . "line,*polyline,circle,arc"))))
  7.   (if ss
  8.     (progn
  9.       (xdrx_setmark)
  10.       ;;曲线交点打断
  11.       (XDRX_CURVE_INTERSECTBREAK ss 0)
  12.       (setq ss (xdrx_getss))
  13.       (xdrx_setmark)
  14.       ;;生成面域
  15.       (XDRX_CURVE->REGION ss)
  16.       (setq ss        (xdrx_getss)
  17.             lst        nil
  18.       )
  19.       (repeat (setq n (sslength ss))
  20.         (setq lst (cons (ssname ss (setq n (1- n))) lst))
  21.       )
  22.       ;;面域按面积从大到小排序
  23.       (setq
  24.         lst (vl-sort
  25.               lst
  26.               '(lambda (a b)
  27.                  (> (XDRX_REGION_GETAREA a) (XDRX_REGION_GETAREA b))
  28.                )
  29.             )
  30.       )
  31.       ;;删除最外围的面域
  32.       (entdel (car lst))
  33.       (setq lst (cdr lst))
  34.       (xdrx_setmark)
  35.       ;;将面域转成多段线
  36.       (foreach a lst
  37.         (xdrx_region->curve a)
  38.       )
  39.       (setq ss (xdrx_getss))
  40.       (setvar 'cmdecho cmd)
  41.       ;;返回多段线选择集
  42.       ss
  43.     )
  44.   )
  45. )

点评

现在的API,实现代码更短了 [attachimg]77856[/attachimg]  详情 回复 发表于 2018-5-29 22:20
xdrx_region->curve 返回选择集,封闭多段线。 修改下代码吧,又可以简短了。  详情 回复 发表于 2013-6-23 22:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-6-23 22:06:32 | 显示全部楼层
选择集用
  1. (xdrx_setsstodb ss 0)
  2. (while (setq e (xdrx_getentdata 0))
  3.    (setq lst (cons e lst))
  4. )

  1. (mapcar 'xdrx_region->curve lst)

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-23 22:29:24 | 显示全部楼层
Love-Lisp 发表于 2013-6-23 20:45
用xdrx_region->curve函数修改了下代码,代码简单多了:

xdrx_region->curve 返回选择集,封闭多段线。参数支持选择集,和实体表。

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-23 22:33:01 | 显示全部楼层

直接:

  1. (xdrx_region->curve ss)


或者

  1. (apply 'xdrx_region->curve lst)

点评

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

使用道具 举报

 楼主| 发表于 2013-6-23 23:02:12 | 显示全部楼层

再精简下代码:
  1. (defun c:t13 ()
  2.   (setq cmd (getvar 'cmdecho))
  3.   (setvar 'cmdecho 0)
  4.   (princ "\n选择直线、多段线、圆弧、圆:")
  5.   (setq ss (ssget '((0 . "line,*polyline,circle,arc"))))
  6.   (if ss
  7.     (progn
  8.       (GXL-TIMEINIT)
  9.       (xdrx_setmark)
  10.       ;;曲线交点打断
  11.       (XDRX_CURVE_INTERSECTBREAK ss 0)
  12.       (setq ss (xdrx_getss))
  13.       (xdrx_setmark)
  14.       ;;生成面域
  15.       (XDRX_CURVE->REGION ss)
  16.       (setq ss        (xdrx_getss)
  17.             lst        nil
  18.       )
  19.       (repeat (setq n (sslength ss))
  20.         (setq lst (cons (ssname ss (setq n (1- n))) lst))
  21.       )
  22.       ;;面域按面积从大到小排序
  23.       (setq
  24.         lst (vl-sort
  25.               lst
  26.               '(lambda (a b)
  27.                  (> (XDRX_REGION_GETAREA a) (XDRX_REGION_GETAREA b))
  28.                )
  29.             )
  30.       )
  31.       ;;删除最外围的面域
  32.       (entdel (car lst))
  33.       (setq lst (cdr lst))
  34.       ;;将面域转成多段线
  35.       (setq ss (xdrx_region->curve lst))      
  36.       (setvar 'cmdecho cmd)
  37.       (GXL-TIMEOUT)
  38.       ;;返回多段线选择集
  39.       ss
  40.     )
  41.   )
  42. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

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

使用道具 举报

发表于 2013-6-24 10:29:58 来自手机 | 显示全部楼层
curve->region也可以修改返回值为选择集来自: Android客户端

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 23:32 , Processed in 0.483761 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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