自定义实体的实现

1 、       自定义实体... 3

1.1      说明... 3

1.2      类的类型信息... 3

1.3      worldDraw.. 4

1.4      getGripPoints 4

1.5      moveGripPointsAt 5

1.6      getGeomExtents 6

1.7      getOsnapPoints 6

1.8      explode. 7

1.9      dwgInFields 8

1.10    dwgOutFields 9

1.11     控件例程说明... 9

1 、         
自定义实体

1.1                 
说明

控件支持自定义实体功能,可以从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接口:

virtualAcad::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接口:

virtualAcad::ErrorStatus   getGeomExtents(

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::ErrorStatus
   getOsnapPoints(

    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接口:

virtualAcad::ErrorStatus   explode(

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::ErrorStatus
dwgInFields(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::ErrorStatus
dwgOutFields(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 类实现一个线段实体功能,并带有长度标注功能。

CAD控件使用教程 自定义实体的实现的更多相关文章

  1. 梦想CAD控件COM接口自定义命令

    在CAD软件操作中,为方便使用者,使用自定义命令发出命令,完成CAD绘图,修改,保存等操作.点击此处下载演示实例. _DMxDrawX::RegistUserCustomCommand 向CAD控件注 ...

  2. 梦想CAD控件网页版关于自定义命令

    在CAD控件操作中,为方便使用者,使用自定义命令发出命令,完成CAD绘图,修改,保存等操作.点击此处在线演示. _DMxDrawX::RegistUserCustomCommand 向CAD控件注册一 ...

  3. CAD控件,CAD插件使用教程:Android开发使用控件--开发环境的搭建

    Android开发使用控件入门--环境搭建 2014-12-24 09:57     14人阅读     评论(0)     收藏         编辑     删除 CAD控件.CAD三维控件,手机 ...

  4. 如何在网页中浏览和编辑DWG文件 梦想CAD控件

    如何在网页中浏览和编辑DWG文件 梦想CAD控件 www.mxdraw.com 梦想绘图控件5.2  是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 201 ...

  5. CAD控件:网上打开dwg文件时,对dwg文件路径加密的功能

    梦想CAD控件2015.03.12最新更新  1. 增加控件状态栏文字,自定义功能,        C++接口为 :   CStatusBarInformationReactor::CreatePro ...

  6. 梦想CAD控件关于比较问题

    全图比较 怎么比较两个CAD图纸文件修改前后的不同部分呢?在工程图纸设计中,我们更多情况下可能需要对同一张工程图的前后修改部分进行对比,以确定工程图纸的改动部分及追溯原因,本教程演示了几种常见的比较方 ...

  7. 梦想CAD控件图块COM接口知识点

    梦想CAD控件图块COM接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...

  8. 梦想CAD控件图层COM接口知识点

    梦想CAD控件图层COM接口知识点 一.新建图层 主要用到函数说明: _DMxDrawX::AddLayer 增加新的图层.详细说明如下: 参数 说明 BSTR pszName 图层名 c#中实现代码 ...

  9. CAD控件的鼠标事件(网页版)

    _DMxDrawXEvents::MouseEvent CAD控件中的鼠标事件. 参数 说明 LONG lType 事件类型,1鼠标移动,2是鼠标左键按下,3是鼠标右键按下,4是鼠标左键双击 5是鼠标 ...

随机推荐

  1. golang中获取字符串长度的几种方法

    一.获取字符串长度的几种方法   - 使用 bytes.Count() 统计   - 使用 strings.Count() 统计   - 将字符串转换为 []rune 后调用 len 函数进行统计   ...

  2. zoj3777(状态压缩)

    题目阐述: 给定n个座位,n个人,每个人可以做n个位置中的任意一个,P[i][j]代表第i个人做第j个位置获得的分数,求有多少种排列方式使得获得的分数大于等于M. 这道题跟数位dp的思想很像,都是穷举 ...

  3. 使用VirtualBox虚拟机搭建局域网

    参考资料: http://www.awaimai.com/995.html https://my.oschina.net/cofecafe1/blog/206535 最近公司局域网网络改造,在改造前已 ...

  4. 【黑金教程笔记之007】【建模篇】【Lab 06 SOS信号之二】—笔记

    控制模块的协调角色. 实验六用到了实验四的按键消抖模块debounce_module.v和实验五的sos_module.v. 设计思路: debounce_module.v看成一个输入,sos_mod ...

  5. mysql error:You can't specify target table for update in FROM clause

    mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表( ...

  6. Keras 文档阅读笔记(不定期更新)

    目录 Keras 文档阅读笔记(不定期更新) 模型 Sequential 模型方法 Model 类(函数式 API) 方法 层 关于 Keras 网络层 核心层 卷积层 池化层 循环层 融合层 高级激 ...

  7. css设置页面全屏背景

    .background { background: url(xxx.png); background-size: 100% 100%; height: 100%; position: fixed; w ...

  8. React实战之将数据库返回的时间转换为几分钟前、几小时前、几天前的形式。

    React实战之将数据库返回的时间转换为几分钟前.几小时前.几天前的形式. 不知道大家的时间格式是什么样子的,我先展示下我这里数据库返回的时间格式 ‘2019-05-05T15:52:19Z’ 是这个 ...

  9. Jedis线上的一个小坑:Redis有并发访问的数据错乱的问题

    问题现象: 业务数据有错乱,A的一些数据有好几个都是B的数据 这些业务数据在保存在Redis缓存中,怀疑是并发情况下Jedis错乱的问题 原因分析: JedisUtil里面在使用完Jedis 后释放资 ...

  10. head first python /chapter7 web(python 3 转 python 2.7)

    前言 书中使用的是python3,我这里使用的是python2.7 Web 的目录树 webapp/ ├── cgi-bin │ ├── athletelist.py │ ├── athletemod ...