一、本节课程

c++ Arx二次开发创建多段线

二、本节要讲解的知识点

如何应用C++ ARX二次开发创建多段线(AcDbPolyline、AcDb2dPolyLine、AcDb3dPolyline的使用)

三、具体内容

1、ARX提供了三种多段线相关的类:AcDbPolyline、AcDb2dPolyLine、AcDb3dPolyline。PLINE 创建的是AcDbPolyline,3DPOLY创建AcDb3dPolyline。创建一般的轻量多段线只需要调用AcDbPolyline的构造函数即可,创建矩形、正多边形、圆形、圆环对象,关键在于顶点和凸度的确定。

2、添加多段线对象的函数实现:

AcDbObjectId CPolylineUtil::Add(const AcGePoint2dArray &points,double width)

{

int numVertices=points.length();

AcDbPolyline *pPoly=new AcDbPolyline(numVertices);

for (int i=0;i<numVertices;i++)

{

pPoly->addVertexAt(i,points.at(i),0,width,width);

}

return CDwgDatabaseUtil::PostToModelSpace(pPoly);

}

AcDbObjectId CPolylineUtil::Add(const AcGePoint2d &ptStart,const AcGePoint2d &ptEnd,double width)

{

AcGePoint2dArray points;

points.append(ptStart);

points.append(ptEnd);

return Add(points,width);

}

AcDbObjectId CPolylineUtil::Add3dPolyline(const AcGePoint3dArray &points)

{

AcGePoint3dArray verts=points;

AcDb3dPolyline *pPoly3d=new AcDb3dPolyline(AcDb::k3dSimplePoly,verts);

return CDwgDatabaseUtil::PostToModelSpace(pPoly3d);

}

AcDbObjectId  CPolylineUtil::AddPolygon(const AcGePoint2d &ptCenter,int number,double radius,double rotation,double width)

{

double angle=2*CMathUtil::PI()/(double)number;

AcGePoint2dArray points;

for (int i=0;i<number;i++)

{

AcGePoint2d pt;

pt.x=ptCenter.x+radius*cos(i*angle);

pt.y=ptCenter.y+radius*sin(i*angle);

points.append(pt);

}

AcDbObjectId polyId=Add(points,width);

AcDbEntity *pEnt=NULL;

if (acdbOpenObject(pEnt,polyId,AcDb::kForWrite)==Acad::eOk)

{

AcDbPolyline *pPoly=AcDbPolyline::cast(pEnt);

if (pPoly!=NULL)

{

pPoly->setClosed(Adesk::kTrue);

}

pEnt->close();

}

EntityUtil::Rotate(polyId,ptCenter,rotation);

return polyId;

}

AcDbObjectId CPolylineUtil::AddRectangle(const AcGePoint2d &pt1,const AcGePoint2d &pt2,double width)

{

double x1=pt1.x,x2=pt2.x;

double y1=pt1.y,y2=pt2.y;

AcGePoint2d ptLeftBottom(min(x1,x2),min(y1,y2));

AcGePoint2d ptRightBottom(max(x1,x2),min(y1,y2));

AcGePoint2d ptRightTop(max(x1,x2),max(y1,y2));

AcGePoint2d ptLeftTop(min(x1,x2),max(y1,y2));

AcDbPolyline *pPoly=new AcDbPolyline(4);

pPoly->addVertexAt(0,ptLeftBottom,0,width,width);

pPoly->addVertexAt(1,ptRightBottom,0,width,width);

pPoly->addVertexAt(2,ptRightTop,0,width,width);

pPoly->addVertexAt(3,ptLeftTop,0,width,width);

pPoly->setClosed(true);

return CDwgDatabaseUtil::PostToModelSpace(pPoly);

}

AcDbObjectId CPolylineUtil::AddPolyCircle(const AcGePoint2d &ptCenter,double radius,double width)

{

AcGePoint2d pt1,pt2,pt3;

pt1.x=ptCenter.x+radius;

pt1.y=ptCenter.y;

pt2.x=ptCenter.x-radius;

pt2.y=ptCenter.y;

pt3.x=ptCenter.x+radius;

pt3.y=ptCenter.y;

AcDbPolyline *pPoly=new AcDbPolyline(3);

pPoly->addVertexAt(0,pt1,1,width,width);

pPoly->addVertexAt(1,pt2,1,width,width);

pPoly->addVertexAt(2,pt3,1,width,width);

pPoly->setClosed(Adesk::kTrue);

return CDwgDatabaseUtil::PostToModelSpace(pPoly);

}

四、总结

1、AUTOCAD的三种多段线对象:AcDbPolyline、AcDb2dPolyline、AcDb3dPolyline,我们重点实现了AcDbPolyline、AcDb3dPolyline。

2、如何创建多段线,利用多段线对象来创建正多边形、矩形、圆、圆弧(关键点在于顶点坐标的计算和顶点凸度的概念的掌握)。如果对凸度概念不是很清楚,自己可以用代码来验证。

3、腾讯课堂搜索云幽学院贡献相应的公开课和报名的收费课的上课源代码、上课笔记技术咨询指导。

4、c++ Arx二次开发创建多段线的更多相关文章

  1. c++ Arx二次开发创建椭圆和样条曲线

    一.本节课程 c++ Arx二次开发创建椭圆和样条曲线 二.本节要讲解的知识点 1.如何应用C++ ARX二次开发创建椭圆(对AcDbEllipse类的构造函数的直接封装和根据外接矩形来创建椭圆) 2 ...

  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. 乘风破浪:LeetCode真题_038_Count and Say

    乘风破浪:LeetCode真题_038_Count and Say 一.前言     这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势. ...

  2. Lombok 继承时应注意的点

    lombok项目的产生就是为了省去我们手动创建getter和setter等基本方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter等方法.即它最终能够达到的效果是:在源码中没 ...

  3. bootstrap datepicker含有hasDatepicker无法弹出

    bootstrap datepicker 初始化时,会给控件添加hasDatepicker类 ,如果此时调用 $singleDay.datepicker(initDayOpts);无法弹出时间控件 需 ...

  4. 2.HBase In Action 第一章-HBase简介(1.1数据管理系统:快速学习)

    Relational database systems have been around for a few decades and have been hugely successful in so ...

  5. Spark项目之电商用户行为分析大数据平台之(五)实时数据采集

  6. AES块加密与解密

    AES块加密与解密 解密目标 在CBC和CTR两种模式下分别给出十篇加密的样例密文,求解密一篇特定的密文 解密前提 全部密文及其加密使用的key都已给出 加密的方法遵循AES的标准 解密过程分析 实验 ...

  7. Python高级网络编程系列之基础篇

    一.Socket简介 1.不同电脑上的进程如何通信? 进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的! 在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台 ...

  8. java通过http服务执行shell命令

    服务端代码/** * 执行shell命令 * @param command 执行命令 * @return */public String exeCommandByPath( String comman ...

  9. PAT B1029 旧键盘 (20 分)

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及 ...

  10. js 对于jquery each 多层循环的问题和原生js多层循环问题

    一.在jquery中,我们使用循环的时候,提供两种方式:jquery.each 和(循环体).each  两种方式不是同. 对于return 在作用这两个的函数的时候需要注意: 首先我们需要知道我们的 ...