news 2026/6/16 4:32:44

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/6/15 16:20:34

XML DOM

XML DOM 引言 XML(可扩展标记语言)DOM(文档对象模型)是用于处理XML文档的编程接口。DOM提供了一种将XML文档结构化表示为树形结构的方法,使得开发者能够通过编程方式访问和操作XML文档中的元素和属性。本文将详细介绍XML DOM的概念、特点、操作方法以及在开发中的应用。…

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

通信系统仿真:信道编码与解码_(18).系统级仿真实验

系统级仿真实验 在通信系统仿真中&#xff0c;系统级仿真实验是一个重要的环节&#xff0c;它不仅能够验证信道编码与解码算法的性能&#xff0c;还能帮助我们理解整个通信系统的各项参数对整体性能的影响。系统级仿真实验通常包括以下几个步骤&#xff1a;系统建模、参数设置、…

作者头像 李华
网站建设 2026/6/14 18:20:09

Docker 安装 Ubuntu

Docker 安装 Ubuntu 引言 Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。本文将详细介绍如何在 Docker 中安装 Ubuntu 操作系统。 系统要求 在开始安装之前,…

作者头像 李华
网站建设 2026/6/15 16:23:08

Bootstrap5 按钮组

Bootstrap5 按钮组 Bootstrap 是一个广泛使用的开源前端框架,它为网页设计提供了丰富的组件和工具。在 Bootstrap5 中,按钮组是一个非常重要的组件,它允许开发者以灵活的方式组织按钮,从而实现更好的用户体验。本文将详细介绍 Bootstrap5 中的按钮组,包括其使用方法、特性…

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

Bootstrap4 创建一个网页

Bootstrap4 创建一个网页 引言 Bootstrap 是一个流行的前端框架,它可以帮助开发者快速构建响应式和移动优先的网页。Bootstrap4 是 Bootstrap 的最新版本,它带来了许多新的特性和改进。本文将详细介绍如何使用 Bootstrap4 创建一个基本的网页。 环境准备 在开始之前,请确…

作者头像 李华
网站建设 2026/6/14 23:20:29

【ROS2】ROS2+Qt6+WebRTC程序依赖库

1、OpenCV 错误信息: CMake Error at CMakeLists.txt:45 (find_package):By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project hasasked CMake to find a package configuration file provided by "OpenCV", butCMake did not find…

作者头像 李华