st788796 发表于 2017-2-4 20:17:32

刚拿到最新的API,增加了MPOLYGON实体和方法

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

api 使用方法

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

待续....

newer 发表于 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> ) 根据选择集创建,对于不封闭的多段线进行封闭,非多段线,圆曲线实体拟合成点表后加入拓扑。



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)

st788796 发表于 2017-2-5 19:04:52

两 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)
)

Lisphk 发表于 2017-2-5 20:15:21

st788796 发表于 2017-2-5 19:04


接触就是两个相贴吧?

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


st788796 发表于 2017-2-5 20:48:20

本帖最后由 st788796 于 2017-2-5 21:13 编辑

测试点在哪个 Loop 内的演示 isPointInsideMPolygon
**** Hidden Message *****

st788796 发表于 2017-2-5 21:11:40

getClosestLoopTo 方法 演示,该方法返回测试点距离 MPolygon 最近的 Loop 索引,根据索引就可以进而得到该 Loop 信息
**** Hidden Message *****

st788796 发表于 2017-2-5 21:26:10

getChildLoops 方法演示,顾名思义就是获取子 Loop,即包含了哪些曲线,一组曲线建立一个 MPolygon 映像,这样随意指定一个曲线,就可以用该方法获得包含再内部的其他曲线
**** Hidden Message *****

liuyj 发表于 2017-2-5 22:20:07

这还是个没接触过的东西,如果仅对*Polyline或是cicle,用这种方法的速度是不是比用曲线相关函数快?

newer 发表于 2017-2-5 22:32:41

本帖最后由 newer 于 2017-2-5 22:36 编辑

liuyj 发表于 2017-2-5 22:20

这个MPolygon对象是AUTOCAD MAP里面的,用来构建拓扑关系的,现在把它用到AUTOCAD里面了,
这个东西不应该是曲线比,而且曲线也没有拓扑关系的函数, 应该是REGION比较,他们是一类的,这个MPolyGon比REGION要高效,而且提供了拓扑的一些方法,REGION没有。

st788796 发表于 2017-2-5 23:04:21

getParentLoop 例子,找 父 Loop
**** Hidden Message *****

Lisphk 发表于 2017-2-5 23:07:44

st788796 发表于 2017-2-5 23:04


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

ST大师能不能给写个应用,曲线里面有曲线(可能多个,嵌套),求净面积

st788796 发表于 2017-2-5 23:14:56

再不考虑自相交等情况下,直接使用 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)
)

st788796 发表于 2017-2-5 23:46:05

示例中的曲线生成 MPolygon 后如下图所示,面积就是填充区域的。MPolygon 带有 Hatch 属性,可以和 普通 Hatch 一样设置那些比例、名称、样式、间隙等等,不过 MPolygon 这个 Hatch 只提供了显示方法,没有提供去除显示方法,在 特性管理中如果选择了填充,就无法返回了!

lionguns 发表于 2017-4-19 14:29:31

啥也不说了,感谢楼主分享哇!

liuyizeng 发表于 2017-4-25 08:04:56

效果挺好.
页: [1] 2 3
查看完整版本: 刚拿到最新的API,增加了MPOLYGON实体和方法