找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 414|回复: 0

[教学] 用XDGE几何库算多段线自交点参数值

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-7 23:45:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 newer 于 2017-8-8 00:46 编辑

http://bbs.xdcad.net/thread-711477-1-1.html
上面 Lispboy 的帖子链接介绍了API函数 xdrx_polyline_isSelfIntersect 判断多段线是否自交,并返回自交参数表

下面介绍下,使用XDGE几何库,用晓东通用LISP函数模拟ARX解算的过程。

  1. (defun c:tt ()
  2.   (if
  3.     (and (setq
  4.            e (car
  5.                (xdrx_entsel "\n拾取多段线<退出>:" '((0 . "LWPOLYLINE")))
  6.              )
  7.          )
  8.          (setq ints (xdrx_entity_intersectwith e e))
  9.          ;;自身求交点(包括自交点和顶点)
  10.          (setq verts (xdrx_getpropertyvalue e "vertices"))
  11.          ;;获得多段线顶点表
  12.          (setq g (xdge::constructor e))
  13.          ;;构建多段线几何实体模型
  14.          (setq gl (xdge::getpropertyvalue g "getcurvelist"))
  15.          ;;获得几何多段线各段的几何实体(包括LINE,ARC)
  16.     )
  17.      (progn
  18.        (setq params nil)
  19.        (setq
  20.          ints (vl-remove-if
  21.                 '(lambda (x) (XD::List:ItemAllPosition verts x 1e-3))
  22.                 ints
  23.               )
  24.        )
  25.        ;;删除掉顶点,剩下自交点
  26.        (foreach        n ints
  27.          (setq inx 0)
  28.          (foreach m gl
  29.            ;;循环处理每段,求交点对应的两个参数
  30.            (if (setq pa (xdge::getpropertyvalue m "ison" n))
  31.              ;;判断自交点是否在当前段上,返回参数值(ON)
  32.              (progn
  33.                (setq dis (xdge::getpropertyvalue
  34.                            g
  35.                            "localToGlobalParam"
  36.                            pa
  37.                            inx
  38.                          )
  39.                )
  40.                ;;返回当前段参数对应全局多段线成参数值
  41.                (setq pa (xdrx_curve_getparamatdist e dis))
  42.                ;;dis全局参数(几何实体)对应数据库实体的长度值,由长度算出数据库实体参数值
  43.                (setq params (cons pa params))
  44.              )
  45.            )
  46.            (setq inx (1+ inx))
  47.          )
  48.        )
  49.        (setq params (reverse params))
  50.        (princ "\n计算参数值表:")
  51.        (princ params)
  52.        (princ "\nAPI 参数值表:")
  53.        (princ (xdrx_polyline_isSelfIntersect e 2))
  54.        (xdge::free g gl) ;;释放几何对象内存
  55.      )
  56.   )
  57.   (princ)
  58. )


执行结果:
命令: 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)


得到的结果完全相同。

224457kyzyahpovxwubs7k.png.thumb.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-3-28 18:48 , Processed in 0.504126 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表