找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3590|回复: 20

[教学] 【API-拓扑(三)】REGION实体处理完全解决方案函数集

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-5-16 15:21:57 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 newer 于 2018-5-16 16:10 编辑

ACAD的REGION,VLISP是没提供足够的函数处理的,即使ARX,也仅仅提供了遍历的能力,LOOP间并没有拓扑关系,只有通过ARX的AcBr API和AcDbMpolygon类相关方法组合,进行封装,才能使他具有完备的“拓扑”解析能力。


下面介绍API关于REGION实体的相关函数

一、Region ---> Curves

1、(xdrx_region->curve region [mode])
mode ---- 0(原生曲线),1(封闭的多段线),2(封闭的SPLINE)
默认1

2、(xdrx_region->polyline region)

3、(xdrx_region->spline region)

region-curve.gif

图例实现代码:
根据选项,生成 原生曲线、多段线和SPLINE
  1. (defun c:tt ()
  2.   (xdrx_begin)
  3.   (xdrx_initget "0 1 2")
  4.   (setq val (getkword "\n[0-原生曲线/1-封闭多段线/2-SPLINE]:"))
  5.   (if (and (setq e (car (xdrx_entsel "\n拾取REGION<退出>:" '((0 . "REGION")))))
  6.            (xdrx_entity_copy e)
  7.            (setq ss (xdrx_region->curve (entlast) (atoi val)))
  8.       )
  9.     (progn
  10.       (mapcar '(lambda(x)(setq clr (xdrx_math_rand 0 8))
  11.                  (xdrx_setpropertyvalue x "color" clr))(setq ents (xdrx_pickset->ents ss)))
  12.       (xd::drag:simplemove ents "\n插入点:" 5 t)
  13.     )
  14.   )
  15.   (xdrx_end)
  16.   (princ)
  17. )



二、Region ---> Hatch


(xdrx_region->hatch region [t])
给t参数,保留原region

region-hatch.gif

  1. (defun c:tt ()
  2.   (xdrx_begin)
  3.   (if (and (setq e (car (xdrx_entsel "\n拾取REGION<退出>:" '((0 . "REGION")))))
  4.            (setq ss (xdrx_region->hatch e t)
  5.       ))
  6.     (progn
  7.       (setq ss1 (xd::pickset:getsub ss '((0 . "HATCH"))))
  8.       (xdrx_entity_setproperty ss1 "color" 1)
  9.       (xd::drag:simplemove ss "\n插入点:" 5 t)
  10.     )
  11.   )
  12.   (xdrx_end)
  13.   (princ)
  14. )



三、Region ---> MPolygon


(xdrx_region->mpolygon region [t])
给t参数,保留原region


region-mpolygon.gif

  1. (defun c:tt ()
  2.   (xdrx_begin)
  3.   (if (and (setq e (car (xdrx_entsel "\n拾取REGION<退出>:" '((0 . "REGION")))))
  4.            (setq ss (xdrx_region->mpolygon e t)
  5.       ))
  6.     (progn
  7.       (xdrx_entity_setproperty ss "color" 1)
  8.       (xd::drag:simplemove ss "\n插入点:" 5 t)
  9.     )
  10.   )
  11.   (xdrx_end)
  12.   (princ)
  13. )



四、Region ---> 拆离

(xdrx_region_detach region)

region-detach.gif
五、Region ---> LIST


(xdrx_region->list region)


返回边界LOOP几何实体表(带拓扑结构子表)

六、Region ---> 布尔(交、并、差)


1、(xdrx_region_union r1 r2)

2、(xdrx_region_intersect r1 r2)

3、(xdrx_region_subtract r1 r2)

4、(xdrx_get_union r1 ent)
ent -- 曲线、region、MPOLYGON、Hatch

5、(xdrx_get_intersect r1 ent)
ent -- 曲线、region、MPOLYGON、Hatch


6、(xdrx_get_subtract r1 ent)
ent -- 曲线、region、MPOLYGON、Hatch



七、Region ---> 提取指定点附近的 有独立的ROOT的子REGION




   (xdrx_getpropertyvalue region "extractloop" <pnt or ent or inx>)


region-extract.gif

实现代码:
游客,如果您要查看本帖隐藏内容请回复



八、Region ---> 提取所有的ROOT边界


   (xdrx_getpropertyvalue region "rootloops" [t])
给T参数,返回GE几何实体表

否,返回整数索引表

命令: (xdrx_getpropertyvalue (entlast))

region-root.gif

实现代码:
  1. (defun c:tt ()
  2.   (xdrx_begin)
  3.   (if (and (setq e (car (xdrx_entsel "\n拾取REGION<退出>:" '((0 . "REGION")))))
  4.            (setq ss (xdrx_getpropertyvalue e "rootloops" t))
  5.       )
  6.     (progn
  7.       (setq ents nil)
  8.       (mapcar '(lambda(x)
  9.                  (setq e1 (xdge::entity:make x)
  10.                        ents (cons e1 ents))
  11.                  (xdge::free x))ss)
  12.       (xd::drag:simplemove ents "\n插入点:" 5 t)
  13.     )
  14.   )
  15.   (xdrx_end)
  16.   (princ)
  17. )



九、Region ---> 获取边界LOOP数


   (xdrx_getpropertyvalue region "NumLoops")

返回整数

十、Region ---> 获取指定索引处的LOOP


   (xdrx_getpropertyvalue region "GetloopAt" <inx>)

返回几何实体名

十一、Region ---> 获取指定点、实体附近、索引处的子LOOP


   (xdrx_getpropertyvalue region "ChildLoops" <ent or pnt or inx> [t])
给T,返回几何实体表

否则,返回索引表

region-childloop.gif

  1. (defun c:tt ()
  2.   (xdrx_begin)
  3.   (if (and (setq e (car (xdrx_entsel "\n拾取REGION<退出>:" '((0 . "REGION")))))
  4.            (setq pt (getpoint "\n拾取点<退出>:"))
  5.            (setq ss (xdrx_getpropertyvalue e "childloops" pt t))
  6.       )
  7.     (progn (setq ents nil)
  8.            (mapcar '(lambda (x)
  9.                       (setq e1   (xdge::entity:make x)
  10.                             ents (cons e1 ents)
  11.                       )
  12.                       (xdrx_setpropertyvalue e1 "color" 1)
  13.                       (xdge::free x)
  14.                     )
  15.                    ss
  16.            )
  17.            (xd::drag:simplemove ents "\n插入点:" 5 t)
  18.     )
  19.   )
  20.   (xdrx_end)
  21.   (princ)
  22. )



十二、Region ---> 获取指定点、实体附近、索引处的父LOOP


   (xdrx_getpropertyvalue region "ParentLoop" <ent or pnt or inx> [t])
给T,返回几何实体表

否则,返回索引表


region-parent.gif

实现代码如下:
  1. (defun c:tt ()
  2.   (xdrx_begin)
  3.   (if (and (setq e (car (xdrx_entsel "\n拾取REGION<退出>:" '((0 . "REGION")))))
  4.            (setq pt (getpoint "\n拾取点<退出>:"))
  5.            (setq ss (xdrx_getpropertyvalue e "parentloop" pt t))
  6.       )
  7.     (progn (setq ents nil)
  8.            (mapcar '(lambda (x)
  9.                       (setq e1   (xdge::entity:make x)
  10.                             ents (cons e1 ents)
  11.                       )
  12.                       (xdrx_setpropertyvalue e1 "color" 1)
  13.                       (xdge::free x)
  14.                     )
  15.                    ss
  16.            )
  17.            (xd::drag:simplemove ents "\n插入点:" 5 t)
  18.     )
  19.   )
  20.   (xdrx_end)
  21.   (princ)
  22. )



十三、Region ---> 获取指定点、实体附近、索引处的根LOOP


   (xdrx_getpropertyvalue region "RootLoopAt" <ent or pnt or inx> [t])
   (xdrx_getpropertyvalue region "RootLoop" <ent or pnt or inx> [t])
给T,返回几何实体

否则,返回索引


region-rootat.gif

实现代码如下:

  1. (defun c:tt ()
  2.   (xdrx_begin)
  3.   (if (and (setq e (car (xdrx_entsel "\n拾取REGION<退出>:" '((0 . "REGION")))))
  4.            (setq pt (getpoint "\n拾取点<退出>:"))
  5.            (setq ss (xdrx_getpropertyvalue e "rootloopat" pt t))
  6.       )
  7.     (progn (setq e1 (xdge::entity:make ss))
  8.            (xdrx_setpropertyvalue e1 "color" 1)
  9.            (xdge::free ss)
  10.            (xd::drag:simplemove e1 "\n插入点:" 5 t)
  11.     )
  12.   )
  13.   (xdrx_end)
  14.   (princ)
  15. )



十四、Region ---> 获取REGION的拓扑关系表

(xdrx-get-topology region)返回二叉树型的表

例子:
命令: (xdrx-get-topology (car (entsel)))
选择对象: ((3 (2 (0)) (1)) (7 (6 (4)) (5)) (10 (9) (8)))


REGION实体通用查询函数 xdrx_getpropertyvalue 用法如下:

Class AcDbRegion:

    ├─Area
    ├─Detach
    ├─ExtractLoop
    ├─Perimeter
    ├─Centroid
    ├─GeEntities
    ├─MomInertia
    ├─Plane
    ├─ProdInertia
    ├─Perimeter
    ├─Length
    ├─PrinMoments
    ├─PrinAxes
    ├─RadiiGyration
    ├─ExtentsLow
    ├─ExtentsHigh
    ├─Normal
    ├─NumChanges
    ├─IsNull

    ├─Normal
    ├─NumChanges
    ├─IsNull


Loops Class:
    ├─ClosestLoopTo or LoopIndexAt
    ├─GetLoops
    ├─GetLoopAt
    ├─RootLoop
    ├─RootLoops
    ├─ParentLoop
    ├─ChildLoops
    ├─NumLoops






评分

参与人数 1D豆 +5 收起 理由
sh_h + 5 好主题奖!

查看全部评分

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

已领礼包: 8612个

财富等级: 富甲天下

发表于 2018-5-16 16:09:32 | 显示全部楼层
对天正的房间面积实体类型有没有生成边界的办法

点评

它要允许你炸开,就有办法。 天正活在“自己”的世界。 或者你转T3  详情 回复 发表于 2018-5-16 16:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2018-5-16 16:15:29 | 显示全部楼层
liuyj 发表于 2018-5-16 16:09
对天正的房间面积实体类型有没有生成边界的办法

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

使用道具 举报

已领礼包: 8612个

财富等级: 富甲天下

发表于 2018-5-16 16:21:26 | 显示全部楼层
炸开后就只剩面积文字了,转t3也是,没处下口
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 774个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2018-6-20 11:49:43 | 显示全部楼层
(xdrx_region->list (car(entsel))选取REGION时,返回nil

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2018-6-20 11:54:50 | 显示全部楼层
taner 发表于 2018-6-20 11:49
(xdrx_region->list (car(entsel))选取REGION时,返回nil

搜狗截图20180620115406.png

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2018-6-20 17:51:00 | 显示全部楼层
附件你测试一下看看

testregion.zip

17.02 KB, 下载次数: 5, 下载积分: D豆 -1 , 活跃度 1

点评

没问题,你是不是用的很早以前的API? 下载最新的API安装试试 令: !lst (( ) () () ( ) ( ) ( )) [attachimg]78369[/attachimg]  详情 回复 发表于 2018-6-20 18:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2018-6-20 18:08:14 | 显示全部楼层
本帖最后由 newer 于 2018-6-20 18:09 编辑
taner 发表于 2018-6-20 17:51
附件你测试一下看看

没问题,你是不是用的很早以前的API? 下载最新的API安装试试

令: !lst
((<图元名: 2733519c490> <图元名: 2733519c1d0> <图元名: 2733519c510> <图元名: 2733519c530>) (<图元名: 2733519c130>) (<图元名: 2733519bf10>) (<图元名: 2733519c550> <图元名: 2733519bd90> <图元名: 2733519bf30> <图元名: 2733519be50>) (<图元名: 2733519be70> <图元名: 2733519bfd0> <图元名: 2733519c610> <图元名: 2733519cd50>) (<图元名: 2733519b910> <图元名: 2733519cc90> <图元名: 2733519c970> <图元名: 2733519bff0> <图元名: 2733519c6f0> <图元名: 2733519cc10>))


搜狗截图20180620180836.png

  1. (defun c:tt ()
  2.   (if (and (setq
  3.              e (car (xdrx_entsel "\n拾取REGION<退出>:" '((0 . "region"))))
  4.            )
  5.            (setq lst (xdrx_region->list e))
  6.       )
  7.     (progn
  8.       (setq ss (xdge::entity:make lst))
  9.       (xdrx_entity_setproperty ss "color" 1)
  10.       (xdge::free lst)
  11.     )
  12.   )
  13.   (princ)
  14. )


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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2018-6-22 10:18:09 | 显示全部楼层
(xdrx_region->hatch region [t])出问题,如附件
新建位图图像.jpg

Drawing1.zip

20.19 KB, 下载次数: 2, 下载积分: D豆 -1 , 活跃度 1

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

使用道具 举报

已领礼包: 216个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 267个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:49 , Processed in 0.300977 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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