最近更新于 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 方法里调用
运行效果
ObjectARX 2025(C++)绘制圆 AcDbCircle