一、本节课程

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二次开发创建椭圆和样条曲线的更多相关文章

  1. 4、c++ Arx二次开发创建多段线

    一.本节课程 c++ Arx二次开发创建多段线 二.本节要讲解的知识点 如何应用C++ ARX二次开发创建多段线(AcDbPolyline.AcDb2dPolyLine.AcDb3dPolyline的 ...

  2. 2、Arx二次开发创建第一个应用程序

    一.本节课程 Arx二次开发创建第一个应用程序 二.本节要讲解的知识点 1.手动创建ARX的应用的步骤. 2.应用向导创建ARX应用程序的步骤. 三.具体内容 1.需求:创建一个Hello World ...

  3. Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点

    这一小节,我们创建派生于CivilCreateEntityDemo的类CivilCreateCogoPoint,来创建几何空间点. 1 创建类并添加字段及方法 首先在项目资源管理器中向本项目中添加类, ...

  4. Civil 3D 二次开发 创建AutoCAD对象—— 00 ——

    不积跬步无以至千里,不积小流无以成江海.虽然创建一条直线.添加一个图层这样的小程序没有什么实际意义(内部命令很简单就可以完成),但对于初学二次开发的您来说,这可是一大步,这一步跨出去,您就跨进了二次开 ...

  5. ObjectARX二次开发创建自己的静态库,如同objectARX库一样

    objectARX二次开发的时候,经常会用到一些重复使用的类,如果类已经足够的好,那么我们可以编译成静态库,加快开发和编译的速度,提高工作效率. 环境vs2010+objectARX2012wizar ...

  6. NX二次开发-创建(临时)坐标系

    函数:UF_CSYS_create_csys() . UF_CSYS_create_temp_csys() 函数说明:创建坐标系 .创建临时坐标系 用法: #include <uf.h> ...

  7. NX二次开发-创建NX9 NXOpenCPP Wizard开发向导模板

    这篇文章,我在CSDN,在唐工论坛都发过.http://www.nxopen.cn/forum.php?mod=viewthread&tid=2039&highlight=NX9 博客 ...

  8. Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——

    本节中我们通过创建几何空间点.曲面和采样线了解Civil 3D对象的创建方法.因Civil 3D对象的创建方法相比AutoCAD对象创建要简单的多,比如创建一个几何空间点,最简单的情况采用一行代码(没 ...

  9. Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线

    在方法CreateLine内完成以下代码: 01 public void CreateLine() 02 { 03 PromptPointOptions ppo = new PromptPointOp ...

随机推荐

  1. AD RMS企业文件版权管理

    AD RMS (AD权限管理服务)能够确保企业内部数字文件的机密性,例如,用户即使有权限读取受保护的文件,但是如果未被许可,就无法复制与打印该文件. AD RMS概述 虽然可以通过NTFS权限来设置用 ...

  2. Java 重写 hashCode() 和 equals() 方法

    1. hashCode 1.1 基本概念 hashCode 是 JDK 根据对象的地址算出来的一个 int 数字(对象的哈希码值),代表了该对象再内存中的存储位置. hashCode() 方法是超级类 ...

  3. November 04th, 2017 Week 44th Saturday

    It does not do to dwell on dreams and forget to live. 整天沉溺于梦想而忘记如何好好生活,毫无意义. Bingo, and I think it i ...

  4. Python第一篇-简介和入门

    简介: Python[1]  (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第 ...

  5. array_map 巧替 foreach

    1.array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值. 其中$arr 为输入数组,$callback($result , $v ...

  6. saltstack二次开发(二)

    Saltstack的api Salt-api有两种方式,一种是函数的形式,有人家定义好的函数,我们可以直接调用,直接写python代码调用函数或者类就可以了.第二种形式是salt-api有封装好的ht ...

  7. 10行代码爬取全国所有A股/港股/新三板上市公司信息

    摘要: 我们平常在浏览网页中会遇到一些表格型的数据信息,除了表格本身体现的内容以外,可能还想透过表格背后再挖掘些有意思或者有价值的信息.这时,可用python爬虫来实现.本文采用pandas库中的re ...

  8. swift语言的特征:类型系统与函数式编程:swift是面向类型和面向函数编程的语言

    swift语言的特征: 类型系统:值类型与引用类型.泛型.协议类型 函数式编程:

  9. Netty入门(四)ByteBuf 字节级别的操作

     Netty 中使用 ByteBuf 代替 Java NIO 提供的 ByteBuffer 作为字节的容器. 一.索引 ByteBuf 提供两个指针变量支持读和写操作,读操作使用 readerInde ...

  10. CJOJ 【DP合集】最长上升序列2 — LIS2

    题面 已知一个 1 ∼ N 的排列的最长上升子序列长度为 K ,求合法的排列个数. 好题(除了我想不出来我应该找不到缺点), 想一想最长上升子序列的二分做法, 接在序列后面或者替换. 所以对于每一个位 ...