找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8335|回复: 30

[教学] API应用AcDb系列(1)--AcDbCurve类函数

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-8 08:30:12 | 显示全部楼层 |阅读模式

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

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

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

从今天起打算写一写 XDRXAPI 中有关数据库对象一些函数介绍,形式将 ARX Net ActiveX 及 Dxf 几种方式放在一起对比,前两者主要介绍函数定义,这样让大家对几者有一个统一认识。开篇第一章由 AcDbCurve 讲起。

讲解之前先来看看AcDbCurve在数据库结构中的位置
ARX
20141108074731.jpg
.Net
20141108074909.jpg
ActiveX
20141108075701.jpg
DXF
20141108080047.jpg

ARX是 AutoCAD 的基础,后面几者都是 ARX 派生出来的,Curve有 Entity 派生,都是由点描述的实体,既然他们属于同一类,就有一些共有的方法和属性:

1 Arx Curve Method (2015)
Snap2.jpg
2 Net (2015)
Snap3.jpg
3 XdrxApi
Snap4.jpg

对应 AcGeCurve3d/2d 类参见
http://bbs.xdcad.net/thread-676980-1-1.html

本帖被以下淘专辑推荐:

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

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 08:37:56 | 显示全部楼层
本帖最后由 st788796 于 2014-11-8 08:40 编辑

1 面积 getArea
arx
virtual Acad::ErrorStatus getArea(
    double&
) const;

Net
Curve.Area Property

VLisp
vlax-curve-getarea 参数为 Entity 或 Object,entity 效率好像更高

ActiveX


Specifies the enclosed area of an arc, circle, ellipse, hatch, lightweight polyline, polyline, region, or planar-closed spline.
object.Area

Dxf 组码中没有这个

ADRXAPI 关于面积的函数

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 08:39:11 | 显示全部楼层
2 getClosestPointTo 最近点

这个函数在不同语言中表现出不同方法
ARX 有两种用法
1) 曲线外点到曲线上最近点
virtual Acad::ErrorStatus getClosestPointTo(
     const AcGePoint3d& givenPnt,
     AcGePoint3d& pointOnCurve,
      Adesk::Boolean extend = Adesk::kFalse
) const;
2) 曲线投影到平面的最近点
virtual Acad::ErrorStatus getClosestPointTo(
     const AcGePoint3d& givenPnt,
     const AcGeVector3d& direction,
      AcGePoint3d& pointOnCurve,
      Adesk::Boolean extend = Adesk::kFalse
) const;

Net也是两种用法和 ARX 对应
1)曲线外点到曲线上最近点
public virtual Point3d GetClosestPointTo(
     Point3d givenPoint,
      [MarshalAs(UnmanagedType.U1)] bool extend
);
2)曲线投影到平面的最近点
public virtual Point3d GetClosestPointTo(
     Point3d givenPoint,
      Vector3d direction,
     [MarshalAs(UnmanagedType.U1)] bool extend
);

Vlisp
1)对应上面的方法1
vlax-curve-getclosestpointto
(vlax-curve-getClosestPointTo curve-obj givenPnt [extend])
参数  curve-obj 要测量的 VLA 对象。
givenPnt   点(在 WCS 上),寻找曲线上距该点最近的点。
extend  如果指定该参数且其值不为 nil,vlax-curve-getClosestPointTo 在搜索最近点时扩展曲线。
返回值  如果成功则返回表示曲线上一点的三维点表,否则返回 nil。

2)在将曲线投影到平面上之后,返回曲线上的最近点(在 WCS 上),对应上面的方法2
(vlax-curve-getClosestPointToProjection curve-obj givenPnt normal[extend])
参数 curve-obj 要测量的 VLA 对象。
givenPnt WCS 中的点,在曲线上寻找该点的最近点。
normal WCS 中的法线矢量,指定投影平面。
extend  如果指定该参数且其值不为 nil,vlax-curve-getClosestPointToProjection 在搜索最近点时扩展曲线。

