objectArx---AcGe几何类

一、概述

  • 定义:AcGe类库是为AcDb类库提供的工具类库,如用于二维、三维运算的向量对象和矩阵对象,此外还有很多基本的几何对象,如点,曲线,面。
  • 意义:acdb对象也有几何计算函数,但因为数据库实体类还附带其他数据,计算起来笨重且资源占用较多,而acge类仅单纯涉及几何计算,且算法经过优化,效率更高、资源占用更少
  • 类继承关系:主要的基类分别是AcGeEntity2dAcGeEntity3d。此外还有几个没有基类的类,包括AcGePoint2d,AcGeVector2d和AcGeMaterix2d
    请添加图片描述

二、点对象(AcGePoint2d )

2.1 声明及赋值

  • 点对象声明
    AcGePoint2d pt1(0, 0), pt2(100, 0), pt3, pt4;
    
  • 点赋值
    pt3.set(50, 50);
    acutPrintf(_T("\nset设置点坐标(%0.3f,%0.3f)"),pt3.x,pt3.y);
    
  • 点比较
    // 重载==运算符:也可用2.2对象方法比较
    if(pt1 == pt2)
    {
    	...
    }
    

2.2 点对象方法

  • 两点距离
    double dist = pt1.distanceTo(pt2);
    acutPrintf(_T("\n两点距离:%0.3f"), dist);
    
  • 镜像点
    // 镜像需要一条几何实体类直线
    AcGeLine2d line(pt1, pt2);
    // 镜像点pt3(注意:覆盖原值)
    pt3.mirror(line);
    acutPrintf(_T("\nmirror镜像设置点坐标(%0.3f,%0.3f)"), pt3.x, pt3.y);
    
  • 旋转点
    // 旋转pt3双坐标值;默认基点为原点(仅一个参数)
    pt3.rotateBy(MathUtil::PI() / 2, pt1);
    acutPrintf(_T("\n以pt1为基点旋转(%0.3f,%0.3f)"), pt3.x, pt3.y);
    
  • 等比缩放点:点对象方法
    // 等比缩放pt3双坐标值;默认基点为原点(仅一个参数)
    pt3.scaleBy(2, pt1);
    acutPrintf(_T("\n点对象方法式缩放(%0.3f,%0.3f)"), pt3.x, pt3.y);
    
  • 等比缩放点:重载运算符法
    // 重载点运算符*、/、*=、/=
    pt3 *= 2;
    acutPrintf(_T("\n重载运算符式缩放(%0.3f,%0.3f)"), pt3.x, pt3.y);
    
  • 点平移
    // 重载点运算符+、-、+=、-=
    AcGeVector2d vec1(100,100);
    // 点平移:与平移向量加减
    pt4 = pt3 + vec1;
    acutPrintf(_T("\n点平移(%0.3f,%0.3f)"), pt4.x, pt4.y);
    
  • 点比较
    AcGePoint2d pt1(100, 0), pt2(100.1, 0);
    // 设置容差:两者值差小于0.1,判定为相等
    AcGeTol tol;
    tol.setEqualPoint(0.1);
    // 若为if (pt1.isEqualTo(pt2)),表示容差为1.0Xe-10
    if (pt1.isEqualTo(pt2, tol))
    {
    	AfxMessageBox(_T("相等"));
    }
    

2.3 矩阵对象

2.3.1 概述

  • 功能:可用封装一系列点变化操作,最后统一作用到待操作点上
  • 与点对象方法区别:点对象只能单步操作,矩阵对象可多动作集成为一次操作

2.3.2 矩阵类方法

  • 代码示例
    // 点、直线、向量沿用2.2节
    pt3.set(50, 50);
    
    AcGeMatrix2d mat2d;
    // 镜像:传入直线
    mat2d.setToMirroring(line);
    // 旋转:默认基点为原点
    mat2d.setToRotation(MathUtil::PI() / 2, pt1);
    // 等比缩放;默认基点为原点
    mat2d.setToScaling(2, pt1);
    // 平移:传入平移向量
    mat2d.setTranslation(vec1);
    
    // 将矩阵操作作用于pt4
    pt3.transformBy(mat2d);
    acutPrintf(_T("\n矩阵操作后的点坐标(%0.3f,%0.3f)"), pt3.x, pt3.y);
    

三、二维实体类(AcGeEntity2d)

