news 2026/9/4 14:34:46

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/9/3 0:44:25

基于python的新能源汽车数据分析系统(毕设源码+文档)

背景 本课题聚焦新能源汽车行业数据零散、市场洞察不足及产业决策缺乏精准数据支撑等痛点&#xff0c;设计并实现基于Python的新能源汽车数据分析系统。系统依托Python强大的数据处理与可视化优势&#xff0c;整合新能源汽车全产业链数据整合、多维度分析、可视化展示等核心场景…

作者头像 李华
网站建设 2026/9/2 23:10:05

阿里巴巴禁止使用JDK自带线程池?揭秘背后的惊天内幕!

阿里巴巴禁止使用JDK自带线程池&#xff1f;揭秘背后的惊天内幕&#xff01;为什么大厂对代码细节如此苛求&#xff1f;大家好&#xff0c;我是你们的Java技术向导。今天我们要聊一个在阿里巴巴Java开发手册中颇具争议的规定——严禁使用JDK自带的Executors工具类创建线程池。这…

作者头像 李华
网站建设 2026/9/3 4:40:53

深度学习目标检测中的矩形框坐标格式详解

本篇博文我们来详细解释目标检测中边界框的 (x, y, w, h) 坐标表示法。这是最核心的坐标格式之一。 核心定义 (x, y, w, h) 代表一个矩形框&#xff0c;通常用于标注或预测图像中物体的位置和大小。 四个参数的含义&#xff1a; x&#xff1a;边界框中心点的横坐标y&#xff1a…

作者头像 李华
网站建设 2026/9/2 10:06:17

生产级微服务应用全攻略:从骨架到运维的完整体系

搭建一个生产级的微服务应用,远不止是将单体应用拆分成几个小服务那么简单。它需要一个 强大的底层支撑平台 来应对分布式系统的复杂性。 本文将从 9 大核心组件 出发,结合 数据、异步、灰度、测试和安全策略,为你提供完整的微服务架构蓝图。 第一类:基础支撑层 —— 微服…

作者头像 李华