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

来源:互联网 发布:淘宝消费者保证金冻结 编辑:程序博客网 时间:2024/05/05 09:38

原文地址: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::kFalseAcDbSymbolTableIterator::getRecord()以 openMode 模式打开浏览器所在位置的记录,使 pRecord指向打开的
记录。此函数也在由 AcDbSymbolTable 派生出的类中定义,并常被该
类应用
AcDbSymbolTableIterator::getRecordId()返回浏览器所在位置对象的 AcDbObjectIdAcDbSymbolTableIterator::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();

0 0
原创粉丝点击