目录
一、概述
- 意义:在ObjectArx中如AcDbLine,AcDbCircle,AcDbArc等均为实体类,用户可以根据需要,自定义实体类“,如一扇门等,效果如下图
二、项目初始化
- 目的:初始化项目,创建一个ChDbLine自定义实体类,跟AcDbLine一样
2.1 创建空解决方案
- 菜单-》文件-》新建-》项目…
2.2 DBX操作
2.2.1 创建DBX
- 在空解决方案中添加
- 向导设置
注意:未写可不修改,第一个选项前缀自己决定
2.2.2 调试DBX
- 选择Release/x64,按调试(F5)
- 错误1:
无法打开包括文件: “corecrt.h”: No such file or directory
解决1:将C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt
路径加入包含路径(注意数字不一定相同) - 错误2:
无法打开文件“ucrt.lib”
解决2:将C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64
路径加入库路径(注意数字不一定相同) - 错误3:调用aced类。。。不可调用数据库类
- 错误1:
- 图示
注:将属性页中,调试-》命令一栏清空,否则调试后,会自动启动CAD
2.2.3 创建实体类
- 在DBX项目内添加自定义实体类
- 自定义线类(继承自曲线类)
2.2.4 调试实体类
- ChDbLine.cpp
... //----- AcDbEntity protocols Adesk::Boolean ChDbLine::subWorldDraw (AcGiWorldDraw *mode) { assertReadEnabled () ;
<span class="token comment">// 设置图形颜色</span> mode<span class="token operator">-></span><span class="token function">subEntityTraits</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 点数组</span> AcGePoint3d pts<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span> pts<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">AcGePoint3d</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> pts<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">AcGePoint3d</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// geometry函数:返回AcGiGeometry对象,其类方法worldLine 在世界坐标系中画直线</span> mode<span class="token operator">-></span><span class="token function">geometry</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">worldLine</span><span class="token punctuation">(</span>pts<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token class-name">AcDbCurve</span><span class="token operator">::</span><span class="token function">subWorldDraw</span> <span class="token punctuation">(</span>mode<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">;</span>
}
...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 调试
遇到问题:switch 语句包含“default”但是未包含“case”标签,警告被视为错误
,解决方法如下
2.3 ARX操作
2.3.1 创建arx项
- ARX创建
向导只修改此默认项即可
- 添加依赖(arx是依赖于DBX的)
两文件职责:DBX负责创建自定义类,依赖于DBX的arx负责调用自定义类
2.3.2 调试ARX
- 方法:在解决方案中my_app上单击右键-》生成
- 遇到问题
- 错误1:
无法打开包括文件: “ctype.h”
解答1:将C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt
路径加入包含路径(注意数字不一定相同) - 错误2:
无法打开文件“ucrt.lib”
解决2:将C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64
路径加入库路径(注意数字不一定相同)
- 错误1:
- 修改对话框:参考2.2.2
2.3.3 调用代码
- acrxEntryPoint.cpp文件(my_app项目)
... #include "ChDbLine.h" ... class Cmy_appApp : public AcRxArxApp { ... static void MyGroupMyCommand () { // 获取块表记录 AcDbBlockTable* pBlkTbl = NULL; acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl); AcDbBlockTableRecord* pBlkTblRcd = NULL; pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForWrite); pBlkTbl->close(); // 创建 自定义实体类 对象,并添加进块表记录中 ChDbLine* pLine = new ChDbLine(); pBlkTblRcd->appendAcDbEntity(pLine); // 关闭自定义实体类、块表记录 pLine->close(); pBlkTblRcd->close(); } ... } ...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 调试:在解决方案中my_app上单击右键-》生成
- 遇到问题:
无法打开包括文件: “ChDbLine.h”
解答:添加头文件D:\CPP\CustomerTest\my_entity
,修改对话框参考2.2.2,即包含ChDbLine.h文件的文件夹 - 遇到问题:
无法解析的外部符号 "public: __cdecl ChDbLine::ChDbLine(void)"
解答:添加库文件(理论上在对话框参考2.2.2添加库文件夹也行,这里有点小问题)
- 遇到问题:
2.4 CAD测试
- 加载:文件位置
D:\CPP\CustomerTest\x64\Release
注意:
- 隶属关系:DBX和依赖与它的arx两个文件,是一个解决方案内的项目,生成的目标文件属于CustomerTest解决方案
- 加载顺序:先加载DBX,后加载arx
- 加载后运行:
MYCOMMANDLOCAL
命令 - 效果
三、DBX项目深化
- 目的:深化ChDbLine类,添加功能如:显示夹点、移动、拉伸、捕捉等
3.1 依赖文件修改
- acrxEntryPoint.cpp文件(my_app项目)
... #include "ChDbLine.h" ... static void MyGroupMyCommand () { // 交互式 图中画自定义实体类 AcGePoint3d ptStart, ptEnd; // asDblArray函数可以实现AcGePoint3d 与 ads_real类型间转换 if (acedGetPoint(NULL, L"\n请输入起点:", asDblArray(ptStart)) != RTNORM) return; if (acedGetPoint(NULL, L"\n请输入终点:", asDblArray(ptEnd)) != RTNORM) return;
AcDbBlockTable<span class="token operator">*</span> pBlkTbl <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span> <span class="token function">acdbHostApplicationServices</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">workingDatabase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">getBlockTable</span><span class="token punctuation">(</span>pBlkTbl<span class="token punctuation">)</span><span class="token punctuation">;</span> AcDbBlockTableRecord<span class="token operator">*</span> pBlkTblRcd <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span> pBlkTbl<span class="token operator">-></span><span class="token function">getAt</span><span class="token punctuation">(</span>ACDB_MODEL_SPACE<span class="token punctuation">,</span> pBlkTblRcd<span class="token punctuation">,</span> AcDb<span class="token operator">::</span>kForWrite<span class="token punctuation">)</span><span class="token punctuation">;</span> pBlkTbl<span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 主要修改了以下这句:重载了构造函数</span> ChDbLine<span class="token operator">*</span> pLine <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">ChDbLine</span><span class="token punctuation">(</span>ptStart<span class="token punctuation">,</span> ptEnd<span class="token punctuation">)</span><span class="token punctuation">;</span> pBlkTblRcd<span class="token operator">-></span><span class="token function">appendAcDbEntity</span><span class="token punctuation">(</span>pLine<span class="token punctuation">)</span><span class="token punctuation">;</span> pLine<span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> pBlkTblRcd<span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
...
}
...- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
3.2 被依赖文件修改
- ChDbLine.h
... class DLLIMPEXP ChDbLine : public AcDbCurve {
public:
ACRX_DECLARE_MEMBERS(ChDbLine) ;protected:
static Adesk::UInt32 kCurrentVersionNumber ;public:
ChDbLine();
// 增加构造函数
ChDbLine(const AcGePoint3d &ptstart, const AcGePoint3d &ptend);
virtual ~ChDbLine () ;<span class="token comment">//----- AcDbObject protocols</span> <span class="token comment">//- Dwg Filing protocol</span> <span class="token comment">// 存入DWG数据库参数:此处为起、终点</span> <span class="token keyword">virtual</span> Acad<span class="token operator">::</span>ErrorStatus <span class="token function">dwgOutFields</span> <span class="token punctuation">(</span>AcDbDwgFiler <span class="token operator">*</span>pFiler<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">;</span> <span class="token comment">// 读取DWG数据库参数:参数会提取出给subWorldDraw做渲染</span> <span class="token keyword">virtual</span> Acad<span class="token operator">::</span>ErrorStatus <span class="token function">dwgInFields</span> <span class="token punctuation">(</span>AcDbDwgFiler <span class="token operator">*</span>pFiler<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//- Dxf Filing protocol</span> <span class="token comment">// 存入、读取DXF数据库参数</span> <span class="token keyword">virtual</span> Acad<span class="token operator">::</span>ErrorStatus <span class="token function">dxfOutFields</span> <span class="token punctuation">(</span>AcDbDxfFiler <span class="token operator">*</span>pFiler<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">;</span> <span class="token keyword">virtual</span> Acad<span class="token operator">::</span>ErrorStatus <span class="token function">dxfInFields</span> <span class="token punctuation">(</span>AcDbDxfFiler <span class="token operator">*</span>pFiler<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// 获取起、终点</span> <span class="token keyword">virtual</span> AcGePoint3d <span class="token function">getStartPoint</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span> <span class="token keyword">virtual</span> AcGePoint3d <span class="token function">getEndPoint</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span> <span class="token comment">// 写入起、终点</span> <span class="token keyword">virtual</span> Acad<span class="token operator">::</span>ErrorStatus <span class="token function">setStartPoint</span><span class="token punctuation">(</span>AcGePoint3d newVal<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">virtual</span> Acad<span class="token operator">::</span>ErrorStatus <span class="token function">setEndPoint</span><span class="token punctuation">(</span>AcGePoint3d newVal<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//----- AcDbEntity protocols</span> <span class="token comment">//- Graphics protocol</span>
protected:
// 绘制实体的图形显示:此处定义了自定义实体的样子
virtual Adesk::Boolean subWorldDraw (AcGiWorldDraw mode) ;
// 定义自定义实体属性:如果有特殊定义的话
virtual Adesk::UInt32 subSetAttributes (AcGiDrawableTraits traits) ;
// 重写夹点显示函数:开启显示夹点,只要添加进gripPoints点列表中即可
virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray &geomIds) const;
// 重写几何变换函数:响应move命令,否则不可移动
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
// 重写移动夹点变换函数:否则点选起终点的夹点也是平移效果
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray & indices,
const AcGeVector3d& offset);
// 重写捕捉点:捕捉点类型osnapMode、捕捉点列表snapPoints
virtual Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode osnapMode,
Adesk::GsMarker gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const;
// 类成员变量:起点、终点
AcGePoint3d ptStart;
AcGePoint3d ptEnd;} ;
#ifdef MY_ENTITY_MODULE
ACDB_REGISTER_OBJECT_ENTRY_AUTO(ChDbLine)
#endif- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- ARX创建
- ChDbLine.cpp
读前注意:
- 中文注释为新增加的,其他未注释的为向导自动生成的
- 重写函数首句必须为
assertReadEnabled () ;
或assertWriteEnabled () ;
CAD会在程序执行前测试实体是否满足函数读写的前置需求
... // 默认构造函数 ChDbLine::ChDbLine () : AcDbCurve () {} // 重载构造函数 ChDbLine::ChDbLine(const AcGePoint3d &ptstart, const AcGePoint3d &ptend) { ptStart = ptstart; ptEnd = ptend; } // 析构函数 ChDbLine::~ChDbLine () {}
//-----------------------------------------------------------------------------
//----- AcDbObject protocols
//- Dwg Filing protocol
Acad::ErrorStatus ChDbLine::dwgOutFields (AcDbDwgFiler *pFiler) const {
assertReadEnabled () ;
//----- Save parent class information first.
Acad::ErrorStatus es =AcDbCurve::dwgOutFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
//----- Object version number needs to be saved first
if ( (es =pFiler->writeUInt32 (ChDbLine::kCurrentVersionNumber)) != Acad::eOk )
return (es) ;<span class="token comment">//----- Output params</span> <span class="token comment">// 将数据写入数据库</span> pFiler<span class="token operator">-></span><span class="token function">writeItem</span><span class="token punctuation">(</span>ptStart<span class="token punctuation">)</span><span class="token punctuation">;</span> pFiler<span class="token operator">-></span><span class="token function">writeItem</span><span class="token punctuation">(</span>ptEnd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span>pFiler<span class="token operator">-></span><span class="token function">filerStatus</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">;</span>
}
Acad::ErrorStatus ChDbLine::dwgInFields (AcDbDwgFiler *pFiler) {
assertWriteEnabled () ;
//----- Read parent class information first.
Acad::ErrorStatus es =AcDbCurve::dwgInFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
//----- Object version number needs to be read first
Adesk::UInt32 version =0 ;
if ( (es =pFiler->readUInt32 (&version)) != Acad::eOk )
return (es) ;
if ( version > ChDbLine::kCurrentVersionNumber )
return (Acad::eMakeMeProxy) ;<span class="token comment">//----- Read params</span> <span class="token comment">// 将数据读出数据库</span> pFiler<span class="token operator">-></span><span class="token function">readItem</span><span class="token punctuation">(</span><span class="token operator">&</span>ptStart<span class="token punctuation">)</span><span class="token punctuation">;</span> pFiler<span class="token operator">-></span><span class="token function">readItem</span><span class="token punctuation">(</span><span class="token operator">&</span>ptEnd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span>pFiler<span class="token operator">-></span><span class="token function">filerStatus</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">;</span>
}
//- Dxf Filing protocol
Acad::ErrorStatus ChDbLine::dxfOutFields (AcDbDxfFiler *pFiler) const {
assertReadEnabled () ;
//----- Save parent class information first.
Acad::ErrorStatus es =AcDbCurve::dxfOutFields (pFiler) ;
if ( es != Acad::eOk )
return (es) ;
es =pFiler->writeItem (AcDb::kDxfSubclass, _RXST(“ChDbLine”)) ;
if ( es != Acad::eOk )
return (es) ;
//----- Object version number needs to be saved first
if ( (es =pFiler->writeUInt32 (kDxfInt32, ChDbLine::kCurrentVersionNumber)) != Acad::eOk )
return (es) ;
//----- Output params
//…<span class="token keyword">return</span> <span class="token punctuation">(</span>pFiler<span class="token operator">-></span><span class="token function">filerStatus</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">;</span>
}
Acad::ErrorStatus ChDbLine::dxfInFields (AcDbDxfFiler *pFiler) {
assertWriteEnabled () ;
//----- Read parent class information first.
Acad::ErrorStatus es =AcDbCurve::dxfInFields (pFiler) ;
if ( es != Acad::eOk || !pFiler->atSubclassData (_RXST(“ChDbLine”)) )
return (pFiler->filerStatus ()) ;
//----- Object version number needs to be read first
struct resbuf rb ;
pFiler->readItem (&rb) ;
if ( rb.restype != AcDb::kDxfInt32 ) {
pFiler->pushBackItem () ;
pFiler->setError (Acad::eInvalidDxfCode,
_RXST(“\nError: expected group code %d (version #)”),
AcDb::kDxfInt32) ;
return (pFiler->filerStatus ()) ;
}
Adesk::UInt32 version =(Adesk::UInt32)rb.resval.rlong ;
if ( version > ChDbLine::kCurrentVersionNumber )
return (Acad::eMakeMeProxy) ;<span class="token keyword">while</span> <span class="token punctuation">(</span> es <span class="token operator">==</span> Acad<span class="token operator">::</span>eOk <span class="token operator">&&</span> <span class="token punctuation">(</span>es <span class="token operator">=</span>pFiler<span class="token operator">-></span><span class="token function">readResBuf</span> <span class="token punctuation">(</span><span class="token operator">&</span>rb<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">==</span> Acad<span class="token operator">::</span>eOk <span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">switch</span> <span class="token punctuation">(</span> rb<span class="token punctuation">.</span>restype <span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">default</span><span class="token operator">:</span> pFiler<span class="token operator">-></span><span class="token function">pushBackItem</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">;</span> es <span class="token operator">=</span>Acad<span class="token operator">::</span>eEndOfFile <span class="token punctuation">;</span> <span class="token keyword">break</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> es <span class="token operator">!=</span> Acad<span class="token operator">::</span>eEndOfFile <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">(</span>Acad<span class="token operator">::</span>eInvalidResBuf<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span>pFiler<span class="token operator">-></span><span class="token function">filerStatus</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">;</span>
}
//-----------------------------------------------------------------------------
//----- AcDbEntity protocols
Adesk::Boolean ChDbLine::subWorldDraw (AcGiWorldDraw *mode) {
assertReadEnabled () ;<span class="token comment">// 点数组:设置起始点</span> AcGePoint3d pts<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span> pts<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> ptStart<span class="token punctuation">;</span> pts<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> ptEnd<span class="token punctuation">;</span> <span class="token comment">// geometry函数:返回AcGiGeometry对象,其类方法worldLine 在世界坐标系中画直线</span> <span class="token comment">// 传入的是点数组指针</span> mode<span class="token operator">-></span><span class="token function">geometry</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">worldLine</span><span class="token punctuation">(</span>pts<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token class-name">AcDbCurve</span><span class="token operator">::</span><span class="token function">subWorldDraw</span> <span class="token punctuation">(</span>mode<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">;</span>
}
Adesk::UInt32 ChDbLine::subSetAttributes (AcGiDrawableTraits *traits) {
assertReadEnabled () ;
return (AcDbCurve::subSetAttributes (traits)) ;
}// 重写夹点显示函数
Acad::ErrorStatus ChDbLine::subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray & geomIds) const
{
assertReadEnabled();
// 注意此处添加顺序直接影响夹点顺序,影响后续几何变换换
gripPoints.append(ptStart);
gripPoints.append(AcGePoint3d((ptStart.x + ptEnd.x) / 2, (ptStart.y + ptEnd.y) / 2, 0));
gripPoints.append(ptEnd);
return Acad::eOk;
}// 重写几何变换函数
Acad::ErrorStatus ChDbLine::subTransformBy(const AcGeMatrix3d& xform)
{
assertWriteEnabled();
ptStart.transformBy(xform);
ptEnd.transformBy(xform);
return Acad::eOk;
}// 重写移动夹点变换函数
Acad::ErrorStatus ChDbLine::subMoveGripPointsAt(const AcDbIntArray & indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
// 获取鼠标点击的夹点序号:与夹点添加顺序有关
int p = indices.at(0);
// 起点:起点变换
if (p 0) {
ptStart += offset;
}
// 中点:起、终点均变换
if (p 1)
{
ptStart += offset;
ptEnd += offset;
}
// 终点:终点变换
if (p == 2)
{
ptEnd += offset;
}<span class="token keyword">return</span> Acad<span class="token operator">::</span>eOk<span class="token punctuation">;</span>
}
// 重写捕捉点:osnapMode捕捉点类型、snapPoints捕捉点点列表
Acad::ErrorStatus ChDbLine::subGetOsnapPoints(AcDb::OsnapMode osnapMode,
Adesk::GsMarker gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const
{
assertReadEnabled();<span class="token keyword">switch</span> <span class="token punctuation">(</span>osnapMode<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token comment">// 端点:其他点类型点进AcDb结构体中看</span> <span class="token keyword">case</span> AcDb<span class="token operator">::</span>kOsModeEnd<span class="token operator">:</span> <span class="token punctuation">{<!-- --></span> snapPoints<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>ptStart<span class="token punctuation">)</span><span class="token punctuation">;</span> snapPoints<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>ptEnd<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token comment">// 中点</span> <span class="token keyword">case</span> AcDb<span class="token operator">::</span>kOsModeMid<span class="token operator">:</span> <span class="token punctuation">{<!-- --></span> snapPoints<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token function">AcGePoint3d</span><span class="token punctuation">(</span><span class="token punctuation">(</span>ptStart<span class="token punctuation">.</span>x <span class="token operator">+</span> ptEnd<span class="token punctuation">.</span>x<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>ptStart<span class="token punctuation">.</span>y <span class="token operator">+</span> ptEnd<span class="token punctuation">.</span>y<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token operator">:</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> Acad<span class="token operator">::</span>eOk<span class="token punctuation">;</span>
}
// 获取起点
AcGePoint3d ChDbLine::getStartPoint() const
{
assertReadEnabled();
return ptStart;
}// 获取终点
AcGePoint3d ChDbLine::getEndPoint() const
{
assertReadEnabled();
return ptEnd;
}// 设置起点
Acad::ErrorStatus ChDbLine::setStartPoint(AcGePoint3d newVal)
{
assertWriteEnabled();
ptStart = newVal;
return Acad::eOk;
}// 设置终点
Acad::ErrorStatus ChDbLine::setEndPoint(AcGePoint3d newVal)
{
assertWriteEnabled();
ptEnd = newVal;
return Acad::eOk;
}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
3.3 效果
四、COM创建OPM
- COM:即组件对象模型,是Component Object Model取前三个字母的缩写
- OPM:即对象属性管理器,是Object Property Management前三个字母缩写
后续补充,非自定义实体类的必要组件