说明     控件支持自定义实体功能,可以从McDbEntity继承自己的实体,在自定体实体类中,实现相关虚函数来实现实体的自定义功能。1.2
       类的类型信息       使用MCRX_DECLARE_MEMBERS宏定义类的类型信息函数,宏的第一个参数是类的类名。使用例如:MCRX_DECLARE_MEMBERS(CLinkLine);    使用 ACRX_DXF_DEFINE_MEMBERS 宏实现类的类型信息函数。宏定义参数使用如下:    ACRX_DXF_DEFINE_MEMBERS(CLinkLine, McDbEntity,
    AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 
    AcDbProxyEntity::kAllAllowedBits, _T("LinkLine"), 
    _T("MxDrawObj Test Custom Entity") );参数说明:
   CLinkLine   自定义实体的类名   McDbEnity   自定义实体的基类  AcDb::kDHL_CURRENT  当前文件版本   AcDb::kMReleaseCurrent   当前控件版本   AcDbProxyEntity::kAllAllowedBits 代理实体处理标志   _T("LinkLine")
   Dfx0组码对应值  _T("MxDrawObj Test Custom Entity") 类说明     在程序启动的时候,调用rxInit函数,自定义实体的类型信息注册到系统中,使用例如:   BOOL CCustomEntityApp::InitInstance()  {
   …..   // 注册自定义实体类信息。   CLinkBlock::rxInit();   CLinkLine::rxInit();1.3
      worldDraw重载该虚函数,绘制自定义实体的显示效果VC接口:  Adesk::Boolean  worldDraw
				
    (AcGiWorldDraw * wd);;参数:   Wd  显示绘制的上下文对象参考例程:复制内容到剪贴板
				
代码:
Adesk::Boolean
CLinkLine::worldDraw
(AcGiWorldDraw * wd)
{
assertReadEnabled();
wd->geometry().line(m_start,m_end);
std::auto_ptr<AcDbText> spText(GetDimText() );
spText->worldDraw(wd);
return Adesk::kTrue;
}1.4
       getGripPoints重载该虚函数,返回自定义的编辑夹点
VC接口:virtual Acad::ErrorStatus getGripPoints(
AcGePoint3dArray& 
gripPoints,
AcGeIntArray&
osnapModes,
AcGeIntArray&
					
geomIds) const;参数:   gripPoints   返回夹点   osnapModes   暂没有使用   geomIds      暂没有使用参考例程:复制内容到剪贴板
			
代码:
Acad::ErrorStatus
CLinkLine::getGripPoints(
AcGePoint3dArray&
gripPoints,
AcGeIntArray&
osnapModes,
AcGeIntArray&
geomIds) const
{
assertReadEnabled();
gripPoints.append(m_start);
// 返回开始点夹点
gripPoints.append(m_end);
// 返回结束点夹点
gripPoints.append(m_start + (m_end - m_start) / 2.0);
// 返回中点夹点。
return Acad::eOk;
}1.5
       moveGripPointsAt重载该虚函数,处理夹点编辑结果。VC接口:virtual
Acad::ErrorStatusmoveGripPointsAt
(constAcGeIntArray& indices,
constAcGeVector3d& offset);参数:indices
indices [0]参数是传入被编辑的夹点索引, 其它数组元素暂没有使用。offset    夹点编辑的偏移量参考例程:复制内容到剪贴板
			
代码:
Acad::ErrorStatus CLinkLine::moveGripPointsAt(const AcGeIntArray& indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
int iIndex = indices[0];
switch(iIndex)
{
case 0:
m_start = m_start + offset;
// 开始点被编辑
break;
case 1:
m_end = m_end + offset;
// 结束点被编辑
break;
case 2:
m_start = m_start + offset;
// 中点被编辑
m_end = m_end + offset;
// 中点被编辑
break;
}
return Mcad::eOk;
}1.6
     getGeomExtents重载该虚函数,返回自定义实体的外包矩形框VC接口:virtual
Acad::ErrorStatusgetGeomExtents
(AcDbExtents& extents) const;参数:extents    返回自定义实体外包矩形框。参考例程:复制内容到剪贴板
				
代码:
Acad::ErrorStatus
CLinkLine::getGeomExtents(AcDbExtents& extents) const
{
assertReadEnabled();
extents.set(m_start,m_end);
return Mcad::eOk;
}1.7
     getOsnapPoints重载该虚函数,返回自定义实体的捕捉点
VC接口:virtual Acad::ErrorStatusgetOsnapPoints(
AcDb::OsnapMode
osnapMode,
int
gsSelectionMark,
const AcGePoint3d&
pickPoint,
const AcGePoint3d&
lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray&
snapPoints,
AcDbIntArray&
geomIds) const;参数:osnapMode    捕捉点类型,通过该变量可以确定需要返回什么类型的捕捉点gsSelectionMark   暂没有使用pickPoint         当前输入点lastPoint         上一次的输入点viewXform         暂没有使用snapPoints        返回捕捉点geomIds           暂没有使用参考例程:复制内容到剪贴板
			
代码:
Acad::ErrorStatus
CLinkLine::getOsnapPoints(
AcDb::OsnapMode
osnapMode,
int
gsSelectionMark,
const AcGePoint3d&
pickPoint,
const AcGePoint3d&
lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray&
snapPoints,
AcDbIntArray&
geomIds) const
{
assertReadEnabled();
if(osnapMode == McDb::kOsModeEnd)
{
// 返端点。
snapPoints.append(m_start);
snapPoints.append(m_end);
}
else if(osnapMode == McDb::kOsModeMid)
{
// 返回的是中点。
snapPoints.append(m_start + (m_end - m_start) / 2.0);
}
return Mcad::eOk;
}1.8
           explode重载该虚函数,返回自定义实体打碎后的实体,在控件中,自定义实体保存在到dwg图中时,使用是块引用来保存,控件使用该函数得到自定义实体在块引用中的实体数据。VC接口:virtual
Acad::ErrorStatusexplode
(AcDbVoidPtrArray& entitySet) const;参数:entitySet    返回打碎后的基本实体。实体指针内存控件释放。参考例程:复制内容到剪贴板
			
代码:
Acad::ErrorStatus
CLinkLine::explode(AcDbVoidPtrArray& entitySet) const
{
assertReadEnabled();
AcDbLine* pLine = new AcDbLine(m_start,m_end);
entitySet.append(pLine);
entitySet.append(GetDimText() );
return Acad::eOk;
}1.9
         dwgInFields重载该虚函数,响应控件系统,读取自定义实体数据,在从文件读取实体,复制实体等地方都会调用该函数。VC接口:virtual Acad::ErrorStatusdwgInFields
(AcDbDwgFiler* pFiler);参数:pFiler   数据归档对象,在这个函数,使用该对象读取数据。参考例程:复制内容到剪贴板
			
代码:
Acad::ErrorStatus CLinkLine::dwgInFields (AcDbDwgFiler* pFiler)
{
assertWriteEnabled();
if(pFiler->filerType() != McDb::kCustomEntityFileFiler)
{
Mcad::ErrorStatus es;
if ((es = McDbEntity::dwgInFields(pFiler)) != Mcad::eOk)
{
return es;
}
}
int lVar = 1;
pFiler->readInt(&lVar);
pFiler->readPoint3d(&m_start);
pFiler->readPoint3d(&m_end);
return Mcad::eOk;
}1.10
      dwgOutFields重载该虚函数,响应控件系统,写入自定义实体数据,在把实体写入文件时,复制实体等地方都会调用该函数。VC接口:   virtual Acad::ErrorStatusdwgOutFields
(AcDbDwgFiler* pFiler) const;参数:   pFiler   数据归档对象,在这个函数,使用该对象写入数据。参考例程:复制内容到剪贴板
			
代码:
Acad::ErrorStatus CLinkLine::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
if(pFiler->filerType() != McDb::kCustomEntityFileFiler)
{
Mcad::ErrorStatus es;
if ((es = McDbEntity::dwgOutFields(pFiler)) != Mcad::eOk)
{
return es;
}
}
pFiler->writeInt(LINKLINE_VERSION);
pFiler->writePoint3d(m_start);
pFiler->writePoint3d(m_end);
return Mcad::eOk;
}1.11
控件例程说明        在控件安装目录下的samples\CustomEntity\ CustomEntity.sln例程,演示了自定义实体现。在例程实现连接块CLinkBlock自定义实体,CLinkLine自定义实体,     CLinkBlock类显示通过块引用显示,绘图捕捉点通过块记录中的块属性定义文本来确定,当该实体被编辑后,会自动移动与该实体连接的连接线,实现个连动效果。     CLinkLine 类实现一个线段实体功能,并带有长度标注功能。