3.1 AcGeEntity2d类方法

  • 常规函数(用法同2.2节)
    • 镜像:mirror
    • 旋转:rotateBy
    • 等比缩放:scaleBy
    • 矩阵操作:transformBy
    • 平移:translateBy(const AcGeVector2d&)

  • AcGeEntity2d类方法
    // 直线:传入两点(下节讲),第一个为原点
    AcGeLine2d Line(AcGePoint2d::kOrigin,AcGePoint2d(100,100));
    // 结构体AcGe:见结构体AcGe
    // 枚举EntityId:见结构体AcGe
    AcGe::EntityId eId = Line.type();
    // 打印出枚举值:18
    acutPrintf(_T("\n%d"), eId);
    // 判断是否为枚举值:见结构体AcGe
    if (Line.isKindOf(AcGe::kLine2d))
    	acutPrintf(_T("\n验证通过"));
    
  • 结构体AcGe
    ......
    struct
    AcGe
    {
       GE_DLLDATAEXIMP static const AcGeLibVersion gLibVersion;
       enum { eGood, eBad };
    
       enum EntityId {
           kEntity2d,		kEntity3d,		kPointEnt2d,		kPointEnt3d,
           kPosition2d,		kPosition3d,	kPointOnCurve2d,	kPointOnCurve3d,
           kPointOnSurface, kBoundedPlane, 	kCircArc2d, 		kCircArc3d,
           kConic2d,		kConic3d,		kCurve2d,  			kCurve3d,
           kEllipArc2d, 	kEllipArc3d, 	kLine2d,  			kLine3d,
           kLinearEnt2d,  	kLinearEnt3d,  	kLineSeg2d,    		kLineSeg3d,
           kPlanarEnt,    	kPlane,    		kRay2d,    			kRay3d,
           kSurface,     	kSphere,     	kCylinder,      	kTorus,
           kCone,       	kSplineEnt2d,   kPolyline2d,      	kAugPolyline2d,
           kNurbCurve2d,    kDSpline2d,     kCubicSplineCurve2d, kSplineEnt3d,
           kPolyline3d,      kAugPolyline3d,      kNurbCurve3d,      kDSpline3d,
           ......
       };
    ......
    }
    

3.2 AcGeCurve2d类方法

  • 继承关系:为二维实体类的派生类,见第一条类图
  • 曲线基类:为线、圆、弧、多段线、偏移的基类

3.2.1 常用方法

  • 列表
    名称释义
    isClockWise判断弧线是否为顺时针方向
    startAng、endAng圆弧的起、终弧度值,与X轴正方向夹角,与圆弧方向无关,值小的为起
    radius圆弧半径
    paramOf、evalPoint将点对象(AcGePoint2d )转换为参数化点(double)、逆向转换
    length曲线上两点间弧长,与弧线方向相同,若超终点,长度包含延长线,注意传参两点顺序
    paramAtLength曲线上 距 已知点 一定距离的 另一个 点的参数化值:正距离与弧线正方向同
    distanceTo点到曲线最近距离
    closestPointTo曲线上 离已知点 最近的点坐标
    isOn、isInside判断点是否在弧线上、内: 传入的也可以是 参数化点
    getSamplePoints均分圆弧,返回均分点(包括起、终点)
    tangent(pt, line)过弧上点做切线:pt为切点AcGePoint2d、line为AcGeLine2d
    intersectWith(ent, n, pt4, pt5);获取交点:没交点返回false,ent可以为AcGeLinearEnt2d或AcGeCircArc2d,n为交点个数,后两个为交点,只有n≥0,此两点才有意义

    求两点中点:两点参数化值的平均值即为中点参数化值
    调用:以上函数均为类对象调用,即类对象.函数名();

