找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3330|回复: 12

[教学] XDGE几何库应用(20)--AcGeCompositeCurve

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-27 12:06:53 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 st788796 于 2014-11-1 08:08 编辑

AcGeCompositeCurve2d / 3d 代表了一组连续线 , AcDb 类中的  lwpolyline(2d) polyline(3d) 对应这两个 Ge 类

构造方法
1 (xdge::constructor ent);_默认构造 AcGeComposite3d

2 (xdge::constructor ent "kCompositeCrv2d") 返回表(
_$ (mapcar 'xdge::type (xdge::constructor (entlast) "kCompositeCrv2d"))
("kCompositeCrv3d" "kCompositeCrv2d")

3 (xdge::constructor "kCompositeCrv2d" ge2dlst) 参数为 2d Ge 实体表

方法

1 (xdge::getpropertyvalue ge "getCurveList") 获得组成 AcGeCompositeCurve 的 Ge 曲线列表

2 (xdge::getpropertyvalue ge "globalToLocalParam" param) 全局参数转化为所在 Ge 子段参数,返回表(子段参数 子段索引)
参照AcDb  中 Pline 的 vlax-curve-getparamatdist 就好理解了

3 (xdge::getpropertyvalue ge "localToGlobalParam" param) 与方法2相反

下面是一个用 Line 构造 Pline 测试,相当于 Pedit -> M
  1. (defun c:tt (/ ss lst glst n lsp lep l1 pl)
  2.   (if (setq ss (ssget '((0 . "line"))));_选择线
  3.     (progn
  4.       (apply 'xdge::entity:3d->2d
  5.              (setq gel (xdge::constructor (xdrx_pickset->ents ss)))
  6.       );_构造 geCurveList
  7.       (setq lst         (list (car gel));_初始线
  8.             glst (mapcar '(lambda (x)
  9.                             (cons x
  10.                                   (xdge::getpropertyvalue
  11.                                     x
  12.                                     "hasStartPoint"
  13.                                     "hasEndPoint"
  14.                                   );_取出每段的起点和端点
  15.                             )
  16.                           )
  17.                          (cdr gel)
  18.                  )
  19.             n         (length glst)
  20.       )
  21.       (repeat n
  22.         (setq lsp (xdge::getpropertyvalue (car lst) "hasStartPoint")
  23.               lep (xdge::getpropertyvalue (last lst) "hasEndPoint")
  24.         );_取出构造Pline 的起点和端点
  25.         (if (setq l1 (car (vl-member-if
  26.                             '(lambda (x)
  27.                                (or (equal (cadr x) lsp 1e-12)
  28.                                    (equal (caddr x) lsp 1e-12)
  29.                                    (equal (cadr x) lep 1e-12)
  30.                                    (equal (caddr x) lep 1e-12)
  31.                                )
  32.                              )
  33.                             glst
  34.                           );_搜索出和 pline  首尾相接 Line
  35.                      )
  36.             )
  37.           (progn
  38.             (cond
  39.               ((equal (cadr l1) lsp 1e-12)
  40.                (xdge::setpropertyvalue (car l1) "reverseParams");_保证 endpoint to  startpoint
  41.                (setq lst (cons (car l1) lst))
  42.               )
  43.               ((equal (caddr l1) lsp 1e-12)
  44.                (setq lst (cons (car l1) lst))
  45.               )
  46.               ((equal (cadr l1) lep 1e-12)
  47.                (setq lst (cons (car l1) lst))
  48.               )
  49.               ((equal (caddr l1) lep 1e-12)
  50.                (xdge::setpropertyvalue (car l1) "reverseParams");_保证 endpoint to  startpoint
  51.                (setq lst (cons (car l1) lst))
  52.               )
  53.               (t)
  54.             )
  55.             (setq glst (vl-remove l1 glst))
  56.           )
  57.         )
  58.       )
  59.       (setq pl (xdge::constructor "kCompositeCrv3d" lst));_构造 CompositeCurve
  60.       (xdge::entity:make pl);_转换为 AcDb 实体
  61.       (xdrx_entity_setcolor (entlast) 1)
  62.     )
  63.   )
  64.   (xdge::free)
  65.   (princ)
  66. )


本帖被以下淘专辑推荐:

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

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-9-27 12:32:02 来自手机 | 显示全部楼层
curveList 只能用 AcGeLineSeg & AcGeCircleArc (非闭合)构成

点评

准确的说,AcGeComposite3d 是 LWPOLYLINE的数学几何原形,AcGePolyline3d 是3D POLYLINE的数学几何原形。 而AcGeComposite2d 仅仅是对应的3d 几何实体的二维表现,纯数学应用多,因为很多时候2维方便运算和有特  详情 回复 发表于 2014-9-27 14:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-27 14:08:27 | 显示全部楼层
csharp 发表于 2014-9-27 12:32
curveList 只能用 AcGeLineSeg & AcGeCircleArc (非闭合)构成

准确的说,AcGeComposite3d 是 LWPOLYLINE的数学几何原形,LWPOLYLINE是组合实体,由AcGeLineSeg3d,AcGeCircArc3d组成,对应的DB实体是LINE和ARC。
AcGePolyline3d 是3D POLYLINE的数学几何原形。它不是组合实体,单一实体类型构成的。

而AcGeComposite2d 仅仅是对应的3d 几何实体的二维表现,纯数学应用多,因为很多时候2维方便运算和有特殊于3D的几何属性。

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-9-27 14:18:13 | 显示全部楼层
本帖最后由 st788796 于 2014-9-27 14:24 编辑
XDSoft 发表于 2014-9-27 14:08
准确的说,AcGeComposite3d 是 LWPOLYLINE的数学几何原形,LWPOLYLINE是组合实体,由AcGeLineSeg3d,AcGeC ...

哦,理解错误
_$ (setq ge (xdge::constructor (entlast)))
<图元名: 9356708>
_$ (xdge::type ge)
"kCompositeCrv3d"
_$ (setq gcl (xdge::getpropertyvalue ge "getCurveList"))
(<图元名: 9587418> <图元名: 95873b8>)
_$ (mapcar 'xdge::type gcl)
("kCircArc3d" "kCircArc3d")
_$ (xdge::getpropertyvalue (car gcl) "startAng")
0.0
_$ (xdge::getpropertyvalue (car gcl) "endAng")
2.65943
_$ (xdge::getpropertyvalue (car gcl) "refVec")
(-0.420239 0.907413 0.0)
_$ (xdge::getpropertyvalue (car gcl) "normal")
(0.0 0.0 -1.0)
_$
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-9-27 20:24:16 来自手机 | 显示全部楼层
JOIN命令连接的SPLINE转换为GE也是复合曲线

点评

测试结果如下: (setq ge (xdge::constructor (entlast))) 命令: (xdge::type ge) "kNurbCurve3d" JOIN后的,转换为GE,还是NurbCurve3d  详情 回复 发表于 2014-9-27 21:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-9-27 20:53:44 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-9-27 20:24
JOIN命令连接的SPLINE转换为GE也是复合曲线

学习了,按手册只要首尾相连的 GeCurve 就可以构造 AcGeCompositeCurve ,并没有限定类型,开始只按常规理解了

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-27 21:01:44 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-9-27 20:24
JOIN命令连接的SPLINE转换为GE也是复合曲线

测试结果如下:

(setq ge (xdge::constructor (entlast)))
<图元名: 3a87ae80>
命令: (xdge::type ge)
"kNurbCurve3d"

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

使用道具 举报

发表于 2014-9-27 21:07:01 来自手机 | 显示全部楼层
本帖最后由 雪山飞狐(lzh) 于 2014-9-27 21:14 编辑

e 想起来是我自己的转换类是这样处理的了 呵呵
st上面说的没错 只要是曲线都行
另外我的测试是从join 的ge样条转换到复合曲线 会生成多个子曲线的复合曲线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-9-27 21:07:05 来自手机 | 显示全部楼层
e 想起来是我自己的转换类是这样处理的了 呵呵
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-9-27 21:39:29 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-9-27 21:07
e 想起来是我自己的转换类是这样处理的了 呵呵

刚测试了下,首尾连接的 Curve 构造这个 CompositeCurve 后就可以利用 这个类的特性和方法
  1. (defun c:tt (/ e1 e2 gel gcom sp p pam lpam)
  2.   (if
  3.     (and (setq e1
  4.                 (car (xdrx_entsel "\npick first spline: " '((0 . "spline")))
  5.                 )
  6.          )
  7.          (setq
  8.            e2 (car
  9.                 (xdrx_entsel "\nPick second spline: " '((0 . "spline")))
  10.               )
  11.          )
  12.          (setq gel (xdge::constructor e1 e2))
  13.          (setq gcom (xdge::constructor "kCompositeCrv3d" gel))
  14.          (setq
  15.            sp (xdge::getpropertyvalue gcom "hasStartPoint" "hasEndPoint")
  16.          )
  17.          (xd::pnt:mark (car sp) 1)
  18.          (xd::pnt:mark (cadr sp) 2)
  19.     )
  20.      (while (setq p (getpoint "\ntest point: "))
  21.        (setq p         (xdge::getpropertyvalue gcom "closestPointTo" p)
  22.              pam (xdge::getpropertyvalue gcom "paramOf" p)
  23.        )
  24.        (setq lpam (xdge::getpropertyvalue gcom "globalToLocalParam" pam))
  25.        (princ "\nGloble Param = ")
  26.        (princ pam)
  27.        (princ "\n")
  28.        (princ "\nLocal param = ")
  29.        (princ lpam)
  30.      )
  31.   )
  32.   (princ)
  33. )
  34. (defun XD::Pnt:Mark (p col / p1 p2 p3 p4)
  35.   (grvecs
  36.     (list col
  37.           (polar p (/ pi 4) (* (getvar "viewsize") 0.05))
  38.           (polar p (* pi 1.25) (* (getvar "viewsize") 0.05))
  39.           col
  40.           (polar p (* pi 0.75) (* (getvar "viewsize") 0.05))
  41.           (polar p (* pi -0.25) (* (getvar "viewsize") 0.05))
  42.           col
  43.           (setq p1 (polar p (* pi 0.75) (* (getvar "viewsize") 0.025)))
  44.           (setq p2 (polar p (/ pi 4) (* (getvar "viewsize") 0.025)))
  45.           col
  46.           p2
  47.           (setq p3 (polar p (* pi -0.25) (* (getvar "viewsize") 0.025)))
  48.           col
  49.           p3
  50.           (setq p4 (polar p (* pi 1.25) (* (getvar "viewsize") 0.025)))
  51.           col
  52.           p4
  53.           p1
  54.     )
  55.   )
  56.   t
  57. )
gcom.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-10-1 11:05:46 | 显示全部楼层
本帖最后由 st788796 于 2014-10-1 11:06 编辑

消除 Pline  重复点
  1. ;;在 AcGeCompositeCurve3d 中不能存 0 长度的 Segment, 利用这个特点完成消除重复点
  2. (defun c:tt (/ e n ge gel)
  3.   (if
  4.     (and (setq
  5.            e (car (xdrx_entsel "\nPick Pline: " '((0 . "LWPOLYLINE"))))
  6.          )
  7.          (setq n (xdrx_getpropertyvalue e "numVerts")) ;_顶点数
  8.          (setq ge (xdge::constructor e)) ;_构造 AcGeCompositeCurve3d
  9.          (setq gel (xdge::getpropertyvalue ge "getCurveList")) ;_获取组成 sub Curve
  10.          (/= (length gel) (1- n)) ;_有重复点判断
  11.     )
  12.      (progn
  13.        (setq ne (xdge::entity:make ge))
  14.        (xdrx_entity_setpropertiesfrom ne e) ;_扩展数据没有了
  15.        (xdrx_object_swapid ne e)
  16.        (xdrx_entity_delete ne)
  17.        (setq tf t)
  18.      )
  19.   )
  20.   (xdge::free ge)
  21.   (princ tf)
  22.   (princ)
  23. )

点评

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-10-2 15:05:07 | 显示全部楼层
本帖最后由 csharp 于 2014-10-2 15:42 编辑

凑个热闹,支持一下

简单测试个 复合线方向,非闭合时,Ge 会自动在 StartPoint  和 EndPoint 间作一割线计算 Area ,此时 Area 有 + / - ,也可能为  0,对 isClosed 为 true 的就没有这个特性了,

  1. ;;取点方式
  2. (defun c:tt (/ p pts gpl)
  3.   (while (setq p (getpoint "\nPoint: "))
  4.     (setq pts (cons p pts))
  5.   )
  6.   (if (> (length pts) 2)
  7.     (progn
  8.       (setq gpl        (xdge::constructor
  9.                   "kCompositeCrv3d"
  10.                   (mapcar '(lambda (x y)
  11.                              (xdge::constructor "kLineSeg3d" x y)
  12.                            )
  13.                           pts
  14.                           (cdr pts)
  15.                   )
  16.                 )
  17.       )
  18.       (princ "\nGeCompositeCurve Area = ")
  19.       (princ (xdge::getpropertyvalue gpl "area"))
  20.       (princ "\nPoints Calc Area = ")
  21.       (princ (xd::pnts:area pts))
  22.       (xdge::free)
  23.     )
  24.   )
  25.   (princ)
  26. )
  27. ;; Pline 测试
  28. (defun c:tt1 (/ e ge gel ngel)
  29.   (if (setq e (xdrx_entsel "\nPick Pline: " '((0 . "lwpolyline"))))
  30.     (progn
  31.       (setq ge (xdge::constructor (car e)))
  32.       (if (xdge::getpropertyvalue ge "isClosed")
  33.         (progn
  34.           (setq        gel  (xdge::getpropertyvalue ge "getCurveList")
  35.                 ngel (reverse (cdr (reverse gel)))
  36.           )
  37.           (xdge::setpropertyvalue ge ngel)
  38.         )
  39.       )
  40.       (princ "\nGeCompositeCrv3d area = ")
  41.       (princ (rtos (xdge::getpropertyvalue ge "area") 2 0))
  42.     )
  43.   )
  44.   (princ)
  45. )

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-10-2 17:29:20 来自手机 | 显示全部楼层
本帖最后由 csharp 于 2014-10-2 17:31 编辑
st788796 发表于 2014-10-1 11:05
消除 Pline  重复点


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 20:11 , Processed in 0.494931 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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