De longe, Acessando o ArcObjects a partir do Python? é a minha sessão de perguntas e respostas mais lida e referenciada no GIS Stack Exchange. Apesar desse sucesso, é provavelmente uma das minhas áreas mais fracas quando se trata de uso real. Grande parte dessa exibição ruim deriva da minha pouca capacidade de ler e entender os documentos do ArcObjects .
Portanto, para qualquer tarefa específica, quais são algumas diretrizes para traduzir documentos e exemplos .net / c ++ / java / ... em seus equivalentes em python? (qual idioma é o melhor para trabalhar nesse assunto?) e qual é o melhor índice ou página de destino para começar? que material deve ser focado e, provavelmente, pelo menos tão importante, o que pode ser livremente ignorado?
Suponha que seu público seja alfabetizado em python e analfabeto em outras linguagens de desenvolvimento. Siga-nos através de um pequeno exercício de codificação, desde a ideia inicial e a pesquisa até os resultados de python em funcionamento.
fonte
Respostas:
Também não sou muito forte nessa área, mas modifiquei o módulo Snippets e criei alguns wrappers para tarefas muito simples. Eu tenho um exemplo de apenas adicionar elementos de linha. O exemplo no bloco principal forma um triângulo para a visualização do layout, fora do documento.
Eu uso esse script em conjunto com outros cursores de pesquisa e arcpy para criar tabelas gráficas no layout a partir de linhas individuais e elementos de texto, mas isso rapidamente se afasta do exemplo "simples". O código abaixo é bastante simples e usa uma versão modificada dos trechos:
Editar:
@matt wilkie
Quanto a descobrir as importações, é aí que você terá que examinar os diagramas de modelos do ArcObjects ou ver em qual namespace uma classe ou interface específica está sendo chamada nos documentos de ajuda do .NET SDK. Em alguns casos, mais de um espaço para nome pode ser usado devido à herança.
Como não sou especialista em ArcObjects, normalmente levo um tempo para descobrir quando lançar as coisas com CType (). A maior parte disso, eu peguei de amostras online. Além disso, a sintaxe dos exemplos do VB.NET parece estar mais próxima do que você faz no Python, mas os exemplos em C # fazem mais sentido para mim em termos de legibilidade (se isso faz algum sentido). Mas, como regra geral, eu costumo seguir estas etapas:
Não tenho certeza se estou usando a terminologia adequada ou não ... Eu sou principalmente um desenvolvedor Python que "brinca" em alguns ArcObjects ... Mas apenas toquei a ponta do iceberg.
Além disso, essa função auxiliar carregará todas as bibliotecas de objetos do ArcObjects (.olb):
fonte
import comtypes.gen.esriArcMapUI as esriArcMapUI
e depois usoupMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
(e descobriu a sintaxe nessa instrução)?Em outro post, relacionado, mas um pouco diferente, forneci uma resposta que pode ser de interesse para usuários de python que tentam entender os documentos de ajuda do Esri ArcObjects.
Eu vim do outro lado: eu já conhecia o ArcObjects muito (muito tempo) antes mesmo de ouvir falar de python e, graças a posts como esses, sou capaz de incluir alguns ArcObjects críticos no fácil script de python (veja este post, por exemplo) ) Lembro-me da frustração de tentar entender herança, métodos e propriedades; dilemas como eu tenho X, que é meio que relacionado a Y ... então, como faço para ir de X a Y.Method ()?
A resposta é olhar para as CoClasses que implementam a interface (veja o texto completo aqui ) .. para um exemplo básico, se eu quiser ver se uma camada tem uma consulta de definição e, em caso afirmativo, qual é:
Em c #:
Em vez de
ctype
(que é destaque no VB), o C # usa()
ouas
para transmissão, por exemplo,IObject x = (IObject)y;
é (fundamentalmente) o mesmoIObject x = y as IObject;
que seriadim x as IObject = ctype(y,IObject)
no VB.Posso dizer que preciso de um IFeatureLayer para chegar ao IFeatureLayerDefinition porque:
E quando você lê o documento de ajuda do IFeatureLayer, vê:
O que indica que é seguro acessar ILayer-> IFeatureLayer-> IFeatureLayerDef, desde que o ILayer seja do tipo FeatureLayer (ou qualquer um dos outros CoClasses).
Então, o que há com os "eu" e "não"? A interface I significa, é a parte que faz o trabalho, sem um I é um CoClass (um tipo ), então tudo o que você deseja realmente usar deve começar com um I e se você estiver criando um novo ou verificando o tipo depois pule o I. Uma interface pode ter muitas CoClasses e uma CoClass pode suportar muitas interfaces, mas é a interface que realmente faz o trabalho.
Em python:
Este exemplo faz um pouco mais do que o C, na medida em que encontra o caminho para o aplicativo atual, que só estaria disponível na janela python ou em um complemento, se você tentasse executá-lo na linha de comando, o aplicativo seria Nulo e o script seria falha com uma exceção de referência nula.
fonte