3.2.2 方法示例

  • 以圆弧为例
    AcGePoint2d pt1(-100, 0), pt2(0, 100), pt3(100, 0), pt4, pt5;
    
    // 圆弧 构造函数 之一: 起点、中间点、终点,弧线有方向(此处为顺时针)
    AcGeCircArc2d cArc(pt1, pt2, pt3);
    acutPrintf(_T("\n圆弧:圆心坐标(%0.3f, %0.3f),半径为%0.3f"), cArc.center().x,cArc.center().y,cArc.radius());
    // 起始弧度:与弧线方向无关,均与X轴正向夹角
    acutPrintf(_T("\n起始弧度:%0.3f,终止弧度:%0.3f"), cArc.startAng(), cArc.endAng());
    
    // 将曲线上 参数化点
    double param1 = cArc.paramOf(pt1);
    double param2 = cArc.paramOf(pt2);
    double param3 = cArc.paramOf(pt3);
    acutPrintf(_T("\n点pt2 的 参数化值:%0.3f"), param2);
    
    // 曲线上 两点间弧长:起始参数点、终止参数点,弧长与弧线方向相同(包括延长线)
    double length = cArc.length(param1, param2);
    acutPrintf(_T("\n点pt1与pt2之间弧长:%0.3f"), length);
    
    // 曲线上 距 已知点 一定距离的 另一个 点的参数化值:正距离与弧线正方向同
    double param4 = cArc.paramAtLength(param2, 100);
    // 点参数化 转 点对象
    pt4 = cArc.evalPoint(param4);
    acutPrintf(_T("\n圆弧上距离pt2点100的点坐标(%0.3f,%0.3f)"), pt4.x, pt4.y);
    
    // 点到曲线的 最近距离
    double dist = cArc.distanceTo(AcGePoint2d(0, 101));
    acutPrintf(_T("\n(0, 101)点到曲线的距离:%0.3f"), dist);
    
    // 曲线上 离已知点 最近的点坐标
    pt5 = cArc.closestPointTo(AcGePoint2d(101, 0));
    acutPrintf(_T("\n曲线上 离(0, 101)点 最近的点:(%0.3f, %0.3f)"), pt5.x, pt5.y);
    
    // 判断点是否在弧线上: 传入的也可以是 参数化点
    if (cArc.isOn(pt1))
    {
    	acutPrintf(_T("\n点pt1在曲线上"));
    }
    // 沿着曲线方向等分曲线
    AcGePoint2dArray ptarr;
    // 等分曲线:点个数(包含起终点)、接收结果的点列表
    cArc.getSamplePoints(3, ptarr);
    for (int i = 0; i < ptarr.length(); i++)
    {
    	acutPrintf(_T("\n等分坐标(%0.3f,%0.3f)"), ptarr.at(i).x, ptarr.at(i).y);
    }
    

3.2.3 效果

  • 顺时针曲线AcGeCircArc2d cArc(pt1, pt2, pt3);
    在这里插入图片描述

  • 逆时针曲线AcGeCircArc2d cArc(pt3, pt2, pt1);
    在这里插入图片描述

四、二维线实体类(AcGeLinearEnt2d)

  • 继承关系:为二维曲线类(AcGeCurve2d)的派生类,见第一条类图
  • 派生类
    • 直线:AcGeLine2d,对应数据库类型AcDbXline
    • 线段:AcGeLineSeg2d,对应数据库类型AcDbLine
    • 射线:AcGeRay2d,对应数据库类型AcDbRay

4.1 常用方法

  • 方法列表
    名称释义
    set创建直线:传入两点
    getPerpLine条件创建直线:过已知点,创建垂直于调用直线对象的直线
    sColinearTo判断线重合
    sParallelTo判断线平行
    sPerpendicularTo判断线垂直
    ntersectWith传入线对象,获取交点

    线段、射线参考直线方法调用

