扩展组件工具

处理自动化扩展开发主要用于希望使用 SuperMap iDesktopX 工具箱进行处理自动化模型搭建,且现有工具无法满足功能需求的用户。您可跟随文档完成处理自动化工具的自定义扩展,并掌握在 SuperMap iDesktopX 工具箱中投入使用的步骤。

在进行工具的扩展开发之前,您可能需要了解工具的结构:

Structure

  • 一个 ProcessRegistry(ProcessFactory) 中可以添加多个包含工具方法原型的类(一个类可以包含多个工具方法原型)。
  • 扩展开发一个基于方法的工具,就是按照一定的规则实现一个工具方法,并让某个 ProcessRegistry 能够找到该方法所在类。
  • 工具的加载逻辑是:

    1. 用 ProcessManager 通过 factoryName 获取 IProcessFactory;
    2. 用 IProcessFactory 通过 Name 获取工具

    注:IProcessFactory 与 IProcess 是一对多的关系。

扩展组件工具大致可以分为新建自定义工具类、注册自定义工具类、定义工具方法和注册工具四个步骤。以产品包中 %SuperMap iDesktopX_HOME%\templates\SampleCode 工程中 objectsgp 文件夹为例进行说明。具体如下:

点击此处下载示例代码

1. 新建自定义工具类

新建自定义工具类 SampleCodeRegistry 类继承 AbstractProcessRegistry 类,其中:

getName factory Name,即一级分组标识
getDefaultNamespace 二级分组,当前factory对应的工具不存在Namespace时,会采用默认Namespace
getTitle 显示名称
getDescription 描述信息
getResourceBundleName resource Bundle 名称,负责处理资源化
### ![](../../../img/CodeExamples.png) 示例代码
public class SampleCodeRegistry extends AbstractProcessRegistry {

    public SampleCodeRegistry(){
        this.classes.add(SampleCodeFunctions.class);
    }

    @Override
    public String getName() {
        return "iobjects_sample_code";
    }

    @Override
    public String getDefaultNamespace() {
        return "com.supermap.desktop.develop.objectsgp.default";
    }

    @Override
    public String getTitle() {
        return DevelopProperties.getString("String_ObjectsProcess");
    }

    @Override
    public String getDescription() {
        return DevelopProperties.getString("String_ObjectsProcess");
    }

    @Override
    public String getResourceBundleName() {
        return "Develop";
    }
}

2. 注册自定义工具类

新建 META-INF\services\com.supermap.sps.impl.annotated.annotation.ProcessRegistry文件,并注册自定义工具类 SampleCodeRegistry 。

Register

3. 定义工具方法

定义工具方法就是确定好工具输入输出参数,并且编写工具的执行方法体。

例如:

static Object annotatedStaticMethodProcessDemo(
    Object input
){
    /* do something */
    return input;
 }

我们可以使用SuperMap注解来描述工具的基本信息、结果和参数等。常用的注解有:

  • @ProcessDef:标示工具名称;
  • @Namespace:标示工具的命名空间,当工具数量较多时便于分组;
  • @InputDef:输入参数;
  • @OutputDef:输出参数。

例如:

@ProcessDef(name = "annotatedStaticMethodProcessDemo")
@Output(name = "output")
static Object annotatedStaticMethodProcessDemo(
    @InputDef(name = "input") Object input
){
    /* do something */
    return input;
 }

此外,工具的方法体编写过程中,我们可能会用到以下信息:

  • 进度信息:工具添加上下文对象 AnnotatedStaticMethodContext 参数,并通过 context 中的 AnnotatedRunningListener 对象监听工具执行的进度。
  • 资源化:

    • 使用 ResourceBundle 资源化 caption 和 description 字符串,方便支持国际化。
    • 在工具所属的 registry 中的 getResourceBundleName() 方法中指定的 resourceBundle ,并在该文件中添加词条。
  • meta:工具输入的附加信息,一些输入参数的值域限定,比如缓冲区的数据源只支持点线面数据集。

4. 注册工具

在 ProcessRegistry 类中注册工具,其中,ProcessRegistry 的 factoryName 就是工具的 factoryName 。

如果已经注册,跳过此步。

例如:

public class SampleCodeRegistry extends AbstractProcessRegistry {

    public SampleCodeRegistry(){
        this.classes.add(SampleCodeFunctions.class);
    }

以自定义一个矢量数据集的查找重复点的工具为例,具体代码如下:

public class SampleCodeFunctions {

    @NamespaceDef(namespace = "com.supermap.desktop.develop.objectsgp.vector", title = "String_DatasetVector", description = "String_DatasetVector")
    @ProcessDef(name = "findDuplicatePoints", caption = "String_FindDuplicatePoints", description = "String_FindDuplicatePoints")
    @OutputDef(name = "duplicatePointsDataset", caption = "String_ResultDatasetVector", description = "String_ResultDatasetVector", outputSourceType = OutputSourceType.RETURN)
    public static DatasetVector findDuplicatePoints(
            @InputDef(name = "sourceDataset", caption = "String_SourceDataset", description = "String_SourceDataset", meta = {"supportType={POINT}"}) DatasetVector datasetVector,
            @InputDef(name = "tolerance", caption = "String_Tolerance", description = "String_Tolerance", defaultValue = "0.0000001", meta = {"minValue=0.0","left=open","right=open"}) double tolerance,
            @InputDef(name = "resultDatasource", caption = "String_ResultDatasource", description = "String_ResultDatasource") Datasource datasource,
            @InputDef(name = "resultDatasetName", caption = "String_ResultDataset", description = "String_ResultDataset", defaultValue = "duplicatePointsDataset") String resultDatasetName,
            AnnotatedStaticMethodProcessContext annotatedStaticMethodProcessContext) {
        SteppedListener listener = annotatedStaticMethodProcessContext == null ? null : new ObjectsEventSender(annotatedStaticMethodProcessContext.getAnnotatedRunningListener());
        if (listener != null) {
            TopologyValidator.addSteppedListener(listener);
        }
        DatasetVector result = TopologyValidator.validate(datasetVector, null, TopologyRule.POINT_NO_IDENTICAL, tolerance, null, datasource, resultDatasetName);
        if (listener != null) {
            TopologyValidator.removeSteppedListener(listener);
        }
        return result;
    }

}

软件界面工具箱中出现自定义的工具,也可将其拖到模型窗口与其他工具组合使用。

ToolInDockbar