vlax-curve-getClosestPointToProjection 将曲线投影到由 givenPnt 和 normal 定义的平面上,然后在该平面上计算距 givenPnt 最近的点。然后,vlax-curve-getClosestPointToProjection 将结果点重新投影到原来的曲线上,并返回投影后的点。

返回值 如果成功,则返回表示曲线上一点的三维点表,否则返回 nil。

ActiveX 无此方法

3 XDAPI
1) xdrx_curve_closepoint
功  能:
获得曲线外点到曲线最近距离曲线上的点,或者两条曲线间最近距离的点
调用格格:
(xdrx_curve_ClosestPoint<曲线实体名> <曲线外点>)

(xdrx_curve_ClosestPoint <曲线实体名> <曲线实体名>)
返 回 值:
(距离 曲线1点 曲线2点)
说    明:

2) xdrx_curve_getclosestpoint
功  能:
获得曲线外点到曲线最近距离曲线上的点
调用格式:
(xdrx_curve_getClosesaPoint <曲线实体名> <曲线外点> [flae])

(xdrx_curve_getClosestPoint <p1 ... pn> <曲线外点> [flag])
返 回 值:

说    明:
1、 p1...pn 参数WCS点
根据xdrx_document_ucson 返回UCS点
2、 [flag]标记T, 扩展曲线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 08:56:21 | 显示全部楼层
3 AcDbCurve::getDistAtParam 获取曲线上指定参数处点到起点距离(曲线长度)

1) ARX
virtual Acad::ErrorStatus getDistAtParam(
    double param,
     double& dist
) const;

2)Net
public virtual double GetDistanceAtParameter(
    double value
);

3)Vlisp
(vlax-curve-getDistAtParam curve-objparam)

  4) XDAPI
功  能:
获得曲线上任一参数到曲线起点参数的距离或者曲线上两参数间的距离
调用格用:
(xdrx_curve_getDistAtPoint <曲线实体名> <曲线上参数值> [曲线任一点参数值])
返 回 值:
实数
说    明:
若给一点,返回到起点的距离,给两点,返回两点间的距离

xdrx_curve_getdistatparam 扩展了 getDistAtParam,增加一个一个两参数间距离功能用

vlax 实现就是

  1. (abs (- (vlax-curve-getdistatparam e pam1)
  2.          (vlax-curve-getdistatparam e pam2)
  3.      )
  4. )



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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 09:14:08 | 显示全部楼层
4 AcDbCurve::getEndParam曲线结束参数
有上界的曲线才有,如 ray xline 是无限延伸的则没有此参数

1)ARX
virtual Acad::ErrorStatus getEndParam(
    double&
) const;

2)Net
Curve.EndParam Property

3) vlax
(vlax-curve-getendparam <entity or object>)

4) XDAPI

方式1:
功  能:
获得曲线终止参数值
调用格式:
(xdrx_curve_getEndParam <曲线实体名>)
返 回 值:
实数
说    明:

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 09:21:10 | 显示全部楼层
5 AcDbCurve::getEndPoint 获取曲线端点
ray xline 没有端点

1)ARX
virtual Acad::ErrorStatus getEndPoint(
    AcGePoint3d&
) const;

2) Net
Curve.EndPoint Property

3) vlax
(vlax-curve-getendpoint <entity or object>)

4)XDAPI
方式1:
功  能:
获得曲曲终点
调用格式:
(xdrx_curve_getEndPoint <曲线实体名>)
返 回 值:

说    明:

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 09:33:23 | 显示全部楼层
6 AcDbCurve::getFirstDeriv获取曲线指定点或参数的一阶导数

1)ARX
方法1:给点(需是 PointOnCurve)
virtual Acad::ErrorStatus getFirstDeriv(
    const AcGePoint3d&,
     AcGeVector3d& firstDeriv
) const;
方法2:给参数
virtual Acad::ErrorStatus getFirstDeriv(
    double param,
     AcGeVector3d& firstDeriv
) const;

