0
头像

导入文件夹结构

我有一个导入不同类型文件的导入器。但是,它仅适用于单个文件,我想将其调整为整个文件夹。我在每个导入器中都使用了 _importDocuments 函数,但从未调用过该函数。可能它之前在 getPermissibleExtensions() 和tentativeAutoDetect 中被拒绝。

 

如何管理文件夹?

VL

13 条评论

0
头像

作为 Geneious 的用户,您只需选择文件夹中的所有文件并将它们拖放到一个组中,Geneious 应该为每个文件调用您的导入程序。对于将于今年晚些时候发布的 Geneious R9,Geneious 将有一个文件夹导入选项,该选项将自动为用户选择的文件夹中的每个文件调用您的导入程序。我建议你等到那时,但如果你现在真的需要导入文件夹,你可能需要在你的插件中实现一个 DocumentOperation 来提示用户输入一个文件夹并生成文档作为操作的输出。

希拉里·米勒(Hilary Miller) 0 票
评论动作 永久链接
0
头像

你知道最新版本什么时候发布吗?

VL 0 票
评论动作 永久链接
0
头像

它将在今年晚些时候推出。

理查德·摩尔 0 票
评论动作 永久链接
0
头像

Thank you.但只要不清楚何时发布新版本,我想我最好自己实现它。
不幸的是,我是 Geneious Plugins 的新手,不太明白我应该如何将我的导入器集成到 DocumentOperation 中。我有几个导入器类,如 MegAlign、PrimerSelection 、...我的类中的导入器 MyImporter 扩展了 GeneiousPlugin。我真的不明白应该在哪里集成 DocumentOperation。当我阅读 doumentation 时,似乎 GeneiousGridImporter[] getImporter() 将是正确的函数。但同样在 MyImporter 中从未调用过此函数。

VL 0 票
评论动作 永久链接
0
头像

你好

忽略网格类。这些用于在计算机网络上运行。

您应该做的是实现 GeneiousPlugin.getDocumentOperations() 并定义一个不需要输入的 DocumentOperation 并生成您作为输出导入的文档。例如:

公共文档操作[] getDocumentOperations() {
文档操作操作 = 新文档操作(){
@覆盖
公共 GeneiousActionOptions getActionOptions() {
return new GeneiousActionOptions("我从文件夹中自定义格式").setMainMenuLocation(GeneiousActionOptions.MainMenu.Import);
}

@覆盖
公共字符串 getHelp() {
返回空;
}

@覆盖
公共 DocumentSelectionSignature[] getSelectionSignatures() {
返回新的 DocumentSelectionSignature[0];
}

@覆盖
public void performOperation(AnnotatedPluginDocument[] annotatedDocuments, ProgressListener progressListener, Options options, SequenceSelection sequenceSelection, OperationCallback callback) 抛出 DocumentOperationException {
callback.addDocument(new DefaultNucleotideSequence("a", "GATT"), false, ProgressListener.EMPTY);
}
};
返回新的文档操作[]{操作};
}


您应该填写 performOperation 的详细信息以提示用户输入文件夹并创建文档。

希拉里·米勒(Hilary Miller) 0 票
评论动作 永久链接
0
头像

它现在有效。但理想情况下,我也想保留我的子文件夹。我不知道如何在给定路径中创建新文件夹并在特定文件夹中写入文件。

是否可以 ?

 

VL 0 票
评论动作 永久链接
0
头像

您可以使用 callback.setSubFolder(),但它不支持嵌套子文件夹。因此,如果您需要超过 1 级深的子文件夹,您可以在 performOperation 方法中执行以下操作:

 

DefaultNucleotideSequence sequence = new DefaultNucleotideSequence( "a" , "GATT" );
GeneiousService selectedService = ServiceUtilities。 getSelectedService ();
试试{
if (selectedService instanceof WritableDatabaseService) {
WritableDatabaseService 服务 = (WritableDatabaseService) selectedService;
service = service.createChildFolder( "folderName" ).createChildFolder( "subFolderName" );
service.addDocumentCopy(DocumentUtilities createAnnotatedPluginDocument(序列),ProgressListener EMPTY。);
}
其他{
callback.setSubFolder( "文件夹名" ); // 这不支持子文件夹
callback.addDocument(序列,,ProgressListener EMPTY。);
}
} catch (DatabaseServiceException e) {
抛出新的DocumentOperationException(e);
}
希拉里·米勒(Hilary Miller) 0 票
评论动作 永久链接
0
头像

如果未选择文件夹,则会弹出另一个窗口并询问目标文件夹。但是我无法通过 ServiceUtilities.getSelectedService() 获取这个新文件夹。我试图调用 ServiceUtilities.getResultsDestination(),但它第二次请求路径...我怎样才能抑制第一个弹出窗口或获取它的路径?

VL 0 票
评论动作 永久链接
0
头像

在 performOperation 开始时,您应该调用 ServiceUtilities.getSelectedService()。如果没有返回 WritableDatabaseService,则调用 ServiceUtilities.getResultsDestination()。然后将所有文档导入到该服务或其子文件夹中。

希拉里·米勒(Hilary Miller) 0 票
评论动作 永久链接
0
头像

这是我尝试过的。但是在performOperation之前已经显示了目的地选择的弹出窗口。当我调用 ServiceUtilities.getResultsDestination() 时,选择窗口会再次弹出,尽管我已经选择了一个文件夹。当我调用 ServiceUtilities.getResultsDestination() 时没有问题,我得到了我的目标文件夹。但是这个函数之前被调用过(我没有在其他地方调用它)并且我无法捕捉到它。

这是我为 performOperation 得到的:

 

public void performOperation(AnnotatedPluginDocument[] annotatedDocuments, ProgressListener progressListener, Options options, SequenceSelection sequenceSelection, OperationCallback callback) 抛出 DocumentOperationException {

                // 此时已经调用了 ResultsDestination
options.getOptions();
String pathname = options.getValueAsString("FolderToBeImported");
File[] files = new File(pathname).listFiles();

WritableDatabaseService service= (WritableDatabaseService) PluginUtilities.getGeneiousService("LocalDocuments");
GeneiousService selectedService = ServiceUtilities.getSelectedService();
if (!(selectedService instanceof WritableDatabaseService)) {
selectedService = ServiceUtilities.getResultsDestination(); // 这里调用了另一个 ResultsDestination
}

for(文件文件:文件){
服务 = (WritableDatabaseService) selectedService;

                    尝试 {
parentFolder = file.getParentFile().getName();
service = service.createChildFolder(parentFolder);

                    }抓住{...}

            }

 

 

VL 0 票
评论动作 永久链接
0
头像

抱歉,一开始我不太明白这个问题。您可以通过将其添加到您的 DocumentOperation 来解决这个问题:

 

@覆盖
公共布尔isDocumentGenerator() {
返回假
}
希拉里·米勒(Hilary Miller) 0 票
评论动作 永久链接
0
头像

这解决了一个问题,但实际上我返回了一个 PluginDocument (TextDocument),以防我的导入程序无法导入某些文档。我使用了 callback.addDocument(),但如果我将其设置为 false,这将不起作用;据我所知,该服务不支持 PluginDocuments,而只支持 AnnotatedPluginDocuments。

VL 0 票
评论动作 永久链接
0
头像

当覆盖 isDocumentGenerator 时,您应该忽略回调并将所有文档直接添加到服务中。任何 PluginDocument 都可以使用 DocumentUtilities.createAnnotatedPluginDocument() 包装在 AnnotatedPluginDocument 中。  

希拉里·米勒(Hilary Miller) 0 票
评论动作 永久链接