| 
本帖最后由 newer 于 2018-5-1 01:33 编辑
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册 
    
 
 
 XDRX API从 2018.0508开始提供ObjectARX AcBr API 库的LISP封装。
 
 
 什么是“ACBR API” ?
 
 
 AcBr API 是ARX处理拓扑对象的应用程序开发接口,用来处理AcDbRegion, AcDb3DSolid,AcDbBody等三维几何实体的拓扑关系。
 除去ARX,其他的开发接口VLISP等没有提供封装的接口。
 
 
 通过这个API,可以很方便的查询几何模型实体的“体、面、环、边、点”的数据和拓扑关系。
 AcBrEntity 是这个接口的基类,本身不能实例化,它下面派生了 AcBrBrep,AcBrFace,AcBrLoop,AcBrEdge,AcBrVertex及AcBrShell等子类。并通过拓扑遍历器AcBrTraverser类,从 体、面、环、边、点的顺序来遍历整个模型实体。
 
 
 下面我们介绍通过ACBR API来遍历一个面域实体,来得到每个边界曲线。
 
 
 如图,是一个用SUBTRACT,UNION组合的面域实体,从ACBR的角度出发,它由“两个FACE”,“三个LOOP”,和“三个EDGE”组成。
 ACBR的实体模型的拓扑层次结构是: 体(BODY) --->面(FACE)--->路径(LOOP)--->边(Edge)--->顶点(Vertex)
 
 
 比如一个正方体BOX,由6个面,每个面由一个LOOP,每个LOOP由四条边,每个边由两个顶点组成。
 通过遍历器,从BOX的根可以遍历到每个元素。也就可以方便的求出点,线,面的拓扑关系,点线面的交点、交线,点或直线是否在线、面上等等查询。
 
 
 
   
 白色的是面域,红色是取得的三个边界曲线(圆)
 
 
   上图,得到3DSOLID的每条边,红色。
 
 代码如下:三层循环遍历结构
 
 
 
  ;面(FACE)-> 路径(LOOP) ->边(EDGE)三层遍历,获得REGION边界曲线
(defun c:tt ()
  (if (and (setq e (car (entsel))) (setq br (xdbr::constructor e)))
    (progn (setq tr (xdbr::constructor "brepfacetraverser" br))
           (setq xents nil)
           ;;FACE遍历
           (while (not (xdbr::traverser:done tr))
             (setq face (xdbr::getpropertyvalue tr "face"))
             (setq faceloop (xdbr::constructor "facelooptraverser" face))
             (xdrx_object_release face)
             (setq fents nil)
             ;FACE下LOOP遍历
             (while (not (xdbr::traverser:done faceloop));;遍历器没到结束,循环
               (setq loop (xdbr::getpropertyvalue faceloop "loop"))
               (setq loopedge (xdbr::constructor "loopedgetraverser" loop))
               (xdrx_object_release loop)
               (setq ents nil)
               ;LOOP下Edge遍历
               (while (not (xdbr::traverser:done loopedge))
                 (setq edge (xdbr::getpropertyvalue loopedge "edge"))
                 (setq ents (cons edge ents));;边AcBrEdge保存到全局表中,以后操作。
                 (xdbr::traverser:next loopedge);;遍历器指针指向下一条边
               )
               (xdrx_object_release loopedge)
               (setq fents (cons ents fents))
               (xdbr::traverser:next faceloop);;遍历器指向下一条LOOP
             )
             (xdrx_object_release faceloop)
             (setq xents (cons fents xents))
             (xdbr::traverser:next tr);;遍历器指向下一个面FACE
           )
           ;;AcBrEdge -> AcGe Curve
           (setq ges (mapcar '(lambda (x) (xdbr::getpropertyvalue x "curve"))
                             (xd::list:flat xents)
                     )
           )
           (setq ss (xdge::entity:make ges)) ;;创建数据库曲线
           (xdrx_object_release tr br ges xents);;释放中间的ACBR对象
           (xdrx_entity_setproperty ss "color" 1);;设置颜色红色
           (xdrx_entity_redraw ss 1);;夹点亮显选择集
    )
  )
  (princ)
)
 
 
 |