2) Net
方法1:
public virtual Vector3d GetFirstDerivative(
    Point3d point
);
方法2:
public virtual Vector3d GetFirstDerivative(
    double value
);

3)vlax 只有方法2
(vlax-curve-getfirstderiv <entity or object> pam)
实现第第一种这样用
  1. (vlax-curve-getfirstderiv ent (vlax-curve-getparamatpoint ent (vlax-curve-getclosestpointto ent pnt)))


4)XDAPI

功  能:
获得曲线上一点处的一阶上数(沿曲线前处方向在该点处的切向量)
调用格式:
(xdrx_curve_getFirstDeriv <曲线实体名> <曲线上任一点>)
(xdrx_curve getFirstDeriv <曲线实体名> <曲线上任一参r值>)
返 回 值:
向量(3d点)
说    明:
单位向量
   

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 09:48:02 | 显示全部楼层
7 AcDbCurve::getDistAtPoint 获取点到起点的距离(曲线长度)

1)ARX (需要 PointOnCurve)

virtual Acad::ErrorStatus getDistAtPoint(
    const AcGePoint3d&,
     double&
) const;

2)Net (需要 PointOnCurve)
public virtual double GetDistAtPoint(
    Point3d point
);

3)vlax
(vlax-curve-getdistatpoint <entity or object> pnt)
点需要在 Curve 上 (vlax-curve-getclosestpointto ent pnt)

4) XDAPI
功  能:
获得曲线上任一点到曲线起点的距离或者曲线上两点间的距离
调用格式:
(xdrx_curve_getDistAtPoint <曲线实体名> <曲线上任一点> [曲线任一点])
返 回 值:
实数
说    明:
若给一点,返回到起点回距离,给两点,返回两点间的距离

XDAPI 扩展了 getDistAtPoint ,可以返回两点间距离,而且点自动进行了 closestPointTo

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 09:55:53 | 显示全部楼层
8 AcDbCurve::getParamAtDist 获取指定距离处参数

1)ARX
virtual Acad::ErrorStatus getParamAtDist(
    double dist,
     double& param
) const;

2)Net
public virtual double GetParameterAtDistance(
    double dist
);

3)vlax
(vlax-curve-getparamatdist <entity or object> dis)

4)XDAPI
功  能:
获得曲线上据起点指定距离处的曲线的参数值
调用格式:
(xdrx_curve_getParamAtDist <曲线实体名> <距离>)
返 回 值:
实数
说    明:
  
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 09:56:34 | 显示全部楼层
9 AcDbCurve::getParamAtPoint 获取指定点处参数

点需要 PointOnCurve 且为 WCS
1)ARX
virtual Acad::ErrorStatus getParamAtPoint(
   const AcGePoint3d&,
     double&
) const;

2)Net
public virtual double GetParameterAtPoint(
    Point3d point
);

3)vlax
(vlax-curve-getparamatpoint <entity or object> pnt)
点需要 vlax-curve-getclosestpointto !

4) xdapi
功  能:
获得曲线上给定点处的曲线的参数值
调格格式:
(xdrx_curve_getParamAtPoint <曲线实体名> <曲线上任一点>)
返 回 值:
实数
说    明:
点若不在曲线上,则取到曲线最近距离的曲线上的点进行计算
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 10:08:20 | 显示全部楼层
10 AcDbCurve::getPointAtParam获取指定参数处点

1)ARX
virtual Acad::ErrorStatus getPointAtParam(
   double,
    AcGePoint3d&
) const;

2)Net
public virtual Point3d GetPointAtParameter(
    double value
);

3)vlax
(vlax-curve-getpointatparam <entity or object> double)

4) xdapi
功  能:
返回指定参数值位置的曲线值的点
调用格式:
(xdrx_curve_getPointAtParam <曲线实体名> <参数值>)
返 回 值:

