Opticks 開發者指南/概念
本節介紹了一些使用 Opticks 的主要概念。第一節描述了外掛架構。
Opticks 外掛架構使開發人員能夠輕鬆地新增用於匯入、處理和匯出遙感資料的功能。啟動時,Opticks 會掃描外掛目錄以查詢 Opticks 外掛。任何新的外掛都會自動註冊,其功能將可以使用。隨著新的外掛可用,Opticks 主應用程式無需更新。這使多個開發團隊能夠快速、獨立地建立功能。

如右圖所示,外掛架構由 Opticks 主應用程式、模組和外掛組成。一個模組將一個或多個外掛打包在 DLL 或共享物件中,並定義 Opticks 載入外掛的介面。模組也是一個方便的地方,可以放置多個外掛共享的程式碼。例如,該圖顯示了 NITF 匯入器和匯出器在同一個模組中,因為它們共享讀取和寫入 NITF 檔案格式的程式碼。
外掛是用 C++ 類實現的。要建立一個外掛,您只需從幾個預定義的外掛類型別中繼承,並新增自己的功能。下表顯示了基本的外掛型別
- 演算法 - 通用處理和利用演算法。
- 匯出器 - 用於儲存資料的外掛。
- 地理配準 - 支援新增新型地理配准算法的外掛。
- 匯入器 - 用於載入資料的外掛。
- 直譯器 - 指令碼語言支援。
- 柵格分頁器 - 用於動態請求柵格“畫素”資料的外掛。
- 檢視器 - 支援基本無模式對話方塊的外掛。
如該圖所示,Opticks 為外掛提供了通用服務。這些服務都可以透過通用的 Service 類訪問。ApplicationServices、DesktopServices、ModelServices 和 PlugInManagerServices 是主要的幾個服務。檢視 Service 文件以獲取完整的列表。每個服務都以相同的方式獲取,併為外掛提供與 Opticks 通訊的方法。
- ApplicationServices 提供對配置設定和會話資訊的訪問。
- DesktopServices 提供對 Opticks 主顯示機制的訪問。它提供建立工作區視窗、可停靠視窗和工具欄的功能。
- ModelServices 提供對活動會話中資料元素的訪問。
- PlugInManagerServices 為外掛提供訪問其他可用外掛的能力。
模組是透過 ModuleManager 類實現的。該類在 ModuleManager.h 標頭檔案中宣告,該標頭檔案包含在 Opticks 軟體開發工具包 (SDK) 的“include”目錄中。預設實現是在 ModuleManager.cpp 原始檔中提供的。外掛開發者應該獲取提供的預設 ModuleManager.cpp 原始檔並修改它以描述正在開發的模組。不應修改 ModuleManager.h 標頭檔案。
在 ModuleManager.h 中宣告並在 ModuleManager.cpp 中定義了模組設定變數,這些變數描述了模組。這些模組設定包括模組名稱、版本、描述和唯一的模組識別符號字串。ModuleManager 還包含一個名為 getPlugIn() 的方法。此方法用於 Opticks 獲取外掛類。此方法將索引作為引數,指定要返回的外掛,其中 0 表示第一個外掛。預設 ModuleManager.cpp 原始檔中 getPlugIn() 的實現應該被編輯以建立和返回您的外掛。下面的程式碼片段顯示了包含兩個外掛(匯入器和匯出器)的模組中 getPlugIn() 方法的可能實現。
PlugIn* ModuleManager::getPlugIn(unsigned long plugInNumber)
{
PlugIn* pPlugIn = NULL;
switch (plugInNumber)
{
case 0: // Get importer plug-in
pPlugIn = new NitfImporter();
break;
case 1: // Get exporter plug-in
pPlugIn = new NitfExporter();
break;
default:
break;
}
return pPlugIn;
}
每個外掛不應位於其自己的模組中,太多的模組會顯著增加 Opticks 載入時間。
外掛可以在互動模式或批處理模式下啟動。在互動模式下執行的外掛通常使用對話方塊從使用者請求資訊。然後使用使用者輸入來進一步執行外掛。相反,在批處理模式下執行的外掛不應包含使用者介面元件以從使用者獲取必要的輸入,而應該要求這些輸入存在於外掛的輸入引數列表中。這意味著外掛在互動模式和批處理模式下可能具有不同的引數數量。
為每種型別的外掛構建了 shell 類。這些 shell 類可用作建立外掛的起點。AlgorithmShell、ExporterShell、GeoreferenceShell、ImporterShell、InterpreterShell、RasterPagerShell 和 ViewerShell 就是幾個例子。shell 為該外掛型別實現了通用功能。例如,下圖顯示了 NITF 匯出器繼承自 ExporterShell 類。ExporterShell 實現了許多通用方法。外掛開發者應該從 shell 類繼承,過載方法,並使用 Opticks 服務來實現其獨特的功能。

大多數 shell 類繼承自 PlugIn 和 Executable 介面。這些通用外掛介面為 Opticks 提供了一種與外掛互動的標準方法。PlugIn 提供一個用於描述外掛的通用類。這包括外掛名稱、版本、描述和選單位置等資訊。Executable 是一個非常強大的通用介面,使所有外掛能夠以通用方式呼叫。
Executable 介面使 Opticks 能夠確定外掛的輸入和輸出引數,指定外掛是將以批處理模式還是互動模式執行,以及執行外掛。此介面使分析師能夠使用 Opticks 嚮導生成器將演算法連結在一起並自動化常見任務。
class Executable {
...
bool setBatch() = 0;
bool setInteractive() = 0;
bool getInputSpecification(PlugInArgList*& pArgList) = 0;
bool getOutputSpecification(PlugInArgList*& pArgList) = 0;
bool execute(PlugInArgList* pInArgList, PlugInArgList* pOutArgList) = 0;
bool abort() = 0;
...
}
getInputSpecification() 和 getOutputSpecification() 方法指定外掛的輸入和輸出引數。setBatch() 和 setInteractive() 方法有兩個目的,一是通知外掛它應該以批處理模式或互動模式執行,二是查詢外掛是否支援該模式。execute() 方法啟動外掛,可以由 Opticks 或其他外掛呼叫。abort() 方法由 Opticks 在使用者單擊進度對話方塊中的“取消”按鈕時呼叫,也可以由其他外掛呼叫。