2019独角兽企业重金招聘Python工程师标准>>>

首先看一下效果图:

分为4部分,先看代码最少的计算模块:

**********Calculation.h*******************#pragma onceclass sAcGePoint2d;
class AcGePoint3d;class CCalculation
{
public:CCalculation(void);~CCalculation(void);//计算两点连线的中点static AcGePoint2d MiddlePoint(AcGePoint2d pt1, AcGePoint2d pt2);static AcGePoint3d MiddlePoint(AcGePoint3d pt1, AcGePoint3d pt2);static AcGePoint3d Pt2dTo3d(AcGePoint2d pt);//计算常量π的值static double PI();
};
**********Calculation.cpp*******************#include "StdAfx.h"
#include "Calculation.h"
#include <math.h>CCalculation::CCalculation(void)
{
}CCalculation::~CCalculation(void)
{
}AcGePoint2d CCalculation::MiddlePoint(AcGePoint2d pt1, AcGePoint2d pt2)
{AcGePoint2d pt;pt[X] = (pt1[X] + pt2[X]) / 2;pt[Y] = (pt1[Y] + pt2[Y]) / 2;return pt;
}AcGePoint3d CCalculation::MiddlePoint(AcGePoint3d pt1, AcGePoint3d pt2)
{AcGePoint3d pt;pt[X] = (pt1[X] + pt2[X]) / 2;pt[Y] = (pt1[Y] + pt2[Y]) / 2;pt[Z] = (pt1[Z] + pt2[Z]) / 2;return pt;
}AcGePoint3d CCalculation::Pt2dTo3d(AcGePoint2d pt)
{AcGePoint3d ptTemp(pt.x, pt.y, 0);return ptTemp;
}double CCalculation::PI()
{return 4 * atan(1.0);//反正切
}

然后我们看一下,修改颜色,图层,线条:

**********CModifyEnt.h*******************#pragma once
#include "StdAfx.h"class CModifyEnt
{
public:CModifyEnt(void);~CModifyEnt(void);//改变颜色static Acad::ErrorStatus ChangeColor(AcDbObjectId entId, Adesk::UInt16 colorIndex);//改变图层static Acad::ErrorStatus ChangeLayer(AcDbObjectId entId,CString strLayerName);//改变线型static Acad::ErrorStatus ChangeLinetype(AcDbObjectId entId,CString strLinetype);
};
**********CModifyEnt.cpp*******************#include "StdAfx.h"
#include "ModifyEnt.h"CModifyEnt::CModifyEnt(void)
{
}CModifyEnt::~CModifyEnt(void)
{
}Acad::ErrorStatus CModifyEnt::ChangeColor(AcDbObjectId entId, Adesk::UInt16 colorIndex)
{AcDbEntity *pEntity = NULL;// 打开图形数据库中的对象acdbOpenObject(pEntity, entId, AcDb::kForWrite);// 修改实体的颜pEntity->setColorIndex(colorIndex);// colorIndex:0~256 的值,其中 0 代表随块,256 代表随层// 用完之后,及时关闭pEntity->close();return Acad::eOk;
}Acad::ErrorStatus CModifyEnt::ChangeLayer(AcDbObjectId entId, CString strLayerName)
{AcDbEntity *pEntity = NULL;// 打开图形数据库中的对象acdbOpenObject(pEntity, entId, AcDb::kForWrite);// 修改实体的图层pEntity->setLayer(strLayerName);// 用完之后,及时关闭pEntity->close();return Acad::eOk;
}Acad::ErrorStatus CModifyEnt::ChangeLinetype(AcDbObjectId entId, CString strLinetype)
{AcDbEntity *pEntity = NULL;// 打开图形数据库中的对象acdbOpenObject(pEntity, entId, AcDb::kForWrite);// 修改实体的线型pEntity->setLayer(strLinetype);// 用完之后,及时关闭pEntity->close();return Acad::eOk;
}

接下来,我们看最重要的一部分,创建直线,创建圆(4种方法),创建圆弧(5种方法):

