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;
}
6)在CLineUtil類中添加一個Add函數,它的實作非常簡潔:
AcDbObjectId CLineUtil::Add( const AcGePoint3d &startPoint, const AcGePoint3d &endPoint, AcDbDatabase *pDb )
{
// 建立直線實體
AcDbLine *pLine = new AcDbLine(startPoint, endPoint);
// 将直線實體添加到模型空間
return CDwgDatabaseUtil::PostToModelSpace(pLine, pDb);
}
7)在CEntityUtil類中添加SetColor函數,修改實體的顔色,其實作代碼如下:
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();
}
}
8)利用ObjectARX向導注冊一個新指令ChangColor2,實作的功能仍然是添加一條直線,修改它的顔色為“紅色”,如下:
// 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指令