news 2026/6/9 1:39:40

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/9 15:04:38

SOAP HTTP Binding

SOAP HTTP Binding 引言 SOAP(Simple Object Access Protocol)是一种轻量级、简单的协议,用于在网络上交换结构化信息。它广泛应用于Web服务中,用于实现不同系统之间的通信。本文将深入探讨SOAP HTTP Binding,包括其定义、工作原理、优势以及应用场景。 SOAP HTTP Bind…

作者头像 李华
网站建设 2026/6/9 16:09:57

《Foundation 下拉菜单:设计、实现与应用指南》

《Foundation 下拉菜单:设计、实现与应用指南》 引言 在Web设计中,下拉菜单是提高用户体验和页面布局灵活性的关键元素。本文将深入探讨Foundation框架下的下拉菜单设计、实现与应用,旨在为开发者提供全面的指导和参考。 一、Foundation 概述 Foundation是由ZURB创建的前…

作者头像 李华
网站建设 2026/6/9 13:07:02

Perl 基础语法

Perl 基础语法 引言 Perl 是一种广泛使用的通用、解释型、动态编程语言。它以其强大的文本处理能力而闻名,同时也在系统管理、网络编程等领域有着广泛的应用。本文将为您介绍 Perl 的基础语法,帮助您快速入门。 Perl 环境搭建 在开始学习 Perl 之前,您需要先搭建一个 Pe…

作者头像 李华
网站建设 2026/5/31 10:43:33

城市仿真软件:AnyLogic_(18).优化与决策支持

优化与决策支持 在城市仿真软件中&#xff0c;优化与决策支持是一个关键的模块&#xff0c;它通过模拟不同的城市规划方案、交通流量管理、资源分配等场景&#xff0c;帮助决策者找到最优的解决方案。本节将详细介绍如何在AnyLogic中实现优化与决策支持功能&#xff0c;包括优化…

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

【课程设计/毕业设计】基于SpringBoot和Vue的实验报告管理系统的设计与实现基于springboot的实验报告管理系统的设计与实现【附源码、数据库、万字文档】

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

作者头像 李华
网站建设 2026/6/8 15:01:30

python高校毕业设计信息选题管理系统设计与实现pycharm django vue flask--论文

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 python高校毕业设计信息选题管理系统设计与实现pycharm djang…

作者头像 李华