基於sharpdevelop核心和ArcEngine打造插件式桌面GIS應用之四——工具欄


  系統演示請看《我的插件GIS系統演示

  今天來講一下工具欄的設計,目前是完全按照Sharpdevelop(我把它簡稱為SD)的規則建立工具欄,講的內容也完全是SD中如何定義工具欄,大家有興趣的話也可以實現自己的工具欄加載機制,我現在在另一個項目中已經脫離SD,通過Sqlite數據庫配置界面,實現了一個簡單的插件框架。

  使用sharpdevelop的插件機制之后,工具欄的開發已經非常便捷,主要優點有:
  1、插件方式,裝配、修改便捷
  由於SD的插件配置文件采用XML文件,便於閱讀,我們可以根據自己的需求新建、修改配置信息。實現滿足特定需求的工具欄。

  2、利用Condition實現條件可視化
  很多時候,工具欄按鈕是否顯示(Visible)、是否可用 (Enable)需要根據特定條件變化。SD框架設計了ICondition條件接口,通過實現該接口自定義類來完成條件可視化。

    <!--條件(單一條件),當前活動窗體是MapViewContent時顯示-->
<Condition name = "WindowActive" activewindow="GISP.Addin.ArcMap.Views.MapViewContent">
<ToolbarItem id = "New" icon = "Icons.16x16.NewDocumentIcon" tooltip = "${res:XML.MainMenu.FileMenu.New.File.Description}" class = "GISP.Addin.ArcMap.Commands.NewMxdCommand"/>
<ToolbarItem id="OpenMxd" tooltip="${res:GIS.MapControl.Commands.OpenMXD}" icon="Icons.16x16.OpenFileIcon" class="GISP.Addin.ArcMap.Commands.OpenMxdCommand"/>
<ToolbarItem id="SaveMxd" tooltip="${res:GIS.MapControl.Commands.SaveMXD}" icon="Icons.16x16.SaveIcon" class="GISP.Addin.ArcMap.Commands.SaveMxdCommand"/>
<ToolbarItem id="SaveAsMxd" tooltip="${res:GIS.MapControl.Commands.SaveAsMXD}" icon="Icons.16x16.SaveIcon" class="GISP.Addin.ArcMap.Commands.SaveMxdAsCommand"/>
<ToolbarItem id = "Separator1" type = "Separator"/>
<ToolbarItem id="ExportToPic" tooltip="輸出圖片" icon="ArcGIS.MapOpen16" class="GISP.Addin.ArcMap.Commands.ExportActiveViewToPictureCommand"/>
</Condition>
<!--復合條件-->
<ComplexCondition>
<Or>
<Condition name="CADLayerTOCSelectItemConditionEvaluator" itemtype="null"/>
<Condition name="CADLayerTOCSelectItemConditionEvaluator" itemtype="group"/>
</Or>
</ComplexCondition>

  條件分為單一條件和復合條件。
  復合條件的復合關系包括有:And和Or。
  條件的action狀態分為不顯示(不指定)和不可用(action="disable")。 

  3、工具欄的父對象靈活指定
  工具欄可的父對象一般是主窗體,也可以是子控件、子窗體,通過簡單的代碼就可以在不同級別的對象上建立工具欄。 
  如果要子子窗體或者空間上顯示工具欄,只需要在代碼中添加類似代碼即可:

public partial class CatalogControl : UserControl
{

……
ToolStrip toolStrip = null;

#region 構造函數

public CatalogControl()
{
InitializeComponent();
InitControl();
     ……
}

#endregion

private void InitControl()
{
toolStrip = ToolbarService.CreateToolStrip(this, "/SDF/Pads/ArcGIS/CatalogPad/Toolbar");
toolStrip.GripStyle = ToolStripGripStyle.Hidden;
this.Controls.Add(toolStrip);
}

  

  接下來講一下如何定義工具欄,以地圖導航工具欄為例:
  1、首先定義工具欄按鈕實現類
   

 1 /// <summary>
2 /// 地圖放大
3 /// </summary>
4 class MapZoomInCommand : BaseMapControlCommand
5 {
6 public override void Run()
7 {
8
9 if (MapControl != null)
10 {
11 ESRI.ArcGIS.SystemUI.ICommand command = new ESRI.ArcGIS.Controls.ControlsMapZoomInToolClass();
12 command.OnCreate(MapControl.MapControlDefault);
13 MapControl.MapControlDefault.CurrentTool = command as ESRI.ArcGIS.SystemUI.ITool;
14 StatusBarService.SetMessage("放大");
15 }
16 }
17 }

  MapZoomInCommand的父類是BaseMapControlCommand,在內部封裝了DM控件、TOC控件、PageLayout控件的屬性,以便在子類中簡化實現。

 1     public class BaseMapControlCommand : AbstractCommand
2 {
3
4 protected DefaultMapControl MapControl
5 {
6 get
7 {
8 foreach (IViewContent view in WorkbenchSingleton.Workbench.ViewContentCollection)
9 {
10 if (view.Control is DefaultMapControl)
11 return view.Control as DefaultMapControl;
12 }
13 return null;
14 }
15 }
16
17 protected DefaultPageLayoutControl PageLayoutControl
18 {
19 get
20 {
21 foreach (IViewContent view in WorkbenchSingleton.Workbench.ViewContentCollection)
22 {
23 if (view.Control is DefaultPageLayoutControl)
24 return view.Control as DefaultPageLayoutControl;
25 }
26 return null;
27 }
28 }
29
30 protected TocControl TocControl
31 {
32 get
33 {
34 foreach (PadDescriptor pad in WorkbenchSingleton.Workbench.PadContentCollection)
35 {
36 if (pad.PadContent.Control is TocControl)
37 return pad.PadContent.Control as TocControl;
38 }
39 return null;
40 }
41 }
42
43 public override void Run()
44 {
45
46 }
47 }
 
        

 

