c++ Arx二次开发创建椭圆和样条曲线
一、本节课程
c++ Arx二次开发创建椭圆和样条曲线
二、本节要讲解的知识点
1、如何应用C++ ARX二次开发创建椭圆(对AcDbEllipse类的构造函数的直接封装和根据外接矩形来创建椭圆)
2、如何应用C++ ARX二次开发创建样条曲线(对AcDbSpline类的构造函数的直接封装)
三、具体内容
1、创建椭圆的思路
有参数构造函数:AcDbEllipse(
const AcGePoint3d& center,
const AcGeVector3d& unitNormal,
const AcGeVector3d& majorAxis,
double radiusRatio,
double startAngle = 0.0,
double endAngle = 6.28318530717958647692
);
(1)AcDbEllipse类的构造函数,给定中心点、所在平面、长轴的一个端点和半径比例来创建椭圆。半径比例是一个用来定义椭圆的短轴相对于长轴的比例的参数。半径比例为1时,椭圆就变为圆。startAngle、endAngle这两个参数的配合使用,可以创建部分椭圆(椭圆弧)。
(2)根据外接矩形来创建椭圆,椭圆的长、短轴的端点就是外接矩形的四条边的中点。因此,只要外接矩形的角点确定,椭圆的大小和形状就能计算出来。