**********CreateEnt.h*******************#pragma once
#include "StdAfx.h"class CCreateEnt
{
public:CCreateEnt(void);~CCreateEnt(void);// 将实体添加到图形数据库的模型空间static AcDbObjectId PostToModelSpace(AcDbEntity* pEnt);// 创建一条线static AcDbObjectId CreateLine(AcGePoint3d ptStart,AcGePoint3d ptEnd); //创建一个圆(圆心、半径法)(三维)// ptCenter:圆心; //radius:半径;//vec:圆所在平面static AcDbObjectId CreateCircle(AcGePoint3d ptCenter, AcGeVector3d vec, double radius);//创建位于 XOY 平面上的圆(二维)依赖三维法static AcDbObjectId CreateCircle(AcGePoint3d ptCenter, double radius);//创建一个圆(俩点法)依赖二维法static AcDbObjectId CreateCircle(AcGePoint2d pt1, AcGePoint2d pt2);//创建一个圆(三点法)依赖二维法static AcDbObjectId CreateCircle(AcGePoint2d pt1, AcGePoint2d pt2,AcGePoint2d pt3);//创建圆弧(圆心、半径、圆弧所在的平面、起点角度和终点角度)//ptCenter:圆心; //vec:圆弧所在平面//radius:半径;//startAngle:起点角度//endAngle:终点角度static AcDbObjectId CreateArc(AcGePoint3d ptCenter, AcGeVector3d vec, double radius, double startAngle, double endAngle);//创建圆弧(二维)依赖于圆弧1法static AcDbObjectId CreateArc(AcGePoint2d ptCenter, double radius, double startAngle, double endAngle);//创建圆弧(三点法)依赖于二维法static AcDbObjectId CreateArc(AcGePoint2d ptStart, AcGePoint2d ptOnArc, AcGePoint2d ptEnd);//创建圆弧(起点、圆心、终点)依赖于二维法static AcDbObjectId CreateArcSCE(AcGePoint2d ptStart, AcGePoint2d ptCenter, AcGePoint2d ptEnd);//创建圆弧(起点、圆心、圆弧角度)依赖于二维法static AcDbObjectId CreateArc(AcGePoint2d ptStart, AcGePoint2d ptCenter, double angle);};
**********Calculation.cpp*******************#include "StdAfx.h"
#include "CreateEnt.h"
#include "Calculation.h"
#include <math.h>
#include "gearc3d.h"CCreateEnt::CCreateEnt(void)
{
}CCreateEnt::~CCreateEnt(void)
{
}AcDbObjectId CCreateEnt::CreateLine(AcGePoint3d ptStart,AcGePoint3d ptEnd)
{// 在内存上创建一个新的AcDbLine对象//AcGePoint3d ptStart(0, 0, 0);//AcGePoint3d ptEnd(100, 100, 0);AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);AcDbObjectId lineId;lineId = CCreateEnt::PostToModelSpace(pLine);return lineId;
}AcDbObjectId CCreateEnt::PostToModelSpace(AcDbEntity* pEnt)
{// 获得指向块表的指针AcDbBlockTable *pBlockTable = NULL;//workingDatabase()能够获得一个指向当前活动的图形数据库的指针,acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);// 获得指向特定的块表记录(模型空间)的指针AcDbBlockTableRecord *pBlockTableRecord NULL;pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);// 将AcDbLine类的对象添加到块表记录中AcDbObjectId entId;pBlockTableRecord->appendAcDbEntity(entId, pEnt); // 关闭图形数据库的各种对象pBlockTable->close();pBlockTableRecord->close();pEnt->close(); return entId;
}AcDbObjectId CCreateEnt::CreateCircle(AcGePoint3d ptCenter, AcGeVector3d vec, double radius)
{AcDbCircle *pCircle = new AcDbCircle(ptCenter, vec, radius);// 将实体添加到图形数据库AcDbObjectId circleId;circleId = CCreateEnt::PostToModelSpace(pCircle);return circleId;
}AcDbObjectId CCreateEnt::CreateCircle(AcGePoint3d ptCenter, double radius)
{AcGeVector3d vec(0, 0, 1);return CCreateEnt::CreateCircle(ptCenter, vec, radius);
}AcDbObjectId CCreateEnt::CreateCircle(AcGePoint2d pt1, AcGePoint2d pt2)
{ // 计算圆心和半径AcGePoint2d pt = CCalculation::MiddlePoint(pt1, pt2);AcGePoint3d ptCenter(pt[X], pt[Y], 0); // 圆心double radius = pt1.distanceTo(pt2) / 2;//distanceTo 函数用于计算两点之间的距离,也就是半径// 创建圆return CCreateEnt::CreateCircle(ptCenter, radius);
}AcDbObjectId CCreateEnt::CreateCircle(AcGePoint2d pt1, AcGePoint2d pt2,AcGePoint2d pt3)
{/*// 使用数学方法double xysm, xyse, xy;AcGePoint3d ptCenter;double radius; xy = pow(pt1[X], 2) + pow(pt1[Y], 2);xyse = xy - pow(pt3[X], 2) - pow(pt3[Y], 2);xysm = xy - pow(pt2[X], 2) - pow(pt2[Y], 2);xy = (pt1[X] - pt2[X]) * (pt1[Y] - pt3[Y]) - (pt1[X] - pt3[X]) * (pt1[Y] - pt2[Y]);// 判断参数有效性if (fabs(xy) < 0.000001){AfxMessageBox(_T("所输入的参数无法创建圆形!"));return 0;}// 获得圆心和半径ptCenter[X] = (xysm * (pt1[Y] - pt3[Y]) - xyse * (pt1[Y] - pt2[Y])) / (2 * xy);ptCenter[Y] = (xyse * (pt1[X] - pt2[X]) - xysm * (pt1[X] - pt3[X])) / (2 * xy);ptCenter[Z] = 0;radius = sqrt((pt1[X] - ptCenter[X]) * (pt1[X] - ptCenter[X]) + (pt1[Y] - ptCenter[Y]) * (pt1[Y] - ptCenter[Y]));if (radius < 0.000001){AfxMessageBox(_T("半径过小!"));return 0;}return CCreateEnt::CreateCircle(ptCenter, radius);
*/// 使用几何类AcGeCircArc2d geArc(pt1, pt2, pt3);AcGePoint3d ptCenter(geArc.center().x, geArc.center().y, 0);return CCreateEnt::CreateCircle(ptCenter, geArc.radius());}AcDbObjectId CCreateEnt::CreateArc(AcGePoint3d ptCenter, AcGeVector3d vec, double radius, double startAngle, double endAngle)
{AcDbObjectId arcId;AcDbArc *pArc = new AcDbArc(ptCenter, vec, radius, startAngle, endAngle);arcId = CCreateEnt::PostToModelSpace(pArc);return arcId;
}AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptCenter, double radius, double startAngle, double endAngle)
{AcGeVector3d vec(0, 0, 1);return CCreateEnt::CreateArc(CCalculation::Pt2dTo3d(ptCenter),vec, radius, startAngle, endAngle);
}AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptStart, AcGePoint2d ptOnArc, AcGePoint2d ptEnd)
{// 使用几何类获得圆心、半径AcGeCircArc2d geArc(ptStart, ptOnArc, ptEnd);AcGePoint2d ptCenter = geArc.center();double radius = geArc.radius();// 计算起始和终止角度AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);AcGeVector2d vecEnd(ptEnd.x - ptCenter.x, ptEnd.y - ptCenter.y);double startAngle = vecStart.angle();double endAngle = vecEnd.angle();return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}AcDbObjectId CCreateEnt::CreateArcSCE(AcGePoint2d ptStart, AcGePoint2d ptCenter, AcGePoint2d ptEnd)
{// 计算半径double radius = ptCenter.distanceTo(ptStart);// 计算起、终点角度AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);AcGeVector2d vecEnd(ptEnd.x - ptCenter.x, ptEnd.y - ptCenter.y);double startAngle = vecStart.angle();double endAngle = vecEnd.angle();// 创建圆弧return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptStart, AcGePoint2d ptCenter, double angle)
{// 计算半径double radius = ptCenter.distanceTo(ptStart);// 计算起、终点角度AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);double startAngle = vecStart.angle();double endAngle = startAngle + angle;// 创建圆弧return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}

最后,创建AutoCAD命令,达到在AutoCAD命令行中输入命令,布局窗口看到我们的大斧头的目的:

**********acrxEntryPoint.cpp*******************static void HHLCreateEntsLine(void){AcGePoint3d ptStart(0, 100, 0);AcGePoint3d ptEnd(0, -100, 0);AcDbObjectId lineId;lineId = CCreateEnt::CreateLine(ptStart, ptEnd);CModifyEnt::ChangeColor(lineId, 1);ptStart.set(-10, 100, 0);ptEnd.set(-10, -100, 0);lineId = CCreateEnt::CreateLine(ptStart, ptEnd);CModifyEnt::ChangeColor(lineId, 1);CModifyEnt::ChangeLayer(lineId, _T("虚线"));CModifyEnt::ChangeLinetype(lineId, _T("中心线"));}static void HHLCreateEntsCircle(void){// “圆心、半径”法创建一个圆AcGePoint3d ptCenter(50, 50, 0);CCreateEnt::CreateCircle(ptCenter, 5);// 两点法创建一个圆AcGePoint2d pt1(70, 100);AcGePoint2d pt2(130, 100);//CCreateEnt::CreateCircle(pt1, pt2);// 三点法创建一个圆pt1.set(60, 100);pt2.set(140, 100);AcGePoint2d pt3(100, 60);//CCreateEnt::CreateCircle(pt1, pt2, pt3);}static void HHLCreateEntsArc(void){// 创建位于XOY平面上的圆弧AcGePoint2d ptCenter(50, -50);CCreateEnt::CreateArc(ptCenter, 100 * sqrt( (double)2 ) / 2, 1 * CCalculation::PI() / 4, 3 * CCalculation::PI() / 4);// 三点法创建圆弧AcGePoint2d ptStart(100, 0);AcGePoint2d ptOnArc(120, 50);AcGePoint2d ptEnd(100, 100);CCreateEnt::CreateArc(ptStart, ptOnArc, ptEnd);// “起点、圆心、终点”创建圆弧ptStart.set(100, 100);ptCenter.set(50, 150);ptEnd.set(0, 100);CCreateEnt::CreateArcSCE(ptEnd , ptCenter, ptStart);// “起点、圆心、圆弧角度”创建圆弧ptStart.set(0, 0);ptCenter.set(-50, 50);CCreateEnt::CreateArc(ptStart, ptCenter, CCalculation::PI() / 2);}ACED_ARXCOMMAND_ENTRY_AUTO(CCreateEntsApp, HHL, CreateEntsLine, CreateLine, ACRX_CMD_TRANSPARENT, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CCreateEntsApp, HHL, CreateEntsCircle, CreateCircle, ACRX_CMD_TRANSPARENT, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CCreateEntsApp, HHL, CreateEntsArc, CreateArc, ACRX_CMD_TRANSPARENT, NULL)

注意:最后这部分代码是加在现有cpp里的,该cpp为程序的主入口

转载于:https://my.oschina.net/u/2930533/blog/760855

AutoCAD_创建直线,圆弧,圆相关推荐

  1. c# CAD二次开发 类库 创建各种图形、直线、圆、多段线、正方形、点等

    c# CAD二次开发 类库 创建各种图形.直线.圆.多段线.正方形.点等 using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD ...

  2. 一般是指用计算机绘制的画面,()一般指用计算机绘制的画面,如直线、圆、圆弧、矩形、任意曲线和图表等。A、图形B、图像C、动画D、图...

    ()一般指用计算机绘制的画面,如直线.圆.圆弧.矩形.任意曲线和图表等.A.图形B.图像C.动画D.图 更多相关问题 minf(X)=x12+3x22一3x1x2+4x1-12x2 电子束焊设备应装置 ...

  3. 【sketchup 2021】草图大师的基础使用【矩形与橡皮擦、直线与圆、手绘线与多边形、圆形与扇形、推拉工具】

    文章目录 矩形与橡皮擦 矩形普通使用 矩形进阶使用[画立面和分割面] 擦除 连续擦除 选中后不想删除了... 隐藏/显示边线 柔化边线/取消柔化 另一种擦除:删除 直线与圆 直线工具 鼠标绘制 默认绘 ...

  4. Halcon回顾之1D Measuring以及扩展实现直线和圆的检测

    基本算子功能介绍 按功能分类介绍: 生成边缘提取区域 gen_measure_rectangle2():生成一个垂直于边缘的边缘提取矩形. gen_measure_arc():生成一个垂直于边缘的边缘 ...

  5. 运用C#在VS2017的PictureBox控件中绘制简易二自由度机械臂,并且让机械臂实现画直线、圆、人物轮廓及写字的功能。

    运用C#在VS2017的PictureBox控件中绘制简易二自由度机械臂,并且让机械臂实现画直线.圆.人物轮廓及写字的功能. 给大家看看效果吧 演示写字视频在下: VID 首先放置了诸多控件 在给控件 ...

  6. opencv 基本绘图功能 画直线 画圆 给图像添加文字等

    直线 矩形 圆 椭圆 多边形 多条直线 图像上写文字 实验 import cv2 as cv import numpy as np# 创建一副黑色的图片 img = np.zeros((512, 51 ...

  7. lisp 画双线带倒圆角_VisualLisp增加公差、消除重合直线圆弧

    1 (vl-load-com)2 3 ;;;标注文字增加公差4 ;;;命令:GV5 ;;;极限公差文字高度可设置成主尺寸文字高度的任意比例,缺省值为0.7 6 ;;;当上公差与下公差相等时为对称公差7 ...

  8. Glut绘制直线和圆

    这个学期报了学校开设的计算机图形学课程,由于前一个月老师讲的都太抽象完全不知道在说啥--于是我的入门现在才刚刚开始.最近的一节课教授了基本图元的生成算法,留的作业是使用OpenGL或者DirectX实 ...

  9. tensorboard图上存在直线_高中数学必修二直线与圆:真是让我没想到,他俩的关系还挺不简单...

    为什么有些题目看着复杂,看一眼就想烧了卷子.听老师一讲,然后一个有趣的事情就发生了,原来这么简单,哎哟,这方法不错,老师还挺聪明,给你点个赞. 首先承认一点,大家智商基本没有太大差异,老师也好,学生也 ...

最新文章

  1. 关于--Error: User Command terminated, Exit-Code = 1解决办法
  2. C++中实现Singleton的正确方法
  3. curses颜色操作
  4. HTTP 错误 500.19 - Internal Server Error v4.0.30319
  5. 耶鲁大学计算机科学录取,2020年耶鲁大学排名TFE Times美国最佳计算机科学硕士专业排名第18...
  6. awk教程入门与实例练习(二)
  7. 开平区教育局资源分布式存储解决方案
  8. 基于springboot+thymeleaf+mybatis的员工管理系统 —— 登录与注册
  9. 【米课】思维导图与深度思考
  10. 专访探真科技:云原生安全与业务迭代平衡术
  11. VPC2007与VServer2005R2比较
  12. 计算机系统更新不上怎么办理,电脑系统更新打不开怎么办
  13. MOSS2007匿名调查列表使用分页符导致的错误分析
  14. ThrustMaster HOTAS WARTHOG飞行摇杆评测
  15. 用FileExplorer查看android手机中的数据库
  16. Android 加固应用
  17. 固定资产的日期之接管日期
  18. ‘A’与”A”的区别
  19. 【邢不行|量化小讲堂系列03-Python量化入门】如何安装pandas、anaconda(最新教程、保证可用)
  20. html中伪类定义,伪类

热门文章

  1. Hbase系统架构简述
  2. 怎样才能学好Linux
  3. php网页出现文档已移动错误,WordPress中无法将上传的文件移动至错误的解决方法...
  4. JavaScript面试技巧与解析
  5. tplink错误代码51215_TP错误提示对照表
  6. UDS学习笔记(三)——协议的理解
  7. python pptx table_Python-pptx Table
  8. PS打开PSD文档服务器未响应,优化你的 PSD 文件防止 Photoshop 崩溃卡死 - 文章教程...
  9. Switch case小知识点
  10. mysql galera 高并发_MySQL的高可用性集群Galera Cluste