twitter youtube facebook linkedin email
Connect with:

dal BIM in poi...

Python + Windows = Data Entry in Dynamo

Come ogni anno maggio è il mese non solo in cui fioriscono le rose ma anche i rilasci di software Autodesk e di conseguenza i training sulle nuove versioni.

Nell’ambito di questi training ho pensato bene di fare qualcosa che fosse, oltre che utile ai discenti, anche divertente per me che dovevo preparare le lezioni.

Inutile dire che in questo momento mi diverte molto sperimentare con il linguaggio Python all’interno di Dynamo per cercare di estendere le potenzialità dell’ambiente di programmazione grafico e fornire una alternativa al DesignScript (che devo dire non mi piace molto) come linguaggio di programmazione.

Ho colto quindi l’occasione di una chiacchierata con una collega per dimostrare una interessante tecnica di interfaccia tra Dynamo e le API di Windows attraverso Python.

Il problema era quello di avere una maniera per selezionare interattivamente un elemento di una lista, per esempio un codice da un elenco di identificativi di parti.

La soluzione che avevano trovato i colleghi era scrivere un nodo in C#: trovate le informazioni su questo approccio qui (il post è in tedesco ma per chi come me non conosce questa lingua ci sono sempre i traduttori online).

L’approccio funziona ma è troppo complicato e soprattutto costringe a ricompilare il codice se cambia la lista: allora mi son detto “Proviamo a rifarlo con Python!” e nell’immagine che segue trovate il risultato di meno di 30 righe di codice.

Screenshot - 31_05_2016 , 10_45_05

Per ottenere questo risultato ho sfruttato le caratteristiche dell’implementazione di Python presente in Dynamo (Studio) e cioè di IronPyton: questa implementazione è molto ben integrata con la piattaforma Windows e .Net e questo rende possibile sfruttare quanto già disponibile per creare la “form” che ci serve.

Screenshot - 31_05_2016 , 10_51_20

Nell’immagine precedente il codice per creare la form:

  • Righe 2-6: riferimenti alle DLL di sistema Windows
  • Righe 8-9: creazione della maschera (form)
  • Righe 11-16: creazione della etichetta (label) ed aggiunta alla form
  • Righe 18-25: creazione dell’elenco a discesa (terribile traduzione di combo-box) ed aggiunta alla form
  • Righe 22-23: popolamento della combo-box con gli elementi provenienti dalla lista in ingresso
  • Riga 27: la form viene mostrata ed il programma aspetta finché la form rimane aperta
  • Riga 29: in uscita ho l’elemento selezionato della lista

Ovviamente è solo un primo abbozzo (ci starebbe bene un pulsante per chiudere la form, provateci voi) ma per dare una idea di cosa si può fare è un buon inizio.

Buon divertimento con Dynamo & Python!

PS: ovviamente attraverso le API di Windows si possono fare tante altre cose molto interessanti quali ad esempio ricavare il nome dell’utente connesso o del PC utilizzato o altro ancora

Featured Links

Stefano Toparini

Stefano si occupa da molti anni di BIM per le Infrastrutture nonché di reti tecnologiche e di gestione del territorio, con esperienze professionali maturate sia in Italia che all'estero. Lavora nella filiale Italiana di Autodesk Inc. da oltre 10 anni dopo esperienze in varie altre aziende di informatica e servizi nel mondo della progettazione e delle pubbliche amministrazioni.

3 Comments

View by:
Most Recent Oldest
  1. AvatarEnricoC@hellermanus.com

    Ciao Stefano, complimenti per l’articolo molto interessante! Ho provato a ricreare un nodo python con il tuo stesso codice, tuttavia mi ritorna il seguente errore:
    File “”, line 8, in
    NameError: name ‘form’ is not defined.
    Ciao.
    Enrico

    1. Stefano TopariniStefano Toparini (Post author)

      Ciao Enrico
      ho riprovato il codice e funziona: probabilmente nel copiare qualcosa è saltato.
      Riporto per te e per tutti qui sotto il codice in modo da poter fare cut&paste.
      Attenzione all’indentazione che in Python è parte della sintassi
      Un saluto
      Stefano
       

      import clr
      clr.AddReferenceByPartialName("System.Windows.Forms")
      clr.AddReferenceByPartialName("System.Drawing")
      from System.Windows.Forms import *
      from System.Drawing import *
       
      form = Form()
      form.Text = "Dynamo Form"
       
      label = Label(Text = "Choose an item:")
      label.Location = Point(30, 20)
      label.Font = Font("Verdana", 15)
      label.Height = 30
      label.Width = 300
      form.Controls.Add(label)
       
      combo = ComboBox()
      combo.Size = Size(200, 100)
      combo.Location = Point(40, 80)
       
      for i in IN[0] :
          combo.Items.Add(str(i));
       
      form.Controls.Add(combo)
       
      Application.Run(form)
       
      OUT = combo.SelectedItem

       

  2. Avatarguidobonin

    Interessante, come sempre, la possibilita’ di personalizzare con un po’ di codice.
    Probabilmente Dynamo (del quale devo ancora, personalmente, scoprire bene le potenzialita’ per il mio lavoro) si presta particolarmente, dato che e’ nella sua natura.

    Mi fa piacere vedere che sei tornato a divertirti con il sano vecchio codice…

'