• ObjectARX开发教程(转)——第2课:AutoCAD数据库


    第2课:AutoCAD数据库
    介绍

    AutoCAD数据库的结构
    每个AutoCAD图形代表一个存储在几种对象中的数据库结构。打开工程图时,AutoCAD会自己创建一个有组织的高效数据库。该数据库包含用于创建基本工程图的最少数据。

    最少的数据量由诸如图层,线型,文本样式等对象表示。这样,您将获得第0层,标准字体,连续样式等。
    在AutoCAD 2000版中,您可以与MDI环境同时使用多个图形。此功能提供了极大的灵活性,但在处理多个图纸时也有些麻烦。在本课程中,我们将不讨论MDI方面,但是ObjectARX应用程序可能会要求它。
    数据如何存储
    数据库维护需要绘图的每种对象。这些对象存储在容器(容器)中,这些容器是为管理相同类型的对象而创建的特殊对象。这样,我们就可以使用适当的存储方法和过程来存储实体,类,版式等。

    存储在数据库中的每个对象都接收一个称为ObjectId的标识符。该标识符在同一AutoCAD会话中是唯一的,并且在每个对象的整个生命周期内有效。 ObjectId由其数据库生成,因此您不必关心它是如何创建的。

    在ObjectARX内部,我们有3种基本类型的对象:
    实体:图形对象(直线,圆弧,文本等);
    容器(隔间):用于存储和管理对象集(图层表,轮廓表等)的特殊对象;
    对象集:非图形对象(组,布局等)。
    创建对象
    要使用ObjectARX创建对象,我们有一些基于对象类型和要存储对象的公式(大多数情况下,我们需要将对象存储在自己的隔间中)。基本上,您将执行以下操作:
    将指针包含在要创建的对象中,并将其称为new运算符;
    使用此指针,调用对象的适当方法以更改其属性;
    获取指向您要在其中创建对象的数据库的指针(通常是当前数据库);
    打开一个存储数据的容器;
    通过其指针精确调用对象存储方法;
    获取对象的标识符(ObjectId)(由容器自动生成);
    完成所有对象集(包括隔离专区和刚刚创建的对象)的关闭过程。
    显然,您可以巧妙地创建一些使流程自动化的对象(类),因为它们是统一的且易于重用。主要思想是创建一种数据库实用程序函数,例如:Addlayer,AddLine,AddTextStyle等。

    *重要的是不要忘记关闭对象集,因为这将导致AutoCAD立即停止工作。
    创建线段(AcDbLine)的简单示例
    以下代码显示了如何在2点之间创建一条线。在这个简单的过程中,代码不会捕获错误,但是主要目的是使您熟悉这些概念。它需要嵌入到ObjectARX应用程序的结构中才能工作。稍微注意打开和关闭订单。
    //首先,我们必须声明一对点
    AcGePoint3d startPt(1.0,1.0,0.0);
    AcGePoint3d endPt(10.0,10.0,0.0);
    //现在我们将初始化一个AcDbLine指针
    //在这种情况下,构造函数允许2点
    AcDbLine * pLine =新的AcDbLine(startPt,endPt);
    //我们将在BlockTable中打开相应的隔离专区
    AcDbBlockTable * pBlockTable = NULL;
    //首先,获取当前数据库,然后获取BlockTable
    AcDbDatabase * pDB = acdbHostApplicationServices()-> workingDatabase();
    pDB-> getSymbolTable(pBlockTable,AcDb :: kForRead);
    //在BlockTable中,打开ModelSpace
    AcDbBlockTableRecord * pBlockTableRecord = NULL;
    pBlockTable-> getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb :: kForWrite);
    //在拥有ModelSpace之后,我们可以关闭BlockTable
    pBlockTable-> close();
    //使用ModelSpace光标,我们可以添加新行
    AcDbObjectId lineId = AcDbObjectId :: kNull;
    pBlockTableRecord-> appendAcDbEntity(lineId,pLine);
    //要完成此过程,请关闭ModelSpace和创建的实体
    pBlockTableRecord-> close();
    pLine-> close();

  • 相关阅读:
    模拟赛总结
    2018.04.06学习总结
    2018.04.06学习总结
    Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
  • 原文地址:https://www.cnblogs.com/ztcad/p/14113873.html
Copyright © 2020-2023  润新知