找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8117|回复: 38

[每日一码] 刚拿到最新的API,增加了MPOLYGON实体和方法

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-2-4 20:17:32 | 显示全部楼层 |阅读模式

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

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

×
在AutoCAD中 MPolygon 可以说是一个“自定义”实体,这个实体提供了点和线或者线线间拓扑关系一些方法,MPolygon只支持点和Bugle构成,也就是 AcDbPolyline AcDb2dPolyline AcDbCircle , MPolygon 可以判断是否自相交、曲线包含关系等,另外 MPolygon 还带有 Hatch 属性,和 Hatch mpolygon.jpg
这个方式一致,选择 曲线 生成MPolygon 后是这个拓扑关系

api 使用方法

  1. (setq mp (xdrx_mpolygon (ssget '((0 . "lwpolyline,circle"))))

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-2-4 20:39:44 | 显示全部楼层
AcDbMPolygon类,不只是支持点和BULGE组成的边界,同时也支持AcDbPolyline(闭合),AcDb2dPolyline(闭合),AcDbCircle对象。

xdrx api 2017.0204以上版本,加入了对MPolygon对象的支持

1、创建函数:
  (xdrx_mpolygon_make)  ---- 创建一个空的AcDbMPolygon对象
  (xdrx_mpolygon_make <ss .... ent .... ent ...ss> [t or nil] [t]) 根据选择集创建,对于不封闭的多段线进行封闭,非多段线,圆曲线实体拟合成点表后加入拓扑。

QQ截图20170204203637.png

2、查询函数
    (xdrx_getpropertyvalue MPolygon实体 "方法")

Class AcDbMPolygon:
    ├─Elevation
    ├─Area
    ├─ChildLoops
    ├─ClosestLoopTo
    ├─LoopAtGsMarker
    ├─LoopDirection
    ├─MPolygonLoopAt
    ├─OffsetVector
    ├─PatternDefinitionAt
    ├─Perimeter
    ├─Normal
    ├─NumMPolygonLoops
    ├─NumPatternDefinitions
    ├─IncludesTouchingLoops
    ├─IsPointInsideMPolygon
    ├─IsPointOnLoopBoundary
    ├─SelfCrosses
    ├─PatternAngle
    ├─PatternScale
    ├─PatternDouble
    ├─PatternSpace
    ├─PatternName
    ├─PatternType


3、编辑函数
    (xdrx_setpropertyvalue MPolygon实体 "方法")

Class AcDbMPolygon:
  ├─Elevation (Double)
  ├─Gradient (Int STR)
  ├─GradientAngle (Double)
  ├─GradientShift (Int)
  ├─Normal (Vector)
  ├─LoopDirection (Int Int)
  ├─Pattern (Int Str)
  ├─PatternAngle (double)
  ├─PatternColor (POINT or Int)
  ├─PatternDouble (T or NIL)
  ├─PatternScale (Double or Int)
  ├─appendMPolygonLoop (Points and Doubles or T)
  ├─appendLoopFromBoundary (Enames [T])
  ├─insertMPolygonLoopAt (INT Enames Doubles [T])
  ├─removeMPolygonLoopAt (Int)
  ├─evaluateHatch (None or T)


Class AcDbEntity:

  ├─Color(Int)
  ├─Elevation(Int or Real)
  ├─Layer(STR)
  ├─Linetype(STR)
  ├─LinetypeScale(Real or Int)
  ├─LineWeight(INT)
  ├─PlotStyleName(STR)
  ├─Transparency(0-100)
  ├─Visibility(T or Nil)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2017-2-5 19:04:52 | 显示全部楼层
两 Pline 位置关系判断

  1. (defun c:tt1 (/ e1 e2 mp)
  2.   (if (and (setq e1 (xdrx_entsel
  3.                       "\nPick Pline: "
  4.                       '((0 . "lwpolyline")
  5.                         (-4 . "&=")
  6.                         (70 . 0)
  7.                        )
  8.                     )
  9.            )
  10.            (setq e2 (xdrx_entsel
  11.                       "\nPick Pline: "
  12.                       '((0 . "lwpolyline")
  13.                         (-4 . "&=")
  14.                         (70 . 0)
  15.                        )
  16.                     )
  17.            )
  18.       )
  19.     (progn
  20.       (setq mp (xdrx_mpolygon_make))
  21.       (if (xdrx_setpropertyvalue
  22.             mp
  23.             "appendLoopFromBoundary"
  24.             (car e1)
  25.             nil
  26.             nil
  27.           )
  28.         (progn
  29.           (if (xdrx_setpropertyvalue
  30.                 mp
  31.                 "appendLoopFromBoundary"
  32.                 (car e2)
  33.                 nil
  34.                 nil
  35.               )
  36.             (progn
  37.               (cond
  38.                 ((and (not (xdrx_getpropertyvalue mp "childLoops" 0))
  39.                       (not (xdrx_getpropertyvalue mp "childLoops" 1))
  40.                  )
  41.                  (if (xdrx_getpropertyvalue mp "includesTouchingLoops")
  42.                    (princ "\n接触")
  43.                    (princ "\n相离")
  44.                  )
  45.                 )
  46.                 ((= (car (xdrx_getpropertyvalue mp "childLoops" 0)) 1)
  47.                  (princ "\n2 in 1")
  48.                 )
  49.                 ((= (car (xdrx_getpropertyvalue mp "childLoops" 1)) 0)
  50.                  (princ "\n1 in 2")
  51.                 )
  52.                 (t)
  53.               )
  54.             )
  55.             (princ "\n相交")
  56.           )
  57.           (entdel mp)
  58.         )
  59.         (princ "\nFirst LWPOLYLINE is selfCrossed.")
  60.       )
  61.     )
  62.   )
  63.   (princ)
  64. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-2-5 20:15:21 | 显示全部楼层

接触就是两个相贴吧?

这个代码,内,也是相离吧?
是不是还应该有个内外的关系?


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2017-2-5 20:48:20 | 显示全部楼层
本帖最后由 st788796 于 2017-2-5 21:13 编辑

测试点在哪个 Loop 内的演示 isPointInsideMPolygon
游客,如果您要查看本帖隐藏内容请回复
mpolygon-1.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2017-2-5 21:11:40 | 显示全部楼层
getClosestLoopTo 方法 演示,该方法返回测试点距离 MPolygon 最近的 Loop 索引,根据索引就可以进而得到该 Loop 信息
游客,如果您要查看本帖隐藏内容请回复


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2017-2-5 21:26:10 | 显示全部楼层
getChildLoops 方法演示,顾名思义就是获取子 Loop,即包含了哪些曲线,一组曲线建立一个 MPolygon 映像,这样随意指定一个曲线,就可以用该方法获得包含再内部的其他曲线
游客,如果您要查看本帖隐藏内容请回复
mpolygon-3.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

发表于 2017-2-5 22:20:07 | 显示全部楼层
这还是个没接触过的东西,如果仅对*Polyline或是cicle,用这种方法的速度是不是比用曲线相关函数快?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-2-5 22:32:41 | 显示全部楼层
本帖最后由 newer 于 2017-2-5 22:36 编辑

这个MPolygon对象是AUTOCAD MAP里面的,用来构建拓扑关系的,现在把它用到AUTOCAD里面了,
这个东西不应该是曲线比,而且曲线也没有拓扑关系的函数, 应该是REGION比较,他们是一类的,这个MPolyGon比REGION要高效,而且提供了拓扑的一些方法,REGION没有。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2017-2-5 23:04:21 | 显示全部楼层
getParentLoop 例子,找 父 Loop
游客,如果您要查看本帖隐藏内容请回复

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-2-5 23:07:44 | 显示全部楼层

感觉这个能求开孔的区域的面积

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2017-2-5 23:14:56 | 显示全部楼层
再不考虑自相交等情况下,直接使用 area 方法, 比 Region 方法要简单多了

  1. (defun c:tt6 (/ ss mp)
  2.   (if (and (setq ss (ssget))
  3.            (setq mp (xdrx_mpolygon_make ss))
  4.       )
  5.     (progn
  6.       (princ "\nArea = ")
  7.       (princ (xdrx_getpropertyvalue mp "area"))
  8.       (entdel mp)
  9.     )
  10.   )
  11.   (princ)
  12. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2017-2-5 23:46:05 | 显示全部楼层
示例中的曲线生成 MPolygon 后如下图所示,面积就是填充区域的。MPolygon 带有 Hatch 属性,可以和 普通 Hatch 一样设置那些比例、名称、样式、间隙等等,不过 MPolygon 这个 Hatch 只提供了显示方法,没有提供去除显示方法,在 特性管理中如果选择了填充,就无法返回了!
mpolygon-area.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 1562个

财富等级: 堆金积玉

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-21 00:26 , Processed in 0.219545 second(s), 62 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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