找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1283|回复: 6

[研讨] XDGE几何库应用 ---获取曲线重叠段

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2017-2-13 12:57:56 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Lispboy 于 2017-2-13 13:06 编辑

ARX功能强大,尤其是其中的AcGe几何库,最近研究了下,有些心得


下面探讨如何获得两条曲线重叠的部分


几何库里面有个类 AcGeCurveCurveInt3d,这个类就是处理两条相交曲线的各种位置关系的,其中
1、overlapCount 方法获取重叠段的数量
2、getOverLapRanges 获得指定索引(数量,基于0)的两条曲线上的重叠的范围的参数(AcGeInterval)


得到重叠的参数范围,就可以扣除局部的曲线了(使用通用函数库的xd::curve:getsub函数)


XDRX API 封装了ARX的几何库方法供LISP调用


重叠段演示.gif

下面是代码:
(defun c:tt ()
  (if (and (setq e1 (car (xdrx_entsel
                           "\n选取第一个多段线<退出>:"
                           '((0 . "LWPOLYLINE"))
                         )
                    )
           )
           (setq e2 (car (xdrx_entsel
                           "\n选取第二个多段线<退出>:"
                           '((0 . "LWPOLYLINE"))
                         )
                    )
           )
      )
    (progn
      (setq g1 (xdge::constructor e1) ;;构建第一条多段线的几何实体
            g2 (xdge::constructor e2)   ;;构建第二条多段线的几何实体
      )
      (if (setq gint (xdge::constructor "kCurveCurveInt3d" g1 g2)) ;;从两个几何实体构造AcGeCurveCurveInt3d对象
        (progn
          (setq num (xdge::getpropertyvalue gint "overlapcount")) ;;获取重叠段的数量
          (setq        i  -1
                ss (ssadd)
          )
          (repeat num
            (setq i        (1+ i)
                  g        (xdge::getpropertyvalue gint "getOverLapRanges" i) ;;获得第i段重叠的曲线范围参数
                  intv1        (car g) ;;获得第一条曲线的重叠部分的范围AcGeInterval对象
                  param        (xdge::getpropertyvalue intv1 "getbounds") ;;从AcGeInterval得到曲线参数上下范围
            )
            (setq e        (xd::curve:getsub e1 (car param) (cadr param) 0))  ;;调用通用LISP函数库函数扣取曲线部分实体(几何实体)
            (xdge::entity:make e) ;;生成数据库AcDbPolyline对象
            (xdrx_setpropertyvalue  ;;设置颜色6,常量宽度60
              (entlast)
              "color"
              6
              "constantwidth"
              60.0
            )
            (ssadd (entlast) ss)
          )
          (xdrx_prompt "\n发现了" num "个重叠段,品红色标记出.")
          (sssetfirst nil ss)
        )
      )      (xdge::free)
    )
  )
  (princ)
)


AcGeCurveCurveInt3d类,XDRXAPI 封装的方法


<kCurveCurveInt3d>:


   Edit Functions:
        ├───set


   Intersection Query Functions:
        ├───intPoint
        ├───intPoints
        ├───intPointTol
        ├───isTangential
        ├───isTransversal
        ├───numIntPoints
        ├───overlapCount
        ├───overlapDirection


   Ordering Functions:
        ├───changeCurveOrder
        ├───orderWrt1
        ├───orderWrt12


   Query Functions:
        ├───curve1
        ├───curve2
        ├───getIntParams
        ├───getIntRanges
        ├───getOverlapRanges
        ├───getPointOnCurve1
        ├───getPointOnCurve2
        ├───tolerance




<kEntity3d>:


   Equality Checking Functions:
        ├───isEqualTo


   Point Containment Functions:
        ├───isOn


   Type Identification Functions:
        ├───isKindOf
        ├───type



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

已领礼包: 104个

财富等级: 日进斗金

发表于 2021-10-21 08:30:42 | 显示全部楼层
谢谢老师分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 104个

