马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 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)
得到的结果完全相同。
|