Scripts/it

Work in progress -- need some revision

Introduzione
Per Scripting si intende l'uso dell'interprete Python interno di FreeCAD per generare oggetti. FreeCAD può essere usato come "ottimo" sostituto di OpenSCAD, perché possiede un vero e proprio interprete Python, con il pieno supporto per tutti i costrutti di un linguaggio di programmazione, quasi tutto quello che si può realizzare con l'interfaccia grafica è possibile realizzarlo anche attraverso uno script Python.

Le informazioni sullo scripting sono però sparse nella documentazione di FreeCAD, non c'è una uniformità di "scritture" e alcune cose sono spiegate in maniera complicata per chi comincia.

Primo assaggio
Purtroppo non esiste un modo per attivare direttamente con un comando di menu od un'icona nella barra degli strumenti, l'editor Python interno a FreeCAD, sapendo però che FreeCAD apre un file con estensione nell'editor Python interno, il trucco più semplice è quello di creare un file usando il proprio editor di testo preferito, poi aprirlo in FreeCAD con.

Per fare le cose con un minimo di stile, lo script deve essere scritto con un certo ordine. L'editor di FreeCAD possiede una decente "evidenziazione di sintassi" che manca a molti editor come Windows Notepad o altri editor di Linux di base, per cominciare basta scrivere queste poche righe:

Salvatele con un nome significativo e con estensione e caricate il file prodotto in FreeCAD, con il comando File -Apri.

Un esempio minimale ma che contiene tutto quanto necessario per uno script è mostrato in questa porzione di codice, che potete tranquillamente usare come modello per quasi ogni vostro futuro script:

Nel code qui sopra sono presenti alcuni trucchi:


 * Questa linea serve per importare FreeCAD all'interno dell'interprete Python, può sembrare superfluo, ma non lo è.
 * Base e Vector sono molto usati negli script in FreeCAD, importando questi due metodi in questo modo vi evita di scrivere oppure  al posto di   oppure, vi risparmiano quindi molto lavoro di battitura e rendono il codice più compatto.

Cominciamo con un piccolo script che un piccolo lavoro, ma dimostra la potenza di questo approccio.

Mettetelo dopo il codice di esempio e premete la freccia verde della Barra di strumenti Macro

Accadranno alcune magie, si apre un nuovo documento chiamato "Pippo" e si visualizza un cubo nella Vista 3D, che dovrebbe assomigliare all'immagine qui sotto.



Qualcosa di più...
Niente di eccezionale? Vero, ma da qualcosa dobbiamo pure incominciare, possiamo fare la stessa cosa con un cilindro, aggiungete queste linee dopo il metodo e prima della riga.

Anche qui nulla di eccezionale, notiamo alcune nella costruzione del codice:


 * L'assenza degli usuali riferimenti ad, presenti in molta documentazione che parla di scripting, è pienamente voluto, in futuro si potrà riusare il codice per accedere a FreeCAD come un modula da un interprete Python esterno, la cosa non è proprio facilissima da AppImage, ma con qualche accortezza è possibile. Di più facendo riferimento al motto di Python "esplicito è meglio che implicito",  non indica molto bene da dove arrivano i metodi che si usano.
 * Notate l'uso della "costante" DOC assegnata al documento attivo in = ;  ovviamente non è una "costante", ma dal punto di vista semantico è il nostro "documento attivo", da qui l'uso della convenzione di Pyhton del nome "TUTTO MAIUSCOLO" per le "costanti", senza considerare che  è molto pià corto che.
 * ogni metodo ritorna un geometria, questo diventerà importante fra poco.
 * la geometria viene creata senza definire una la proprietà, questo è voluto perché se utilizzando geometrie semplici per creare geometrie più complesse, la gestione della proprietà è una cosa "delicata".

Ora dobbiamo pur farci qualcosa con questi oggetti,

Introduciamo ora le operazioni booleane. Un esempio per cominciare, mettendo queste linee dopo, si crea un metodo che esgue una operazione di "Fusione" conosciuta anche come "Unione":

Anche qui nulla di eccezionale, notate comunque l'uniformità nel metodo di scrittura; Questo approccio è molto più lineare di quello usato in molti altri Tutorial, aiuta molto ad incrementare la leggibilità del codice e anche quando si vuole fare copia e incolla

Usiamo ora queste geometrie, calcellate le linee di codice dopo e inserite queste linee:

Lanciate lo script con la freccia verde e vedrete nella vista 3D, qualcosa che assomiglia all'immagine qui sotto:



Posizionamento
Il concetto di Posizionamento è relativamente complesso, potete vedere Tutorial Aeroplano per una spiegazione più approfondita.

In genere abbiamo bisogno di posizionare una geometria rispetto ad un'altra geometria, cosa abbastanza frequente quando si creano geometrie complesse, il modo più comodo è quello di usare la proprietà della geometria.

FreeCAD offre un'ampia scelta di modi con cui specificare questa proprietà, molto dipende anche dalle conoscenze di fondo dell'utente, quella più facile da comprendere è quella spiegata nel Tutorial citato, usa una particolare definizione della porzione all'interno della definizione di.

But over other consideration, one thing is crucial, geometry reference point, in other word the point from which the object is modeled by FreeCAD, as described in this table, copied from Placement:

This information has to be keep in mind especially when we have to apply a rotation.

Some examples may help, delete all the line after method and insert the portion of code below:

Let's explain something in the code:


 * We have used a method to define a spehere, using the most easy definition, using only the radius.
 * We have introduced a second writing for the 'Union or Fusion, using multiple objects, not more distant from the usual Part::Fuse it uses Part:Multifuse and use only one property, we have passed a tuple as arguments, but it accepts also a list.
 * We have defined a complex object aeroplano (italian word for aeroplane), but we have done it in a "parametric" way, defining some parameters and deriving other parameters, through some calculation, based on the main parameters.
 * We have used some Placement poperties around in the method and before returning the final geometries we have used a  property with the Yaw-Pitch-Roll, writing. Note the last, that define a center of rotation of the whole geometry.

It can be easily noted that aeroplano geometry rotate around his "barycenter" or "center of gravity", that I've fixed at wing center, a place that is relatively "natural", but could be placed wherever you want.

The first  is the Translation vector, not used here, but if you substitute  with these lines to the code

You will se in the Report window this text:

What has happened?

FreeCAD has translated the in other word our  definition that specifies three components, Translation, Rotation and center of rotation in the "internal" values of only two components, Translation and Rotation'.

you can easily visualize the value of using a print statement in the  method and see that it is:

in other word the rotation center of the geometry is at, but this rotation center is not shown in the GUI, it could be entered as a value, it could not be easily retrieved.

This is the meaning of the word "ankward" that I've used to define property.