news 2026/4/16 13:05:56

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/4/15 20:18:47

Java毕设选题推荐:基于springboot的户外救援系统基于SpringBoot的救援指挥系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 14:06:44

8个AI论文平台推荐!继续教育学生轻松搞定毕业论文格式规范!

8个AI论文平台推荐&#xff01;继续教育学生轻松搞定毕业论文格式规范&#xff01; AI 工具助力论文写作&#xff0c;让学术之路更轻松 在当前的学术环境中&#xff0c;越来越多的学生和科研工作者开始借助 AI 工具来提升论文写作效率。尤其是在继续教育领域&#xff0c;面对…

作者头像 李华
网站建设 2026/4/16 13:05:22

Pandas 相关性分析

Pandas 相关性分析 引言 在数据分析领域,Pandas 是一个不可或缺的工具。它提供了丰富的数据处理功能,其中相关性分析是数据分析的重要部分。本文将详细介绍 Pandas 相关性分析的基本概念、方法以及实际应用。 相关性分析概述 1. 什么是相关性分析? 相关性分析是研究两个…

作者头像 李华
网站建设 2026/4/16 16:24:04

超高创新!强化学习+深度学习单变量时间序列预测MATLAB代码

基于强化学习自动选择最优深度学习模型的时间序列预测。代码通过强化学习智能体在LSTM、BiLSTM、GRU三种模型中选择最佳模型&#xff0c;然后进行单变量时间序列预测和性能评估。 算法步骤 数据预处理阶段 • 导入数据 • 构建时间序列样本&#xff08;滑动窗口方法&#xff09…

作者头像 李华
网站建设 2026/4/16 16:13:17

AI Agent:智能体的觉醒与自主智能的新纪元

目录 一、 AI Agent的灵魂&#xff1a;感知、推理、行动的永恒循环 二、 Agent的核心驱动力&#xff1a;大型语言模型与工具集成 三、 Agent的形态与应用疆域&#xff1a;从虚拟助手到物理世界的智能执行者 四、 Agent的实现基石&#xff1a;框架、模型与内存机制 五、 AI…

作者头像 李华
网站建设 2026/4/16 14:01:42

Redis分布式锁全攻略:原理、陷阱与Redisson最佳实践

在分布式系统中,分布式锁是保障数据一致性与任务互斥执行的核心手段。Redis因其高性能与广泛应用,成为最常见的分布式锁实现方案。 然而,自研Redis分布式锁暗藏诸多陷阱,如果处理不当,容易出现死锁、误删、超时等严重问题。 本文将全面解析 Redis 分布式锁的 基本原理、常…

作者头像 李华