Diretrizes para organizar caixas de ferramentas Python (.pyt) no ArcGIS

17

Para uma das minhas tarefas, preciso criar uma caixa de ferramentas com três ferramentas (scripts python).

Em vez do tbx comum, decidi escrevê-lo como Python Toolbox (pyt).

Tudo está claro, exceto a maneira "boa" de organizar o código.

Como tenho três ferramentas, não é uma boa maneira de armazená-las em um arquivo (pyt). Então, decidi manter cada ferramenta em um arquivo .py separado.

Aqui está um problema: qual é a boa maneira de organizar vários arquivos com PYT para distribuição ou implantação no ArcGIS for Server? Devo mantê-los no mesmo nível do arquivo PYT ou devo colocá-los em algum subdiretório (por exemplo, "Ferramentas")?

Você pode recomendar diretrizes da Esri ou amostra de referência "big PYT toolbox"?

Não encontrei nada sobre esse assunto. Na versão 10.0, havia a chamada estrutura de pastas do ToolShare que eu usei.

Esta é mais uma questão de estilo de codificação. Porque a idéia de criar um arquivo PYT com 500-1000 ou mais linhas de código não parece boa para mim e acredito que não seja uma maneira "pitônica".

Alex Markov
fonte
1
"a ideia de criar um arquivo PYT com 500-1000 ou mais linhas de código não me parece boa". Você não está sozinho, Alex. Hoje afirmei prontamente que o .pyt é uma invenção da mente doentia. E não vou me arrepender.
Remigijus Pankevičius

Respostas:

17

Dê uma olhada neste tópico no fórum do ArcGIS. Basicamente, basta usar módulos python padrão ou uma estrutura de pacote e importar suas ferramentas para a caixa de ferramentas python.

Algo como:

#  \--SomeDir
#     |  toolbox.pyt
#     \--toolpackage
#        |  __init__.py
#        |  script_a.py
#        |  script_b.py


#----------------------------
#The .pyt file
#----------------------------

import arcpy
import toolpackage.script_a.Tool1 as Tool1
import toolpackage.script_a.Tool2 as Tool2
import toolpackage.script_b.Tool3 as Tool3

class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "MultiTool Toolbox"
        self.alias = "mtt"

        # List of tool classes associated with this toolbox
        self.tools = [Tool1, Tool2, Tool3]
user2856
fonte
Descobri que isso funciona bem no ArcGIS Desktop, mas ao publicar um serviço de geoprocessamento em uma instância do ArcGIS Server, ele perde todos os scripts e pacotes, além do arquivo .pyt. Pode ser possível soltar os scripts na implantação manualmente, mas isso aumenta a complexidade.
Gnat
3
@ Gennat Sim, os pensamentos de Luke também são a minha experiência. Os serviços de publicação da ESRI não reconhecem nenhuma das from x import yimportações de estilos. (Isso é totalmente ridículo.) No entanto, acredito que você pode deixar sua self.toolsdefinição em paz e usá-la import toolpackage.script_a.Tool1 as Tool1.
Jpmc26
1
O alias deve ser curto e conter apenas letras, ou seja, self.alias = "mtt"
Curtis Price
2
Desde que passei uma hora fazendo alterações no meu código de ferramentas e tentando parecer refletido no guia de ferramentas do Arcmap, gostaria de compartilhar isso. Se você fizer alterações no seu código fora do arquivo pyt e desejar vê-lo refletido no gui da ferramenta, será necessário reiniciar o ArcMap / Catalog. Você pode clicar em Atualizar na caixa de ferramentas tudo o que quiser, que parece apenas recarregar o próprio pyt. Ele não encontrará as alterações no outro código.
TurboGus
1
@TurboGus gis.stackexchange.com/q/91112/2856
user2856