2、创建椭圆的步骤和代码实现:
|
AcDbObjectId CEllipseUtil::Add(const AcGePoint3d &ptCenter,const AcGeVector3d & vecNormal,const AcGeVector3d &majorAxis,double ratio) { AcDbEllipse *pEllipse=new AcDbEllipse(ptCenter,vecNormal,majorAxis,ratio); return CDwgDatabaseUtil::PostToModelSpace(pEllipse);//将对象添加到模型空间的函数 } AcDbObjectId CEllipseUtil::Add(const AcGePoint2d &pt1,const AcGePoint2d &pt2)//pt1,pt2位矩形的两个角 { AcGePoint3d ptCenter; ptCenter=CGePointUtil::GetMiddlePoint(CConvertUtil::ToPoint3d(pt1),CConvertUtil::ToPoint3d(pt2)); AcGeVector3d vecNormal(0,0,1); AcGeVector3d majorAxis(fabs(pt1.x-pt2.x)/2,0,0); double ratio=fabs((pt1.y-pt2.y)/(pt1.x-pt2.x)); return Add(ptCenter,vecNormal,majorAxis,ratio); } |
3、创建样条曲线的思路
样条曲线在地形图的等高线经常被定义为样条曲线,创建样条曲线我们是对AcDbSpline类构造函数的封装。
AcDbSpline(
const AcGePoint3dArray& fitPoints,
int order = 4,
double fitTolerance = 0.0
);
|
int order = 4 |
Order of the spline to be created (in the range 2 to 26) |
|
double fitTolerance = 0.0 |
Tolerance to which the spline should approximate fitPoints |
|
points |
Array of points (in WCS coordinates) through which to fit the curve |
4、创建样条曲线的步骤和代码实现
|
AcDbObjectId CSplineUtil::Add(const AcGePoint3dArray &points,int order,double fitTolerance) { assert(order>=2&& order<=26); AcDbSpline *pSpline=new AcDbSpline(points,order,fitTolerance); AcDbObjectId splineId=CDwgDatabaseUtil::PostToModelSpace(pSpline); return splineId; } |
再添加一个创建样条曲线的函数,相比上述创建样条曲线的函数多了两个参数,分别用于指定样条曲线的起点和终点的切向方向。
|
AcDbObjectId CSplineUtil::Add(const AcGePoint3dArray &points,const AcGeVector3d startTangent,const AcGeVector3d endTangent, int order,double fitTolerance) { assert(order>=2&& order<=26); AcDbSpline *pSpline=new AcDbSpline(points,startTangent,endTangent,order,fitTolerance); AcDbObjectId splineId=CDwgDatabaseUtil::PostToModelSpace(pSpline); return splineId; } |
5、在acrxEntryPoint里面实现我们的命令(添加椭圆命令):
命令的定义:ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, YunyouMyGroup,AddEllipse, AddEllipse, ACRX_CMD_MODAL, NULL)
|
static void YunyouMyGroupAddEllipse() { //使用中心点、所在的平面、长轴矢量和短长轴比例来创建椭圆 AcGeVector3d vecNormal(0,0,1); AcGeVector3d majorAxis(40,0,0); AcDbObjectId entId; entId=CEllipseUtil::Add(AcGePoint3d::kOrigin,vecNormal,majorAxis,0.5); //指定外接矩形来创建椭圆 AcGePoint2d pt1(60,80),pt2(140,120); CEllipseUtil::Add(pt1,pt2); } |
6、在acrxEntryPoint里面实现我们的命令(添加样条曲线的命令):
命令的定义:ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, YunyouMyGroup,AddSpline, AddSpline, ACRX_CMD_MODAL, NULL)
|
static void YunyouMyGroupAddSpline() { //使用样本点直接创建样条曲线 AcGePoint3d pt1(0,0,0),pt2(10,30,0),pt3(60,80,0),pt4(100,100,0); AcGePoint3dArray points; points.append(pt1); points.append(pt2); points.append(pt3); points.append(pt4); CSplineUtil::Add(points); //指定起始点和终止点的切向方向来创建样条曲线 pt2.set(30,10,0); pt3.set(80,60,0); points.removeSubArray(0,3); points.append(pt1); points.append(pt2); points.append(pt3); points.append(pt4); AcGeVector3d startTangent(5,1,0); AcGeVector3d endTangent(5,1,0); CSplineUtil::Add(points,startTangent,endTangent); } |
7、测试添加椭圆和添加样条曲线的命令:
在AUTOCAD2016中命令行输入:ARX+L命令,加载我们生成的ARX程序文件,输入AddEllipse命令,效果如下:

输入AddSpline命令后,执行效果如下:

四、总结
1、assert宏的使用。
2、如何根据外接矩形来创建椭圆。
3、如何创建样条曲线。
4、ARX模块的加载和使用。
5、腾讯课堂搜云幽学院,收费课程会共享源代码和开发笔记,并且获得学习、开发技术指导。
c++ Arx二次开发创建椭圆和样条曲线的更多相关文章
- 4、c++ Arx二次开发创建多段线
一.本节课程 c++ Arx二次开发创建多段线 二.本节要讲解的知识点 如何应用C++ ARX二次开发创建多段线(AcDbPolyline.AcDb2dPolyLine.AcDb3dPolyline的 ...
- 2、Arx二次开发创建第一个应用程序
一.本节课程 Arx二次开发创建第一个应用程序 二.本节要讲解的知识点 1.手动创建ARX的应用的步骤. 2.应用向导创建ARX应用程序的步骤. 三.具体内容 1.需求:创建一个Hello World ...
- Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点
这一小节,我们创建派生于CivilCreateEntityDemo的类CivilCreateCogoPoint,来创建几何空间点. 1 创建类并添加字段及方法 首先在项目资源管理器中向本项目中添加类, ...
- Civil 3D 二次开发 创建AutoCAD对象—— 00 ——
不积跬步无以至千里,不积小流无以成江海.虽然创建一条直线.添加一个图层这样的小程序没有什么实际意义(内部命令很简单就可以完成),但对于初学二次开发的您来说,这可是一大步,这一步跨出去,您就跨进了二次开 ...
- ObjectARX二次开发创建自己的静态库,如同objectARX库一样
objectARX二次开发的时候,经常会用到一些重复使用的类,如果类已经足够的好,那么我们可以编译成静态库,加快开发和编译的速度,提高工作效率. 环境vs2010+objectARX2012wizar ...
- NX二次开发-创建(临时)坐标系
函数:UF_CSYS_create_csys() . UF_CSYS_create_temp_csys() 函数说明:创建坐标系 .创建临时坐标系 用法: #include <uf.h> ...
- NX二次开发-创建NX9 NXOpenCPP Wizard开发向导模板
这篇文章,我在CSDN,在唐工论坛都发过.http://www.nxopen.cn/forum.php?mod=viewthread&tid=2039&highlight=NX9 博客 ...
- Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——
本节中我们通过创建几何空间点.曲面和采样线了解Civil 3D对象的创建方法.因Civil 3D对象的创建方法相比AutoCAD对象创建要简单的多,比如创建一个几何空间点,最简单的情况采用一行代码(没 ...
- Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线
在方法CreateLine内完成以下代码: 01 public void CreateLine() 02 { 03 PromptPointOptions ppo = new PromptPointOp ...
随机推荐
- 从外部导入django模块
import os import sys sys.path.append("D:\\pyweb\\sf"); # 项目位置(不是app) os.environ.setdefault ...
- Django之基于iframe的ajax伪造
IFRAME是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME).iframe元素会创建包含另外一个文档的内联框架 ajax的理念是不进行浏览器页面刷新的信息获取更新,也就是局部刷新. 那 ...
- 【Amazon 必考】Amazon Leadership Principles 亚马逊领导力准则
Leadership Principles,也就是领导力准则,不仅仅是几条用来鼓舞人心的口号,更是成就了Amazon特有公司文化的秘诀.不管是为新项目讨论创意.寻找解决客户问题的方案,还是面试求职者时 ...
- (转)glew的安装
http://blog.sina.com.cn/s/blog_858820890100vbys.html 下载链接: https://sourceforge.net/project/downloadi ...
- leetcode 6. ZigZag Conversion [java]
自己写的: if(numRows == 1) return s; int ll = s.length() / 2 + 1; Character tc[] = new Character[numRows ...
- MySQL双主.md
MySQL 双主配置 环境说明 系统 IP 主机名 mysql版本 CentOS 6.8 192.168.197.61 C6-node1 5.6.36 CentOS 6.8 192.168.197.6 ...
- Lr场景设计-hc课堂笔记
性能测试最基本也是最难的部分:场景设计.瓶颈分析和定位 10个业务10个脚本,每个脚本单独执行:单独场景.10个脚本一起执行:混合场景.10个业务1个脚本:可以设计不同用户登录,分别做不同的操作等场景 ...
- pyspider爬取数据导入mysql--1.安装驱动
接上篇,刚装好的pyspider,我们打算大显身手,抓一批数据到mysql中. 然而,出师未捷,提示我们:ImportError: No module named MySQLdb 这是因为还没有安装M ...
- 最邻近规则分类(K-Nearest Neighbor)KNN算法
自写代码: # Author Chenglong Qian from numpy import * #科学计算模块 import operator #运算符模块 def createDaraSet( ...
- Docker学习1-基本概念
Docker Docker的基本概念 Docker是为开发人员和系统管理员而设计的以容器的形式开发.部署和运行应用程序的平台.使用Linux容器去部署应用程序称为容器化,利用容器部署应用程序方便简单. ...