找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3367|回复: 11

[教学] API应用AcGe系列(1)--AcGeCurve3d/2d类函数

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-9 16:33:43 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 st788796 于 2014-11-9 17:20 编辑

AcGeCurve3d
所有3D曲线的抽象基类。从这个类派生出的任何类都表示一条3D曲线
ARX AcGeCurve3d                                 
Arx-3dc.jpg
Net AcGeCurve3d
Net-3dc.jpg   

ARX                                              Net
arx-3d.jpg       net-3d.jpg


AcDbCurve 类函数见下贴
http://bbs.xdcad.net/thread-676936-1-1.html


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

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-9 17:14:10 | 显示全部楼层
本帖最后由 st788796 于 2014-11-9 17:17 编辑

ARX                                                        Net
Arx-2dc.jpg net-2dc.jpg
Arx AcGeCurve2d Class                                      Net Curve2d Class
Arx-2d.jpg net-2d.jpg

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-9 19:25:52 | 显示全部楼层
AcGe 线性代数和几何学对象的应用类。AutoCAD中用点描述的对象都可以找到其对应类,打开 CAD 的 DWG 屏幕上呈现的属于 AcDb 类,在 Lisp 中应用最多的就是  entsel 、ssget 、ssname、entget、entmod 等等操作的对象(除去非图形对象),一些对象去掉某些属性(比如图层、线形、颜色、厚度等)用数学方法描述就是 AcGe 类。

AcGe类中 Curve3d Curve2d 是很重要的类,AutoCAD 是以二维为主,点、线、面是必须要熟悉的概念,Curve 类就包括了所有 线 几何模型,Ge库中,在同一平面内的曲线使用Curve2d 或 Curve3d 是没有区别的,但 Curve2d 会更方便,而且 2d 库有些方法是 3d 库不具备的,如果是空间线运算那只能选择 Curve3d。

本帖介绍以 Curve2d 为主,对 Curve3d 中不同方法最后再介绍。

在 Alisp 中使用 AcGe 库,得知道这些 AcGe 对象怎么制造,以前AcGe都是专业ARX程序独享工具,感谢 XD 把这个库带入 Autolisp 天地,Lisper 有了一个更加强大工具。看看 XdGe 几何库提供的函数
20141109191450.jpg
另外也要知道 XdGe 目前支持 的 Ge 类型
20141109192419.jpg

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-9 19:48:37 | 显示全部楼层
本帖最后由 st788796 于 2014-11-10 07:53 编辑

AcGeCurve2d 由 AcGeEntity2d 派生,该类共有的Method包括

先随便构造两个 Ge 实体用于测试
(setq ge (xdge::constructor "kLineSeg2d" '(1.0 2.0) '(100.0 100.0)))
(setq ge1 (xdge::constructor "kLineSeg2d" '(105.0 0.0)  '(180.0 180.0)))

注意: 使用 Ge 构造时,实数 小数点 不要省略!

1 boundBlock 包围盒

方法1:
参   数: GeCurve2d
返回值: kBoundBlock2d 对象

(setq box (xdrx::getpropertyvalue geobj "boundBlock"))

_$ (xdge::getpropertyvalue ge "boundBlock")
<图元名: 9736f68>
_$ (xdge::type (xdge::getpropertyvalue ge "boundBlock"))
"kBoundBlock2d"
_$

方法2:
参   数 :AcGeInterval 对象
返回值:kBoundBlock2d 对象

(xdge::getpropertyvalue geobj "boundBlock" interval)

_$ (setq in (xdge::constructor "AcGeInterval" 0.0 0.5))
<图元名: 9736fa8>
_$ (xdge::getpropertyvalue ge "boundBlock" in)
<图元名: 9736fc8>

2 closestPointTo 两曲线间最近点或指定点与曲线间最近点

方法1:
两曲线间最近点
参   数:AcGeCurve2d
返回值:  点表(曲线1上点  曲线2上点)

(xdge::getpropertyvalue ge1 "closestPointTo" ge2)

_$ (xdge::getpropertyvalue ge "closestPointTo" ge1)
((100.0 100.0) (139.763 83.432))
_$

