news 2026/7/8 7:31:50

CAD二次开发中圆的绘制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CAD二次开发中圆的绘制

Circle.h

#pragma once class Circle{ public: //创建任意平面上的圆,该平面的法向量为normal static AcDbObjectId SetCircle(const AcGePoint3d& centerPoint, const AcGeVector3d& normal, double radius); //创建XOY平面上的圆,即平面的法向量为(0, 0, 1) static AcDbObjectId SetCircle(const AcGePoint3d& centerPoint, double radius); //以XOY平面上两点为直径创建一个圆 static AcDbObjectId SetCircle(const AcGePoint2d& Point1, const AcGePoint2d& Point2); //三个点创建一个圆 static AcDbObjectId SetCircle(const AcGePoint2d& Point1, const AcGePoint2d& Point2, const AcGePoint2d& Point3); }; class ModelSpace { public: //将实体添加到模型空间 static AcDbObjectId SetModelSpace(AcDbEntity* pEnt); }; //几何运算 class GeometricOperations { public: //两个三维点求中点 static AcGePoint3d GetMiddlePoint(const AcGePoint3d& startPoint, const AcGePoint3d& endPoint); //两个二维点求中点 static AcGePoint2d GetMiddlePoint(const AcGePoint2d& startPoint, const AcGePoint2d& endPoint); }; class Demo { public: //加载、卸载和执行主函数 static void m_Init(); static void m_Unload(); static void m_Demo(); };

Circle.cpp

#include "stdafx.h" #include "Circle.h" #include<math.h> #include "gearc2d.h" //将实体添加到模型空间 AcDbObjectId ModelSpace::SetModelSpace(AcDbEntity* pEnt) { //检查输入参数的有效性 assert(pEnt); //获得当前图形数据库的块表 AcDbBlockTable* pBT1 = NULL; acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT1, AcDb::kForRead); //获得模型空间对应的块表记录 AcDbBlockTableRecord* pBT1Rcd = NULL; pBT1->getAt(ACDB_MODEL_SPACE, pBT1Rcd, AcDb::kForWrite); pBT1->close(); //将实体添加到模型空间的块表记录中 AcDbObjectId lineId; Acad::ErrorStatus es = pBT1Rcd->appendAcDbEntity(lineId, pEnt); if (es != Acad::eOk) { pBT1Rcd->close(); delete pEnt; //添加失败时delete pEnt = NULL; return AcDbObjectId::kNull; } //关闭模型空间块表记录 pBT1Rcd->close(); pEnt->close(); return lineId; } //任意平面上的圆,该平面的法向量为normal AcDbObjectId Circle::SetCircle(const AcGePoint3d& centerPoint, const AcGeVector3d& normal, double radius) { AcDbCircle* pCircle = new AcDbCircle(centerPoint, normal, radius); if (pCircle == nullptr) { acedAlert(_T("\n错误:创建圆对象失败!")); return AcDbObjectId::kNull; } return ModelSpace::SetModelSpace(pCircle); } //XOY平面上的圆,即平面的法向量为(0, 0, 1) AcDbObjectId Circle::SetCircle(const AcGePoint3d& centerPoint, double radius) { AcGeVector3d vec(0, 0, 1); return Circle::SetCircle(centerPoint, vec, radius); } //两个三维点求中点 AcGePoint3d GeometricOperations::GetMiddlePoint(const AcGePoint3d& startPoint, const AcGePoint3d& endPoint) { double x = (startPoint.x + endPoint.x) * 0.5; double y = (startPoint.y + endPoint.y) * 0.5; double z = (startPoint.z + endPoint.z) * 0.5; return AcGePoint3d(x, y, z); } //两个二维点求中点 AcGePoint2d GeometricOperations::GetMiddlePoint(const AcGePoint2d& startPoint, const AcGePoint2d& endPoint) { double x = (startPoint.x + endPoint.x) * 0.5; double y = (startPoint.y + endPoint.y) * 0.5; return AcGePoint2d(x, y); } //以XOY平面上两点为直径创建一个圆 AcDbObjectId Circle::SetCircle(const AcGePoint2d& Point1, const AcGePoint2d& Point2) { //计算圆心和半径 AcGePoint2d center = GeometricOperations::GetMiddlePoint(Point1, Point2); AcGePoint3d center3d(center.x, center.y, 0); double radius = center3d.distanceTo(AcGePoint3d(Point1.x, Point1.y, 0)); //检查半径是否有效 if (radius < 1e-6) { acedAlert(_T("错误:两点重合,无法创建直径圆!")); return AcDbObjectId::kNull; } //创建圆 return Circle::SetCircle(center3d, radius); //类内访问静态成员函数就不用加类名了 } /* //三个点创建一个圆 AcDbObjectId Circle::SetCircle(const AcGePoint2d& Point1, const AcGePoint2d& Point2, const AcGePoint2d& Point3) { // 提取三点坐标,便于后面计算 double x1 = Point1.x, y1 = Point1.y; double x2 = Point2.x, y2 = Point2.y; double x3 = Point3.x, y3 = Point3.y; // 计算各点的x²+y² double s1 = x1 * x1 + y1 * y1; double s2 = x2 * x2 + y2 * y2; double s3 = x3 * x3 + y3 * y3; // 计算三点共线的判别式(分母),为0则三点共线 double denominator = (x1 - x2) * (y1 - y3) - (x1 - x3) * (y1 - y2); // 1. 判断三点是否共线(无法创建圆) if (fabs(denominator) < 1e-6) { // ObjectARX专属的acedAlert,解决提示出错问题 acedAlert(_T("错误:输入的三点共线,无法创建二维圆!")); return AcDbObjectId::kNull; } // 2. 计算二维圆心(Z轴强制为0,适配二维平面) AcGePoint3d ptCenter; ptCenter.x = ((s1 - s2) * (y1 - y3) - (s1 - s3) * (y1 - y2)) / (2 * denominator); ptCenter.y = ((s1 - s3) * (x1 - x2) - (s1 - s2) * (x1 - x3)) / (2 * denominator); ptCenter.z = 0; // 二维平面,Z坐标直接设为0 // 3. 计算圆的半径(基于Point1到圆心的距离) double dx = x1 - ptCenter.x; double dy = y1 - ptCenter.y; double radius = sqrt(dx * dx + dy * dy); // 4. 判断半径是否有效 if (radius < 1e-6) { acedAlert(_T("错误:计算出的圆半径过小,无法创建!")); return AcDbObjectId::kNull; } return SetCircle(ptCenter, radius); } */ //三个点创建一个圆(使用几何类,更简洁) AcDbObjectId Circle::SetCircle(const AcGePoint2d& Point1, const AcGePoint2d& Point2, const AcGePoint2d& Point3) { AcGeCircArc2d geArc(Point1, Point2, Point3); AcGePoint3d ptCenter(geArc.center().x, geArc.center().y, 0); return SetCircle(ptCenter, geArc.radius()); } void Demo::m_Init() { acedRegCmds->addCommand(_T("g1"), _T("CreateCircle"), _T("画一个圆"), ACRX_CMD_MODAL, Demo::m_Demo); } void Demo::m_Unload() { acedRegCmds->removeGroup(_T("g1")); } void Demo::m_Demo() { //"圆心、半径"法创建一个圆 AcGePoint3d ptCenter(100, 100, 0); Circle::SetCircle(ptCenter, 20); //以XOY平面上两点为直径创建一个圆 AcGePoint2d pt1(70, 100); AcGePoint2d pt2(130, 100); Circle::SetCircle(pt1, pt2); //三点创建一个圆 pt1.set(60, 100); pt2.set(140, 100); AcGePoint2d pt3(100, 60); Circle::SetCircle(pt1, pt2, pt3); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 7:53:25

