设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 167|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

    发表于 2020-12-29 14:12 | 显示全部楼层 |阅读模式
    1. 一、符号表



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



    3. 符号表名

    4. 符号表功能

    5. AcDbViewTable

    6. (视图表)

    7. 适用于 AcDbViewTableRecord 类,表示在数据库中存储的视图。

    8. 视图与CAD的"VIEW"命令相关联

    9. AcDbViewportTable(视口表)

    10. 适用于 AcDbViewportTableRecord 类,表示在CAD中当前系统变量TILEMODE的值为1时的视口设置。视口配置由CAD的 VPORTS 命令创建。不要和 MVIEW 命令混淆,当系统变量 TILEMODE 的值为0是,该命令创建视口实体。
    11. AcDbLinetypeTable

    12. (线性表)

    13. 适用于 AcDbLinetypeTableRecord 类,表示图形数据库中的线性。
    14. AcDbLayerTable

    15. (层表)

    16. 适用于 AcDbLayerTableRecord类,表示图层。
    17. AcDbTextStyleTable

    18. (文字样式表)

    19. 适用于 AcDbTextStyleTable 类,表示文字样式。
    20. AcDbUCSTable

    21. (用户坐标系表)

    22. 适用于 AcDbUCSTableRecord 类,表示图形数据库中的存储的用户坐标系。


    23. AcDbRegAppTable

    24. (应用程序名注册表)

    25.   适用于 AcDbRegAppTableRecord 类,表示为图形数据库中对象的扩展实体数据而注册的应用程序名。
    26. AcDbDimStyleTable

    27. (尺寸标注样式表)

    28. 适用于 AcDbDimStyleTableRecord 类,表示图形数据库中的尺寸标注样式。
    29. AcDbBlockTable

    30. (块表)

    31.   适用于 AcDbDimStyleTableRecord 类,表示图形数据库中定义的块。此表含有两个非常重要的记录:模型空间和图纸空间。所有的实体(可见对象)均防御块表AcDbBlockTable中。


    32. 二、用ObjectARX创建对象



    33. (1)创建直线

    34. AcDbObjectId createLine()
    35. {
    36. AcDbBlockTable *pBlkTable;
    37. AcDbBlockTableRecord *pBlkTableRecord;
    38. AcDbLine *pLine;
    39. AcDbObjectId lineId;
    40. AcGePoint3d startPt(100.0, 100.0, 0.0);
    41. AcGePoint3d endPt(500.0, 500.0, 0.0);
    42. //  创建线段
    43. pLine = new AcDbLine(startPt, endPt);
    44. //  以读方式打开块表
    45. acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTable, AcDb::kForRead);
    46. //  以写方式打开块表记录,并在其中查找 ACDB_MODEL_SPACE 或 ACDB_PAPER_SPACE 或一个布局
    47. pBlkTable->getAt(ACDB_MODEL_SPACE, pBlkTableRecord, AcDb::kForWrite);
    48. //  关闭块表
    49. pBlkTable->close();
    50. //  把实体添加到块表记录
    51. lineId = pBlkTableRecord->appendAcDbEntity(lineId, pLine);

    52. //  关闭块表记录
    53. pBlkTableRecord->close();
    54. //  关闭实体对象
    55. pLine->close();
    56. //  返回对象ID
    57. return lineId;
    58. }

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



    60. (1)创建图层

    61. void createNewLayer()
    62. {
    63. AcDbDatabase *pCurDb;
    64. AcDbLayerTable *pLayerTable;
    65. pCurDb = acdbHostApplicationServices()->workingDatabase();
    66. pCurDb->getLayerTable(pLayerTable, AcDb::kForRead);
    67. AcDbLayerTableRecord *pLayerTalbeRecord = new AcDbLayerTableRecord;
    68. //  设置层名
    69. pLayerTalbeRecord->setName("ARX");
    70. //  设置线性
    71. AcDbLinetypeTable *pLinetypeTbl;
    72. pCurDb->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);

    73. //  创建图层
    74. AcDbObjectId layerId;
    75. pLinetypeTbl->getAt("CONTINUOUS", layerId);
    76. pLayerTalbeRecord->setLinetypeObjectId(layerId);
    77. pLayerTable->add(pLayerTalbeRecord);

    78. //  释放内存
    79. pLinetypeTbl->close();
    80. pLayerTable->close();
    81. pLayerTalbeRecord->close();
    82. }

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



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

    85. 创建一个新实体。
    86. 以读方式打开块表。
    87. 以写方式打开块表记录,并在其中查找 ACDB_MODEL_SPACE 或 ACDB_PAPER_SPACE 或一个布局。
    88. 关闭块表。
    89. 把实体添加到块表记录。
    90. 关闭块表记录。
    91. 关闭实体对象。
    92. 三、AutoCAD的数据库结构



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

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

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

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



    101. 符号表的查询函数如下:

    102. AcDb###Table::getAt()-----------> 获得指定符号表记录的指针或ID号。
    103. AcDb###Table::has()-------------> 确定符号表中指定的符号表记录是否存在。
    104. AcDb###Table::newIterator()-----> 创建遍历符号表的浏览器。
    105. 符号表的编辑函数如下:

    106. AcDb###Table::add()----> 在符号表中加入一条符号表记录。
    107. 注:用适当的符号表名代替上面的###字符。



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

    109. AcDbLayerTableRecord::color()           图层是什么颜色?
    110. AcDbLayerTableRecord::ifFrozen()        图层是否冻结?
    111. AcDbLayerTableRecord::isLocked()        图层是否锁住?
    112. AcDbLayerTableRecord::isOff()           图层是否关闭?
    113. AcDbLayerTableRecord::linetypeObjectId() 图层的线性是什么?
    114. AcDbLayerTableRecord::VPDFLT()          视口中层的可见性缺省值?
    115. 层表记录的编辑函数如下:

    116. AcDbLayerTableRecord::setColor()    改变图层颜色。
    117. AcDbLayerTableRecord::setIsFrozen() 解冻/冻结。
    118. AcDbLayerTableRecord::setIsLocked() 锁住/解锁。
    119. AcDbLayerTableRecord::setIsOff()    打开/关闭。
    120. AcDbLayerTableRecord::setLinetypeObjectId() 改变图层的线性。
    121. AcDbLayerTableRecord::setVPDFLT()   改变图层的可见性缺省值。
    122. 五、常用返回码



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

    124. Acad::ErrorStatus  在头文件 acadstr.h 中定义。
    125. Adesk::Boolean    在 adesk.h 中定义。
    126. 六、浏览器常用函数



    127. 浏览器函数

    128. 说明

    129. AcDbSymbolTableIterator::done()         如果浏览器到达表尾,函数返回 Adesk::kTrue,否则返回 Adesk::kFalse
    130. AcDbSymbolTableIterator::getRecord()         以 openMode 模式打开浏览器所在位置的记录,使 pRecord指向打开的记录。此函数也在由 AcDbSymbolTable 派生出的类中定义,并常被该类应用
    131. AcDbSymbolTableIterator::getRecordId()         返回浏览器所在位置对象的 AcDbObjectId
    132. AcDbSymbolTableIterator::seek()       
    133. 用于定位浏览器,使浏览器处于由 AcDbObjectId 指定的记录处

    134. AcDbSymbolTableIterator::start()         用于初始化浏览器的位置,使其处于表的开头或表的结尾
    135. AcDbSymbolTableIterator::step()         移动浏览器,使其再表中下移(或上移)一条记录



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

    137. void inblk()
    138. {
    139. // 首先以读模式打开获得一条记录,接着获得先姓名,关闭记录,然后打印先姓名。
    140. //  最后删除浏览器

    141. AcDbDatabase *pCurDb;
    142. AcDbLinetypeTable *pLineTypeTable;
    143. AcDbLinetypeTableRecord *pLineTypeTableRecord;
    144. AcDbLinetypeTableIterator *pLineTypeTableIter;
    145. char * pName;

    146. pCurDb = acdbHostApplicationServices()->workingDatabase();
    147. //  获得线性表
    148. pCurDb->getLinetypeTable(pLineTypeTable, AcDb::kForRead);
    149. //  定义浏览器
    150. pLineTypeTable->newIterator(pLineTypeTableIter);
    151. //  遍历浏览器
    152. for (; !pLineTypeTableIter->done(); pLineTypeTableIter->step())
    153. {
    154.   pLineTypeTableIter->getRecord(pLineTypeTableRecord, AcDb::kForRead);
    155.   pLineTypeTableRecord->getName(pName);
    156.   pLineTypeTableRecord->close();
    157.   acutPrintf("\n线性名:%s", pName);
    158.   //  释放资源
    159.   free(pName);
    160. }
    161. //  释放浏览器
    162. delete pLineTypeTableIter;
    163. pLineTypeTable->close();
    164. }

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

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

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





    复制代码
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

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

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