ObjectARX AutoCAD的数据库和实体结构(一)

原文地址:http://blog.sina.com.cn/s/blog_520637050100c356.html


一、符号表
 

一副CAD图形就是一个包含有多个表的数据库,它规定了9个符号表(见下表),用户不能再增加新的符号表

 

符号表名符号表功能
 AcDbViewTable
(视图表)      
适用于 AcDbViewTableRecord 类,表示在数据库中存储的视图。
视图与CAD的"VIEW"命令相关联
 AcDbViewportTable
(视口表)
 适用于 AcDbViewportTableRecord 类,表示在CAD中当前系统变
量TILEMODE的值为1时的视口设置。视口配置由CAD的 VPORTS
 命令创建。不要和 MVIEW 命令混淆,当系统变量 TILEMODE 的
值为0是,该命令创建视口实体。
AcDbLinetypeTable
(线性表)
适用于 AcDbLinetypeTableRecord 类,表示图形数据库中的线性。
 AcDbLayerTable
(层表)
适用于 AcDbLayerTableRecord类,表示图层。
 AcDbTextStyleTable
(文字样式表)
 适用于 AcDbTextStyleTable 类,表示文字样式。
 AcDbUCSTable
(用户坐标系表)
适用于 AcDbUCSTableRecord 类,表示图形数据库中的存储的用户
坐标系。
 AcDbRegAppTable
(应用程序名注册表)
适用于 AcDbRegAppTableRecord 类,表示为图形数据库中对象的扩
展实体数据而注册的应用程序名。
 AcDbDimStyleTable
(尺寸标注样式表)
适用于 AcDbDimStyleTableRecord 类,表示图形数据库中的尺寸标注
样式。
 AcDbBlockTable
(块表)
 适用于 AcDbDimStyleTableRecord 类,表示图形数据库中定义的块。
此表含有两个非常重要的记录:模型空间和图纸空间。所有的实体(可
见对象)均防御块表AcDbBlockTable中。



二、用ObjectARX创建对象
 
(1)创建直线


AcDbObjectId createLine()

{

     AcDbBlockTable *pBlkTable;

     AcDbBlockTableRecord *pBlkTableRecord;

      AcDbLine *pLine;

      AcDbObjectId lineId;

      AcGePoint3d startPt(100.0, 100.0, 0.0);

      AcGePoint3d endPt(500.0, 500.0, 0.0);

      //  创建线段

      pLine = new AcDbLine(startPt, endPt);

      //  以读方式打开块表

      acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTable, AcDb::kForRead);

      //  以写方式打开块表记录,并在其中查找 ACDB_MODEL_SPACE 或 ACDB_PAPER_SPACE 或一个布局

      pBlkTable->getAt(ACDB_MODEL_SPACE, pBlkTableRecord, AcDb::kForWrite);

      //  关闭块表

      pBlkTable->close();

      //  把实体添加到块表记录

     lineId = pBlkTableRecord->appendAcDbEntity(lineId, pLine);

 

      //  关闭块表记录

      pBlkTableRecord->close();

      //  关闭实体对象

      pLine->close();

      //  返回对象ID

      return lineId;

}

注:添加道CAD数据库中的所有实体均获得一个对象ID。

 
(2)创建图层


void createNewLayer()

{

      AcDbDatabase *pCurDb;

      AcDbLayerTable *pLayerTable;

      pCurDb = acdbHostApplicationServices()->workingDatabase();

      pCurDb->getLayerTable(pLayerTable, AcDb::kForRead);

      AcDbLayerTableRecord *pLayerTalbeRecord = new AcDbLayerTableRecord;

      //  设置层名

      pLayerTalbeRecord->setName("ARX"); 

      //  设置线性

      AcDbLinetypeTable *pLinetypeTbl;

      pCurDb->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);

      //  创建图层

      AcDbObjectId layerId;

      pLinetypeTbl->getAt("CONTINUOUS", layerId);

      pLayerTalbeRecord->setLinetypeObjectId(layerId);

      pLayerTable->add(pLayerTalbeRecord);

      //  释放内存

      pLinetypeTbl->close();

      pLayerTable->close();

      pLayerTalbeRecord->close();

}

