在本练习中,我们将实现实用程序功能,这些功能稍后将对实现我们的命令有用。 我们需要实现两个实用程序函数createLayer()和createBlockRecord(),这将有助于实现我们的“ CREATE”命令。 我们将在新的cpp文件'utilities.cpp'中实现这两个函数,并且函数声明将放置在头文件'utilities.h'中.

 

为实用程序功能创建新的头文件和实现文件:

通过名称“ utilities.h”创建一个新的头文件。 该文件将包含实用程序功能的声明。 在“ utilities.h”文件中,添加以下代码.

 

#include "StdAfx.h"

//Declaration of createLayer():
Acad::ErrorStatus createLayer (const TCHAR* layerName, AcDbObjectId& layerId);

//Declaration of createBlockRecord():
Acad::ErrorStatus createBlockRecord (const TCHAR* name);

 

通过名称“ utilities.cpp”创建一个新的.cpp文件。 在此文件中,我们将使用以下步骤添加函数的实现。 但在此之前添加以下包含语句:

#include "utilities.h"

 


用户定义的createLayer()实用程序函数在Utility.cpp中的实现

添加以下功能说明:

//
// Create a new layer or return the ObjectId if it already exists
//
// In :
// const TCHAR* layerName : layer name
// Out :
// AcDbObjectId& layerId : ObjectId of the created or existing layer
//

createLayer的算法()

  1. 从当前的工作数据库(AcDbLayerTable,AcDbDatabase :: getLayerTable())获取图层表。 要获取当前的工作数据库,请使用acdbHostApplicationServices()-> workingDatabase())。
  2. 检查是否已经存在相同名称的图层(AcDbLayerTable :: getAt())。 如果是这样,获取它的对象ID,并使用我们的createLayer()函数的第二个参数返回它.
  3. 如果该图层尚不存在,则必须创建该图层并将其添加到图层表(AcDbLayerTable :: getAt())中。 使用“ new”运算符创建一个新层(AcDbLayerTableRecord)。 由于我们将修改图层表,因此需要打开图层表以进行写入。 新创建的图层表记录将通过AcDbLayerTable :: add()添加到图层表中。 我们将返回新创建的图层的对象ID-当然,在关闭之后.
  4. 使用AcDbLayerTable,AcDbLayerTableRecord需要包含文件<dbsymtb.h>。 但是您不必添加包含,因为这是因为“ utilities.h”中包含的头文件stdafx.h对头“ arxHeaders.h”具有了include语句。 “ arxHeaders.h”头文件具有包含所有ObjectARX头的包含语句。. 

 


用户定义的createBlockRecord()实用程序函数在Utility.cpp中的实现

添加以下功能说明:

//
// Create a new block table record and add the entities of the employee to it
//
// In :
// const TCHAR* name : Name of block table record
//

createBlockRecord的算法()

  1. 从当前工作数据库中获取块表(AcDbBlockTable,AcDbDatabase :: getBlockTable())
  2. 检查块表记录是否已经存在(AcDbBlockTable :: has())。 如果存在,则返回错误状态(Acad :: eDuplicateKey)。 不要忘记关闭黑名单.
  3. 使用“ new”运算符创建一个新的块表记录,并将其添加到块表(AcDbBlockTableRecord,AcDbBlockTable :: add())。 (由于我们修改了块表,因此必须将其打开以进行写入)。 初始化新的块表记录。 将原点设置为(0,0,0)(AcDbBlockTableRecord :: setOrigin(AcGePoint3d :: kOrigin))。 设置名称。 如果块表记录已成功添加到AutoCAD数据库,则可以关闭块表.
  4. 创建“ EMPLOYEE”实体,并将其附加到新的块表记录中。 (AcDbBlockTableRecord :: appendAcDbEntity())“ EMPLOYEE”实体是三个圆(AcDbCircle)和一个圆弧(AcDbArc),其特征如下表所示。 使脸变黄,眼睛变蓝,嘴变红。 (AcDbEntity :: setColorIndex())
  5. 不要忘记关闭新创建的实体,块表记录和块表.
  6. 使用AcDbCircle时,AcDbArc需要包含文件<dbents.h>。 同样,您不必如上所述添加include,因为此标头包含在“ arxHeaders.h”文件中
  7. PI可以定义为3.141592654.

 

“ EMPLOYEE”块定义的数据:

Block name
"EMPLOYEE"
AcDbBlockReference        
Block origin (0, 0, 0)        
Face characteristics AcDbCircle (yellow) Center
= (0, 0, 0)
Radius = 1.0    
Left eye AcDbCircle (blue) Center
= (0.33,0.25,0)
Radius = 0.1    
Right eye AcDbCircle (blue) Center
= (-0.33,0.25,0)
Radius = 0.1    
Mouth AcDbArc (red) Center
= (0,0.5,0)
Radius = 1.0 Start Angle
= PI+(PI*0.3)
End Angle
= PI+(PI*0.7)

 

尝试自己实现这两个功能。 不要忘记ObjectARX联机帮助。 如果卡住,可以打开解决方案 Step03解决的项目 并研究“ utilities.cpp”文件中的代码.

 

NEXT: 实现CREATE和SETLAYER命令

Utility Functions
Copyright ? 2013 Autodesk, Inc.