说    明:
3D点(根据xdrx_document_ucson值返回)


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 10:08:51 | 显示全部楼层
11 AcDbCurve::getPointAtDist 获取曲线上指定距离处点

1)ARX
virtual Acad::ErrorStatus getPointAtDist(
    double,
     AcGePoint3d&
) const;

2)Net
public virtual Point3d GetPointAtDist(
    double value
);

3)vlax
(vlax-curve-getpointatdist <entity or object> dist)

4) xdapi
功  能:
返回曲线上距离起点指定距离处的点
调用格式:
(xdrx_curve_getPointAtDist <曲线实体名> <距离>)
返 回值:

说    明:
3D点(根据xdrx_document_ucson值返回)

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 10:18:17 | 显示全部楼层
12 getSecondDeriv获得曲线上一点(或者参数值)处的二阶导数(在该点处的曲率)

1)ARX
方法1:给参数
virtual Acad::ErrorStatus getSecondDeriv(
    double param,
     AcGeVector3d& secDeriv
) const;
方法2:给点(PointOnCurve)
virtual Acad::ErrorStatus getSecondDeriv(
     const AcGePoint3d&,
     AcGeVector3d& secDeriv
) const;
2)Net
方法1:给参数
public virtual Vector3d GetSecondDerivative(
    double value
);方法2:给点(PointOnCurve)
public virtual Vector3d GetSecondDerivative(
    Point3d point
);
3)vlax(不一定是单位向量)
(vlax-curve-getsecondderiv <entity or object> param)
实现第二种方式
  1. (vlax-curve-getsecondderiv curve (vlax-curve-getparamatpoint curve (vlax-curve-getclosestpointto curve pnt)))


4) xdapi
功  能:
获得曲线上一点(或者参数值)处的二阶导数(在该点处的曲率)
调用格式:
(xdrx>curve_getSecond_eriv <曲线实体名> <曲线上任一点>)
(xdrx_curve_getSecondDeriv <曲线实体名> <曲线上任一参数值>)
返 回 值:
向量(3d点)
说    明:
单位向量

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 10:18:47 | 显示全部楼层
13 AcDbCurve::getStartParam 获取曲线起点参数
对 Line Polyline Spline Circle Ellipse Ray 始终为 0.0 ,Arc Ellipse(弧)为起始角度(弧度),xline 没有

1)ARX
virtual Acad::ErrorStatus getStartParam(
    double&
) const;

2)Net
Curve.StartParam Property

3)vlax(vlax-curve-getstartparam curve)

4) xdapi
功  能:
获得曲线起始参数值
调用格式:
(xdrx_curve_getStartParam <曲线实体名>)
返 回 值:
实数
说    明:


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-8 10:19:22 | 显示全部楼层
13 AcDbCurve::getStartPoint 获取曲线起点

arx 和 net 为 read-write
1)ARX
virtual Acad::ErrorStatus getStartPoint(
    AcGePoint3d&
) const;
2)Net
Curve.StartPoint Property

3)vlax 只读
(vlax-curve-getstartpoint curve)

4)ActiveX startpoint 属性仅适用 Arc Ellipse Line ,前两者为 read-only,Line 为 read-write 属性
object.StartPoint

(vla-get-startpoint obj) 返回 variant

(vlax-get obj 'startpoint) 返回 Lisp 点表
修改仅对line
  1. (vla-put-startpoint lineobj (vlax-3d-point pnt))


  1. (vlax-put lineobj pnt)


5) dxf 中仅 Line 组码10 为起点,11 为终点,其他类有不同含义,参考  dxf 手册

6) xdapi
功  能:
获得曲线起点
调用格式:
(xdrx_curve_getStartPoint <曲线实体名>)
返 回 值:

说    明:
  

方法2:
(xdrx_getpropertyvalue curve "startPoint")

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 22:29 , Processed in 0.475277 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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