  2、定義Addin文件

  命令類定義好之后,就需要在Addin文件中進行配置。 

<Path name="/SDF/Workbench/ToolBar/ArcMap_Navagation">
<Condition name = "WindowActive" activewindow="GISP.Addin.ArcMap.Views.MapViewContent">
<ToolbarItem id="ZoomIn" tooltip="${res:GIS.MapControl.Commands.ZoomIn}" icon="GIS.MapControl.ZoomIn" class="GISP.Addin.ArcMap.Commands.MapZoomInCommand"/>
<ToolbarItem id="ZoomOut" tooltip="${res:GIS.MapControl.Commands.ZoomOut}" icon="GIS.MapControl.ZoomOut" class="GISP.Addin.ArcMap.Commands.MapZoomOutCommand"/>
...... 

  配置時需要指定ID、提示信息、圖標和命令類。需要注意的是圖標需要保存在資源文件中。

 

  3、 啟動程序測試
    如果Addin文件沒有書寫錯誤,程序啟動后,會生成如下圖所示的工具欄。
 


補充

  工具欄按鈕的類型包括普通按鈕和下拉按鈕,普通按鈕的定義上面已經進行了介紹,這里對下拉按鈕做一個簡單說明。

  下拉按鈕的界面顯示類似下圖

  配置文件的格式如下代碼,注意指定type = "DropDownButton",其下拉項是menuitem

<ToolbarItem id      = "Editor" type = "DropDownButton" icon    = "ArcGIS.EditingLayerTarget16"
tooltip
= "編輯" class ="GISP.Addin.ArcMap.Commands.MapEditorDropDownList">
<Condition name="MapContainsLayer" itemtype="ESRI.ArcGIS.Carto:ESRI.ArcGIS.Carto.IFeatureLayer" action="Disable">
<Condition name = "EditState" state="notediting" action="Disable">
<MenuItem id="StartEdit" label="啟動編輯" icon="" class="GISP.Addin.ArcMap.Commands.MapStartEditingCommand"/>
</Condition>
<Condition name = "EditState" state="editing" action="Disable">
<MenuItem id="StopEdit" label="停止編輯" icon="" insertafter="StartEdit" class="GISP.Addin.ArcMap.Commands.MapStopEditingCommand"/>
<MenuItem id = "editStatusSeprator" type = "Separator" insertafter="StopEdit"/>
<MenuItem id="saveEdit" label="保存編輯" icon="" insertafter="editStatusSeprator" class="GISP.Addin.ArcMap.Commands.MapSaveEditingCommand"/>
<MenuItem id = "SaveEditSeprator" type = "Separator" insertafter="saveEdit"/>
<MenuItem id="Edit_Move" label="移動.." icon="" insertafter="SaveEditSeprator" class="GISP.Addin.ArcMap.Commands.MapEdit_MoveFeatureCommand"/>
<MenuItem id="Edit_Split" label="分解" icon="" insertafter="Edit_Move" class="GISP.Addin.ArcMap.Commands.MapEdit_SplitMultipleFeatureCommand"/>
<MenuItem id="Edit_Buffer" label="緩沖..." icon="" insertafter="Edit_Split" class="GISP.Addin.ArcMap.Commands.MapEdit_BufferFeatureCommand"/>
<MenuItem id="Edit_Union" label="合並..." icon="" insertafter="Edit_Buffer" class="GISP.Addin.ArcMap.Commands.MapEdit_MergeFeatureCommand"/>
<MenuItem id="Edit_Intersect" label="交集" icon="" insertafter="Edit_Union" class="GISP.Addin.ArcMap.Commands.MapEdit_IntersectFeatureCommand"/>
<!--<MenuItem id="SelectFeatures" label="求異" icon="" class="GISP.Addin.ArcMap.Commands.MapEdit_DifferenceFeatureCommand"/>-->
<MenuItem id="Edit_Cut" label="裁剪..." icon="" insertafter="Edit_Intersect" class="GISP.Addin.ArcMap.Commands.MapEdit_ClipFeatureCommand"/>
<MenuItem id="Edit_AddIntersectPointOfLine" label="添加交點..." insertafter="Edit_Cut" icon="" class="GISP.Addin.ArcMap.Commands.MapEdit_AddIntersectPointOfPolyLineFeatureCommand"/>
<MenuItem id="Edit_GeneralizeGeometry" label="一般化..." icon="AddIntersectPointOfLine" insertafter="Edit_AddIntersectPointOfLine" class="GISP.Addin.ArcMap.Commands.MapEdit_GeneralizeGeometryCommand"/>
<MenuItem id="Edit_DeleteOverlap" label="刪除壓蓋要素..." icon="" insertafter="Edit_AddIntersectPointOfLine" class="GISP.Addin.ArcMap.Commands.MapEdit_DeleteOverlapFeaturesCommand"/>
</Condition>
</Condition>
</ToolbarItem>



 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM