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();

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ObjectARX是一个开发工具包,用于创建定制的AutoCAD应用程序。它是由Autodesk开发的,用于扩展和增强AutoCAD的功能。ObjectARX允许开发人员使用C++、.NET和其他编程语言创建插件、宏和其他扩展,以满足用户的特定需求。 ObjectARX for AutoCAD 2020是最新版本的ObjectARX,专门为AutoCAD 2020版本定制开发的。它提供了与AutoCAD的最新功能和改进的兼容性,使开发人员能够开发高度集成、高度定制的AutoCAD应用程序。 使用ObjectARX for AutoCAD 2020,开发人员可以利用AutoCAD的强大功能,如二维和三维绘图、设计和建模工具,来创建个性化的工作流程和定制工具。他们可以访问和操纵AutoCAD的对象模型,如图层、块、实体等,以及访问图形数据库的数据。 ObjectARX for AutoCAD 2020还包括了对最新的AutoCAD功能的支持,如新的DWG文件格式、图形视觉化和呈现功能、云存储和协作能力等。开发人员可以充分利用这些功能,为用户提供更强大、更高效的定制工具和功能。 总而言之,ObjectARX for AutoCAD 2020是一个强大的开发工具包,可以帮助开发人员创建定制的AutoCAD应用程序,满足用户的特定需求,并利用AutoCAD最新的功能和改进,提供更强大、更高效的定制工具和功能。 ### 回答2: ObjectARX for AutoCAD 2020是一种用于AutoCAD 2020的开发工具包,它允许开发者通过自定义的方式扩展和定制AutoCAD的功能。 ObjectARX是Autodesk提供的强大的应用程序编程接口(API),允许开发者使用C++语言编写插件和应用程序,以访问和操纵AutoCAD中的对象、实体和命令。 ObjectARX for AutoCAD 2020提供了许多功能和功能,使开发者能够创建各种各样的自定义解决方案。一些常见的应用包括自定义命令、自定义实体、自定义图形界面等。通过使用ObjectARX,开发者可以通过添加新的命令和功能来满足特定的工作流程需求,提高生产效率。 该开发工具包还提供了许多用于操作和管理AutoCAD图形对象的类和函数,例如创建和编辑实体、块、层等。借助这些工具,开发者可以轻松地与AutoCAD中的图形数据进行交互,实现自定义的二维和三维图形操作。 ObjectARX for AutoCAD 2020还支持与其他Autodesk产品的集成,例如Autodesk Revit和Navisworks等。这意味着开发者可以在不同的Autodesk应用程序之间共享数据和功能,实现更加灵活和高效的工作流程。 总的来说,ObjectARX for AutoCAD 2020是一个强大的开发工具包,使开发者能够创建和定制各种自定义解决方案,满足特定的工作流程需求,并提高AutoCAD的生产效率。 ### 回答3: ObjectARX for AutoCAD 2020(AutoCAD 2020 的 ObjectARX)是一种开发框架,用于自定义和扩展 AutoCAD 2020 的功能。ObjectARX 允许开发者使用 C++ 编程语言创建自己的 AutoCAD 插件,以满足特定的设计需求。 使用 ObjectARX,开发者可以利用 AutoCAD 2020 中的各种功能和特性来创建定制化的工具和功能,例如自定义命令、菜单、工具栏等。它还允许开发者与 AutoCAD 2020 中的各个对象进行交互,包括图形实体、图层、块定义、属性等。通过 ObjectARX 可以轻松地访问和修改 AutoCAD 中的图形数据。 ObjectARX for AutoCAD 2020 提供了丰富的 API(应用程序编程接口),开发者可以使用这些 API 来操纵图形数据、执行各种操作和实现自定义功能。同时,ObjectARX 还提供了强大的调试工具,方便开发者进行代码的调试和错误修复。 使用 ObjectARX,开发者可以开发出适用于各种特殊需求的 AutoCAD 插件,如自动化绘图、批量处理、数据导出等。这些插件能够大大提高工作效率,并且根据项目需求进行定制,满足不同用户的不同要求。 总之,ObjectARX for AutoCAD 2020 是一个强大的开发框架,用于自定义和扩展 AutoCAD 2020 的功能。它提供了丰富的 API 和调试工具,可以帮助开发者创建出适应特定需求的定制化工具和功能,提高工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值