财富等级: 日进斗金

发表于 2021-11-1 10:57:58 | 显示全部楼层
老师:我使用这个插件发现一个问题,对于二个封闭的图形生成的是选择的第一条曲线的非重叠段;
另一个问题:能不能框选生成多条曲线生成重叠段。
封闭曲线重叠段生成的位置有误.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 199个

财富等级: 日进斗金

发表于 2022-7-18 18:09:24 | 显示全部楼层
我测试的结果也是有上述问题,应该是函数出问题了。估计是后面的函数有修改造成的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2023-11-15 06:15:26 | 显示全部楼层
开心68602 发表于 2021-11-1 10:57
老师:我使用这个插件发现一个问题,对于二个封闭的图形生成的是选择的第一条曲线的非重叠段;
另一个问题 ...


修改了下代码,试试下面的


微信截图_20231115061150.png

  1. (defun c:tt ()
  2.   (if (and (setq e1 (car (xdrx_entsel
  3.                            "\nSelect the first polyline<Exit>:"
  4.                            '((0 . "LWPOLYLINE"))
  5.                          )
  6.                     )
  7.            )
  8.            (setq e2 (car (xdrx_entsel
  9.                            "\nSelect second polyline <Exit>:"
  10.                            '((0 . "LWPOLYLINE"))
  11.                          )
  12.                     )
  13.            )
  14.       )
  15.     (progn
  16.       (setq g1 (xdge::constructor e1)
  17.             ;;Construct the geometric entity of the first polyline
  18.             g2 (xdge::constructor e2)
  19.                ;;Construct the geometric entity of the second polyline
  20.       )
  21.       (if (setq gint (xdge::constructor "kCurveCurveInt3d" g1 g2))
  22.         ;;Construct AcGeCurveCurveInt3d object from two geometric entities
  23.         (progn
  24.           (setq num (xdge::getpropertyvalue gint "overlapcount"))
  25.           ;;Get the number of overlapping segments
  26.           (setq        i  -1
  27.                 ss (ssadd)
  28.           )
  29.           (repeat num
  30.             (setq i        (1+ i)
  31.                   g        (xdge::getpropertyvalue gint "getOverLapRanges" i)
  32.                   ;;Get the overlapping curve range parameters of the i-th segment
  33.                   intv1        (car g)
  34.                   ;;Get the range AcGeInterval object of the overlapping part of the first curve
  35.                   param        (xdge::getpropertyvalue intv1 "getbounds")
  36.                         ;;Get the upper and lower range of curve parameters from AcGeInterval
  37.             )
  38.             ;(setq e (xd::curve:getsub e1 (car param) (cadr param) 0))
  39.             (setq e (xdge::setpropertyvalue g1 "setinterval" (car param) (cadr param) ))
  40.             ;;Call the general LISP function library function to deduct part of the curve entity (geometric entity)
  41.             (xdge::entity:make e)
  42.             ;;Generate database AcDbPolyline object
  43.             (xdrx_setpropertyvalue
  44.               ;;Set color 6, constant width 60
  45.               (entlast)
  46.               "color"
  47.               6
  48.               "constantwidth"
  49.               60.0
  50.             )
  51.             (ssadd (entlast) ss)
  52.           )
  53.           (xdrx_prompt
  54.             "\n"
  55.             num
  56.             "overlapping segments found, marked in magenta."
  57.           )
  58.           (sssetfirst nil ss)
  59.         )
  60.       )
  61.       (xdge::free)
  62.     )
  63.   )
  64.   (princ)
  65. )

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

使用道具 举报

已领礼包: 104个

财富等级: 日进斗金

发表于 2024-1-1 21:49:36 | 显示全部楼层
LoveArx 发表于 2023-11-15 06:15
修改了下代码,试试下面的

今天刚看到,试了一下,能用了,非常感谢老师。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-3-29 19:24 , Processed in 0.296548 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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