注意:我们打开线性表进行读操作,获得 CONTINUOUS 线性。记住:线性  CONTINUOUS 始终存在。最后,我们把新的层表记录加进层表中,接着关闭层表和层表记录。这和创建实体并非完全相同。

 

通过以上代码,我们可以总结出一下把实体放入CAD数据库时所需的步骤。如下:

    1. 创建一个新实体。
    2. 以读方式打开块表。
    3. 以写方式打开块表记录,并在其中查找 ACDB_MODEL_SPACE 或 ACDB_PAPER_SPACE 或一个布局。
    4. 关闭块表。
    5. 把实体添加到块表记录。
    6. 关闭块表记录。
    7. 关闭实体对象。


三、AutoCAD的数据库结构
 

所有的数据库有表和记录,AutoCAD把图形结构看作一个数据库。一幅图形具有如下的结构:

    • 层表和层表记录——AcDbLayerTable, AcDbLayerTableRecord。
    • 块表和块表记录——AcDbBlockTable, AcDbBlockTableRecord。AutoCAD中的所有实体(可见实体)均属于块表记录。块表中包含有两天特殊的记录:*MODEL_SPACE(模型空间)和*PAPER_SPACE(图纸空间)。所有的AutoCAD实体均属于这两个记录。
    • 符号表和各种类型的符号表记录,见上面的符号表表格。
    • 有名对象字典,其中有“组字典”和“多线样式字典”。



四、数据库常驻对象



数据库常驻对象中的每一个对象都使用AcDb前缀。这些对象可分为下列几大类型:符号表、符号表记录、实体、基本类和光栅类。所有的数据库常驻对象均有AcDbObject类派生,而AcDbObject类是由AcRxObject类派生,AcRxObject是基类。

为了能使用符号表和符号表记录,在应用程序中比寻包含头文件 dbsymtb.h,即:#include<dbsymtb.h>

 

符号表的查询函数如下:

  • AcDb###Table::getAt()----------->  获得指定符号表记录的指针或ID号。
  • AcDb###Table::has()------------->  确定符号表中指定的符号表记录是否存在。
  • AcDb###Table::newIterator()----->  创建遍历符号表的浏览器。

符号表的编辑函数如下:

  • AcDb###Table::add()---->  在符号表中加入一条符号表记录。

注:用适当的符号表名代替上面的###字符。

 

层表记录的查询函数如下:

  •  AcDbLayerTableRecord::color()            图层是什么颜色?
  •  AcDbLayerTableRecord::ifFrozen()         图层是否冻结?
  •  AcDbLayerTableRecord::isLocked()         图层是否锁住?
  •  AcDbLayerTableRecord::isOff()            图层是否关闭?
  •  AcDbLayerTableRecord::linetypeObjectId() 图层的线性是什么?
  •  AcDbLayerTableRecord::VPDFLT()           视口中层的可见性缺省值?

 层表记录的编辑函数如下:

  •  AcDbLayerTableRecord::setColor()     改变图层颜色。
  •  AcDbLayerTableRecord::setIsFrozen()  解冻/冻结。
  •  AcDbLayerTableRecord::setIsLocked()  锁住/解锁。
  •  AcDbLayerTableRecord::setIsOff()     打开/关闭。
  •  AcDbLayerTableRecord::setLinetypeObjectId()  改变图层的线性。
  •  AcDbLayerTableRecord::setVPDFLT()    改变图层的可见性缺省值。


五、常用返回码
 

两个最常用的返回码如下:

  • Acad::ErrorStatus  在头文件 acadstr.h 中定义。
  • Adesk::Boolean     在 adesk.h 中定义。


六、浏览器常用函数
 

浏览器函数说明
AcDbSymbolTableIterator::done()如果浏览器到达表尾,函数返回 Adesk::kTrue,否则返回 Adesk::kFalse
AcDbSymbolTableIterator::getRecord()以 openMode 模式打开浏览器所在位置的记录,使 pRecord指向打开的
记录。此函数也在由 AcDbSymbolTable 派生出的类中定义,并常被该
类应用
AcDbSymbolTableIterator::getRecordId()返回浏览器所在位置对象的 AcDbObjectId
AcDbSymbolTableIterator::seek() 用于定位浏览器,使浏览器处于由 AcDbObjectId 指定的记录处
AcDbSymbolTableIterator::start() 用于初始化浏览器的位置,使其处于表的开头或表的结尾
AcDbSymbolTableIterator::step() 移动浏览器,使其再表中下移(或上移)一条记录


