刚拿到最新的API,增加了MPOLYGON实体和方法
在AutoCAD中 MPolygon 可以说是一个“自定义”实体,这个实体提供了点和线或者线线间拓扑关系一些方法,MPolygon只支持点和Bugle构成,也就是 AcDbPolyline AcDb2dPolyline AcDbCircle , MPolygon 可以判断是否自相交、曲线包含关系等,另外 MPolygon 还带有 Hatch 属性,和 Hatch这个方式一致,选择 曲线 生成MPolygon 后是这个拓扑关系
api 使用方法
(setq mp (xdrx_mpolygon (ssget '((0 . "lwpolyline,circle"))))
待续....
AcDbMPolygon类,不只是支持点和BULGE组成的边界,同时也支持AcDbPolyline(闭合),AcDb2dPolyline(闭合),AcDbCircle对象。
xdrx api 2017.0204以上版本,加入了对MPolygon对象的支持
1、创建函数:
(xdrx_mpolygon_make)---- 创建一个空的AcDbMPolygon对象
(xdrx_mpolygon_make <ss .... ent .... ent ...ss> ) 根据选择集创建,对于不封闭的多段线进行封闭,非多段线,圆曲线实体拟合成点表后加入拓扑。
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 )
├─insertMPolygonLoopAt (INT Enames Doubles )
├─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) 两 Pline 位置关系判断
(defun c:tt1 (/ e1 e2 mp)
(if (and (setq e1 (xdrx_entsel
"\nPick Pline: "
'((0 . "lwpolyline")
(-4 . "&=")
(70 . 0)
)
)
)
(setq e2 (xdrx_entsel
"\nPick Pline: "
'((0 . "lwpolyline")
(-4 . "&=")
(70 . 0)
)
)
)
)
(progn
(setq mp (xdrx_mpolygon_make))
(if (xdrx_setpropertyvalue
mp
"appendLoopFromBoundary"
(car e1)
nil
nil
)
(progn
(if (xdrx_setpropertyvalue
mp
"appendLoopFromBoundary"
(car e2)
nil
nil
)
(progn
(cond
((and (not (xdrx_getpropertyvalue mp "childLoops" 0))
(not (xdrx_getpropertyvalue mp "childLoops" 1))
)
(if (xdrx_getpropertyvalue mp "includesTouchingLoops")
(princ "\n接触")
(princ "\n相离")
)
)
((= (car (xdrx_getpropertyvalue mp "childLoops" 0)) 1)
(princ "\n2 in 1")
)
((= (car (xdrx_getpropertyvalue mp "childLoops" 1)) 0)
(princ "\n1 in 2")
)
(t)
)
)
(princ "\n相交")
)
(entdel mp)
)
(princ "\nFirst LWPOLYLINE is selfCrossed.")
)
)
)
(princ)
) st788796 发表于 2017-2-5 19:04
接触就是两个相贴吧?
这个代码,内,也是相离吧?
是不是还应该有个内外的关系?
本帖最后由 st788796 于 2017-2-5 21:13 编辑
测试点在哪个 Loop 内的演示 isPointInsideMPolygon
**** Hidden Message ***** getClosestLoopTo 方法 演示,该方法返回测试点距离 MPolygon 最近的 Loop 索引,根据索引就可以进而得到该 Loop 信息
**** Hidden Message *****
getChildLoops 方法演示,顾名思义就是获取子 Loop,即包含了哪些曲线,一组曲线建立一个 MPolygon 映像,这样随意指定一个曲线,就可以用该方法获得包含再内部的其他曲线
**** Hidden Message ***** 这还是个没接触过的东西,如果仅对*Polyline或是cicle,用这种方法的速度是不是比用曲线相关函数快? 本帖最后由 newer 于 2017-2-5 22:36 编辑
liuyj 发表于 2017-2-5 22:20
这个MPolygon对象是AUTOCAD MAP里面的,用来构建拓扑关系的,现在把它用到AUTOCAD里面了,
这个东西不应该是曲线比,而且曲线也没有拓扑关系的函数, 应该是REGION比较,他们是一类的,这个MPolyGon比REGION要高效,而且提供了拓扑的一些方法,REGION没有。
getParentLoop 例子,找 父 Loop
**** Hidden Message *****
st788796 发表于 2017-2-5 23:04
感觉这个能求开孔的区域的面积
ST大师能不能给写个应用,曲线里面有曲线(可能多个,嵌套),求净面积
再不考虑自相交等情况下,直接使用 area 方法, 比 Region 方法要简单多了
(defun c:tt6 (/ ss mp)
(if (and (setq ss (ssget))
(setq mp (xdrx_mpolygon_make ss))
)
(progn
(princ "\nArea = ")
(princ (xdrx_getpropertyvalue mp "area"))
(entdel mp)
)
)
(princ)
)
示例中的曲线生成 MPolygon 后如下图所示,面积就是填充区域的。MPolygon 带有 Hatch 属性,可以和 普通 Hatch 一样设置那些比例、名称、样式、间隙等等,不过 MPolygon 这个 Hatch 只提供了显示方法,没有提供去除显示方法,在 特性管理中如果选择了填充,就无法返回了! 啥也不说了,感谢楼主分享哇! 效果挺好.