4.2 方法示例

  • 代码示例
    AcGePoint2d pt1(100, 0), pt2(0, 100), pt3(100, 100), pt4;
    AcGeLine2d xline(AcGePoint2d::kOrigin, pt1);
    AcGeLine2d yline(AcGePoint2d::kOrigin, pt2);
    
    // 条件创建直线:过已知点pt2,获得垂直于yline线的直线hline
    AcGeLine2d hline;
    yline.getPerpLine(pt2, hline);
    
    // set方法获得直线:传入两点
    AcGeLine2d linetemp;
    linetemp.set(pt1, pt2);
    // 获取直线的向量
    AcGeVector2d vec = linetemp.direction();
    acutPrintf(_T("\n直线与X轴正向夹角(弧度):%0.3f"), vec.angle());
    
    // 以下函数:tol默认e-10,且均可省略
    AcGeTol tol;
    tol.setEqualPoint(0.1);
    
    if (hline.isColinearTo(hline, tol))
    	acutPrintf(_T("\n两线重合"));
    if (xline.isParallelTo(hline,tol))
    	acutPrintf(_T("\n两线平行"));
    if (xline.isPerpendicularTo(yline,tol))
    	acutPrintf(_T("\n两线垂直"));	
    
    // xline获取与yline的交点pt4
    xline.intersectWith(yline, pt4);
    acutPrintf(_T("\n交点坐标(%0.3f,%0.3f)"), pt4.x, pt4.y);
    
  • 效果
    在这里插入图片描述
    传送门 返回 列表
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
从acdbmgd.dll导出的内容,方便参考,格式如下: :Autodesk.AutoCAD.DatabaseServices.TextStyleTableRecord:Autodesk.AutoCAD.DatabaseServices.SymbolTableRecord New() 方法: {dtor}() {dtor}() {dtor}() {dtor}() ApplyPaperOrientationTransform(Viewport) ApplyPartialUndo(DwgFiler,RXClass) Audit(AuditInfo) Cancel() Close() CloseAndPage(Boolean) CopyFrom(RXObject) CreateExtensionDictionary() DisableUndoRecording(Boolean) Dispose() DowngradeOpen() DowngradeToNotify(Boolean) DwgIn(DwgFiler) DwgOut(DwgFiler) DxfIn(DxfFiler) DxfOut(DxfFiler) Erase() Erase(Boolean) HandOverTo(DBObject,Boolean,Boolean) ReleaseExtensionDictionary() RemoveField(ObjectId) ResetScaleDependentProperties() SetObjectIdsInFlux() SetPaperOrientation(Boolean) SwapIdWith(ObjectId,Boolean,Boolean) SwapReferences(IdMapping) UpgradeOpen() ViewportDraw(ViewportDraw) XDataTransformBy(Matrix3d) 函数: Clone() AS System.Object CompareTo(Object) AS System.Int32 CreateObjRef(Type) AS System.Runtime.Remoting.ObjRef DecomposeForSave(DwgVersion) AS Autodesk.AutoCAD.DatabaseServices.DecomposeForSaveReplacementRecord DeepClone(DBObject,IdMapping,Boolean) AS Autodesk.AutoCAD.DatabaseServices.DBObject Equals(Object) AS System.Boolean GetHashCode() AS System.Int32 GetLifetimeService() AS System.Object GetObjectSaveVersion(DwgFiler) AS Autodesk.AutoCAD.DatabaseServices.FullDwgVersion GetObjectSaveVersion(DxfFiler) AS Autodesk.AutoCAD.DatabaseServices.FullDwgVersion GetPersistentReactorIds() AS Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection GetReactors() AS System.Collections.Generic.List`1[[Autodesk.AutoCAD.Runtime.RXObject, acdbmgd, Version=17.1.0.0, Culture=neutral, PublicKeyToken=null]] GetRXClass() AS Autodesk.AutoCAD.Runtime.RXClass GetType() AS System.Type GetXDataForApplication(String) AS Autodesk.AutoCAD.DatabaseServices.ResultBuffer HasPersistentReactor(ObjectId) AS System.Boolean InitializeLifetimeService() AS System.Object QueryX(RXClass) AS System.IntPtr RemoveField() AS Autodesk.AutoCAD.DatabaseServices.ObjectId RemoveField(String) AS Autodesk.AutoCAD.DatabaseServices.ObjectId SetAttributes(DrawableTraits) AS System.Int32 SetField(Field) AS Autodesk.AutoCAD.DatabaseServices.ObjectId SetField(String,Field) AS Autodesk.AutoCAD.DatabaseServices.ObjectId SetFromStyle() AS System.Boolean ToString() AS System.String UpgradeFromNotify() AS System.Boolean ViewportDrawLogicalFlags(ViewportDraw) AS System.Int32 WblockClone(RXObject,IdMapping,Boolean) AS Autodesk.AutoCAD.DatabaseServices.DBObject WorldDraw(WorldDraw) AS System.Boolean X(RXClass) AS System.IntPtr 属性: AcadObject AS System.Object 可读不可写 Annotative AS Autodesk.AutoCAD.DatabaseServices.AnnotativeStates 可读可写 AutoDelete AS System.Boolean 可读可写 BigFontFileName AS System.String 可读可写 ClassID AS System.Guid 可读不可写 Database AS Autodesk.AutoCAD.DatabaseServices.Database 可读不可写 Drawable AS Autodesk.AutoCAD.GraphicsInterface.Drawable 可读不可写 DrawableType AS Autodesk.AutoCAD.GraphicsInterface.DrawableType 可读不可写 ExtensionDictionary AS Autodesk.AutoCAD.DatabaseServices.ObjectId 可读不可写 FileName AS System.String 可读可写 FlagBits AS System.Byte 可读可写 Font AS Autodesk.AutoCAD.GraphicsInterface.FontDescriptor 可读可写 Handle AS Autodesk.AutoCAD.DatabaseServices.Handle 可读不可写 HasFields AS System.Boolean 可读不可写 HasSaveVersionOverride AS System.Boolean 可读可写 Id AS Autodesk.AutoCAD.DatabaseServices.ObjectId 可读不可写 IsAProxy AS System.Boolean 可读不可写 IsCancelling AS System.Boolean 可读不可写 IsDependent AS System.Boolean 可读不可写 IsDisposed AS System.Boolean 可读不可写 IsErased AS System.Boolean 可读不可写 IsEraseStatusToggled AS System.Boolean 可读不可写 IsModified AS System.Boolean 可读不可写 IsModifiedGraphics AS System.Boolean 可读不可写 IsModifiedXData AS System.Boolean 可读不可写 IsNewObject AS System.Boolean 可读不可写 IsNotifyEnabled AS System.Boolean 可读不可写 IsNotifying AS System.Boolean 可读不可写 IsObjectIdsInFlux AS System.Boolean 可读不可写 IsPersistent AS System.Boolean 可读不可写 IsReadEnabled AS System.Boolean 可读不可写 IsReallyClosing AS System.Boolean 可读不可写 IsResolved AS System.Boolean 可读不可写 IsShapeFile AS System.Boolean 可读可写 IsTransactionResident AS System.Boolean 可读不可写 IsUndoing AS System.Boolean 可读不可写 IsVertical AS System.Boolean 可读可写 IsWriteEnabled AS System.Boolean 可读不可写 MergeStyle AS Autodesk.AutoCAD.DatabaseServices.DuplicateRecordCloning 可读可写 Name AS System.String 可读可写 ObjectBirthVersion AS Autodesk.AutoCAD.DatabaseServices.FullDwgVersion 可读不可写 ObjectId AS Autodesk.AutoCAD.DatabaseServices.ObjectId 可读不可写 ObliquingAngle AS System.Double 可读可写 OwnerId AS Autodesk.AutoCAD.DatabaseServices.ObjectId 可读可写 PaperOrientation AS Autodesk.AutoCAD.DatabaseServices.PaperOrientationStates 可读不可写 PriorSize AS System.Double 可读可写 TextSize AS System.Double 可读可写 UndoFiler AS Autodesk.AutoCAD.DatabaseServices.DwgFiler 可读不可写 UnmanagedObject AS System.IntPtr 可读不可写 XData AS Autodesk.AutoCAD.DatabaseServices.ResultBuffer 可读可写 XScale AS System.Double 可读可写 -------------------------------- :Autodesk.AutoCAD.DatabaseServices.TextVerticalMode:System.Enum 函数: CompareTo(Object) AS System.Int32 Equals(Object) AS System.Boolean GetHashCode() AS System.Int32 GetType() AS System.Type GetTypeCode() AS System.TypeCode ToString() AS System.String ToString(IFormatProvider) AS System.String ToString(String,IFormatProvider) AS System.String ToString(String) AS System.String 字段: TextBase AS TextVerticalMode TextBottom AS TextVerticalMode TextTop AS TextVerticalMode TextVerticalMid AS TextVerticalMode value__ AS Int32
objectarxwizards-2023.zip是一个压缩文件,它可能包含了针对ObjectARX软件开发工具集的一些示例代码和实用程序。ObjectARX是Autodesk公司提供的用于开发AutoCAD软件的应用程序编程接口(API),它允许开发人员创建自定义功能和扩展,以满足用户特定的需求和要求。这个压缩文件可能是为了方便开发人员参考和学习使用ObjectARX编程而创建的。 通过解压和查看这个文件,我们可以学习示例代码和实用程序的结构和用法。这可能有助于我们更好地理解ObjectARX的编程概念和技术,进而应用到我们自己的项目中。压缩文件中可能包含了一些源代码文件、库文件、帮助文档和示例项目,它们可以帮助我们进一步学习和开发自定义的AutoCAD功能。 ObjectARX是一个功能强大的开发工具,它提供了许多API函数和,可以访问和操作AutoCAD软件内部的对象和数据。通过使用ObjectARX,我们可以创建插件、自定义命令、修改绘图元素、修改用户界面以及与其他应用程序集成等等。因此,这个压缩文件对于那些对AutoCAD开发感兴趣的人来说是非常有价值的资源。 总之,objectarxwizards-2023.zip是一个ObjectARX开发工具集的压缩文件,它包含了一些示例代码和实用程序,可以帮助开发人员学习和开发自定义的AutoCAD功能。如果我们对AutoCAD软件的开发有兴趣,这个文件会提供很多有用的资源和参考资料。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值