| 
本帖最后由 newer 于 2017-8-8 00:46 编辑
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册 
    
 http://bbs.xdcad.net/thread-711477-1-1.html
 上面 Lispboy 的帖子链接介绍了API函数 xdrx_polyline_isSelfIntersect 判断多段线是否自交,并返回自交参数表
 
 下面介绍下,使用XDGE几何库,用晓东通用LISP函数模拟ARX解算的过程。
 
 
  (defun c:tt ()
  (if
    (and (setq
           e (car
               (xdrx_entsel "\n拾取多段线<退出>:" '((0 . "LWPOLYLINE")))
             )
         )
         (setq ints (xdrx_entity_intersectwith e e))
         ;;自身求交点(包括自交点和顶点)
         (setq verts (xdrx_getpropertyvalue e "vertices"))
         ;;获得多段线顶点表
         (setq g (xdge::constructor e))
         ;;构建多段线几何实体模型
         (setq gl (xdge::getpropertyvalue g "getcurvelist"))
         ;;获得几何多段线各段的几何实体(包括LINE,ARC)
    )
     (progn
       (setq params nil)
       (setq
         ints (vl-remove-if
                '(lambda (x) (XD::List:ItemAllPosition verts x 1e-3))
                ints
              )
       )
       ;;删除掉顶点,剩下自交点
       (foreach        n ints
         (setq inx 0)
         (foreach m gl
           ;;循环处理每段,求交点对应的两个参数
           (if (setq pa (xdge::getpropertyvalue m "ison" n))
             ;;判断自交点是否在当前段上,返回参数值(ON)
             (progn
               (setq dis (xdge::getpropertyvalue
                           g
                           "localToGlobalParam"
                           pa
                           inx
                         )
               )
               ;;返回当前段参数对应全局多段线成参数值
               (setq pa (xdrx_curve_getparamatdist e dis))
               ;;dis全局参数(几何实体)对应数据库实体的长度值,由长度算出数据库实体参数值
               (setq params (cons pa params))
             )
           )
           (setq inx (1+ inx))
         )
       )
       (setq params (reverse params))
       (princ "\n计算参数值表:")
       (princ params)
       (princ "\nAPI 参数值表:")
       (princ (xdrx_polyline_isSelfIntersect e 2))
       (xdge::free g gl) ;;释放几何对象内存
     )
  )
  (princ)
)
 执行结果:
 命令: TT
 拾取多段线<退出>:
 计算参数值表:(1.17218 3.62837 1.81808 5.18041 3.48957 6.13156)
 API 参数值表:(1.17218 3.62837 1.81808 5.18041 3.48957 6.13156)
 
 
 得到的结果完全相同。
 
 
   
 |