Executar scripts Python em nós Sem toque (C#)
Executar scripts Python em nós sem toque (C#)
Se você estiver familiarizado com a escrita de scripts no Python e desejar mais funcionalidade dos nós padrão do Dynamo Python, poderemos usar o recurso Sem toque para criar nossos próprios. Vamos começar com um exemplo simples que nos permite passar um script Python como uma sequência de caracteres para um nó Sem toque, onde o script é executado e um resultado é retornado. Este estudo de caso será baseado nos tutoriais virtuais e nos exemplos na seção Introdução. Consulte os exemplos se você for completamente novo na criação de nós Sem toque.
Um nó Sem toque que executará uma sequência de caracteres de script Python
Mecanismo Python
O PythonNet3 agora é o mecanismo padrão com uma experiência mais simples se você estiver migrando do CPython. Todos os novos nós Python criados no Dynamo 4.0 e superior começam com o PythonNet3.
Esse nó depende de uma instância do mecanismo de scripts IronPython. Para fazer isso, precisamos fazer referência a algumas montagens adicionais. Siga as etapas abaixo para configurar um modelo básico no Visual Studio:
Criar um novo projeto de classe do Visual Studio
Adicionar uma referência ao
IronPython.dlllocalizado emC:\Program Files (x86)\IronPython 2.7\IronPython.dllAdicionar uma referência ao
Microsoft.Scripting.dlllocalizado emC:\Program Files (x86)\IronPython 2.7\Platforms\Net40\Microsoft.Scripting.dllIncluir as declarações
IronPython.HostingeMicrosoft.Scripting.Hostingusingna classeAdicionar um construtor vazio privado para evitar que um nó adicional seja adicionado à biblioteca do Dynamo com nosso pacote
Criar um novo método que toma uma única sequência de caracteres como um parâmetro de entrada
Dentro desse método, instanciaremos um novo mecanismo Python e criaremos um escopo de script vazio. Você pode imaginar esse escopo como as variáveis globais dentro de uma instância do interpretador Python
Em seguida, chamar
Executeno mecanismo que está passando a sequência de entrada e o escopo como parâmetrosPor fim, recuperar e retornar os resultados do script chamando
GetVariableno escopo e passando o nome da variável do script Python que contém o valor que você está tentando retornar. (Consulte o exemplo abaixo para obter detalhes adicionais)
O código a seguir fornece um exemplo para a etapa mencionada acima. A compilação da solução criará um novo .dll localizado na pasta bin de nosso projeto. Agora, é possível importar este .dll para o Dynamo como parte de um pacote ou navegar para File < Import Library...
O script Python está retornando a variável output, o que significa que precisaremos de uma variável output no script Python. Use esse script de amostra para testar o nó no Dynamo. Se você já tiver usado o nó Python no Dynamo, o seguinte deverá ser familiar. Para obter mais informações, consulte a seção Python do manual.
Várias saídas
Uma limitação dos nós Python padrão é que eles têm somente uma única porta de saída, portanto, se desejarmos retornar vários objetos, deveremos criar uma lista e recuperar cada objeto. Se modificarmos o exemplo acima para retornar um dicionário, poderemos adicionar quantas portas de saída desejarmos. Consulte a seção Retornar vários valores em “Aprofundar o conhecimento sobre o nó Sem toque” para obter informações mais específicas sobre os dicionários.
Esse nó está nos permitindo retornar o volume do cuboide e seu centroide.
Vamos modificar o exemplo anterior com estas etapas:
Adicionar uma referência ao
DynamoServices.dlldo gerenciador de pacotes do NuGetAlém das montagens anteriores, incluir
System.Collections.GenericeAutodesk.DesignScript.RuntimeModificar o tipo de retorno em nosso método para retornar um dicionário que conterá nossas saídas
Cada saída deve ser individualmente recuperada do escopo (considere a possibilidade de configurar um loop simples para conjuntos maiores de saídas)
Também adicionamos uma variável de saída (output2) ao script python de amostra. Lembre-se de que essas variáveis podem usar qualquer convenção de nomenclatura Python legal; a saída foi usada estritamente para fins de clareza neste exemplo.
Limitações conhecidas e soluções alternativas do PythonNet3
A seguir estão algumas limitações conhecidas e soluções alternativas ao usar o PythonNet3
As coleções do .NET não são convertidas automaticamente em listas do Python
É necessário converter explicitamente matrizes ou coleções
.NETusandolist(...)antes de usarlen(), indexação ou iteração.
Os métodos .NET genéricos podem exigir parâmetros de tipo explícito
Alguns métodos (por exemplo,
GroupBy) falharão, a menos que você especifique manualmente os tipos genéricos em vez de confiar na inferência automática.
Não é possível detectar métodos de extensão por meio de
dir()ou do preenchimento automáticoOs métodos de extensão ainda podem funcionar quando chamados explicitamente, mas não aparecem na introspecção ou na conclusão do código.
Os métodos de extensão DataTable não são compatíveis
A importação de
System.Data.DataTableExtensionsfalhará; não é possível usar esses métodos auxiliares diretamente.
Alguns métodos principais do Dynamo se comportam de forma diferente no PythonNet3
Algumas funções (por exemplo, aplainamento de lista) podem não funcionar conforme o esperado devido à manipulação mais rigorosa das coleções.
Não será possível transmitir as classes Python entre os nós se herdarem de tipos .NET
Não é possível transferir as classes derivadas de tipos ou interfaces .NET com segurança entre nós do Python.
O
set()do Python não aceita alguns objetos .NETObjetos como
InvalidElementIddevem ser filtrados ou tratados usando coleções .NET.
Chamadas de
print()frequentes podem causar crescimento de memóriaEvite o uso intenso de
print()em loops ou scripts de longa execução.
A interoperabilidade de dicionários entre o Dynamo e o Python é limitada
Os dicionários do Dynamo e do Python não são totalmente intercambiáveis e podem requerer conversão manual.
O método
Marshal.GetActiveObject()para obter a instância COM em execução de um objeto especificado não está mais disponívelUse
BindToMonikerse você conhecer o caminho do arquivo em uso.Codifique uma biblioteca em C# usando a estrutura de classes
Marshal.GetActiveObject()
Migrar do CPython3 para o PythonNet3
O Dynamo migrará automaticamente os nós do CPython para o PythonNet3. Veja o que acontece:
Uma cópia de backup do arquivo original é criada automaticamente.
Todos os nós do CPython (incluindo os nós personalizados que usam o CPython) são convertidos em PythonNet3.
Uma notificação do sistema informa quantos nós foram migrados.
Ao salvar, você verá um lembrete de que os nós do Python agora usarão o PythonNet3. Novamente, não se preocupe com a compatibilidade com versões anteriores: para aqueles que trabalham em ambientes com várias versões (por exemplo, Revit ou Civil 3D 2025/2026), instale o pacote do mecanismo PythonNet3 no Dynamo 3.3 a 3.6 para manter a compatibilidade.
Migrar do IronPython2 para o PythonNet3
Se o gráfico usar um mecanismo IronPython, não ocorrerá migração automática.
Se o pacote IronPython correspondente estiver instalado, o gráfico será executado normalmente. Se ele estiver ausente, você verá um aviso de dependência na extensão Referências do espaço de trabalho solicitando que você faça o download do pacote. É possível continuar usando o IronPython reinstalando o pacote. Mas como o IronPython não é atualizado há anos e o Dynamo não oferece suporte ativo a esses mecanismos no Dynamo há algum tempo, é altamente recomendável migrar para o PythonNet3 para garantir que os gráficos continuem funcionando de forma confiável no futuro. Embora o DynamoIronPython2.7 e o DynamoIronPython3 continuem disponíveis como pacotes no Dynamo Package Manager, eles não serão mais mantidos pela equipe do Dynamo.
Nesse caso, a opção de migração disponível é a migração nó a nó, usando o Assistente de migração disponível no Editor Python.
Para obter mais informações sobre a migração, consulte este blog
Last updated