我已經出離的憤怒了,對於這個問題一年半以前曾經研究過,上過學期又回過頭來弄過,但是到現在我仍然沒有像樣的把這個問題解決掉!所以下定決心抽一點時間把這個問題解決一下。不求做出來的東西功能多么全面,但求弄夠實現基本功能!
參考了一些代碼,但是還是沒有完全得到要領!目前開發ArcGIS編輯模塊有兩種方式:一種是用IEngineEditor接口。
先來實踐混合用的,http://www.gisall.com/html/52/25952-2752.html 文中提出:
EditTool用ControlsEditingEditToolClass |
分析ArcGIS編輯工具條的功能,發現Edit Tool單擊時當前的任務為Create New Feature,雙擊時為Modify Feature。仔細觀察:
起始:開始編輯高亮,其他按鈕全灰。默認任務狀態“Create New Feature新建要素”。 開始編輯:停止編輯,保存編輯高亮,Edit和Sketch按鈕高亮。Edit按鈕選中,當前圖層和當前任務選擇框高亮,當前圖層為第一個圖層。 創建要素狀態:選擇Sketch創建要素;選擇Edit按鈕,單擊選擇要素,雙擊進入“Modify Feature”。 修改要素狀態:Edit按鈕默認選中。點擊要素,Sketch按鈕高亮,可以移動節點。選擇Sketch可以接着最后節點繪制。 |
在幫助文檔中知道EngineEditor是singleton object,這個很重要啊!
在How to listen to edit events幫助可以看到下面一句話:
In .NET, event interfaces are automatically suffixed with _Event by the type library importer. |
IEngineEditEvents_Event事件接口,通過Iengineditor接口跳轉訪問。這里思考一下“事件”,“事件”起作用關建還是他訂閱的方法不是嗎?那么我如果將事件訂閱自己定義的方法不是可以實現很多東西嗎?“事件”可不是單單用戶點擊鼠標鍵盤這樣的才叫事件啊,類也可以定義“事件”,可以定義“事件”訂閱的方法。EngineEditor的事件應該包裝了AxMapControl的MouseDown、MouseMove、DoubleClick等事件(個人理解)。EngineEditor實際應該是和界面分離的,如何實現編輯功能與編輯工具條的狀態的聯動是很關鍵的,所以一個思路就是將IEngineEditor的事件訂閱自己定義的方法來實現界面狀態的聯動。(計划重新學習委托和事件):
IEngineEditEvents內部接口,實現了事件訂閱的方法(個人理解!)
通過EngineEditor完全可以實現編輯的所有功能。IEngineEditor可能對IWorkspaceEdit接口進行了調用(個人理解,以后如果有新的想法在說。)開發工作正在進行,參考引文撤銷和重做功能按鈕就是通過IWorkspaceEdit來實現的,這樣只能在繪制新要素完成和編輯完成之后進行重做和撤銷,而ArcGIS中可以實現在編輯中的撤銷操作。所以有用ToolBar的OperateStack來實現撤銷和重做的,目前撤銷和重做采用IWorkspaceEdit實現,所以是混合了IEngineEditor和IWorkspaceEdit。而且按照自己的思路開發是可行的。(2012-02-26——11:30:12)
另外一種是用IWorkspaceEdit接口http://www.cnblogs.com/aplsc/archive/2008/08/31/1280594.html,決定嘗試一下。