2025论文降AI神器,降重降AI率快人一步!

2025年高校查重系统全面升级&#xff0c;知网、维普、万方等平台AIGC检测模块精准度高&#xff08;数据来源&#xff1a;2025学术检测白皮书&#xff09;。许多同学用AI辅助写作后&#xff0c;发现论文充满AI味&#xff1a;固定句式扎堆、词汇重复率高、逻辑衔接生硬... 最终导…

作者头像 李华
网站建设 2026/7/4 15:20:00

基于python的中文起点网top500小说数据提取的设计与实现(毕设源码+文档)

背景 本课题聚焦中文起点网top500小说数据获取效率低、人工提取误差大及数据结构化程度低等痛点&#xff0c;设计并实现基于Python的中文起点网top500小说数据提取系统。系统依托Python强大的网络爬虫与数据处理优势&#xff0c;整合小说数据爬取、清洗转换、结构化存储等核心场…

作者头像 李华
网站建设 2026/6/15 13:26:25

MySQL调优实践

sql的书写顺序和执行顺序 SELECT [DISTINCT] 字段/表达式 -- 5. 筛选返回的字段 FROM 表名 [别名] -- 1. 指定查询的数据源表 [JOIN 关联表 [别名] ON 关联条件] -- 2. 执行表关联操作 WHERE 过滤条件 -- 3. 过滤行数据&#xff08;分组前&a…

作者头像 李华
网站建设 2026/6/17 11:03:17

操作系统统计

操作系统统计 引言 操作系统作为计算机系统的核心组成部分,其性能和稳定性直接影响到整个计算机系统的运行效率。本文将对操作系统的统计指标进行详细解析,帮助读者全面了解操作系统性能评估的方法和技巧。 一、操作系统统计指标概述 操作系统统计指标主要包括以下几个方…

作者头像 李华
网站建设 2026/7/1 11:26:09

自考必备!8个AI论文软件推荐,轻松搞定毕业论文格式规范!

自考必备&#xff01;8个AI论文软件推荐&#xff0c;轻松搞定毕业论文格式规范&#xff01; 自考路上的得力助手&#xff0c;AI论文工具如何帮你轻松应对毕业难题 对于自考学生来说&#xff0c;撰写毕业论文不仅是学术能力的考验&#xff0c;更是时间与精力的挑战。随着人工智能…

作者头像 李华