videorevitapipythonrevitpythonshell

Le nove righe — uno script Revit vero, letto riga per riga

Nove righe di Python che riempiono 400 campi in meno di due secondi, lette una per una: import, collector, transazione, ciclo, LookupParameter, la riga della prudenza, Commit.

Paulo Giavoni

Paulo Giavoni

Ingegnere & Specialista BIM

22 agosto 20265 min di lettura

Cinquantatré minuti, o due secondi#

Quattrocento canali in un modello, e ognuno ha il suo campo «Commenti» da riempire a mano. Otto secondi a canale, se non ti fermi mai: fanno cinquantatré minuti. Un'ora del tuo mercoledì per scrivere quattrocento volte la stessa parola.

Nove righe di Python fanno la stessa cosa in meno di due secondi. Qui le leggiamo tutte e nove, senza saltarne nessuna.

L'unica immagine che serve#

Revit, per chi programma, è una scatola di pezzi già fatti. Python sono le tue mani. In mezzo c'è la forma degli incastri, e quella si chiama API. Ogni incastro ti dice come si chiama, cosa gli devi dare e cosa ti dà indietro. Tenuto questo, ogni riga che segue è un incastro.

Dove abitano le cose#

Revit.exe, RevitAPI.dll e RevitAPIUI.dll: il programma e le due scatole di mattoncini
Revit.exe, RevitAPI.dll e RevitAPIUI.dll: il programma e le due scatole di mattoncini
In «Programmi, Autodesk, Revit 2025» ci sono tre inquilini:
  • Revit.exe: il programma. Non lo tocchi mai.
  • RevitAPI.dll: la scatola dei mattoncini del modello. Muri, canali, parametri, transazioni. Lato DB, database.
  • RevitAPIUI.dll: l'altra scatola, l'interfaccia. Selezione, finestre, ribbon. Lato UI.

Una dll è una libreria: un programma senza pulsante di avvio, fatto per essere usato da altri programmi. Non la apri, la importi.

Nel RevitPythonShell le due scatole sono già sul tavolo, ridotte a due parole: doc, il modello, e uidoc, l'interfaccia.

Si comincia sbagliando#

Il mattoncino c’è, ma sta dentro la scatola Autodesk.Revit.DB: serve l’import
Il mattoncino c’è, ma sta dentro la scatola Autodesk.Revit.DB: serve l’import
Tre righe che chiedono i muri del modello, F5, e la console risponde: NameError: name FilteredElementCollector is not defined. Tradotto: e chi è questo signore?

Non è un guasto, è il contratto che parla. Il mattoncino esiste ma sta ancora nella scatola. Lo dichiari con un import: from Autodesk.Revit.DB import FilteredElementCollector. Dallo scaffale Autodesk-Revit-DB, portami il collector.

Le nove righe#

Riga 6: FilteredElementCollector(doc).OfClass(Wall), e poi solo i muri
Riga 6: FilteredElementCollector(doc).OfClass(Wall), e poi solo i muri
Riga 12: if p and not p.IsReadOnly, la riga della prudenza
Riga 12: if p and not p.IsReadOnly, la riga della prudenza
Riga 14: Commit, e i quattrocento canali che cambiano insieme
Riga 14: Commit, e i quattrocento canali che cambiano insieme
Riga 6. walls = FilteredElementCollector(doc).OfClass(Wall). Aprimi lo schedario del modello, e poi tienimi solo i muri. Il punto si legge «e poi». walls = dà un nome al mazzo di schede: una variabile.

Riga 8. t = Transaction(doc, "Riempire Commenti"). Una transazione è un contratto: sto per toccare il modello, e da adesso finché non firmo tutto è un blocco unico. Il testo fra virgolette compare nella cronologia dell'annulla: mettici nomi veri.

Riga 9. t.Start(). Il contratto si apre. Le parentesi vuote sono il dito che preme il pulsante.

Riga 10. for w in walls:. Un ciclo: per ogni muro, fai quello che segue. È il motivo per cui quattrocento canali costano come quattro. Il rientro delle righe dopo i due punti non è estetica: in Python è grammatica.

Riga 11. p = w.LookupParameter("Commenti"). Di questo muro, dammi il campo che si chiama Commenti. Attento: il nome è quello della lingua della tua interfaccia. In un Revit inglese si chiama Comments.

Riga 12. if p and not p.IsReadOnly:. La prudenza. Se il parametro esiste davvero, e non è di sola lettura. Senza questa riga lo script funziona per un po', poi arriva il muro strano e si ferma a metà.

Riga 13. p.Set("Verificato"). Il lavoro vero, in una riga. Rientrata due volte: sta dentro l'if, che sta dentro il for.

Riga 14. t.Commit(). Si firma. Se qualcosa fosse andato storto al muro duecentotrenta, il contratto non si chiude e Revit rimette tutto com'era. Tutto, o niente. Mai a metà.

Tre parole e un cognome#

Element: un muro, una vista, un abaco, un cartiglio sono la stessa cosa
Element: un muro, una vista, un abaco, un cartiglio sono la stessa cosa
Il pannello delle proprietà e l’API: le stesse schede, da un’altra finestra
Il pannello delle proprietà e l’API: le stesse schede, da un’altra finestra
  • Document: non è il file .rvt. Il file è il libro chiuso sullo scaffale; Document è il libro aperto sul tavolo, la sessione viva.
  • Element: tutto è Element. Un muro, un canale, ma anche la vista, l'abaco, il livello, il cartiglio. Un solo insieme di verbi basta per tutto.
  • Parameter: la scheda di ogni elemento. Nome, lunghezza, commenti, livello.
  • ElementId: il numero unico di ogni elemento, valido dentro quel documento e basta.

E il capovolgimento che vale tutto il video: il pannello delle proprietà non è l'informazione. È una finestra puntata sulle schede. L'API guarda le stesse schede da un'altra finestra. Ecco perché uno script legge in un secondo quello che a mano costa mille clic: non clicca più veloce, non clicca.

Tre domande senza risposta tecnica#

Perché devo aprire una transazione? Perché le unità interne sono in piedi? Perché su sedici nuclei Revit ne usa uno? Nessuna delle tre è un capriccio. Sono fossili, e c'è un video apposta: «I fossili».

Guarda il video#

Sedici minuti sulla finestra vera del RevitPythonShell dentro Revit: l'errore, l'import, le nove righe che scorrono e i quattrocento canali che cambiano insieme.

Il video completo è su YouTube: se ti è piaciuto, iscriviti al canale e attiva la campanella per i prossimi episodi.

Domande o commenti?

Le domande sui video e sul libro sono benvenute: scrivimi, o commenta sotto il video su YouTube.

Su LinkedIn pubblico ogni video del canale, con due righe in più.