VC6.0是1989年发布的,而VS2002是2002年发布的,VC6.0很经典,而VS2002则是C#的第一个IDE版本。
下面讨论VC6.0创建Workspaces和文件过滤器
一、VC6.0创建Workspaces
1) 打开VC6.0--》点击工具栏上的“File”---》New--》Workspaces--> 工作区间命名为:Chapter04
图(1)创建工作区间Chapter04
2)右击“Chapter04” ---》Add New Project to Workspaces ---》 选中“ObjectARX 2000/2000I/2002 AppWizard”-->将工程命名为:CreateLine2
---》 OK --》勾选“ Use MFC” --》Finish
3)打开Chapter04所在的文件夹,在与Chapter04同级的目录中新建一个MyCommon2文件,在其中再创建Document、Entity两个文件夹,
这些文件夹的位置关系如图(3)所示:
图(3)MyCommon2和Chapter04的位置关系
4)在VC6.0中添加类
4.1)选择【Insert/New Class】菜单项,系统弹出如图(4.1)所示的对话框。在该对话框中输入类的名称CLineUtil,如果直接单击【Ok】按钮完成类的创建,这个类的头文件和源文件就会保持在工程的目录里,这里我们改一下,我们把这个文件放置到上面创建的MyCommon2文件夹的Entity文件夹里。
单击【Change】按钮,系统弹出如图(4.2)所示的对话框。
图(4.1)输入类的名称
图(4.2)选择文件保持的位置
图(4.3) 选中Entity文件夹
图(4.4)保存在..\MyCommon2\Entity里
单击【Browse】按钮,系统弹出如图(4.3)所示的对话框。在该对话框中修改文件的保存位置,保存位置为:..\MyCommon2\Entity里(即上一步所创建的Entity文件夹里),将CLineUtil类 的 .h和 .cpp文件都保存在Entity文件夹里。
单击【OK】按钮后,回到FileView面板,我们可以看到,头文件和源文件被放置在默认的过滤器Headers Files和Sources Files中,如图(4.5)所示。
图(4.5)头文件和源文件的默认位置
图(4.6)拖动文件后,头文件和源文件的最终位置
实际上,VC++中的文件过滤器(或者称为筛选器) 与.Net中有很大的区别,它不能直接与存储的文件夹直接对应,而是可以灵活地指定任意位置的文件。
在这里,我们需要手工创建出与MyCommon2、Entity和Document文件夹对应的过滤器。
4.2)创建各个文件夹对应的过滤器,调整CLineUtil类的头文件和源文件在FileView中的正确位置。
在FileView面板中,右击“CreateLine2”--》New Folder--》命名为:MyCommon2
同理,右击MyCommon2 ——》New Folder ,在MyCommon2下添加名称为Entity和Document的过滤器。
在FileView面板中,选中LineUtil.h和LineUtil.cpp两个文件,将其拖动到Entity过滤器对应的节点,就得到如图(4.6)所示的结果。
4.3)采用同样的方法,在Entity文件中添加CEntityUtil类,在Document文件夹添加CDwgDatabaseUtil类。
5)在CDwgDatabaseUtil类中添加一个静态成员函数PostToModelSpace,用于将一个实体添加到当前图形数据库模型空间。
这个函数在CDwgDatabaseUtil.h的声明为:
//将实体添加到模型空间 static AcDbObjectId PostToModelSpace(AcDbEntity *pEnt, AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase());
在CDwgDatabaseUtil.cpp中的实现为:
AcDbObjectId CDwgDatabaseUtil::PostToModelSpace( AcDbEntity *pEnt, AcDbDatabase *pDb ) { // 检查输入参数的有效性 assert (pEnt); // 等效于assert (pEnt != NULL); // 获得当前图形数据库的块表 AcDbBlockTable *pBlkTbl = NULL; pDb->getBlockTable(pBlkTbl, AcDb::kForRead); // 获得模型空间对应的块表记录 AcDbBlockTableRecord *pBlkTblRcd = NULL; pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForWrite); pBlkTbl->close(); // 将实体添加到模型空间的块表记录 AcDbObjectId entId; Acad::ErrorStatus es = pBlkTblRcd->appendAcDbEntity(entId, pEnt); if (es != Acad::eOk) { pBlkTblRcd->close(); delete pEnt; // 添加失败时,要delete pEnt = NULL; return AcDbObjectId::kNull; } // 关闭模型空间块表记录和实体 pBlkTblRcd->close(); pEnt->close(); return entId; }
AcDbObjectId CLineUtil::Add( const AcGePoint3d &startPoint, const AcGePoint3d &endPoint, AcDbDatabase *pDb ) { // 创建直线实体 AcDbLine *pLine = new AcDbLine(startPoint, endPoint); // 将直线实体添加到模型空间 return CDwgDatabaseUtil::PostToModelSpace(pLine, pDb); }
void CEntityUtil::SetColor( AcDbObjectId entId, int colorIndex ) { // 检测参数的有效性 assert (colorIndex >= 0 && colorIndex <= 256); AcDbEntity *pEnt = NULL; if (acdbOpenObject(pEnt, entId, AcDb::kForWrite) == Acad::eOk) { pEnt->setColorIndex(colorIndex); pEnt->close(); } }
// This is command 'CHANGCOLOR2' void WhCHAP2CHANGCOLOR2() { // TODO: Implement the command //创建直线 AcGePoint3d startPoint(0,0,0); AcGePoint3d endPoint(100,100,0); AcDbObjectId lineId = CLineUtil::Add(startPoint,endPoint); //修改颜色 CEntityUtil::SetColor(lineId,1); }效果如下:
按F7编译该工程--》F5启动调试和AutoCAD2002--》在Cad2002的命令行窗口输入:applode --》加载相应的.arx文件 ——》输入changcolor2——》回车,结果如下:
图(6)输入appload加载.arx,再执行changcolor2命令