本節中我們通過創建幾何空間點、曲面和采樣線了解Civil 3D對象的創建方法。因Civil 3D對象的創建方法相比AutoCAD對象創建要簡單的多,比如創建一個幾何空間點,最簡單的情況采用一行代碼(沒寫錯,就是一行)就能實現,類似的操作,您完全可以去Developer’s Guide中查看,因此在本節加入了類的繼承及多態的一些知識,這是讓程序更加高效、使代碼更為簡潔的有效方式。我自己在學習Civil 3D二次開發之初,按照Developer’s Guide中的樣例去寫,結果發現存在大量的重復代碼,究其原因,是對類沒有很好的理解和應用,所以,即使會給您閱讀本節內容造成不小的困難,我也要把您往面向對象程序設計的路上引領。如果您只想采用結構化程序設計,可以只關注我對Civil 3D對象創建方法的分析及幫助文檔查詢方法的介紹就行了,之后參考Developer’s Guide其他的示例。
上一節中,我們在同一個類CreateEntityDemo中創建了三個方法,分別創建了直線、圖層、布局,這一節我們將創建一個名為CivilCreateEntityDemo的基類和三個名稱分別為CivilCreateCogoPoint、CivilCreateTinSurface、CivilCreateSampleLine的派生類,在每個類中的采用重寫(override)基類方法CivilCreateEntity的方式完成相應的操作。在完成命令方法的時候,通過多態來完成不同的操作。
下面就讓我先來創建基類CivilCreateEntityDemo:
在解決方案按中添加類,名稱CivilCreateEntityDemo,並添加4個字段、構造函數及方法CivilCreateEntity及GetString(從editor獲取字符串)。為了實現派生類能夠訪問基類的字段,需要采用protected關鍵字來修飾。為了派生類能夠重寫基類的方法,方法CivilCreateEntity需要用virtual關鍵字修飾。在構造函數中初始化各個字段,在GetString方法中添加相應代碼。現在你的代碼應該類似如下:
01 class CivilCreateEntityDemo 02 { 03 protected Document doc; 04 protected Database db; 05 protected Editor ed; 06 protected CivilDocument civilDoc; 07 public CivilCreateEntityDemo() //構造函數 08 { 09 doc = Application.DocumentManager.MdiActiveDocument; 10 ed = doc.Editor; 11 db = doc.Database; 12 civilDoc = CivilApplication.ActiveDocument; 13 } 14 virtual public void CivilCreateEntity() //可重寫的虛方法 15 { 16 ed.WriteMessage("\n我什么也沒做!"); 17 } 18 public void GetString(string mess, ref string stringOut) //獲取字符串 19 { 20 PromptStringOptions pso = new PromptStringOptions(mess); 21 pso.UseDefaultValue = true; 22 pso.DefaultValue = stringOut; 23 PromptResult pr = ed.GetString(pso); 24 if (pr.Status == PromptStatus.OK) 25 { 26 stringOut = pr.StringResult; 27 } 28 } 28 }
再次強調如下:注意第3-6行的protected關鍵字,注意第14行的virtual關鍵字。第16行中代碼是為了測試用的,如果您有興趣想測試一下調用基類方法或在派生類中沒有重寫相應方法時,可以向命令行輸出相應的信息。
字段應設為私有(用private來修飾)更合適,這里為了簡化代碼,采用了protected來修飾。如果采用來private修飾,需要增加屬性,以便派生類能順利訪問基類的字段。關於屬性,您可以查閱C#相關書籍獲取更多信息。
一個簡單的基類准備完成,下面我們就創建多個派生類來完成創建Civil 3D對象。