目录

  • 一、概述
  • 二、点对象(AcGePoint2d )
    • 2.1 声明及赋值
    • 2.2 点对象方法
    • 2.3 矩阵对象
      • 2.3.1 概述
      • 2.3.2 矩阵类方法
  • 三、二维实体类(AcGeEntity2d)
    • 3.1 AcGeEntity2d类方法
    • 3.2 AcGeCurve2d类方法
      • 3.2.1 常用方法
      • 3.2.2 方法示例
      • 3.2.3 效果
  • 四、二维线实体类(AcGeLinearEnt2d)
    • 4.1 常用方法
    • 4.2 方法示例

一、概述

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

    传送门 返回 列表

objectArx---AcGe几何类相关推荐

  1. [ObjectARX]-几何类的使用

    打开VS2015,使用ObjectARX向导创建新工程,名为BaseGeometryClass. (1)计算直线几何类和 圆弧几何类的交点. 注册命令InsertsetWith,实现代码: stati ...

  2. c++几何类和几何简单工厂模式

    直接上报告了,不想再修改了 里面有很多算法都是学习其他朋友的,希望体谅 代码都是自己一句一句写的,不容易,有问题可以评论区见 一.实习题目 1.实现一个集合类 CSet(完成代码并测试运行),能够存储 ...

  3. ObjectARX运行时类信息实现原理

    新公司维护基于CAD的二次开发旧代码.学习ObjectARX相关的内容. 先看原始代码 class MyClass: public AcRxObject { public:virtual AcRxCl ...

  4. [ObjectARX系列]

    ObjectARX系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如: ObjectARX学习入门 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 ...

  5. AutoCAD中ObjectARX C++常用的方法

    在AutoCAD中选择实体 1. ads_name[在AutoCAD 2000中仍为此名].acdbNameSet()[ads_name_set()].acdbNameEqual()[ads_name ...

  6. ObjectARX目录页

    目录页 一.环境配置 二.命令注册.表结构 三.封装代码 3.1 工具类封装 3.2 简单交互 3.3 ads篇(重点) 3.4 AcGe几何类篇 四.数据库实体类 4.1 圆.圆弧.多段线 4.2 ...

  7. CAD2020-objectArx开发笔记---目录

    目录页 一.环境配置 二.命令注册.表结构 三.封装代码 3.1 工具类封装 3.2 简单交互 3.3 ads篇(重点) 3.4 AcGe几何类篇 四.数据库实体类 4.1 圆.圆弧.多段线 4.2 ...

  8. ObjectARX常用类和函数

    2019独角兽企业重金招聘Python工程师标准>>> (1)AcAx 开头的全局函数:这些函数通过 COM 的方式来让AutoCAD 完成一些操作. (a) acutPrintf函 ...

  9. ObjectArx-自定义对象-派生自ObjectARX类

    1. 自定义对象-派生自ObjectARX类 使用ObjectARX宏管理继承于ObjectARX的自定义类.宏允许自定义类参与AcRxObject运行时类型标识机制. 1.1 派生的自定义类 为了便 ...

最新文章

  1. c语言爬虫代码,simspider
  2. 华为网络技术培训笔记之常用网络工具(二)
  3. Linux系统的日志管理
  4. Recovery 流程简介
  5. 程序员听歌该有的样子
  6. 【渝粤教育】广东开放大学 计量基础知识 形成性考核 (48)
  7. UI进阶——XMPP即时通讯
  8. 打印系统开发(5)——书脊
  9. 4种方法解决鼠标反应慢(迟钝)
  10. 知名大企业的愿景和使命
  11. [鼠标指针][仅需1步]宝藏的猫咪Cat老师[win10/11][点击看更多免费]......
  12. 用Python生成人人贷借款理由词云图
  13. JavaScript中的随机数--随机点名器
  14. vue+animation实现翻页动画
  15. WordPress 前端投稿/编辑插件 DJD Site Post(支持游客和已注册用户)
  16. 外汇天眼:开仓、平仓、持仓、锁仓是什么意思?
  17. linux修改BCD文件,关于BCDEdit 命令的使用
  18. 视频H5页面/视频app怎么做?
  19. CNCF宣布TUF项目正式毕业
  20. MT7688/MT7628-GPIO使用

热门文章

  1. 文件加密都有哪些方法?
  2. [安全] AD域解释 , 域和组的区别?
  3. 你可和差拨便去那里 视频转换软件
  4. 程序无法安装时, 提示无法访问网络位置0 的解决办法
  5. DD-路径图、MM-路径图的定义与区别联系
  6. 【Git】OpenSSL SSL_read: Connection was aborted, errno 10053
  7. oracle查询当前时间前10分钟到当前时间的数据
  8. ubuntu命令行启动浏览器_linux命令行下使用linux打开浏览器命令
  9. PPT模板的动画去掉或更改
  10. 戴维斯双击策略的实现与验证