处理自动化扩展开发主要用于希望使用 SuperMap iDesktopX 工具箱进行处理自动化模型搭建,且现有工具无法满足功能需求的用户。您可跟随文档完成处理自动化工具的自定义扩展,并掌握在 SuperMap iDesktopX 工具箱中投入使用的步骤。
在进行工具的扩展开发之前,您可能需要了解工具的结构:
- 一个 ProcessRegistry(ProcessFactory) 中可以添加多个包含工具方法原型的类(一个类可以包含多个工具方法原型)。
- 扩展开发一个基于方法的工具,就是按照一定的规则实现一个工具方法,并让某个 ProcessRegistry 能够找到该方法所在类。
-
工具的加载逻辑是:
- 用 ProcessManager 通过 factoryName 获取 IProcessFactory;
- 用 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 名称,负责处理资源化 |
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 。
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;
}
}
软件界面工具箱中出现自定义的工具,也可将其拖到模型窗口与其他工具组合使用。