zoukankan      html  css  js  c++  java
  • PIE SDK算法的自定义扩展

    1.算法功能简介

        算法的自定义扩展允许用户自主开发新的算法。自定义的算法必须实现PIE.SystemAlgo.BaseSystemAlgo基础类,这样才能被PIE的算法管理器调用起来。

    2.算法功能实现说明

    2.1. 示例简介

        本算法用于实现栅格影像的拷贝。参数类“AlgoParams.cs”用于存放要拷贝的路径和拷贝到的路径,算法类“Algo.cs”用于执行算法,窗体类“FormTest.cs”用于接收用户输入的要拷贝的路径和拷贝到的路径,Command类“AlgoCommand.cs”用于实现算法调用。

        算法类“Algo.cs”继承自BaseSystemAlgo,该类实现了ISystemAlgo, ISystemAlgoEvents两个接口。以下对BaseSystemAlgo类的属性,方法和事件进行介绍:

    属性介绍

    Description

    String

    描述

    Name

    String

    名称

    Params

    String

    参数

    方法介绍

    Execute()

    Bool

    执行算法,返回结果:是否执行成功

    GetErrorInfo(ref int errCode, ref string errMsg)

    Void

    获取错误信息,参数: errCode:错误信息编号,errMsg:错误信息描述

    事件介绍

    OnExecuteCompleted

    OnExecuteCompletedEventHandler

    执行完成事件

    OnProgressChanged

    OnProgressChangedEventHandler

    进度变化事件

    2.2. 实现步骤

    第一步

    编写参数类“AlgoParams.cs”

    第二步

    构造算法类“Algo.cs”

    第三步

    新建窗体类“FormTest.cs”

    第四步

    写Command类实现算法调用

    2.3. 示例代码

    项目路径

    百度云盘地址下/PIE示例程序/10.算法调用/算法的调用方式/Algo.AlgoTest

    数据路径

    百度云盘地址下/PIE示例数据/栅格数据/04.World/ World.tif

    视频路径

    百度云盘地址下/PIE视频教程/10.算法调用/算法的调用方式/算法的自定义扩展.avi

    示例代码

      1         //(一)编写参数类“AlgoParams.cs”
      2          public class AlgoParams
      3     {
      4         /// <summary>
      5         /// 要拷贝的路径
      6         /// </summary>
      7         public string OpenFilePath;
      8 
      9         /// <summary>
     10         /// 拷贝到的路径
     11         /// </summary>
     12         public string SaveFilePath;
     13     }
     14          //(二)构造算法类“Algo.cs”
     15 public class Algo : PIE.SystemAlgo.BaseSystemAlgo
     16     {
     17         /// <summary>
     18         /// 构造函数
     19         /// </summary>
     20         public Algo()
     21         {
     22 
     23         }
     24 
     25         /// <summary>
     26         /// 执行算法
     27         /// </summary>
     28         /// <returns>是否执行成功</returns> 
     29         public override bool Execute()
     30         {
     31             AlgoParams m_AlgoParams = (AlgoParams)this.Params;
     32             if (string.IsNullOrEmpty(m_AlgoParams.OpenFilePath) || string.IsNullOrEmpty(m_AlgoParams.SaveFilePath)) return false;
     33             File.Copy(m_AlgoParams.OpenFilePath, m_AlgoParams.SaveFilePath, true);
     34             return true;
     35         }
     36     }
     37          //(三)新建窗体类“FormTest.cs”
     38          public partial class FormTest : Form
     39     {
     40         /// <summary>
     41         /// 算法参数
     42         /// </summary>
     43         private AlgoTest.AlgoParams m_Parm = new AlgoParams();
     44 
     45         /// <summary>
     46         /// 构造函数
     47         /// </summary>
     48         public FormTest()
     49         {
     50             InitializeComponent();
     51         }
     52 
     53         /// <summary>
     54         /// 算法参数
     55         /// </summary>
     56         public AlgoParams Params
     57         {
     58             get { return m_Parm; }
     59             set { this.m_Parm = value; }
     60         }
     61 
     62         private void buttonEdit_save_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
     63         {
     64             SaveFileDialog save = new SaveFileDialog();
     65             save.Title = "另存为";
     66             save.Filter = "Raster Files|*.tif";
     67             save.FileName = "";
     68             if (save.ShowDialog() == DialogResult.OK)
     69             {
     70                 this.buttonEdit_save.Text = save.FileName;
     71             }
     72         }
     73 
     74         private void simpleButton_ok_Click(object sender, EventArgs e)
     75         {
     76             if (string.IsNullOrEmpty(this.buttonEdit_tif.Text) || string.IsNullOrEmpty(this.buttonEdit_save.Text))
     77             {
     78                 MessageBox.Show("请输入路径!");
     79                 return;
     80             }
     81             m_Parm.OpenFilePath = this.buttonEdit_tif.Text;
     82             m_Parm.SaveFilePath = this.buttonEdit_save.Text;
     83             this.DialogResult = DialogResult.OK;
     84         }
     85 
     86         private void simpleButton_cancel_Click(object sender, EventArgs e)
     87         {
     88             this.Close();
     89         }
     90 
     91         private void buttonEdit_tif_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
     92         {
     93             OpenFileDialog open = new OpenFileDialog();
     94             open.Filter = "Raster Files|*.tif";
     95             open.Title = "选择栅格文件";
     96             open.Multiselect = false;
     97             if (open.ShowDialog() != DialogResult.OK) return;
     98             string filePath = open.FileName;
     99 
    100             IRasterDataset dataSet = DatasetFactory.OpenRasterDataset(filePath, OpenMode.ReadOnly);
    101             if (dataSet == null)
    102             {
    103                 MessageBox.Show("文件打开失败!");
    104                 return;
    105             }
    106             if (!dataSet.Open(filePath, OpenMode.ReadOnly))
    107             {
    108                 MessageBox.Show("文件打开失败!");
    109                 return;
    110             }
    111             this.buttonEdit_tif.Text = filePath;
    112         }
    113 }
    114          //(四)写Command类实现算法调用
    115          public class AlgoCommand: DesktopCommand
    116     {
    117         /// <summary>
    118         /// 构造函数
    119         /// </summary>
    120         public AlgoCommand()
    121         {
    122             this.Caption = "测试算法";
    123             this.Name = "AlgoCommand";
    124             this.ToolTip = "测试算法";
    125             this.Checked = false;
    126             this.Enabled = false;
    127         }
    128 
    129         /// <summary>
    130         /// 单击方法
    131         /// </summary>
    132         public override void OnClick()
    133         {
    134             #region 1、参数设置
    135             if (!this.Enabled) return;
    136             FormTest frmTest = new FormTest();
    137             if (frmTest.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
    138 
    139             AlgoParams info = frmTest.Params;
    140             PIE.SystemAlgo.ISystemAlgo algo = PIE.SystemAlgo.AlgoFactory.Instance().CreateAlgo("AlgoTest.dll", "AlgoTest.Algo");
    141             if (algo == null) return;
    142 
    143             PIE.SystemAlgo.ISystemAlgoEvents algoEvents = algo as PIE.SystemAlgo.ISystemAlgoEvents;
    144             algo.Name = "测试算法";
    145             algo.Params = info;
    146             algoEvents.OnExecuteCompleted += OnAlgoExcuteCompleted;
    147             algoEvents.OnProgressChanged += OnAlgoProgressChanged;
    148             #endregion
    149 
    150             //2、算法执行
    151             PIE.AxControls.IStatusBar statusBar = m_Application.StatusBar;
    152             statusBar.ShowProgress(0, 100, "");
    153             PIE.SystemAlgo.AlgoFactory.Instance().AsynExecuteAlgo(algo);
    154         }
    155 
    156         /// <summary>
    157         /// 算法执行完成事件
    158         /// </summary>
    159         /// <param name="algo">算法</param>
    160         private void OnAlgoExcuteCompleted(PIE.SystemAlgo.ISystemAlgo algo)
    161         {
    162             PIE.AxControls.IStatusBar statusBar = m_Application.StatusBar;
    163             statusBar.UpdateProgress(100, "");
    164             statusBar.HideProgress();
    165 
    166             //3、结果显示
    167             AlgoParams info = (AlgoParams)algo.Params;
    168             PIE.Carto.ILayer layer = PIE.Carto.LayerFactory.CreateDefaultLayer(info.SaveFilePath);
    169             m_HookHelper.FocusMap.AddLayer(layer);
    170             m_HookHelper.ActiveView.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll);
    171 
    172             PIE.SystemAlgo.ISystemAlgoEvents algoEvents = algo as PIE.SystemAlgo.ISystemAlgoEvents;
    173             algoEvents.OnExecuteCompleted -= OnAlgoExcuteCompleted;
    174             algoEvents.OnProgressChanged -= OnAlgoProgressChanged;
    175         }
    176 
    177         /// <summary>
    178         /// 算法进度变化事件
    179         /// </summary>
    180         /// <param name="complete">进度</param>
    181         /// <param name="msg">进度信息</param>
    182         /// <param name="algo">算法</param>
    183         /// <returns>int</returns>
    184         private int OnAlgoProgressChanged(double complete, string msg, PIE.SystemAlgo.ISystemAlgo algo)
    185         {
    186             PIE.AxControls.IStatusBar statusBar = m_Application.StatusBar;
    187             statusBar.UpdateProgress((int)complete, msg);
    188             return 0;
    189         }
    190     }
    View Code

    2.4. 示例截图

  • 相关阅读:
    oj1089-1096总结(输入输出练习)
    oj 1002题 (大数题)
    第五次博客园作业+
    第五次博客园作业-
    博客园第四次作业
    博客园第四次作业
    C语言第三次作业
    c语言第三次作业
    设计模式第一次作业
    项目选题报告(团队)
  • 原文地址:https://www.cnblogs.com/PIESat/p/10231750.html
Copyright © 2011-2022 走看看