找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1644|回复: 3

[老徐讲堂] 第六讲 在ObjectARX中创建对象

[复制链接]

已领礼包: 12个

财富等级: 恭喜发财

发表于 2013-9-25 14:41:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 小龙龙 于 2013-9-25 14:57 编辑

在ObjectARX中创建对象

本节中的ObjectARX源代码创建了与之前完全相同的实体(直线和圆),并演示了创建一个新层、改变线的颜色和添加到组词典中的过程.
创建实体



下列代码创建了直线并将其添加到模型空间块表记录中:

AcDbObjectId  createLine()//创建直线
{
    AcGePoint3d startPt(4.0, 2.0, 0.0);//起点
    AcGePoint3d endPt(10.0, 7.0, 0.0);//终点
    AcDbLine *pLine = new AcDbLine(startPt,endPt);//内存中创建新的直线
    AcDbBlockTable *pBlockTable;
   acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable,AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,
        AcDb::kForWrite);
    pBlockTable->close();
    AcDbObjectId lineId;
    pBlockTableRecord->appendAcDbEntity(lineId,pLine);
    pBlockTableRecord->close();
    pLine->close();
    return lineId;
}

createLine()程序从当前图形中获取块表,然后以写模式打开模型空间块表记录.关闭块表后,添加实体到块表记录并关闭块表记录和实体.
注意
当用完任何ObjectARX对象后,必须尽早地将其关闭
下面的 createCircle() 程序创建一个圆并将其添加到模型空间块表记录中.

AcDbObjectId  createCircle()
{
    AcGePoint3d center(9.0, 3.0, 0.0);
    AcGeVector3d normal(0.0, 0.0, 1.0);
    AcDbCircle *pCirc = new AcDbCircle(center,normal, 2.0);
    AcDbBlockTable *pBlockTable;
   acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable,AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,
        AcDb::kForWrite);
    pBlockTable->close();
    AcDbObjectId circleId;
    pBlockTableRecord->appendAcDbEntity(circleId,pCirc);
    pBlockTableRecord->close();
    pCirc->close();
    return circleId;
}

创建新层


下面的代码从数据库中获得层表,创建一个新的层表记录,并将其命名为ASDK_MYLAYER,然后将层表记录添加到层表中

void createNewLayer()
{
    AcDbLayerTable *pLayerTable;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pLayerTable,AcDb::kForWrite);
    AcDbLayerTableRecord *pLayerTableRecord =
        new AcDbLayerTableRecord;
   pLayerTableRecord->setName("ASDK_MYLAYER");
    // Defaults are used for other propertiesof
    // the layer if they are not otherwisespecified.
    //
    pLayerTable->add(pLayerTableRecord);
    pLayerTable->close();
    pLayerTableRecord->close();
}

打开和关闭ObjectARX对象


上述所有程序的例子都说明了打开和关闭对象的协议,每当我们操作数据库驻留对象时都要遵守该协议.该协议确保当对象被访问时在物理内存中,而当对象未被访问时可以被分页存储到磁盘中。在我们可以修改对象之前,必须打开它,例如:
acdbOpenObject(pObject,objId, AcDb::kForWrite);
打开函数有一个模式参数,用来说明要打开的对象是用于读、写或是通知操作.当以写模式打开对象时,我们可以对其进行修改;当我们使用完对象后,必须如下例那样关闭对象,不管以什么模式打开对象,都以同一方式关闭:
pObject->close();
下面是一个改变实体颜色的程序代码示例:

Acad::ErrorStatuschangeColor(AcDbObjectIdentId, Adesk::UInt16 newColor)
{
    AcDbEntity *pEntity;
    acdbOpenObject(pEntity, entId,
        AcDb::kForWrite);
    pEntity->setColorIndex(newColor);
    pEntity->close();
    return Acad::eOk;
}

一个对象的新实例在打开时,缺省是用于写操作的.某些函数,如AcDbBlockTable::getAt()函数,获取对象ID的同时打开对象.对象被添加到数据库之后才能将其关闭;在对象被添加到数据库之前,我们拥有对象并可以随时删除对象.
然而,一旦对象已经被添加到数据库后,我们就不能够直接删除它;我们可以通过调用AcDbObject::erase()函数,将对象标记为删除;被标记为删除的对象仍然保留在数据库中,直到数据库被析构为止,但是当保存时,不保存被标记为删除的对象.
警告
如果直接删除已经被.添加到数据库的对象,将导致AutoCAD终止.
在组词典中添加组


下列源代码将前面createLine()函数创建的直线和createCircle()函数创建的圆创建为一个编组(pGroup),并将其放进一个组词典中.线和圆的对象ID是通过参数传入函数的.请注意下面的程序是如何以写模式打开组词典,进行修改,然后将其关闭的.

void createGroup(AcDbObjectIdArray&objIds, char* pGroupName)
{
    AcDbGroup *pGroup = newAcDbGroup(pGroupName);
    // Put the group in the group dictionarywhich resides
    // in the named object dictionary.
    //
    AcDbDictionary *pGroupDict;
   acdbHostApplicationServices()->workingDatabase()
        ->getGroupDictionary(pGroupDict,AcDb::kForWrite);
    AcDbObjectId pGroupId;
    pGroupDict->setAt(pGroupName, pGroup,pGroupId);
    pGroupDict->close();
    // Now that the group has been added, ithas an ObjectID.
    // This is important since the group willbecome a persistent
    // reactor for the added entities...
    for (int i = 0; i < objIds.length();i++) {
        pGroup->append(objIds);
        }
    pGroup->close();
}

在ObjectARX中创建对象.rar

11.19 KB, 下载次数: 22, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-11-3 18:24:03 | 显示全部楼层
感谢分享,期望自己早日升级
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-11-13 19:00:35 | 显示全部楼层

感谢分享,正在学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-6-18 07:44 , Processed in 0.259421 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表