方法2:
指定点到曲线上最近点
参   数:点(2D or 3D)
返回值:  点(2D)
(xdge::getpropertyvalue ge "closestPointTo" pnt)

_$ (xdge::getpropertyvalue ge "closestPointTo" '(-10.0 -10.0))
(1.0 2.0)
_$


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-9 23:40:36 | 显示全部楼层
本帖最后由 st788796 于 2014-11-10 07:52 编辑

3 distanceTo 获取两曲线最近点间距离或指定点到曲线的最近距离

方法1:
两曲线间最近点间距
参   数:  AcGeCurve2d
返回值:  距离(实数)
(setq dist (xdge::getpropertyvalue ge1 "distanceTo" ge2))

_$ (xdge::getpropertyvalue ge "distanceTo" ge1)
43.0769
_$

方法2:
指定点到该曲线的最佳距离
参   数: 点
返回值: 距离(实数)
(xdge::getpropertyvalue ge "distanceTo" pnt)

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-10 00:01:29 | 显示全部楼层
本帖最后由 st788796 于 2014-11-10 07:54 编辑

4 evalPoint   返回曲线指定参数处点或指定参数处点及该点处导数

方法1:
获取指定参数处点及该点处导数
参数1 : 数(double)
参数2 : 整数(0  仅返回点 1 -  一阶导数,2 -一阶及二阶导数)
返回值:  点表(点 (<一阶导数> <二阶导数>)) , 参数2 为 1 时,如果二阶导数存在则返回,否则仅返回一阶导数

(xdge::getpropertyvalue ge "evalPoint" pam 0);_同方法2

(xdge::getpropertyvalue ge "evalPoint" pam 1);_(点 (一阶导数))

(xdge::getpropertyvalue ge "evalPoint" pam 2);_(点 (一阶导数 二阶导数))

_$ (xdge::getpropertyvalue ge "evalPoint" 0.0 0)
(1.0 2.0)
_$ (xdge::getpropertyvalue ge "evalPoint" 0.0 1)
((1.0 2.0) ((99.0 98.0)))
_$ (xdge::getpropertyvalue ge "evalPoint" 0.0 2)
((1.0 2.0) ((99.0 98.0) (0.0 0.0)))
_$

方法2:
返回指定参数处点
参数: 数 (double)
返回值: 点

(xdge::getpropertyvalue ge "evalPoint" pam)

_$ (xdge::getpropertyvalue ge "evalPoint" 0.5)
(50.5 51.0)
_$


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-10 00:14:45 | 显示全部楼层
本帖最后由 st788796 于 2014-11-10 07:52 编辑

5 getClosestPointTo 功能同 closestPointTo ,只是这个函数返回值为 kPointOnCurve2d(即构造了新的 AcGe Object)

方法1:
两曲线间最近点,返回值为 (kPointOnCurve2d kPointOnCurve2d)
(xdge::getpropertyvalue ge1 "getClosestPointTo" ge2)

_$ (xdge::getpropertyvalue ge "getClosestPointTo" ge1)
(<图元名: 9736fe8> <图元名: 9737018>)
_$

方法2:
指定点到曲线上最近点,返回值为 kPointOnCurve2d
(xdge::getpropertyvalue ge "getClosestPointTo" pnt)


_$ (xdge::getpropertyvalue ge "getClosestPointTo" '(-10.0 -10.0))
<图元名: 9737068>
_$

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-10 07:59:16 | 显示全部楼层
6 getInterval 获取曲线区间及起点、终点

参    数: Curve2d
返回值: 表 (AcGeInterval (起点 终点)
(xdge::getpropertyvalue geobj "getInterval")

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-10 08:24:27 | 显示全部楼层
本帖最后由 st788796 于 2014-11-10 08:26 编辑

7 getLocalClosestPoints 获取两曲线指定区间内最近点或指定点在曲线指定区间内最近点

AutoCAD 中的 AcDbCurve 和 AcGeCurve 除 Ray (0.0 -> +∞) Xline (-∞ -> +∞),其它都是“有界”曲线,AcDb 描述这个界就是起点(或参数)、终点(或参数),在 AcGe 中增加了一个区间(Interval) 描述,前面的 closestPointtTo 是全线搜索最近点,getLocalClosestPointTo 是在曲线的一定范围为搜索最近点

方法1:
void getLocalClosestPoints(
    const AcGeCurve2d& otherCurve,
     AcGePointOnCurve2d& approxPntOnThisCrv,
     AcGePointOnCurve2d& approxPntOnOtherCrv,
    const AcGeInterval* nbhd1 = 0,
     const AcGeInterval* nbhd2 = 0,
     const AcGeTol& tol = AcGeContext::gTol
) const;

(xdge::getpropertyvalue ge "getLocalClosestPointTo" ge1 in1 in2)

in1 --  AcGeInterval,指定 ge 的搜索区间
in2 --  AcGeInterval,指定 ge1 的搜索区间

方法2:
void getLocalClosestPoints(
    const AcGePoint2d& point,
     AcGePointOnCurve2d& approxPnt,
     const AcGeInterval* nbhd = 0,
     const AcGeTol& = AcGeContext::gTol
) const;

(xdge::getpropertyvalue ge "getLocalClosestPointTo" pnt in)

pnt  --- 指定点(2d)
in   --- ge 曲线上的区间,AcGeInterval

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

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

8 getSamplePoints 获取曲线等分点或指定参数间直道弓高内的模拟点

方法1:
获取曲线等分点
参   数: 整数
返回值: 点表
(xdge::getpropertyvalue geobj "getSamplePoints" int)

_$ (xdge::getpropertyvalue ge "getSamplePoints" 10)
((1.0 2.0) (12.0 12.8889) (23.0 23.7778) (34.0 34.6667) (45.0 45.5556) (56.0 56.4444) (67.0 67.3333) (78.0 78.2222) (89.0 89.1111) (100.0 100.0))
_$

在 GeCurve 中就是一个函数,Db 中就需要自己根据长度作等分,可以参考 xd::geom:numdiv 、xdrx_getsamplept ,都是自己写算法

方法2:
按给定参数区间和给定的最大弓高获取曲线模拟点
void getSamplePoints(
    double fromParam,
     double toParam,
     double approxEps,
     AcGePoint2dArray& pointArray,
    AcGeDoubleArray& paramArray
) const;

(xdge::getpropertyvalue geobj "getSamplePoints" spam epam fuzz)

参   数:spam --- 开始参数,0.0 从起点开始
            epam --- 结束参数,endParam 为曲线终点
            fuzz   --- 最大弓高
返回值 :  点表

这个方法对 Circle Arc Ellipse Spline 才有意义,fuzz 确定了采样点密度,值越小点越密,同样越接近原曲线,自己写需要用递归方法,可以参考 G版 用 Lisp 写的一个 getsamplepoints ,如果转换为 GeCurve 只要使用这个函数就 ok

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

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

9 area 获取曲线指定参数区间部分面积

能够围合为区域的曲线使用才有意义,如 AcGeCircArc AcGeNurbCurve AcGeEllipArc AcGePolyline AcGeCompositeCrv ,对 AcGeLineSeg AcGeLine AcGeRay 没有意义

(xdge::getpropertyvalue ge "area" spam epam)

参数: spam -- 开始参数
          epam  -- 结束参数
返回值: 实数

10 getSplitCurves 在给定的参数处断开曲线

(xdge::getpropertyvalue ge "getSplitCurves" pam)

pam ---  参数
返回断开后曲线列表


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-11 14:26:02 | 显示全部楼层
11 hasStartPoint 如果曲线有起点则返回起点,否则返回nil,xline 没有起点

(xdge::getpropertyvalue geobj "hasStartPoint")

12 hasEndPoint 如果曲线有终点则返回终点,否则返回nil , ray xline 没有终点

(xdge::getpropertyvalue geobj "hasEndPoint")

13 isDegenerate 判断曲线是否退化,退化返回退化后实体,否则返回nil。例如 kCircArc2d 在 setRadius 为 0.0 时退化为 kPoint2d,isDegenerate 将返回 kPoint2d entity,kEllipArc2d 在 minor radius 为 0 且 major radius 为 1 时, isDegenerate 将返回 kLineSeg2d entity

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 05:30 , Processed in 0.215097 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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