在本练习中,我们将实现实用程序功能,这些功能稍后将对实现我们的命令有用。 我们需要实现两个实用程序函数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文件。 在此文件中,我们将使用以下步骤添加函数的实现。 但在此之前添加以下包含语句:
用户定义的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的算法()
-
从当前的工作数据库(AcDbLayerTable,AcDbDatabase ::
getLayerTable())获取图层表。 要获取当前的工作数据库,请使用acdbHostApplicationServices()-> workingDatabase())。
-
检查是否已经存在相同名称的图层(AcDbLayerTable :: getAt())。 如果是这样,获取它的对象ID,并使用我们的createLayer()函数的第二个参数返回它.
-
如果该图层尚不存在,则必须创建该图层并将其添加到图层表(AcDbLayerTable :: getAt())中。 使用“ new”运算符创建一个新层(AcDbLayerTableRecord)。 由于我们将修改图层表,因此需要打开图层表以进行写入。 新创建的图层表记录将通过AcDbLayerTable
:: add()添加到图层表中。 我们将返回新创建的图层的对象ID-当然,在关闭之后.
-
使用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的算法()
-
从当前工作数据库中获取块表(AcDbBlockTable,AcDbDatabase :: getBlockTable())
-
检查块表记录是否已经存在(AcDbBlockTable :: has())。 如果存在,则返回错误状态(Acad :: eDuplicateKey)。 不要忘记关闭黑名单.
-
使用“
new”运算符创建一个新的块表记录,并将其添加到块表(AcDbBlockTableRecord,AcDbBlockTable :: add())。 (由于我们修改了块表,因此必须将其打开以进行写入)。 初始化新的块表记录。 将原点设置为(0,0,0)(AcDbBlockTableRecord :: setOrigin(AcGePoint3d :: kOrigin))。 设置名称。
如果块表记录已成功添加到AutoCAD数据库,则可以关闭块表.
-
创建“ EMPLOYEE”实体,并将其附加到新的块表记录中。 (AcDbBlockTableRecord ::
appendAcDbEntity())“ EMPLOYEE”实体是三个圆(AcDbCircle)和一个圆弧(AcDbArc),其特征如下表所示。 使脸变黄,眼睛变蓝,嘴变红。 (AcDbEntity :: setColorIndex())
-
不要忘记关闭新创建的实体,块表记录和块表.
-
使用AcDbCircle时,AcDbArc需要包含文件<dbents.h>。
同样,您不必如上所述添加include,因为此标头包含在“ arxHeaders.h”文件中
- 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”文件中的代码. |