例:利用浏览器显示数据库中所有线型

void inblk()

{

 //  首先以读模式打开获得一条记录,接着获得先姓名,关闭记录,然后打印先姓名。

 //  最后删除浏览器

 AcDbDatabase *pCurDb;

 AcDbLinetypeTable *pLineTypeTable;

 AcDbLinetypeTableRecord *pLineTypeTableRecord;

 AcDbLinetypeTableIterator *pLineTypeTableIter;

 char * pName;

 pCurDb = acdbHostApplicationServices()->workingDatabase();

 //  获得线性表

 pCurDb->getLinetypeTable(pLineTypeTable, AcDb::kForRead);

 //  定义浏览器

 pLineTypeTable->newIterator(pLineTypeTableIter);

 //  遍历浏览器

 for (; !pLineTypeTableIter->done(); pLineTypeTableIter->step())

 {

  pLineTypeTableIter->getRecord(pLineTypeTableRecord, AcDb::kForRead);

  pLineTypeTableRecord->getName(pName);

  pLineTypeTableRecord->close();

  acutPrintf("\n线性名:%s", pName);

  //  释放资源

  free(pName);

 }

 //  释放浏览器

 delete pLineTypeTableIter;

 pLineTypeTable->close();

}

特别说明:使用 upgradeOpen() 函数可以把 AcDb###Table 转换为写操作模式。

当前模式为:  pCurDb->getBlockTable(pBlkTable, AcDb::kforread);

改为写模式的写法: pBlkTable->upgradeOpen();

打开方式:pdg格式的文件,采用超星浏览器可以打开。 内容介绍:本书共分三篇,分别是入门篇、基础篇、高级篇。 入门篇对ObjectARX的入门知识和编程环境做了大量介绍图文并茂,非常适合初学者。 基础篇对ObjectARX的基础知识和基本理论做了详细论述,本篇列举了很多实例供读者钻研体会。通过对本篇的学习,读者基本上可以独立地完成大部分AutoCAD二次开发任务。 高级篇对ObjectARX的一些高级应用做了简要的说明,以开拓读者的眼界,带领有兴趣的读者走向一个更高的境界。 目录: 入门篇 第1章 ObjectARX简介 1.1 AutoCAD二次开发工具的综述 1.1.1 AutoLISP语言概述 1.1.2 ADS语言概述 1.1.3 Visual AutoLISP、ObjectARX及VBA 1.1.4 ObjectARX与其他开发工具的比较 1.2 ObjectARX程序设计环境 1.2.1 ObjectARX的运行环境 1.2.2 ObjectARX的功能简介 1.3 ObjectARX与Visual C++ 1.3.1 ObjectARX是Visual C++ 1.3.2 动态链接库 1.4 生成一个简单的ObjectARX程序 1.4.1 创建简单工程 1.4.2 输入程序代码 1.4.3 设置编译器选项 1.4.4 应用程序的调试 1.5 在AutoCAD中使用该应用程序 1.5.1 应用程序的装载和卸载 1.5.2 在AutoCAD中的加载、运行该应用程序 1.5.3 在AutoCAD中卸载该应用程序 第2章 ObjectARX基础 2.1 ObjectARX的数据及函数 2.2 ObjectARX类库 2.3 ObjectARX程序框架 第3章 ObjectARX的安装及使用 3.1 ObjectARX的安装 3.2 ObjectARX的定制及使用 3.3 ObjectARX工具的使用 第4章 ObjectARX数据库 4.1 数据库概述 4.2 操作数据库 4.3 数据库对象 第5章 ObjectARX实体对象 第6章 容器、选择集和实体 第7章 ObjectARX派生类 第8章 ObjectARX用户界面 第9章 关于几个高级问题的探讨 第10章 ObjectDBX库 页数:380页
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值