一、椭圆
1.1 椭圆类
- 模板:以第(三)篇文件结构为基础,构建自己的类库
- 在AcDbEntity筛选器中添加
- Ellipse.h
#pragma once class Ellipse { public: Ellipse(); ~Ellipse(); // 椭圆:椭圆中心、法线向量、主轴长、长短轴比 static AcDbObjectId Add(const AcGePoint3d &ptCenter, const AcGeVector3d &vecNormal, const AcGeVector3d &majorAxis, double ratio); // 重载椭圆:矩形内切椭圆,矩形对角点坐标 static AcDbObjectId Add(const AcGePoint2d &pt1, const AcGePoint2d &pt2); };
- Ellipse.cpp
#include "stdafx.h" #include "Ellipse.h" #include "Database.h" #include "Geometry.h" #include "ConvertUtil.h" Ellipse::Ellipse(){} Ellipse::~Ellipse(){} // 椭圆:椭圆中心、法线向量、主轴长、长短轴长度比 AcDbObjectId Ellipse::Add(const AcGePoint3d &ptCenter, const AcGeVector3d &vecNormal, const AcGeVector3d &majorAxis, double ratio) { AcDbEllipse *pEllipse = new AcDbEllipse(ptCenter, vecNormal, majorAxis, ratio); return Database::PostToModelSpace(pEllipse); } // 重载椭圆:矩形内切椭圆,矩形对角点坐标 AcDbObjectId Ellipse::Add(const AcGePoint2d &pt1, const AcGePoint2d &pt2) { // 算椭圆中心 AcGePoint3d ptCenter; ptCenter = Geometry::GetMiddlePoint(ConvertUtil::ToPoint3d(pt1), ConvertUtil::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); }
1.2 测试代码
- Commands.h
#include "StdAfx.h" void AddCommands(); void CreateEllipse();
- Commands.cpp
#include "StdAfx.h" #include "Commands.h" #include "Editor.h" #include "MathUtil.h" #include "Ellipse.h" void AddCommands() { Editor::AddCommand(_T("AddArc"), ACRX_CMD_MODAL, CreateEllipse); } void CreateEllipse() { AcGeVector3d vecNormal(0, 0, 1); AcGeVector3d majorAxis(40, 0, 0); Ellipse::Add(AcGePoint3d::kOrigin, vecNormal, majorAxis, 0.5); // 外切矩形对角点 AcGePoint2d pt1(60, 80), pt2(140, 120); Ellipse::Add(pt1, pt2); }
二、文字
2.1 文字类
- 模板:以第(三)篇文件结构为基础,构建自己的类库
- 在AcDbEntity筛选器中添加
- Text.h
#pragma once class Text { public: Text(); ~Text(); // 单行文字:插入点、文字内容、文字样式、文字高度、文字旋转 static AcDbObjectId AddText(const AcGePoint3d &ptInsert, const ACHAR* text, AcDbObjectId style = AcDbObjectId::kNull, double height = 2.5, double rotation = 0.0); // 多行文字:插入点、文字内容、文字样式、多行文字高度、文字宽度 static AcDbObjectId AddMText(const AcGePoint3d &ptInsert, const ACHAR* text, AcDbObjectId style = AcDbObjectId::kNull, double height = 2.5, double width = 20.0); };
- Text.cpp
#include "StdAfx.h" #include "Commands.h" #include "Editor.h" #include "Text.h" void AddCommands() { Editor::AddCommand(_T("AddText"), ACRX_CMD_MODAL, CreateText); } void CreateText() { AcGePoint3d ptInsert(0, 10, 0); Text::AddText(ptInsert, _T("热烈欢迎进入objectarx大坑")); ptInsert.set(0, -8, 0); Text::AddMText(ptInsert, _T("再次热烈欢迎进入OBJECTARX大坑")); }
2.2 测试代码
- Commands.h
#include "StdAfx.h" void AddCommands(); void CreateText();
- Commands.cpp
#include "StdAfx.h" #include "Commands.h" #include "Editor.h" #include "Text.h" void AddCommands() { Editor::AddCommand(_T("AddText"), ACRX_CMD_MODAL, CreateText); } void CreateText() { AcGePoint3d ptInsert(0, 10, 0); Text::AddText(ptInsert, _T("热烈欢迎进入objectarx大坑")); ptInsert.set(0, -8, 0); Text::AddMText(ptInsert, _T("再次热烈欢迎进入OBJECTARX大坑")); }
三、样条曲线
3.1 样条曲线类
- 模板:以第(三)篇文件结构为基础,构建自己的类库
- 在AcDbEntity筛选器中添加
- Spline.h
#pragma once class Spline { public: Spline(); ~Spline(); // 样条曲线:3d点列表,order(2~26),配合公差(学术名词) static AcDbObjectId Add(const AcGePoint3dArray &points, int order = 4, double fitTolerance = 0.0); // 重载样条曲线: // 3d点列表,起点方向向量,终点方向向量,order(2~26),配合公差(学术名词) static AcDbObjectId Add(const AcGePoint3dArray &points, const AcGeVector3d &startTangent, const AcGeVector3d &endTangent, int order = 4, double fitTolerance = 0.0); };
- Spline.cpp
#include "stdafx.h" #include "Spline.h" #include "Database.h" Spline::Spline(){} Spline::~Spline(){} // 样条曲线:3d点列表,order(2~26),配合公差(学术名词) AcDbObjectId Spline::Add(const AcGePoint3dArray &points, int order, double fitTolerance) { // 断言:order在2~26之间,否则弹出对话框,如代码下图 assert(order >= 2 && order <= 26); AcDbSpline *pSpline = new AcDbSpline(points, order, fitTolerance); return Database::PostToModelSpace(pSpline); } // 重载样条曲线:3d点列表,起点方向向量,终点方向向量,order(2~26),配合公差(学术名词) AcDbObjectId Spline::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); return Database::PostToModelSpace(pSpline); }
- assert效果
3.2 测试代码
- Commands.h
#include "StdAfx.h" void AddCommands(); void CreateSpline();
- Commands.cpp
#include "StdAfx.h" #include "Commands.h" #include "Editor.h" #include "Spline.h" void AddCommands() { Editor::AddCommand(_T("AddSpline"), ACRX_CMD_MODAL, CreateSpline); } void CreateSpline() { 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); Spline::Add(points); // 清除点列表中序号为0、1、2、3 points.removeSubArray(0, 3); acutPrintf(_T("%d"), points.length()); // 重设pt2、pt3值 pt2.set(30, 10, 0); pt3.set(80, 60, 0); points.append(pt1); points.append(pt2); points.append(pt3); points.append(pt4); // 起始点处方向向量 AcGeVector3d startTangent(5, 1, 0); // 终止点处方向向量 AcGeVector3d endTangent(5, 1, 0); Spline::Add(points, startTangent, endTangent); }