四、ObjectARX 修改对象的属性
2015-11-11 10:34
441 查看
环境:vs2008+ObjectARX 2010 +CAD2010 64位
上个博客中,如果在最后一行(close函数之前)添加上pLine->setColorIndex(1);
我们所创立的直线就会变成红色。
但是那是在对象关闭之前进行创建的,这一次,我们通过对象的ID号,进行改变我们对象的颜色的程序。
*******************************************************************************
AcDbBlockTableRecord 类的 appendAcDbEntity 函数能够将一个实体添加到图形数据库中,并且返回分配给该实体的 ID,这个函数上一节已经介绍过;全局函数acdbOpenAcDbEntity 用于从实体的 ID 号获得指向图形数据库中实体的指针,其定义为:
Acad::ErrorStatus acdbOpenAcDbEntity(
AcDbEntity*& pEnt,
AcDbObjectId id,
AcDb::OpenMode mode,
bool openErasedEntity = false);
第一个参数返回指向图形数据库实体的指针;
第二个参数输入了要获得的实体的 ID 号;
第三个参数指定了打开该实体的方式,如果仅是查询该实体的特性用“读”模式打开即可,
要修改实体的特性就必须用“写”模式打开;
第四个参数指定是否允许访问一个已经被删除
的实体。
访问实体的特性必须通过对象指针,但是一旦你获得了实体的ID、句柄或者ads_name,都能通过ID作中介而获得对象的指针。
![](https://img-blog.csdn.net/20151111104430252?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20151111104515392?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
改变的步骤如下:
利用向导创建一个ObjectARX工程
在入口点函数:
![](https://img-blog.csdn.net/20151111104621505?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
中AcrxEntryPoint.cpp中插入 创建一个新的命令行,所有的参数跟之前一样,名字为ChangeColor
将上一张博客里面的CreateLine 做一下修改如下:
static AcDbObjectId CHAP2CreateLine(void)
{
// Add your code for command CHAP2.CreateLine here
AcGePoint3d ptStart(0,0,0);//创建一个3d空间的点
AcGePoint3d ptEnd(100,100,0);
AcDbLine *pLine = new AcDbLine(ptStart,ptEnd);//这个类代表了CAD里面的线实体,起始点终结点
//获取指向块表的指针
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);
//acdbHostApplicationServices()->workingDataBase()->getBlockTable(pBlockTable,AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
AcDbObjectId lineld;
pBlockTableRecord->appendAcDbEntity(lineld,pLine);
//设置颜色
// pLine->setColorIndex(1);
pBlockTable->close();
pBlockTableRecord->close();
pLine->close();
return lineld;
}
在 这个APP类之外重新添加一段函数代码如下:
Acad::ErrorStatus ChangeColor(AcDbObjectId entId,Adesk::UInt16 colorIndex)
{
AcDbEntity *pEntity;
acdbOpenObject(pEntity,entId,AcDb::kForWrite);
pEntity->setColorIndex(colorIndex);
pEntity->close();
return Acad::eOk;
}
配置好环境之后,点击运行测试。
结果:
![](https://img-blog.csdn.net/20151111105129003?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
上个博客中,如果在最后一行(close函数之前)添加上pLine->setColorIndex(1);
我们所创立的直线就会变成红色。
但是那是在对象关闭之前进行创建的,这一次,我们通过对象的ID号,进行改变我们对象的颜色的程序。
*******************************************************************************
AcDbBlockTableRecord 类的 appendAcDbEntity 函数能够将一个实体添加到图形数据库中,并且返回分配给该实体的 ID,这个函数上一节已经介绍过;全局函数acdbOpenAcDbEntity 用于从实体的 ID 号获得指向图形数据库中实体的指针,其定义为:
Acad::ErrorStatus acdbOpenAcDbEntity(
AcDbEntity*& pEnt,
AcDbObjectId id,
AcDb::OpenMode mode,
bool openErasedEntity = false);
第一个参数返回指向图形数据库实体的指针;
第二个参数输入了要获得的实体的 ID 号;
第三个参数指定了打开该实体的方式,如果仅是查询该实体的特性用“读”模式打开即可,
要修改实体的特性就必须用“写”模式打开;
第四个参数指定是否允许访问一个已经被删除
的实体。
访问实体的特性必须通过对象指针,但是一旦你获得了实体的ID、句柄或者ads_name,都能通过ID作中介而获得对象的指针。
改变的步骤如下:
利用向导创建一个ObjectARX工程
在入口点函数:
中AcrxEntryPoint.cpp中插入 创建一个新的命令行,所有的参数跟之前一样,名字为ChangeColor
将上一张博客里面的CreateLine 做一下修改如下:
static AcDbObjectId CHAP2CreateLine(void)
{
// Add your code for command CHAP2.CreateLine here
AcGePoint3d ptStart(0,0,0);//创建一个3d空间的点
AcGePoint3d ptEnd(100,100,0);
AcDbLine *pLine = new AcDbLine(ptStart,ptEnd);//这个类代表了CAD里面的线实体,起始点终结点
//获取指向块表的指针
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);
//acdbHostApplicationServices()->workingDataBase()->getBlockTable(pBlockTable,AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
AcDbObjectId lineld;
pBlockTableRecord->appendAcDbEntity(lineld,pLine);
//设置颜色
// pLine->setColorIndex(1);
pBlockTable->close();
pBlockTableRecord->close();
pLine->close();
return lineld;
}
在 这个APP类之外重新添加一段函数代码如下:
Acad::ErrorStatus ChangeColor(AcDbObjectId entId,Adesk::UInt16 colorIndex)
{
AcDbEntity *pEntity;
acdbOpenObject(pEntity,entId,AcDb::kForWrite);
pEntity->setColorIndex(colorIndex);
pEntity->close();
return Acad::eOk;
}
配置好环境之后,点击运行测试。
结果:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 如何使用Visual Studio 2010在数据库中生成随机测试数据
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性