ObjectARX 2025(C++)绘制圆 AcDbCircle

最近更新于 2025-03-23 10:16

环境

AutoCAD 机械版 2025
ObjectARX 2025
VS 2022

环境配置参考:https://blog.iyatt.com/?p=16480

实现

Circle.hpp

#pragma once
class Circle
{
public:
    static void work();

private:
    static void drawCircle(AcDbCircle* circleObj);
};

Circle.cpp

#include "stdafx.h"
#include "Circle.hpp"

void Circle::drawCircle(AcDbCircle* circleObj)
{
    AcDbBlockTable* pBlockTable = nullptr;
    acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
    AcDbBlockTableRecord* pBlockTableRecord = nullptr;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
    pBlockTableRecord->appendAcDbEntity(circleObj);
    pBlockTableRecord->close();
    pBlockTable->close();
}

void Circle::work()
{
    // X、Y 平面向量
    AcGeVector3d normal(0, 0, 1);

    // 圆心、半径
    AcGePoint3d center1(0, 0, 0);
    double radius1 = 50;

    AcDbCircle* circleObj1 = new AcDbCircle(center1, normal, radius1);
    drawCircle(circleObj1);
    circleObj1->close();

    // 两点
    AcGePoint2d pt1(60, 55), pt2(-10, -5);
    // 计算中点
    AcGePoint3d center2;
    center2.x = (pt1.x + pt2.x) / 2;
    center2.y = (pt1.y + pt2.y) / 2;
    center2.y = 0;
    // 计算半径
    double radius2 = pt1.distanceTo(pt2) / 2;

    AcDbCircle* circleObj2 = new AcDbCircle(center2, normal, radius2);
    Circle::drawCircle(circleObj2);
    circleObj2->close();

    // 三点
    AcGePoint2d pt3(0, 90);
    // 创建圆弧对象
    AcGeCircArc2d geArc(pt1, pt2, pt3);
    // 圆心
    AcGePoint3d center3(geArc.center().x, geArc.center().y, 0);
    // 半径
    double radius3 = geArc.radius();

    AcDbCircle* circleObj3 = new AcDbCircle(center3, normal, radius3);
    Circle::drawCircle(circleObj3);
    circleObj3->close();
}

在 acrxEntryPoint.cpp 中引用头文件,并在 On_kInitAppMsg 方法里调用
file

运行效果
file

ObjectARX 2025(C++)绘制圆 AcDbCircle
Scroll to top

目录

打开目录