Manual/it: Difference between revisions

From FreeCAD Documentation
No edit summary
Line 8: Line 8:


{{:Online_Help_Startpage/it}}
{{:Online_Help_Startpage/it}}
{{clear}}

== Introduzione ==
== Introduzione ==


{{:About_FreeCAD/it}}
{{:About_FreeCAD/it}}
{{clear}}
{{:Feature_list/it}}
{{:Feature_list/it}}
{{clear}}

== Installazione ==
== Installazione ==


{{:Install on Windows/it}}
{{:Install on Windows/it}}
{{clear}}

{{:Install on Unix/it}}
{{:Install on Unix/it}}
{{clear}}

{{:Install on Mac/it}}
{{:Install on Mac/it}}
{{clear}}

== Informazioni su FreeCAD ==
== Informazioni su FreeCAD ==


{{:Getting_started/it}}
{{:Getting_started/it}}
{{clear}}

== Lavorare con FreeCAD ==
== Lavorare con FreeCAD ==


{{:Mouse Model/it}}
{{:Mouse Model/it}}
{{clear}}

== I documenti di FreeCAD ==
== I documenti di FreeCAD ==


{{:Document structure/it}}
{{:Document structure/it}}
{{clear}}



{{:Preferences Editor/it}}
{{:Preferences Editor/it}}


{{clear}}

{{:Interface Customization/it}}
{{:Interface Customization/it}}
{{clear}}


== Proprietà degli oggetti ==


{{:Property/it}}
{{:Property/it}}
{{clear}}


= Gli ambienti di lavoro =


{{:Workbenches/it}}
{{:Workbenches/it}}



== Ambiente Mesh ==


{{:Mesh Module/it}}
{{:Mesh Module/it}}



== Ambiente Parte ==


{{:Part Module/it}}
{{:Part Module/it}}



== Ambiente Draw ==


{{:Drawing Module/it}}
{{:Drawing Module/it}}



== Ambiente Render ==


{{:Raytracing Module/it}}
{{:Raytracing Module/it}}



== Ambiente Immagini ==


{{:Image Module/it}}
{{:Image Module/it}}



== Ambiente Draft ==


{{:Draft Module/it}}
{{:Draft Module/it}}


= Script e Macro =
== Script e Macro ==


== Macro ==
== Macro ==

Revision as of 22:43, 15 November 2013

Manuale

Questo è il manuale FreeCAD. Comprende le parti essenziali del Wiki della documentazione di FreeCAD.

Questa versione è stata creata principalmente per essere stampata come un unico grande documento.

Se si sta leggendo questo online, si consiglia di andare direttamente alla Guida in linea, che è più facile da esplorare.


150
150

Benvenuti nelle pagine dell'aiuto in linea di FreeCAD

Il sistema di aiuto di FreeCAD è ospitato su un wiki/it costruito, mantenuto e sviluppato dalla comunità di utenti e sviluppatori di FreeCAD. Contiene informazioni generali su FreeCAD, tutorial, documentazione precisa su ciascun comando di FreeCAD e documentazione di programmazione per Python e C++. Contiene anche traduzioni di questa documentazione in diverse lingue. Ci auguriamo che troverai qui tutte le informazioni di cui hai bisogno. Nel caso in cui tu abbia domande a cui non riesci a trovare risposta in questa documentazione, dai un'occhiata al forum di FreeCAD, dove potresti trovare già la risposta alla tua domanda, oppure trova qualcuno in grado di aiutarti.

Come utilizzare FreeCAD

Questo documento è suddiviso in diverse sezioni:

  1. Introduzione e utilizzo, per gli utenti finali che desiderano semplicemente utilizzare il programma.
  2. Python scripting, per gli utenti esperti che sono interessati alle capacità di scripting di FreeCAD e desiderano personalizzare alcuni dei suoi aspetti.
  3. Linee guida per lo sviluppo, per gli sviluppatori che considerano FreeCAD come base per sviluppare le proprie applicazioni.

Molte pagine di questo wiki sono anche raggruppate in un Manuale più facile da leggere. Se sei nuovo a FreeCAD, ti suggeriamo di iniziare a leggere il manuale.

Contribuire

Come potresti aver sperimentato, i programmatori a volte sono pessimi scrittori di documentazione! È quindi fondamentale che utenti esperti aiutino a scrivere, aggiornare, correggere e rivedere la documentazione. Sì, intendiamo te! La modifica del wiki è facile. Poiché questa wiki è protetta da scrittura per ridurre lo spam, avrai bisogno di un account wiki di FreeCAD per accedere. Chiedi sul forum e ti creeremo un account. Attualmente, l'account wiki è separato dall'account del forum, ma creeremo un account wiki con lo stesso nome del tuo account del forum. Quindi puoi iniziare a modificare! Inoltre, controlla questa pagina per ulteriori modalità con cui puoi aiutare FreeCAD.

Introduzione

FreeCAD è un generico CAD 3D modellatore parametrico open source concesso in licenza in base alla Licenza LGPL. FreeCAD si rivolge direttamente a ingegneri meccanici e progettisti di prodotti ma, essendo molto generico, si adatta anche ad una gamma più ampia di usi in ambito ingegneristico, come l'architettura, l'analisi ad elementi finiti, la stampa 3D, ed altre applicazioni.

L'utilizzo e le funzioni di FreeCAD sono simili a quelle di CATIA, SolidWorks o Solid Edge o o Revit, e rientra anche nella categoria di CAD, PLM, CAx, CAE e BIM. È un Modellatore parametrico di solidi con una architettura modulare che permette l'aggiunta e lo sviluppo di nuove funzioni con estrema facilità, senza modificare il "cuore" del software.

Come altri modellatori CAD è provvisto di molti componenti 2D per disegnare forme planari o creare disegni di produzione, ma il disegno in 2D (tipo Inkscape o AutoCAD LT) non è lo scopo del software, e non rientrano negli interessi principali neanche l'animazione o la modifica delle mesh (come Blender, Maya, 3ds Max, o Cinema 4D), anche se, grazie alla sua estrema flessibilità, FreeCAD è utile in un'area molto più ampia rispetto al suo set di funzionalità di base.

FreeCAD utilizza molte delle librerie open-source disponibili nel campo della computazione scientifica. Tra queste Open Cascade Technology (OCCT), un potente kernel CAD, Coin3D, un kit di strumenti per lo sviluppo di grafica 3D compatibile con Open Inventor, Qt, il framework di interfaccia utente famoso in tutto il mondo; e Python, uno moderno linguaggio di script. FreeCAD può anche essere utilizzato come libreria per altri software.

Inoltre FreeCAD è multi-piattaforma, ed allo stato attuale è in grado di funzionare senza problemi su Linux/Unix, Windows, e macOS conservando inalterate le caratteristiche e le funzionalità su ognuna di queste piattaforme.

Per ulteriori informazioni su FreeCAD, dare un'occhiata alla lista delle funzioni, alle ultime note di rilascio, e all'articolo per iniziare, o vedere alcuni screenshots.

Informazioni sul progetto FreeCAD

Il progetto FreeCAD è stato avviato nel 2001, come descritto nella pagina Storia di FreeCAD.

FreeCAD è mantenuto e sviluppato da una comunità di sviluppatori e utenti entusiasti ed è costruito attraverso il paziente lavoro di centinaia di collaboratori, alcuni regolari, altri occasionali. La maggior parte lavora su FreeCAD come volontari. Il forum di FreeCAD è il luogo in cui vengono discusse la maggior parte delle idee e delle decisioni e il repository GitHub è il luogo in cui viene conservato il codice, condiviso, discusso e lavorato. Chiunque voglia partecipare è il benvenuto.

Informazioni sull'FPA

Il progetto FreeCAD è supportato anche da un'organizzazione senza scopo di lucro, la FreeCAD project association (FPA). L'FPA è un organismo indipendente creato da alcuni veterani di FreeCAD nel 2021 per raccogliere donazioni e altre risorse per supportare il progetto e la sua comunità, per aiutare a proteggere quella comunità, consentirle di continuare a svilupparsi nelle migliori condizioni, e rappresentare il progetto nei confronti di altri enti come aziende e istituzioni.


Questa è una lista estesa, ma non completa, delle funzioni implementate in FreeCAD.

Note di rilascio

Funzioni principali

  • Un kernel geometrico (nucleo) basato su OpenCasCade permette operazioni complesse su profili di varia natura, anche molto articolati. È presente il supporto nativo al BREP, alle curve e alle superfici NURBS, una vasta gamma di entità geometriche, di operazioni booleane e raccordi, e il supporto interno per i file STEP e IGES.
  • Un modellatore interamente parametrico. Tutti gli oggetti di FreeCAD sono nativamente parametrici, il che significa che la loro forma può essere basata sulle proprietà o anche dipendere da altri oggetti. Tutte le modifiche possono essere ricalcolate a richiesta, e registrate dall'albero delle operazioni annulla o ripeti. Possono essere aggiunti facilmente nuovi tipi di oggetti, e possono anche essere completamente programmati in Python.
  • Una architettura modulare permette di estendere le funzioni del programma attraverso l'utilizzo dei plugins. Un'estensione può essere complessa, come un'intera nuova applicazione programmata in C++ o essere semplice, come uno script Python o una macro auto-registrata. Attraverso l'utilizzo della riga di comando integrata nella GUI, è possibile accedere praticamente a tutte le funzionalità del software per mezzo di semplici comandi Python. Si possono creare e/o modificare oggetti geometrici, interagire con l'ambiente di lavoro o addirittura personalizzare l'interfaccia grafica del programma.
  • È possibile importare ed esportare molti dei formati standard di rappresentazione 3D, come ad esempio: STEP, IGES, OBJ, STL, DXF, SVG, DAE, IFC oppure OFF, NASTRAN, VRML, oltre al formato nativo di FreeCAD FCStd. Il livello di compatibilità tra FreeCAD e un formato di file specifico è variabile, dipende dal modulo che lo implementa.
  • Un ambiente di sketch dotato di strumenti per disegnare sagome in 2D vincolate. Questa funzionalità permette di vincolare in diversi modi le geometrie tracciate e poi di utilizzarle come base per la costruzione delle forme 3D.
  • Un nuovo modulo comodo per creare fogli di disegno tradizionali con opzioni per viste di dettaglo, sezioni trasversali, quotatura e altre, che consente di inserire delle viste 2D dei modelli 3D su un foglio. Questo modulo produce quindi fogli SVG o PDF pronti per l'esportazione.

Funzioni Generali

  • multipiattaforma. FreeCAD funziona esattamente allo stesso modo su piattaforme Microsoft Windows®, Linux e macOS®.
  • interfaccia grafica completa basata sulla piattaforma Qt e una interfaccia di visualizzazione 3D basata su Open Inventor che garantisce un rendering rapido e permette di accedere facilmente alle varie proiezioni della scena.
  • funziona tramite riga di comando. In modalità riga di comando, FreeCAD viene eseguito senza la sua interfaccia ma con tutti i suoi strumenti di geometria. In questa modalità ha un ingombro di memoria relativamente basso e può essere utilizzato, ad esempio, come server per produrre contenuti per altre applicazioni.
  • può essere importato come un modulo Python. FreeCAD può essere importato in qualsiasi applicazione in grado di eseguire script Python. Come in modalità riga di comando, la parte di interfaccia di FreeCAD non è disponibile, ma tutti gli strumenti di geometria sono accessibili.
  • concepito in Ambienti. Nell'interfaccia di FreeCAD gli strumenti sono raggruppati all'interno di workbenches (ambienti di lavoro). Questo permette che vengano visualizzati soltanto gli strumenti necessari all'azione specifica che si deve compiere, ottenendo un'area di lavoro pulita, facile da gestire e veloce da caricare.
  • plugins e moduli per il caricamento ritardato di funzioni e dati. FreeCAD è diviso in un'applicazione principale con moduli che vengono caricati solo quando è necessario. Quasi tutti gli strumenti e i tipi di geometria sono memorizzati nei moduli. I moduli si comportano come dei plug-in; oltre al caricamento ritardato, è possibile aggiungere o rimuovere singoli moduli da un'installazione di FreeCAD esistente.
  • gestione parametrica degli oggetti. In un documento di FreeCAD tutti gli oggetti possono essere definiti da parametri. Questi parametri possono essere modificati e ricalcolati in qualsiasi momento. Poiché le relazioni tra gli oggetti vengono mantenute, la modifica di un oggetto si propaga automaticamente a qualsiasi oggetto dipendente.
  • creazione parametrica di primitive. Gli oggetti primitivi come box, sfere, cilindri, ecc. possono essere creati specificando i loro vincoli geometrici.
  • operazioni di modifica grafica. FreeCAD può eseguire traslazioni, rotazione, ridimensionamento, mirroring, offset (triviali o come descritte in Jung/Shin/Choi) o anche trasformazione della forma, in qualsiasi piano dello spazio 3D.
  • constructive solid geometry (operazioni booleane). FreeCAD può eseguire operazioni di geometria solida costruttiva (unione, differenza, intersezione).
  • creazione grafica di geometrie piane. Linee, spezzate, rettangoli, B-spline e archi circolari o ellittici possono essere creati graficamente in qualsiasi piano dello spazio 3D
  • modellazione lineare o rivolutiva di estrusioni, sezioni e raccordi.
  • elementi topologici quali vertici, spigoli, contorni e piani facilmente ottenibili anche tramite script Python.
  • test e correzione. FreeCAD dispone di strumenti per il test delle mesh (test solido, test di non-due-varietà, test di auto-intersezione) e per la riparazione di mesh (riempimento del foro, orientamento uniforme).
  • annotazioni. FreeCAD può inserire annotazioni per testo o dimensioni.
  • strumento annulla/ripristina. In FreeCAD si può annullare o ripristinare tutto tramite l'accesso diretto allo storico delle azioni. In questo modo è possibile annullare più modifiche contemporaneamente.
  • gestione delle modifiche. Lo storico annulla/ripristina conserva le informazioni sulle modifiche globali e non sulla singola azione, così ogni singolo strumento può gestire esattamente ciò che deve essere annullato o ripristinato.
  • strumento di sviluppo di script integrato. FreeCAD fornisce un interprete Python integrato nel programma e delle API che coprono la quasi totalità del programma, come ad esempio l'interfaccia, la geometria e la visualizzazione 3D. L'interprete è in grado di gestire singoli comandi così come interi script complessi. Tutti i moduli possono essere gestiti tramite Python.
  • console Python integrata. L'interprete Python include una console completa con evidenziazione della sintassi, auto-completamento ed esplorazione delle classi. I comandi python possono essere inviati direttamente in FreeCAD ed essere eseguiti immediatamente, permettendo a chi scrive codice di testare immediatamente al volo le funzionalità, esplorare i contenuti dei moduli di FreeCAD e impararne facilmente i componenti.
  • azioni dell'utente registrate nella console. Tutto ciò che l'utente fa nell'interfaccia di FreeCAD viene eseguito tramite del codice Python, che può essere scritto sulla console e registrato nelle macro.
  • registrazione e editazione di macro.. I comandi Python generati quando l'utente manipola l'interfaccia possono essere registrati, modificati, e se necessario, salvati per essere poi riprodotti in seguito.
  • formato dei file composto (basato su ZIP). I documenti di FreeCAD vengono salvati con un'estensione .FCStd. Il documento può contenere molti tipi diversi di informazioni come la geometria, gli script o le icone delle miniature. Il file .FCStd è esso stesso un contenitore zip; un file di FreeCAD salvato è già compresso.
  • G.U.I. completamente personalizzabile. L'interfaccia di FreeCAD è basata su Qt ed è completamente configurabile tramite l'interprete Python. Oltre alle funzioni standard definite nel software, si ha a disposizione la potenze e la versatilità dell'intero framework Qt, il quale permette di aggiungere, spostare, agganciare oppure eliminare i widgets dall'area di lavoro.
  • creazione di miniature (per ora disponibile solo su piattaforme GNU/Linux). le icone dei documenti salvati in formato .fcstd forniscono una comoda anteprima del loro contenuto in molte applicazioni di gestione dei file, come Nautilus di Gnome, rendendo facile individuare i propri elaborati.
  • installatore MSI modulare. L'installatore di FreeCAD garantisce una installazione flessibile in ambienti Microsoft Windows®. Sono disponibili anche dei pacchetti specifici per Ubuntu.

Ambienti complementari

Gli utenti esperti hanno creato vari ambienti complementari personalizzati.


Installazione


Installazione Standard

Il modo più semplice per installare l'ultima versione stabile di FreeCAD è di utilizzare l'installer, vedere la pagina di Download.

Se si desidera scaricare una versione di sviluppo, che potrebbe essere instabile, vedere la pagina Weekly builds download.

Dopo aver scaricato l'installer, fare doppio clic su di esso per avviare il processo di installazione.

Più avanti sono riportate ulteriori informazioni sul alcune opzioni tecniche. Ma la maggior parte degli utenti necessita solo dell'installer. Al termine dell'installazione leggere la pagina Per iniziare.

Installazione per tutti gli utenti in ambiente Windows

Di default FreeCAD verrà installato per l'utente che esegue l'installazione. Se l'utente ha permessi per il solo utente, il percorso d'installazione è:

C:\Users\<username>\AppData\Local\Programs\FreeCAD X.YY

Se l'installer è eseguito da un utente amministratore, o se lo esegui come amministratore, puoi scegliere se FreeCAD deve essere installato per tutti gli utenti del sistema o solo per te. Il default è per tutti gli utenti.

Se installato per tutti gli utenti, il percorso di default è:

C:\Program Files\FreeCAD X.YY

Installazione in modalità silente

Per installare FreeCAD in modalità silente, puoi eseguire l'installer dalla riga di comando.

FreeCAD-~.exe /S

Le impostazioni di default verranno utilizzate per tutte le opzioni. Si può specificare un percorso d'installazione personalizzato in questo modo:

FreeCAD-~.exe /S /D=A path to FreeCAD with spaces

Di default, anche con installazioni in modalità silente, ci sarà un breve avviso quando l'installer viene verificato per eventuali corruzioni. Questo è detto controllo ciclico di ridondanza e richiede normalmente pochi secondi. Per disabilitare il controllo di corruzione:

FreeCAD-~.exe /S /NCRC

Notare che questa selezione /NCRC "non è raccomandata" perché il controllo di corruzione assicura che l'installer sia stato completamente scaricato.

Chocolatey

L'utilizzo del gestore pacchetti Chocolatey non è attualmente consigliato poiché tale repository non è più aggiornato.

Disinstallazione

Per disinstallare FreeCAD è preferibile utilizzare gli strumenti di Windows per la disinstallazione del software. In alternativa puoi eseguire l'uninstaller direttamente. Questo è il file:

Uninstall-FreeCAD.exe

Si trova nella cartella dove FreeCAD è installato.

L'uninstaller può anche essere eseguito in modalità silente dalla riga di comando.

Uninstall-FreeCAD.exe /S

Notare che la disinstallazione silente fallisce se c'è un'instanza aperta di FreeCAD, anche se l'istanza non è quella della versione che sta per essere disinstallata.



Descrizione

L'installazione di FreeCAD sui più noti sistemi Linux è approvata dalla comunità e FreeCAD è direttamente disponibile tramite il gestore di pacchetti su quei sistemi. Il team di FreeCAD fornisce anche alcuni:

Ubuntu e sistemi basati su Ubuntu

Molte distribuzioni Linux sono basate su Ubuntu e condividono i suoi repository. Per altre varianti ufficiali (Kubuntu, Xubuntu e Lubuntu), ci sono distro non ufficiali come per Linux Mint, Voyager e altri. Le opzioni di installazione riportate di seguito (Espandi) dovrebbero essere compatibili con tali sistemi.

Versione ufficiale

FreeCAD è disponibile nel repository ufficiale di Ubuntu e può essere installato tramite Software Center o dal terminale:

sudo apt install freecad

Nota: il pacchetto del repository di Ubuntu potrebbe essere obsoleto rispetto all'ultimo codice sorgente stabile. In questo caso, si consiglia di installare il pacchetto dal PPA -stable sottostante. Inoltre, l'installazione del pacchetto -daily può essere eseguita per testare il ramo di sviluppo.

Versione PPA stabile

Attenzione: il PPA di FreeCAD attualmente non è aggiornato looking for volunteers. Per favore, usa un'alternativa (snap, appimage) fintanto che il problema non è risolto!

Il Personal Package Archive (PPA) per la versione stabile di FreeCAD è mantenuto dalla comunità di FreeCAD su Launchpad. Il repository Launchpad viene chiamato FreeCAD Stable Releases .

Interfaccia grafica

Installare il PPA stabile tramite l'interfaccia utente grafica (GUI):

1. Navigare verso Software per Ubuntu → Software e Aggiornamenti → Codice sorgente → Altro Software
2. Cliccare su Aggiungi, quindi copiare e incollare la riga seguente
ppa:freecad-maintainers/freecad-stable
3. Aggiungere il sorgente, chiudere la finestra di dialogo e ricaricare i sorgenti del software, se richiesto.

Ora si può trovare e installare l'ultima versione stabile di FreeCAD da Ubuntu Software Center.

Riga di comando

Installare il PPA stabile tramite l'interfaccia della riga di comando (CLI):

1. Aggiungere il PPA al proprio sorgenti software:
sudo add-apt-repository ppa:freecad-maintainers/freecad-stable
2. Recuperare gli elenchi dei pacchetti aggiornati:
sudo apt update
3. Quindi installare FreeCAD insieme alla sua documentazione offline:
sudo apt install freecad freecad-doc

Nota: a causa di problemi di pacchettizzazione, in alcune versioni di Ubuntu il pacchetto freecad-doc è entrato in conflitto con l'installazione di FreeCAD o con una delle sue dipendenze; in questo caso, rimuovere il pacchetto freecad-doc e installare solo il pacchetto freecad. Se il pacchetto freecad-doc non esiste, ignoralo.

Verificare l'installazione

4. Una volta che il PPA stabile è stato aggiunto ai sorgenti usando uno dei metodi sopra, il pacchetto freecad installerà questa versione PPA su quella fornita dal repository di Ubuntu Universe. Si può vedere le versioni disponibili con il seguente comando apt-cache:
apt-cache policy freecad
L'output dovrebbe essere simile al seguente (ovviamente le informazioni sulla versione varieranno):
freecad:
  Installed: (none)
  Candidate: 2:0.18.4+dfsg1~201911060029~ubuntu18.04.1
  Version table:
     2:0.18.4+dfsg1~201911060029~ubuntu18.04.1 500
        500 http://ppa.launchpad.net/freecad-maintainers/freecad-stable/ubuntu bionic/main amd64 Packages
     0.16.6712+dfsg1-1ubuntu2 500
        500 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
ubuntu@ubuntu:~$ apt-cache policy freecad-doc
5. Richiamare la versione stabile (PPA) di FreeCAD dall'interfaccia grafica (GUI) o dalla riga di comando (CLI). Quest'ultimo metodo è il seguente:
./freecad

PPA per le versioni di sviluppo (Daily)

Dato che FreeCAD è in costante sviluppo, si potrebbe voler installare il pacchetto daily per essere aggiornati sugli ultimi miglioramenti e correzioni di bug. Il repository è anche ospitato su Launchpad e viene chiamato freecad-daily.

Questa versione viene compilata quotidianamente dal repository principale ufficiale. Tienere presente che, sebbene contenga nuove funzioni e correzioni di bug, potrebbe anche avere bug più recenti ed essere instabile.

Aggiungere il PPA daily alle sorgenti software, aggiornare gli elenchi dei pacchetti e installare il pacchetto daily:

sudo add-apt-repository ppa:freecad-maintainers/freecad-daily
sudo apt-get update
sudo apt-get install freecad-daily

È possibile aggiornare quotidianamente la versione daily:

sudo apt-get update
sudo apt-get install freecad-daily

Nota: in alcuni casi il nuovo codice o le dipendenze aggiunte a FreeCAD causano errori di pacchettizzazione; se ciò accade, il pacchetto daily potrebbe non essere generato fino a quando i manutentori non risolvono manualmente i problemi. Se si desidera continuare a testare il codice più recente, bisogna scaricare il codice sorgente e compilare FreeCAD direttamente; per le istruzioni vedere compilazione.

Esegui la versione daily (PPA) di FreeCAD:

freecad-daily

Nota: è possibile installare entrambi i pacchetti -stable e -daily nello stesso sistema. Ciò è utile se si desidera lavorare con una versione stabile ed essere comunque in grado di testare le ultime funzioni in fase di sviluppo. Notare che l'eseguibile per la versione giornaliera è freecad-daily, ma per la versione stabile è solo freecad.

Debian e altri sistemi basati su Debian

A partire da Debian Lenny, FreeCAD è disponibile direttamente nei repository di software Debian e può essere installato tramite Synaptic o semplicemente con:

sudo apt-get install freecad

OpenSUSE

FreeCAD viene in genere installato con YAST (abbr. Yet Another Setup Tool), lo strumento di installazione e configurazione del sistema operativo Linux, o in qualsiasi terminale/console (sono richiesti i diritti di root) con:

zypper install FreeCAD

Note: Questa procedura copre solo l'installazione delle versioni del programma FreeCAD stable ufficialmente rilasciate, a seconda dei collegamenti installati ai repository dei pacchetti del programma della versione del sistema operativo. Il pacchetto openSUSE potrebbe essere obsoleto in quanto il pacchetto potrebbe essere in ritardo rispetto all'ultimo codice sorgente stabile. In questo caso, si suggerisce di installare il pacchetto manualmente dai repository di sorgenti (Espandi) indicati di seguito.

Viene offerto un vasto programma di rilascio per la creazione di pacchetti di FreeCAD. Si prega di visitare per un sondaggio:

Survey of repositories on openSUSE

Generalmente per selezionare la corretta distribuzione di openSUSE desiderata è necessario fare clic sul corrispondente pulsante View.

Stabile

La versione stabile del pacchetto: Repository stabili su openSUSE. La versione corretta della distribuzione di openSUSE deve essere selezionata nella parte inferiore della pagina web.

Nota: openSUSE ha diverse opzioni tra cui scegliere quando si scarica FreeCAD. Per visualizzare queste opzioni, visitare Survey of stable repository on openSUSE.

Sviluppo

Ultime versioni di sviluppo AKA unstable: Unstable repositories listings on openSUSE

Si consiglia di prendere direttamente i pacchetti binari. Quindi selezionare la distribuzione corretta per il tuo sistema operativo openSUSE installato.

Gentoo

FreeCAD si può costruire/installare semplicemente eseguendo:

emerge freecad

Fedora

FreeCAD è stato incluso nei pacchetti ufficiali di Fedora da Fedora 20. Può essere installato dalla riga di comando con:

sudo dnf install freecad

Nelle versioni precedenti di Fedora, questo era:

sudo yum install freecad

Possono essere utilizzati anche i gestori dei pacchetti gui. Cercare "freecad". La versione ufficiale del pacchetto di rilascio tende ad essere molto indietro rispetto alle versioni di FreeCAD. Pacchetto: freecad mostra le versioni incluse nei repository Fedora nel tempo e nelle versioni.

È possibile ottenere versioni più recenti scaricando uno dei .AppImagerilasci dal repository github. Questi funzionano bene su Fedora.

Se vuoi stare al passo con le ultime build giornaliere in assoluto, FreeCAD è disponibile anche su copr. Per installare la build da lì, in una sessione di terminale, inserisci:

sudo dnf copr enable @freecad/nightly
sudo dnf install freecad

Che lascia il copr repository attivo, quindi

sudo dnf upgrade

o equivalente, si aggiornerà all'ultima build di FreeCAD, insieme agli aggiornamenti da qualsiasi altro repository attivo. Se vuoi qualcosa di un po' più stabile, puoi disabilitare @freecad/nightly nuovamente dopo l'installazione iniziale. Il copr il repository conserva solo le build delle ultime 2 settimane. Questa non è una soluzione se vuoi scegliere una versione precedente specifica.

Le istruzioni sono disponibili anche su Compilazione in Linux, incluso uno script specifico per Fedora. Con una piccola modifica, per verificare il commit specifico da git, qualsiasi versione da circa FreeCAD 0.15 può essere costruita su qualsiasi distribuzione da Fedora 21.

Arch

Installazione di FreeCAD su Arch Linux e derivati ​​(es. Manjaro):

pacman -S freecad

Altri

Se scoprite che il vostro sistema è dotato di FreeCAD, ma in questa pagina non è documentato, per favore comunicatelo tramite il forum!

Sulla rete sono disponibili diversi pacchetti alternativi non ufficiali di FreeCAD, ad esempio per sistemi come Slackware o Fedora. Una ricerca in rete può dare rapidamente buoni risultati.

Installazione in altri sistemi Linux/Unix

Molte comuni distribuzioni Linux ora includono un FreeCAD precompilato come parte dei pacchetti standard. Questo è spesso obsoleto, ma è un punto di partenza. Controlla i gestori di pacchetti standard per il tuo sistema. Uno dei seguenti (parziali) elenchi di comandi potrebbe installare la versione ufficiale di FreeCAD per la tua distribuzione dal terminale. Questi probabilmente richiedono i privilegi di amministratore.

apt-get install freecad
dnf install freecad
emerge freecad
slackpkg install freecad
yum install freecad
zypper install freecad
pacman -Sy freecad

Il nome del pacchetto fa distinzione tra maiuscole e minuscole, quindi prova sia "FreeCAD" che "freecad". Se ciò non funziona è perché il tuo gestore di pacchetti non ha una versione precompilata di FreeCAD disponibile o perché la versione disponibile è troppo vecchia per le tue esigenze, puoi provare a installare i pacchetti Flatpak o Snap (funzionano sulla maggior parte delle distribuzioni Linux x86_64) oppure a scaricare una delle .AppImage rilasciate dal repository github. Queste tendono a funzionare anche sulla maggior parte delle distribuzioni Linux x86_64 bit, senza alcuna installazione speciale. Assicurati che il file scaricato sia contrassegnato come eseguibile, quindi eseguilo.

Se ciò non basta, e non è possibile individuare un'altra fonte di un pacchetto precompilato per la propria situazione, è necessario compilare FreeCAD da soli.

Prossimi Passi

Appena terminata l'installazione di FreeCAD, è ora di iniziare!



FreeCAD può essere installato in macOS da un pacchetto .dmg che è possibile trascinare nella cartella Applicazioni, vedere la pagina di Download.

Se si desidera scaricare una versione di sviluppo, che potrebbe essere instabile, consultare la pagina Download delle build settimanali.

Si può utilizzare un gestore di pacchetti come HomeBrew per mantenere aggiornato il software. Le istruzioni per installare HomeBrew possono essere visualizzate qui. Quando HomeBrew è installato si può installare FreeCAD semplicemente attraverso il vostro terminale bash con

brew install --cask freecad

e per utilizzare l'ultima versione disponibile su HomeBrew è possibile eseguire

brew install freecad

Se ci sono problemi con l'HomeBrew Cask o Formula puoi segnalarli a qui.

Questa pagina descrive l'uso e le caratteristiche del programma di installazione di FreeCAD. Essa comprende anche le istruzioni di disinstallazione. Andare alla Introduzione una volta completata l'installazione.

Installazione semplice

L'installatore di FreeCAD viene fornito come pacchetto di installazione (.app) incluso in un file di immagine disco.

È possibile scaricare l'ultima versione dell'installatore dalla pagina Download. Dopo aver scaricato il file, basta montare l'immagine, poi trascinarla nella cartella Applicazioni o in una cartella a scelta..

Questo è tutto. Basta cliccare sulla app per lanciare FreeCAD. Se si riceve il messaggio "FreeCAD non può essere aperto in quanto proviene da uno sviluppatore non identificato", aprire la cartella (Applicazione) e fare clic col tasto destro sulla App e quindi fare clic su apri e accettare di aprire l'applicazione.

Disinstallazione

Attualmente non c'è un programma di disinstallazione per FreeCAD installato con dmg package. Per rimuovere completamente FreeCAD e tutti i componenti installati, trascinare i seguenti file e cartelle nel cestino:

  • Nella cartella Applications:
    • /Applications/FreeCAD.app
  • Nella cartella Users Home Library
    • $HOME/Library/Application Support/FreeCAD
    • $HOME/Library/Preferences/FreeCAD
    • $HOME/Library/Preferences/com.freecad.FreeCAD.plist
    • $HOME/Library/Caches/FreeCAD

Se FreeCAD è stato installato con homebrew, utilizzare il comando brew uninstall freecad per disinstallare /Applications/FreeCAD.app. I file e le directory correlati nella libreria home dell'utente dovranno comunque essere rimossi manualmente.


Informazioni su FreeCAD


Prefazione

FreeCAD è una applicazione per la modellazione parametrica. È realizzato principalmente per la progettazione meccanica, ma serve anche in tutti casi in cui è necessario modellare degli oggetti 3D con precisione e avere il controllo dello storico della modellazione.

FreeCAD è in fase di sviluppo dal 2002 e offre un ampio elenco di funzioni, anche se alcune mancano ancora, è però abbastanza potente per uso hobbistico e per molte piccole officine. C'è una comunità in rapida crescita di utenti entusiasti, e si possono già trovare molti esempi di progetti di qualità sviluppati con FreeCAD. Vedere anche FreeCAD utilizzato in produzione.

Come tutti i progetti di software libero, FreeCAD dipende dalla sua comunità per crescere, acquisire funzionalità e correggere i bug. Non dimenticate questo quando usate FreeCAD; se vi piace, potete donare e aiutare FreeCAD in vari modi, come scrivere documentazione e fare traduzioni.

Vedi anche:

Installazione

Prima di tutto, scaricare e installare FreeCAD. Consultare la pagina Download per informazioni sulle versioni, sugli aggiornamenti correnti e per le istruzioni di installazione per il tuo sistema operativo (Windows, Linux o macOS). FreeCAD è disponibile dai gestori di pacchetti di molte distribuzioni Linux. Poiché FreeCAD è open-source, puoi anche scaricare il codice sorgente e compilare tu stesso.

Interfaccia di FreeCAD

Interfaccia standard di FreeCAD

Vedere la spiegazione completa in Interfaccia.

1. L'area della vista principale, che può contenere diverse finestre a schede, principalmente la vista 3D.
2. La vista 3D, che visualizza gli oggetti geometrici contenuti nel documento.
3. La vista ad albero (parte della vista combinata), che mostra la gerarchia e lo storico di costruzione degli oggetti nel documento; può anche visualizzare il pannello delle azioni per i comandi attivi.
4. L'editor delle proprietà (parte della vista combinata), che consente di visualizzare e modificare le proprietà degli oggetti selezionati.
5. La vista selezione, che indica gli oggetti o i sotto-elementi degli oggetti (facce, vertici) che sono selezionati.
6. La finestra dei report dove FreeCAD stampa i messaggi di avvisi o di errori.
7. La console Python dove sono visibili tutti i comandi eseguiti da FreeCAD, e in cui è possibile inserire il codice Python.
8. La barra di stato, dove compaiono alcuni messaggi e suggerimenti.
9. L'area della barra degli strumenti, dove sono ancorate le barre degli strumenti.
10. Il selettore degli ambienti, dove si seleziona l'ambiente attivo.
11. Il menu standard, che ospita le operazioni di base del programma.

Il concetto principale è che, dietro la sua interfaccia, FreeCAD è suddiviso in ambienti di lavoro. Ogni ambiente raggruppa gli strumenti idonei a svolgere un compito specifico, come ad esempio lavorare con gli oggetti mesh, oppure disegnare oggetti 2D o schizzi vincolati. È possibile cambiare l'ambiente corrente con il selettore degli ambienti. Si può personalizzare il set di strumenti inclusi in ogni ambiente, aggiungere degli strumenti da altri ambienti o anche aggiungere strumenti di propria creazione, che chiamiamo macro. Punti di partenza ampiamente utilizzati sono PartDesign e Part.

Al primo avvio di FreeCAD viene visualizzato la pagina iniziale. Ecco come appare nella versione 0.18:

La Pagina Iniziale permette di passare rapidamente a uno degli ambienti di lavoro più comuni, di aprire uno dei file recenti, oppure di vedere le ultime novità dal mondo di FreeCAD. Nelle preferenze è possibile modificare l'ambiente di lavoro predefinito.

Navigare nello spazio 3D

FreeCAD ha diverse modalità di navigazione, che modificano il modo con cui usi il tuo mouse, per interagire con gli oggetti nella vista 3D e con la vista stessa. Uno di questi è specifico per la navigazione touchpad, dove il bottone centrale non è utilizzato. La modalità di navigazione di default è navigazione CAD. Puoi rapidamente cambiare la modalità di navigazione utilizzando il bottone nella barra di stato o cliccando col tasto destro in un area vuota della vista 3D.

Inoltre, sono disponibili alcune viste preconfigurate (dall'alto, laterale, frontale, ecc) accessibili dal menu Visualizza → Viste standard oppure tramite i pratici comandi veloci dei tasti numerici ( 1, 2, 3 etc...). Facendo clic con il pulsante destro su un oggetto o un'area vuota della vista 3D, si ha accesso rapido ad alcune operazioni comuni, come l'impostazione di una vista particolare, o l'individuazione di un oggetto nella vista ad albero.

Primi passi con FreeCAD

L'obiettivo di FreeCAD è quello di consentire di creare dei modelli 3D di alta precisione mantenendo uno stretto controllo sui modelli per essere in grado di tornare indietro nello storico della modellazione e di variare i parametri, e alla fine di costruire quei modelli (attraverso la stampa 3D, CNC o anche la costruzione in cantiere). È quindi molto diverso da alcune applicazioni 3D realizzate per altri scopi, come ad esempio per i film di animazione o per i giochi. La sua curva di apprendimento può essere ripida, specialmente se questo è il primo contatto con la modellazione 3D. Quando si rimane bloccati in un certo punto, ricordarsi che nel FreeCAD forum c'è una comunità amichevole di utenti può essere in grado di fornire un aiuto in breve tempo.

L'ambiente di lavoro con cui iniziare a lavorare in FreeCAD dipende dal tipo di lavoro si intende realizzare. Quando si ha intenzione di lavorare su modelli meccanici, o più in generale su qualsiasi oggetto di piccole dimensioni, probabilmente si vuole provare Part Design. Se si lavora in 2D, allora conviene passare all'ambiente Draft, o all'ambiente Sketcher quando servono i vincoli. Se si vuole fare BIM, avviare l'ambiente Architettura. Se si proviene dal mondo di OpenSCAD, si può provare l'ambiente OpenSCAD. Ci sono anche molti Ambienti complementari sviluppati dalla comunità.

È possibile commutare gli ambienti di lavoro in qualsiasi momento, e anche personalizzare il proprio ambiente preferito aggiungendovi degli strumenti di altri ambienti.

Lavorare con gli ambienti PartDesign e Sketcher

PartDesign è fatto appositamente per costruire oggetti complessi, partendo da forme semplici a cui aggiungere o rimuovere dei pezzi (chiamate "funzioni"), fino a ottenere l'oggetto finale. Tutte le caratteristiche applicate durante il processo di modellazione vengono memorizzate in una vista separata denominata vista a albero, che contiene anche gli altri oggetti del documento. Si può pensare ad un oggetto di PartDesign come a una successione di operazioni, ciascuna applicata al risultato di quella precedente, formando una grande catena. Nella vista ad albero, si vede l'oggetto finale, ma è possibile espanderla e recuperare tutti gli stati precedenti, e modificare i loro parametri, questo aggiorna automaticamente l'oggetto finale.

L'ambiente PartDesign fa uso importante di un altro ambiente, l'ambiente Sketcher. Sketcher permette di disegnare forme 2D vincolate, il che significa che alcune parti della forma 2D possono avere dei vincoli. Ad esempio, è possibile disegnare un rettangolo e impostare un vincolo di lunghezza per uno dei suoi lati. Quel lato quindi non può più essere ridimensionato, fino a quando il vincolo non viene modificato.

Queste forme 2D realizzate con lo sketcher sono molto utilizzate in PartDesign, ad esempio per creare i volumi 3D o per disegnare le aree sulle facce dell'oggetto che devono essere scavate dal volume principale. Ecco un tipico flusso di lavoro PartDesign:

  1. Creare un nuovo schizzo
  2. Disegnare un contorno chiuso (assicurarsi che tutti i punti sono uniti)
  3. Chiudere lo schizzo
  4. Espandere lo schizzo in un solido 3D con lo strumento Pad
  5. Selezionare una faccia del solido
  6. Creare un secondo schizzo (questa volta sarà disegnato sulla faccia selezionata)
  7. Disegnare una forma chiusa
  8. Chiudere lo schizzo
  9. Creare uno scavo con il secondo schizzo, sul primo oggetto

Si ottiene un oggetto simile a questo:

In qualsiasi momento è possibile selezionare gli schizzi originali e modificarli oppure modificare i parametri delle operazioni di estrusione o di scavo, l'oggetto finale viene automaticamente aggiornato.

Lavorare con gli ambienti Draft e Arch

Gli ambienti Draft e Arch si comportano in modo un po' diverso dagli altri ambienti di lavoro di cui sopra, anche se seguono le regole comuni di FreeCAD. In breve, Sketcher e PartDesign sono utilizzati principalmente per la progettazione di singoli pezzi, invece Draft e Arch sono concepiti per facilitare il lavoro quando si opera con diversi oggetti semplici.

L'ambiente Draft offre degli strumenti 2D in parte simili a quelli che si possono trovare nelle applicazioni tradizionali di CAD 2D quali AutoCAD. Però, il disegno 2D è lontano dagli scopi di FreeCAD, quindi non aspettatevi di trovare in esso la gamma completa di strumenti offerta da queste applicazioni dedicate. La maggior parte degli strumenti di Draft lavorano, non solo in un piano 2D, ma anche nello spazio 3D, e beneficiano degli speciali sistemi di supporto come il Piano di lavoro e lo Snapping.

L'ambiente Arch aggiunge a FreeCAD gli strumenti BIM che consentono di costruire i modelli architettonici con degli oggetti parametrici. L'ambiente Arch si basa ampiamente sugli altri moduli come Draft e Sketcher. Tutti gli strumenti di Draft sono presenti anche nell'ambiente Arch e molti strumenti di Arch usano i sistemi di supporto di Draft.

Un tipico flusso di lavoro con gli ambienti Arch e Draft potrebbe essere:

  1. Disegnare un paio di linee con lo strumento Linea di Draft
  2. Selezionare tutte le linee e premere lo strumento Muro per costruire un muro su ciascuna di esse
  3. Unire le pareti selezionandole e premendo lo strumento Aggiungi di Draft
  4. Creare un oggetto pavimento e nella vista ad albero trascinare i muri sull'oggetto pavimento
  5. Creare un oggetto edificio e nella vista ad albero trascinare il pavimento (che ora include i muri) sull'oggetto edificio
  6. Creare una Finestra cliccando sullo strumento Finestra, selezionare un modello predefinito nel suo pannello, quindi fare clic su una faccia di un muro
  7. Aggiungere le Quote impostando prima il piano di lavoro, se necessario, quindi utilizzando lo strumento Dimension di Draft

Si ottiene un oggetto simile a questo:

Maggiori informazioni si trovano nella sezione Tutorial.

Componenti aggiuntivi

Ogni utente può sviluppare le proprie nuove funzionalità per FreeCAD e renderle disponibili alla comunità di FreeCAD come addon.

Esistono tre tipi di componenti aggiuntivi:

  • Macro: breve frammento di codice Python che fornisce un nuovo strumento o una nuova funzionalità in un singolo file con estensione .FCMacro.
  • Ambienti complementari: raccolte di file Python che forniscono Comandi GUI (strumenti) correlati incentrati su un particolare argomento.
  • Pacchetti di Preferenze: raccolte di preferenze utente distribuibili.

Script

Infine, una delle più potenti caratteristiche di FreeCAD è l'ambiente di script. Dalla console Python integrata (o tramite qualsiasi altro script Python esterno), è possibile accedere a quasi tutte le parti di FreeCAD, creare o modificare le geometrie, modificare la rappresentazione degli oggetti nella vista 3D, oppure accedere e modificare l'interfaccia di FreeCAD. Gli script Python possono essere utilizzati anche all'interno delle macro che forniscono un metodo facile e veloce per creare combinazioni di comandi personalizzati.

Aggiornamenti


Lavorare con FreeCAD


Panoramica

La funzione Navigare col mouse di FreeCAD comprende i comandi utilizzati per navigare visivamente lo spazio 3D e per interagire con gli oggetti visualizzati. FreeCAD offre diversi stili di navigazione con il mouse. Lo stile di navigazione predefinito, denominato "Navigazione CAD​​", è molto semplice e pratico, ma FreeCAD fornisce anche diversi stili di navigazione alternativi tra cui puoi scegliere. Lo stile selezionato sarà utilizzato per tutti gli ambienti di lavoro.

Per ulteriori informazione riguardo la selezione degli oggetti vedere modi di selezione

Per ulteriori informazioni riguardo la manipolazione degli oggetti vedere Std TransformManip

Selezionare uno stile di navigazione

  1. Effettuare una delle seguenti operazioni:
    • Premere il bottone sulla barra di stato.
    • Cliccare su un area vuota della vista 3D, e selezionare Stile di navigazione dal menu contestuale.
    • Utilizzare l'Editor delle preferenze. Dal menu selezionare Modifica → Preferenze e poi Visualizzazione → Navigazione → Navigazione 3D.
  2. Seleziona uno stile dalla lista.
  3. Facoltativamente cambiare lo Stile Orbita: premere il bottone sulla barra di Stato e poi scegliere Impostazioni → Stile Orbita. Vedere l'Editor delle Preferenze.

Stili di navigazione disponibili

Con tutti gli stili di navigazione, a meno che non si selezionino oggetti da uno schizzo in modalità di modifica, è necessario tenere premuto Ctrl per selezionare più oggetti.

Navigazione Blender

La navigazione Blender si basa sul modello Blender.

Selezione Traslazione Zoom Rotazione vista
Shift+
Premere il tasto sinistro del mouse su un oggetto che si desidera selezionare. Tenere premuto Shift e il pulsante centrale del mouse, quindi spostare il puntatore.

In alternativa, tenere premuti i pulsanti sinistro e destro del mouse, quindi spostare il puntatore.

Usare la rotellina del mouse per zoommare avanti e indietro. Tenere premuto il pulsante centrale del mouse, quindi spostare il puntatore.


Navigazione CAD

Questo è lo stile di navigazione predefinito. Consente all'utente un semplice controllo della vista, e non richiede l'uso dei tasti della tastiera se non per effettuare selezioni multiple.

Selezione Traslazione Zoom Rotazione vista
Primo metodo
Rotazione vista
Metodo alternativo
Premere il tasto sinistro del mouse su un oggetto che si desidera selezionare. Tenere premuto il pulsante centrale del mouse, quindi sposta il puntatore. Utilizzare la rotellina del mouse per ingrandire e rimpicciolire.

Facendo clic sul pulsante centrale del mouse, la vista viene nuovamente centrata sulla posizione del cursore.

Tenere premuto il pulsante centrale del mouse, quindi premere e tenere premuto il pulsante sinistro del mouse, quindi spostare il puntatore.

Se i pulsanti vengono rilasciati prima di interrompere il movimento del mouse, la visualizzazione continua la rotazione, se l'azione è abilitata.

Un doppio clic con il pulsante centrale del mouse imposta un nuovo centro di rotazione.

Tenere premuto il pulsante centrale del mouse, e tenere premuto il pulsante destro del mouse, quindi spostare il puntatore.

Con questo metodo il pulsante centrale del mouse può essere rilasciato dopo aver tenuto premuto il pulsante destro del mouse.

Gli utenti che utilizzano il mouse con la mano destra potrebbero trovare questo metodo più semplice del primo metodo.

Ctrl+ Ctrl+Shift+ Shift+
Modalità Pan: tenere premuto il tasto Ctrl, premere una volta il pulsante destro del mouse, quindi spostare il puntatore. Modalità zoom: tenere premuti i tasti Ctrl e Shift, premere il pulsante destro del mouse una volta, quindi spostare il puntatore. Modalità rotazione: tenere premuto il tasto Shift, premere il tasto destro del mouse una volta, quindi spostare il puntatore.

Navigazione Gesture

Questo stile è stato pensato per l'uso con un touchscreen e una penna. Tuttavia, può essere utilizzato anche con un mouse ed è consigliato quando si utilizza un Mac con trackpad.

Selezione Traslazione Zoom Rotazione vista Inclinazione vista
Premere il tasto sinistro del mouse su un oggetto che si desidera selezionare. Tenere premuto il tasto destro del mouse, quindi spostare il puntatore. Usare la rotellina del mouse per zoommare avanti e indietro. Tenere premuto il pulsante sinistro del mouse, quindi spostare il puntatore.

In Sketcher e altre modalità di modifica, questo comportamento è disabilitato. Tenere premuto Alt quando si preme il pulsante del mouse per accedere alla modalità di rotazione.

Per impostare il punto di messa a fuoco della fotocamera per la rotazione, fare clic su un punto con il pulsante centrale del mouse. In alternativa, puntare il cursore su un punto e premere H sulla tastiera.

Tenere premuti i pulsanti sinistro e destro del mouse, quindi spostare il puntatore di lato.
Toccare per selezionare. Trascinare con due dita.

In alternativa, toccare e tenere premuto, quindi trascinare. Questo simula la traslazione con il tasto destro del mouse.

Trascinare due dita (pizzicare) più vicino o più lontano. Trascinare con un dito per ruotare.

Tenere premuto Alt quando ci si trova in Sketcher.

Ruota la linea immaginaria formata da due punti di contatto.

Questo metodo è disabilitato per impostazione predefinita. Per abilitarlo, andare in Modifica → Preferenze → Visualizzazione → Navigazione e deselezionare la casella di controllo "Disabilita l'inclinazione touchscreen".

Navigazione Maya-Gesture

Nella navigazione Maya-Gesture, lo spostamento, lo zoom e la rotazione della vista richiedono il tasto Alt insieme a un pulsante del mouse; pertanto, è necessario un mouse a tre pulsanti. È anche possibile utilizzare le gesture poiché questo stile è stato sviluppato sullo stile della Navigazione Gesture.

Selezione Traslazione Zoom Rotazione vista
Alt+ Alt+ Alt+
Premere il tasto sinistro del mouse su un oggetto che si desidera selezionare. Tenere premuto Alt e il pulsante centrale del mouse, quindi spostare il puntatore. Tenere premuto Alt e il tasto destro del mouse, quindi spostare il puntatore.

In alternativa, utilizzare la rotellina del mouse per ingrandire e ridurre.

Tenere premuto Alt e il tasto sinistro del mouse, quindi spostare il puntatore.

Navigazione OpenCascade

La navigazione OpenCascade si basa sul modello OpenCascade.

Selezione Traslazione Zoom Rotazione vista
Ctrl+ Ctrl+ Ctrl+


Premere il tasto sinistro del mouse su un oggetto che si desidera selezionare. Tenere premuto il pulsante centrale del mouse, quindi spostare il puntatore. Usare la rotellina del mouse per zoommare avanti e indietro.

In alternativa, tenere premuto Ctrl e il tasto sinistro del mouse, quindi spostare il puntatore.

Tenere premuto Ctrl e il tasto destro del mouse, quindi spostare il puntatore.

Navigazione OpenInventor

La Navigazione OpenInventor (formalmente Inventor) si basa sul modello Open Inventor. Per selezionare gli oggetti, è necessario tenere premuto il tasto Shift o Ctrl.

Questo stile non è basato su Autodesk Inventor.

Selezione Traslazione Zoom Rotazione vista
Shift+
Tenere premuto Shift, quindi premere il tasto sinistro del mouse sopra un oggetto che si desidera selezionare.

Invece tenere premuto Ctrl per selezionare più oggetti.

Tenere premuto il pulsante centrale del mouse, quindi spostare il puntatore. Usare la rotellina del mouse per ingrandire e rimpicciolire.

In alternativa, tenere premuto il pulsante centrale del mouse, quindi premere e tenere premuto il pulsante sinistro del mouse, quindi spostare il puntatore.

Tenere premuto il pulsante sinistro del mouse, quindi spostare il puntatore.

Navigazione OpenSCAD

La Navigazione OpenSCAD si basa sul modello OpenSCAD.

disponibile dalla versione 0.20

{{OpenSCAD_Navigation |Select_name=Selezione |Pan_name=Traslazione |Zoom_name=Zoom |Rotate_view_name=Rotazione vista |Shift=Shift |Select_text=Premere il pulsante sinistro del mouse su un oggetto che si desidera selezionare.

versione 0.21 e precedenti Tenere premuto Ctrl e Shift quando si preme il pulsante del mouse per trascinare un oggetto in uno schizzo in modalità di modifica. |Pan_text=Tenere premuto il pulsante destro del mouse, quindi spostare il puntatore. |Zoom_text=Tenere premuto il pulsante centrale del mouse, quindi spostare il puntatore. In alternativa, tenere premuto Shift e il pulsante destro del mouse, quindi spostare il puntatore. |Rotate_view_text=Tenere premuto il pulsante sinistro del mouse, quindi spostare il puntatore.

In alternativa, e quando uno schizzo è in modalità di modifica, tenere premuto il pulsante centrale del mouse, quindi tenere premuto il pulsante destro del mouse, quindi spostare il puntatore.

Navigazione Revit

La Navigazione Revit si basa sul modello Revit.

Selezione Traslazione Zoom Rotazione vista
Shift+


Premere il tasto sinistro del mouse su un oggetto che si desidera selezionare. Tenere premuto il pulsante centrale del mouse, quindi spostare il puntatore.

In alternativa, tenere premuti i pulsanti sinistro e destro del mouse, quindi spostare il puntatore.

Usa la rotellina del mouse per zoommare avanti e indietro. Tenere premuto Shift e il pulsante centrale del mouse, quindi spostare il puntatore.

In alternativa, tenere premuto il pulsante centrale del mouse, e tenere premuto il pulsante destro del mouse, quindi spostare il puntatore.

Navigazione TinkerCAD

La Navigazione TinkerCAD si basa sul modello TinkerCAD.

disponibile dalla versione 0.20

Selezione Traslazione Zoom Rotazione vista
Premre il pulsante sinistro del mouse su un oggetto che si desidera selezionare. Tenere premuto il pulsante centrale del mouse, quindi spostare il puntatore. Usare la rotellina del mouse per zoommare avanti e indietro. Premere il tasto destro del mouse, quindi spostare il puntatore.

Navigazione Touchpad

Con la Navigazione touchpad, lo spostamento, lo zoom e la rotazione della vista richiedono un tasto modificatore insieme al touchpad. Questo stile può essere utilizzato anche con il mouse.

Selezione Traslazione Zoom Rotazione vista Ctrl=Ctrl
Shift+ PagSù, PagGiù Alt+
Premere il tasto sinistro del mouse su un oggetto che si desidera selezionare. Premere Shift, quindi spostare il puntatore. Usare PagSù e PagGiù per ingrandire e ridurre. Tenere premuto Alt, quindi spostare il puntatore.
{{{Ctrl}}}+Shift+ Shift+
In alternativa, tenere premuto Ctrl e Shift, quindi spostare il puntatore. In alternativa, tenere premuto Shift e il pulsante sinistro, quindi spostare il puntatore.

Supporto Hardware

FreeCAD supporta anche i dispositivi di input 3D.

Navigazione consigliata per macOS

Sui MacBook con trackpad la navigazione gestuale funziona molto bene, ma i gesti hanno un significato speciale:

  • Zoom: trascina con due dita.
  • Ruota: trascina con tre dita.
  • Panoramica: Ctrl + tre dita.

Sviluppo di una navigazione personalizzata

Il tutorial Aggiunta di una nuova opzione di navigazione del mouse a FreeCAD orienta gli sviluppatori che desiderano sviluppare un'opzione di navigazione del mouse personalizzata. È richiesta la familiarità con la sintassi C++.


I documenti di FreeCAD


Un documento FreeCAD contiene tutti gli oggetti della scena. Può contenere i gruppi e gli oggetti realizzati con qualsiasi ambiente di lavoro. Si possono quindi alternare gli ambienti pur continuando a lavorare sullo stesso documento. Il documento è ciò che viene salvato sul disco quando si salva il proprio lavoro. Inoltre, in FreeCAD è possibile aprire più documenti contemporaneamente, e aprire diverse viste dello stesso documento.

All'interno del documento, gli oggetti possono essere raggruppati, e avere un unico nome. La gestione dei gruppi, degli oggetti e dei nomi degli oggetti avviene prevalentemente nella vista a albero. Nota: Naturalmente, queste operazioni, come tutto in FreeCAD, si possono eseguire anche tramite interprete Python.

Nella vista a albero, è possibile creare dei gruppi, spostare gruppi di oggetti, eliminare oggetti o gruppi, facendo clic destro nella vista a albero o su un oggetto, oppure rinominare gli oggetti facendo doppio clic sui loro nomi, o eventualmente eseguire altre operazioni, attinenti l'ambiente di lavoro attivo.

Un documento FreeCAD può contenere oggetti di diversi tipi. Ogni ambiente di lavoro crea oggetti di tipo specifico, per esempio Mesh crea oggetti Mesh , Parte crea oggetti Parte, Draft crea disegni e anche oggetti Parte, ecc.

In FreeCAD può essere attivo un solo documento alla volta. Il documento attivo è quello che viene visualizzato nella vista 3D corrente ed è il documento in lavorazione.

Applicazione e Interfaccia utente

Come per quasi tutto il resto, in FreeCAD, la parte interfaccia grafica utente (GUI) è separata dalla parte applicazione (App). Questo vale anche per i documenti.

I documenti sono composti da due parti: il documento Applicazione, che contiene gli oggetti, e il documento Visualizzazione, che contiene la rappresentazione degli oggetti sullo schermo.

Pensate a due spazi in cui sono definiti gli oggetti. I loro parametri costruttivi (si tratta di un cubo? di un cono? quanto misura?) sono memorizzati nel documento Applicazione, mentre la loro rappresentazione grafica (è disegnata con linee nere? con le facce blu?) sono memorizzati nel documento Visualizzazione. Questo permette di utilizzare FreeCAD anche senza interfaccia grafica, ad esempio all'interno di altri programmi, e di manipolare gli oggetti, anche senza disegnare nulla sullo schermo.

Il documento Visualizzazione contiene anche le viste 3D. Un documento può avere contemporaneamente diverse viste aperte, in modo da poterlo controllare da diversi punti di vista. Ad esempio, si può visualizzare allo stesso tempo una vista dall'alto e una vista frontale. Tutte le viste dello stesso progetto vengono memorizzate nel documento Visualizzazione. La produzione di nuove viste o la chiusura di viste attive si può fare dal menu Visualizza o facendo clic destro su una scheda di visualizzazione.

Script

Tramite l'interprete Python, si può facilmente accedere, creare o modificare i documenti. Ad esempio:

FreeCAD.ActiveDocument

Restituisce il documento corrente (attivo)

FreeCAD.ActiveDocument.Blob

Accede ad un oggetto chiamato "Blob" all'interno del documento

FreeCADGui.ActiveDocument

Restituisce il documento associato al documento corrente

FreeCADGui.ActiveDocument.Blob

Accede alla rappresentazione grafica (visualizza) l'oggetto "Blob"

FreeCADGui.ActiveDocument.ActiveView

Restituisce la vista corrente



Introduzione

Per avviare l' Editor delle preferenze selezionare l'opzione dal menu Modifica → Preferenze.... Su macOS invece, l'opzione Preferenze... appare nel menu FreeCAD (questa è la posizione predefinita per le preferenze su Mac).

FreeCAD utilizza il concetto di ambiente di lavoro, in cui ogni ambiente di lavoro è responsabile di attività e funzioni specifiche. Un ambiente di lavoro può avere le sue proprie preferenze. Queste appariranno nell'editor delle Preferenze, di solito in una sezione dedicata, se l'ambiente di lavoro è stato caricato nella sessione corrente di FreeCAD. Alcuni ambienti di lavoro aggiungono il supporto per formati di importazione ed esportazione specifici. Se sono presenti preferenze correlate, verranno visualizzate in una o più schede aggiuntive nella sezione Import-Export dell'editor delle preferenze.

Per preservare le risorse, FreeCAD non carica automaticamente tutti gli ambienti di lavoro disponibili. Vedi Ambienti di lavoro per maggiori informazioni. Per un elenco delle preferenze relative all'ambiente, vedere Preferenze relative agli Ambienti di Lavoro.

Se non è stato caricato alcun ambiente di lavoro, Nell'editor delle preferenze appaiono sei sezioni: Generale, Visualizzazione, Ambienti di lavoro, Python, Addon Manager e Import-Export. Tutti gli ambienti di lavoro che sono stati caricati e hanno le proprie preferenze verranno visualizzati di seguito.

Premendo il pulsante Ripristina nell'angolo in basso a sinistra della finestra di dialogo Preferenze si apre un menu (disponibile dalla versione 1.0) con opzioni per ripristinare le preferenze ai valori predefiniti. Si possono reimpostare la scheda corrente, il gruppo corrente o tutte le preferenze. Nella versione 0.21 e precedenti il pulsante ripristinerà tutte le preferenze.

Alcune preferenze avanzate possono essere modificate solo in Modifica parametri. La pagina Ottimizzare l'installazione ne elenca alcuni.

Generale

Questa sezione delle preferenze ha sette schede: Generale, Documento, Selezione, Cache, Area di notifica, Report e Aiuto.

In versione 0.21 e precedenti la settima scheda, Aiuto, è disponibile solo se il Help Addon è stato installato.

Generale

Nella scheda Generale si può specificare quanto segue:

Nome Descrizione
Lingua Lingua dell'interfaccia utente dell'applicazione.
Sistema di unità predefinito Sistema di unità per tutte le parti dell'applicazione. disponibile dalla versione 1.0: utilizzato come predefinito per il sistema di unità documento dei nuovi documenti.
Numero di decimali Il numero di decimali che devono essere visualizzati per numeri e quote.
Ignora il sistema di unità del progetto e usa quello predefinito disponibile dalla versione 1.0 Se selezionati, i sistemi di unità del progetto vengono ignorati e non sovrascrivono il sistema di unità predefinito.
Pollici frazionari minimi Il pollice frazionario minimo che deve essere mostrato per numeri e dimensioni. Disponibile solo per sistemi di unità con pollici frazionari.
Formato numero disponibile dalla versione 0.20 Specifica il formato del numero. Le opzioni sono:
  • Sistema operativo: viene utilizzato il separatore decimale definito dal sistema operativo.
  • Lingua selezionata: Viene utilizzato il separatore decimale della lingua dell'interfaccia di FreeCAD selezionata.
  • C/POSIX: Come separatore decimale viene utilizzato un punto.
Sostituisci separatore decimale disponibile dalla versione 0.20 Se selezionato, il separatore decimale del tastierino numerico verrà sostituito con il separatore definito dall'impostazione Number format. disponibile dalla versione 0.21: Notare che se questa preferenza è abilitata, utilizzando il separatore decimale del tastierino numerico verrà sempre stampato un punto/punto nella Console Python e nell'[[Std_DlgMacroExecute/it#Modifica|Macro editor] ].
Tema Specifica un tema per personalizzare l'aspetto dell'interfaccia utente.
Dimensione delle icone della barra degli strumenti Specifica la dimensione delle icone della barra degli strumenti. Le opzioni sono:
  • Piccolo (16px)
  • Medio (24px)
  • Grande (32px)
  • Extra grande (48px)
Modalità di visualizzazione ad albero Definisce come viene visualizzata la vista ad albero nell'interfaccia utente (è necessario il riavvio). Le opzioni sono:
  • Vista combinata: Combina la vista ad albero e la vista delle proprietà in un unico pannello.
  • Vista ad albero e proprietà: divide la vista ad albero e la vista delle proprietà in pannelli separati.
  • Entrambi: Mostra tutti e tre i pannelli. versione 0.21 e precedenti
Dimensione dell'elenco dei file recenti Specifica quanti file devono essere elencati nell'elenco dei file recenti.

Facoltativamente, è possibile escludere i file importati da questo elenco e includere i file esportati. Vedere Ottimizzare l'installazione.

Abilita lo sfondo a mosaico Se selezionato, lo sfondo della finestra principale di FreeCAD sarà costituito per impostazione predefinita dai riquadri di questa immagine:

Questa opzione ha effetto solo se non è selezionato alcun Foglio di stile.

L'immagine può essere cambiata aggiungendo le cartelle Gui/Images nella cartella:

%APPDATA%/FreeCAD (per Windows),

$HOME/.FreeCAD (su Linux) o

$HOME/Library/Preferences/FreeCAD (su macOS).

Inserire un file chiamato background.png nella cartella Images, e deselezionare/selezionare questa opzione per vedere il file modificato.

Abilita la schermata iniziale all'avvio Se selezionato, all'avvio di FreeCAD viene mostrata una schermata iniziale.

L'immagine della schermata iniziale può essere modificata inserendo un file denominato splash_image.png nella cartella Images già menzionata in Abilita lo sfondo a mosaico.

Abilita il lampeggiamento del cursore Se selezionato, il cursore del testo nella Python console e l'Macro editor lampeggeranno.
Attiva gestione overlay disponibile dalla versione 1.0 Se selezionate, le finestre ancorate possono essere gestite come sovrapposizioni trasparenti.
Pacchetti di preferenze disponibile dalla versione 0.20 Elenca i pacchetti preferenze disponibili e consente inoltre di importarli, salvarli, gestirli e ripristinarli.

Documento

Nella scheda Documento si può specificare quanto segue:

Nome Descrizione
Crea un nuovo documento all'avvio Se selezionato, FreeCAD crea un nuovo documento quando viene avviato
Livello di compressione di salvataggio del documento Specifica del livello di compressione per i file FCStd. I file FCStd sono file compressi ZIP. Quindi puoi rinominare il loro suffisso .FCStd in .zip e aprirli con un programma di archivio ZIP.
Utlizza Annulla/Ripristina sui documenti Se selezionato, tutti i cambiamenti nei documenti sono memorizzati in modo che possano essere annullati o ripristinati
Massimo numero di passaggi Annulla/Ripristina Specifica quanti passaggi Annulla/Ripristina devono essere registrati
Esegui il salvataggio automatico all'avvio Se è disponibile un file di ripristino FreeCAD esegue automaticamente un ripristino del file all'avvio. In questo modo è possibile ripristinare i file in caso di arresto anomalo.
Salva le informazioni di autorecupero ogni Specifica la frequenza con cui viene scritto un file di ripristino.
Salva la miniatura nel file del progetto al salvataggio del documento Se selezionato, quando il documento viene salvato viene salvata anche una miniatura. Ad esempio, la miniatura viene visualizzata nell'elenco dei file recenti nell'ambiente Start.
Aggiungi il logo del programma alla miniatura generata Se selezionato, il logo del programma FreeCAD viene aggiunto alla miniatura. Questa opzione ha effetto solo se viene usato Salva la miniatura nel file del progetto al salvataggio del documento.
Numero massimo di file di backup da conservare quando si salva nuovamente il documento Se selezionato, i file di backup vengono conservati quando si salva il documento. È possibile specificare il numero di file di backup da conservare. Contengono la versione del documento salvata in precedenza. Il primo file di backup ha il suffisso del file .FCStd1, il secondo .FCStd2 e così via.
Usa l'estensione data e FCBak Se selezionato, i file di backup avranno l'estensione .FCbak e i loro nomi di file avranno un suffisso di data in base al formato data specificato. Per una descrizione del formato della data, vedere Cheatsheet sui formati di data e ora.

Con le impostazioni predefinite un file di backup riceverà, ad esempio, questo nome TD-Cube.20200315-215654.FCBak (il nome file originale è TD-Cube.FCStd).

Consenti la duplicazione delle etichette degli oggetti nello stesso documento Se selezionato, gli oggetti possono avere la stessa etichetta o nome. Ad esempio, parti o caratteristiche diverse possono avere lo stesso nome nello stesso documento.
Disabilita il caricamento parziale di oggetti collegati esterni Se è abilitato il caricamento parziale di oggetti collegati esterni, verranno caricati solo gli oggetti di riferimento e le relative dipendenze quando il documento collegato viene aperto automaticamente insieme al documento principale. Un tale documento caricato parzialmente non può essere modificato. Fare doppio clic sull'icona del documento nella vista ad albero per ricaricarlo completamente. Una spiegazione più dettagliata di questa funzione può essere trovata nella Documentazione di Assembly3.
Nome autore Tutti i documenti che vengono creati ottengono il nome dell'autore specificato. Lasciare il campo dell'autore vuoto per un autore anonimo. Se viene selezionata l'opzione Imposta su salva, il campo Ultima modifica effettuata da: sarà impostato sull'autore specificato al momento del salvataggio del file. Questo campo può essere visualizzato utilizzando il menu File → Informazioni sul progetto.
Azienda Tutti i documenti creati ottengono il nome della società specificata
Licenza di default Selezione di una licenza predefinita per nuovi documenti. Per la licenza predefinita, URL della licenza viene automaticamente impostato di conseguenza. Selezionare 'Altro' per una licenza propria o speciale.
URL della licenza Specifica un URL che descrive la licenza selezionata in Licenza di default

Selezione

Nella scheda Selezione si può specificare quanto segue:

Nome Descrizione
Passa automaticamente alla vista 3D contenente l'elemento selezionato Abilita la modalità Sincronizza la vista.
Espande automaticamente la struttura quando l'oggetto corrispondente viene selezionato nella vista 3D Abilita la modalità Sincronizza la selezione.
Preseleziona l'oggetto nella vista 3D quando il mouse sopra l'elemento ad albero Abilita la modalità Preselezione.
Registra la selezione nella vista ad albero per andare indietro/avanti usando il pulsante di navigazione Abilita la modalità Registra la selezione.
Aggiunge caselle di selezione nell'albero del modello Ogni oggetto nella Vista ad albero sarà dotato di una casella di controllo. Questo è utile, ad esempio, per selezionare più elementi su un touchscreen.

Cache

Queste preferenze sono correlate alla directory della cache in cui FreeCAD memorizza i file temporanei.

Nella scheda Cache (disponibile dalla versione 0.20) puoi specificare quanto segue:

Nome Descrizione
Posizione Specifica il percorso della cartella della cache.
Controlla periodicamente all'avvio del programma Controlla la frequenza con cui viene verificata la dimensione della cartella. Le opzioni sono:
  • Sempre
  • Giornaliero
  • Settimanale
  • Mensilmente
  • Annualmente
  • Mai
Limite dimensione della cache Specifica la dimensione massima della cartella. Sarai avvisato se viene eseguito un controllo e la dimensione supera questo valore. Le opzioni sono:
  • 100 MB
  • 300 MB
  • 500 MB
  • 1 GB
  • 2 GB
  • 3 GB
Dimensione attuale cache Mostra la dimensione corrente della directory, se disponibile. Premi il pulsante Controlla ora... per aggiornare il valore.

Area di notifica

Queste preferenze controllano l'area di notifica e le relative notifiche.

Nella scheda Area di notifica (disponibile dalla versione 0.21) si può specificare quanto segue:

Nome Descrizione
Abilita area di notifica Se selezionato, l'Area di notifica apparirà nella barra di stato.
Abilita notifiche non intrusive Se selezionato, le notifiche non intrusive appariranno accanto all'area di notifica nella barra di stato.
Errori Se selezionato, gli errori verranno visualizzati nell'area di notifica.
Avvisi Se selezionato, gli avvisi appariranno nell'area di notifica.
Durata massima Durata massima durante la quale vengono visualizzate le notifiche (a meno che non si faccia clic sui pulsanti del mouse).
Durata minima Durata minima (idem).
Numero massimo di notifiche Numero massimo di notifiche mostrate contemporaneamente.
Ampiezza notifica Larghezza dell'area di notifica in pixel.
Nascondi quando viene attivata un'altra finestra Se selezionato, le notifiche aperte scompariranno quando viene attivata un'altra finestra.
Non mostrare quando inattivo Se selezionato, le notifiche non verranno visualizzate se la finestra di FreeCAD non è la finestra attiva.
Numero massimo di messaggi (0 = nessun limite) Il numero massimo di messaggi conservati nell'elenco. Impostare su 0 per nessun limite.
Rimozione automatica notifiche utente Se selezionato, le notifiche verranno rimosse dall'elenco dei messaggi quando la Durata massima sarà scaduta.

Report

Queste preferenze controllano il comportamento della Finestra dei Report. Questo pannello può essere aperto utilizzando l'opzione di menu Visualizza → Panelli → Report.

Nella scheda Report è possibile specificare quanto segue:

Nome Descrizione
Registra i messaggi normali Se selezionato, verranno registrati i messaggi normali. Verranno emessi nel pannello Report con il colore impostato in Messaggi normali.
Registra i messaggi di log Se selezionato, verranno registrati anche i messaggi di log. Verranno emessi nel pannello Report con il colore impostato in Messaggi di log.
Registra gli avvisi Se selezionato, verranno registrati gli avvisi. Verranno emessi nel pannello Report con il colore impostato in Avvisi.
Registra i messaggi di errore Se selezionato, verranno registrati i messaggi di errore. Verranno emessi nel pannello Report con il colore impostato in Errori
Mostra la vista report in caso di errore Se selezionato, il pannello Report viene visualizzato automaticamente non appena viene registrato un errore.
Mostra la vista report in caso di avviso Se selezionato, il pannello Report viene visualizzato automaticamente non appena viene registrato un avviso.
Mostra la vista report per i messaggi Se selezionato, il pannello Report viene visualizzato automaticamente non appena viene registrato un avviso.
Mostra la vista report per i messaggi di log Se selezionato, il pannello Report viene visualizzato automaticamente non appena viene registrato un messaggio di log.
Inserisci il codice temporale per ogni voce Se selezionato, ogni messaggio e avviso riceverà un codice temporale.
Messaggi normali Specifica il colore del carattere per i messaggi normali.
Messaggi di log Specifica il colore del carattere per i messaggi di log.
Avvisi Specifica il colore del carattere per i messaggi di avviso.
Errori Specifica il colore del carattere per i messaggi di errore.
Reindirizza l'output interno di Python alla finestra di report Se selezionato, l'output interno di Python verrà reindirizzato dalla console di Python al pannello Report.
Reindirizza gli errori interni di Python alla finestra di report Se selezionato, i messaggi di errore interni di Python verranno reindirizzati dalla console di Python al pannello Report.

Help

Nella scheda Help si può specificare quanto segue:

Nome Descrizione
Help location Specifica la posizione dei file della Guida. Le opzioni sono:
  • Online: Immettere l'URL o lasciare vuoto per utilizzare automaticamente l'URL di GitHub.
Translation suffix: Se viene utilizzato https://wiki.freecad.org/, può essere indicato il suffisso della lingua. Usa ad esempio fr per la traduzione francese. Deve essere vuoto per l'URL di GitHub.
  • From disk location: Immettere il percorso in cui è possibile trovare la documentazione di FreeCAD scaricata. Per scaricare la documentazione selezionare l'addon offline-documentation dall'elenco degli Ambienti di Lavoro nell'Addon Manager.
Display Specifica dove deve essere visualizzata la documentazione. Le opzioni sono:
  • In a new FreeCAD tab: La documentazione viene visualizzata in una nuova scheda nell'Area della vista principale.
  • In your default web browser: La documentazione viene visualizzata nel browser Web predefinito.
  • In a separate, embeddable, dialog: La documentazione viene visualizzata in una finestra di dialogo separata. Questa finestra di dialogo può essere agganciata, ad esempio, alla parte superiore della Vista combinata.
Custom stylesheet Specifica un foglio di stile personalizzato opzionale. Non utilizzato per l'URL del wiki.

Visualizzazione

Questa sezione delle preferenze ha tre schede standard: Vista 3D, Navigazione e Colori. Una quarta scheda, Visualizzazione Mesh, viene aggiunta se è stato caricato l'Ambiente Mesh.

Vista 3D

Nella scheda Vista 3D si può specificare quanto segue:

Nome Descrizione
Mostra il sistema di coordinate all'angolo Se selezionato, il sistema di coordinate principale verrà mostrato nell'angolo inferiore destro della Vista 3D.

La Dimensione relativa (disponibile dalla versione 0.20) definisce la dimensione della rappresentazione come percentuale della dimensione della vista (il minimo della sua altezza e larghezza).

Mostra di default il sitema di assi Se selezionato, la croce dell'asse verrà mostrata di default nella Vista 3D.
Mostra contatore frame per secondo Se selezionato, il tempo necessario per l'ultima operazione e la risultante frequenza dei fotogrammi verrà visualizzato nell'angolo inferiore sinistro della Vista 3D.
Usa software OpenGL Se selezionato, OpenGL utilizzerà la CPU invece della GPU. Questa opzione è utile per la risoluzione dei problemi relativi alla scheda grafica e ai driver. La modifica di questa opzione richiede il riavvio dell'applicazione.
Usa OpenGL VBO (Vertex Buffer Object) Se selezionato, Vertex Buffer Objects (VBO) sarà usato. Un VBO è OpenGL OpenGL una funzionalità che fornisce metodi per caricare i dati dei vertici (posizione, vettore normale, colore, ecc.) sulla scheda grafica. I VBO offrono notevoli miglioramenti delle prestazioni perché i dati risiedono nella memoria grafica anziché nella memoria di sistema e quindi possono essere visualizzati direttamente dalla GPU. Per ulteriori informazioni di base, vedere Understanding OpenGL Objects.
Rendering accelerato "Render Cache" or "Render Acceleration" è spiegato più dettagliatamente in FreeCAD assembly3 render-caching. Le opzioni sono:
  • Auto: Lascia che Coin3D decida dove memorizzare nella cache (impostazione predefinita).
  • Distribuita: Attiva manualmente la cache per tutti i nodi radice del provider di viste.
  • Centralizzata: Disattiva manualmente la cache in tutti i nodi di tutti i provider di viste e memorizza nella cache solo il nodo radice del grafico della scena. Ciò offre la massima velocità di rendering, ma una risposta più lenta a qualsiasi cambio di scena.
Anti-Aliasing Specifica se e di che tipo di multisample anti-aliasing è utilizzato.
Oggetti trasparenti Specifica il tipo di rendering degli oggetti trasparenti. Le opzioni sono:
  • Un passaggio: Il rendering viene eseguito in un passaggio (impostazione predefinita). Questo può portare a artefatti triangolari. Se questi capita, può essere utilizzato il tipo Passa per le facce nascoste per evitarlo.
  • Passa per le facce nascoste: Il rendering viene eseguito in due passaggi. I poligoni rivolti all'indietro vengono visualizzati nel primo passaggio e i poligoni rivolti in avanti nel secondo passaggio.
Grandezza segnaposto Specifica la dimensione dei vertici (points) nell'Ambiente Sketcher. L'area cliccabile dei punti può essere ulteriormente ampliata aumentando il raggio di selezione.
Raggio di selezione (px) Imposta l'area per il prelievo degli elementi in Vista 3D. Un valore maggiore semplifica la selezione delle cose, ma può rendere impossibile la selezione di alcune piccole funzionalità.
Distanza tra gli occhi per la modalità stereo Specifica la distanza tra gli occhi utilizzata per le proiezioni stereo. Il valore specificato è un fattore che verrà moltiplicato per la dimensione del rettangolo di selezione dell'oggetto 3D attualmente visualizzato.
Colore di retroilluminazione Se selezionata, la retroilluminazione è abilitata con il colore definito. La retroilluminazione viene utilizzata per il rendering dei lati posteriori delle facce. Di solito, non li vedi nei solidi, a meno che non ne tagli uno con un piano di ritaglio o se le facce non sono orientate correttamente. È usato solo per gli oggetti la cui proprietà Illuminazione (nella scheda Visualizza) è impostata su Un lato. Se disabilitato, il lato posteriore delle facce di quegli oggetti sarà nero. La corrispondente impostazione Intensità specifica l'intensità della retroilluminazione.
Tipo di camera Specifica il tipo di proiezione della telecamera. Le opzioni sono:

Navigazione

Nella scheda Navigazione si può specificare quanto segue:

Nome Descrizione
Cubo di navigazione Se selezionato, il Cubo di navigazione verrà mostrato nella Vista 3D.

Passi di rotazione definisce il numero di passi necessari per una rotazione completa quando si utilizzano le frecce di rotazione del Cubo di navigazione.

Se Ruota verso il più vicino è selezionato, la vista 3D viene ruotata secondo logica alla posizione più vicina, in base all'orientamento corrente del cubo, quando si fa clic su una faccia del cubo. In caso contrario, fare clic su una faccia comporterà sempre la stessa rotazione. disponibile dalla versione 0.20

Dimensione cubo definisce la dimensione del cubo. disponibile dalla versione 0.20

Color imposta il colore base di tutti gli elementi. disponibile dalla versione 0.21

Corner definisce dove viene visualizzato il cubo di navigazione nella Vista 3D. Le opzioni sono:

  • In alto a sinistra
  • In alto a destra
  • In basso a sinistra
  • In basso a destra

Nome carattere specifica il carattere usato per i testi del cubo. disponibile dalla versione 0.21

Dimensione carattere imposta la dimensione del carattere utilizzato per il testo del cubo. disponibile dalla versione 0.21

Colore pulsanti imposta il colore di tutti gli elementi intorno al cubo. disponibile dalla versione 0.21

Navigazione 3D Specifica uno stile di navigazione col mouse. Per vedere i dettagli di ogni stile, selezionalo e poi premi il pulsante Mouse....
Stile orbita Specifica lo stile dell'orbita di rotazione utilizzato in modalità rotazione. Le opzioni sono:
  • Piatto: Muovendo il mouse orizzontalmente, la vista ruoterà attorno all'asse Z.
  • Trackball: Spostando il mouse orizzontalmente la vista ruoterà attorno all'asse Y.
  • Piatto Libero: Simile a Piatto, ma se possibile l'asse di rotazione viene mantenuto collineare con l'asse della vista 3D globale. disponibile dalla versione 0.21
Modalità di rotazione Definisce il centro di rotazione. Le opzioni sono:
  • Centro finestra
  • Trascina al cursore
  • Centro oggetto
Orientamento predefinito della camera Specifica l'orientamento della fotocamera per i nuovi documenti. Questa impostazione viene utilizzata anche dal comando ViewHome..
Zoom fotocamera Influisce sul livello di zoom iniziale della fotocamera per i nuovi documenti. Il valore impostato è il diametro di una sfera che si adatta alla Vista 3D. Il valore predefinito è 100 mm. Imposta anche la dimensione iniziale delle feature di origine (piani di base nei nuovi Corpi Part Design e Parti).
Abilita animazione Se selezionato e Navigazione 3D è impostato su CAD, le rotazioni possono essere animate. Se si sposta il mouse mentre si premono la rotellina e il pulsante destro del mouse, la vista viene ruotata. Se si mantiene il mouse in movimento mentre si rilascia il pulsante destro del mouse, la rotazione continuerà. Per terminare questa animazione, fare clic con il tasto sinistro del mouse.
Ingrandimento al cursore Se selezionata, le operazioni di zoom verranno eseguite nella posizione del puntatore del mouse. In caso contrario, le operazioni di zoom verranno eseguite al centro della vista corrente. Il Fattore di zoom definisce quanto verrà ingrandito. Un passo di zoom di 1 significa un fattore di 7,5 per ogni passo di zoom.
Inverti lo zoom Se selezionato, la direzione delle operazioni di zoom sarà invertita.
Disattiva l'inclinazine dai gesti del touch screen Se selezionato e Navigazione 3D è impostato su Gesture, il gesto di inclinazione sarà disabilitato per lo zoom con le dita (zoom con due dita).
Abilita indicazione centro di rotazione Se questa opzione è selezionata, durante il trascinamento viene visualizzato il centro di rotazione della vista. disponibile dalla versione 1.0

Colori

Nella scheda Colori si può specificare quanto segue:

Nome Descrizione
Attiva l'evidenziamento di preselezione Se selezionato, la preselezione è attivata e verrà utilizzato il colore specificato. La preselezione significa che ad esempio i bordi delle parti verranno evidenziati passandoci sopra con il mouse per indicare che possono essere selezionati.
Attiva l'evidenziamento di selezione Se selezionato, l'evidenziazione della selezione è attivata e verrà utilizzato il colore specificato.
Colore semplice Se selezionato, lo sfondo della Vista 3D avrà il colore selezionato.
Gradiente di colore Se selezionato, lo sfondo della Vista 3D avrà una sfumatura di colore verticale. Il primo colore è il colore nella parte superiore della vista 3D, il secondo il colore in basso.
Commuta Premere questo pulsante per commutare la cima ed il fondo dei colori del gradiente. disponibile dalla versione 0.21
Colore centrale Questa opzione è abilitata solo se è selezionato Gradiente di colore. Se selezionato, il gradiente di colore applicherà il colore selezionato come colore centrale.
Oggetto in fase di modifica Specifica il colore di sfondo per gli oggetti nella vista ad albero che sono attualmente in modifica.
Contenitore attivo Specifica il colore di sfondo per i contenitori attivi nella vista ad albero. Ad esempio, un corpo attivo di PartDesign avrà questo colore.

Visualizzazione Mesh

Questa scheda è disponibile solo se è stato caricato l'Ambiente Mesh.

Nella scheda Visualizzazione Mesh puoi specificare quanto segue:

Nome Descrizione
Colore predefinito della mesh Specifica il colore predefinito della faccia.
Colore predefinito della linea Specifica il colore predefinito della linea.
Trasparenza della mesh Specifica la trasparenza predefinita della mesh.
Trasparenza della linea Specifica la trasparenza predefinita della linea.
Render di entrambi i lati Se selezionato, il valore predefinito per la proprietà VistaLighting è Two side invece di One side. Two side significa che il colore del lato interno delle facce è lo stesso del colore del lato esterno. One side significa che il loro colore è il Colore di retroilluminazione, se abilitato, o il nero.
Mostra contenitore per le mesh evidenziate o selezionate Se selezionato, il valore predefinito per la proprietà VistaSelection Style è BoundBox invece di Shape. BoundBox significa che viene visualizzato un riquadro di delimitazione evidenziato se le mesh sono evidenziate o selezionate. Shape significa che la forma stessa viene quindi evidenziata.
Definisci le normali per vertice Se selezionato, viene utilizzato il Phong shading, altrimenti un'ombreggiatura piatta. L'ombreggiatura definisce l'aspetto delle superfici. Con l'ombreggiatura piatta le normali alla superficie non sono definite per vertice. Ciò porta a un aspetto irrealistico per le superfici curve. Mentre l'ombreggiatura Phong porta a un aspetto più realistico e più liscio.
Angolo di piega L'angolo di piega è un angolo di soglia tra due facce. Può essere impostato solo se viene utilizzata l'opzione Definisci le normali per vertice.
Se l'angolo della faccia ≥ angolo di piega, viene utilizzata l'ombreggiatura della sfaccettatura.
Se l'angolo della faccia < l'angolo di piega, viene utilizzata l'ombreggiatura uniforme.

Ambienti di lavoro

Questa sezione delle preferenze ha un'unica scheda: Ambienti di Lavoro Disponibili.

Ambienti Disponibili

Queste preferenze controllano il caricamento dell'ambiente.

Nella scheda Ambienti di Lavoro Disponibili è possibile specificare quanto segue:

Nome Descrizione
Ambienti di Lavoro Disponibili L'elenco visualizza tutti gli ambienti di lavoro installati. L'elenco può essere riordinato trascinandolo (disponibile dalla versione 0.21) e ordinato facendo clic con il pulsante destro del mouse sull'elenco e selezionando Ordina alfabeticamente (disponibile dalla versione 1.0). L'ordine dell'elenco determina anche l'ordine del Selettore dell'ambiente di lavoro.
  • disponibile dalla versione 0.21: Prima casella di spunta in ogni riga: Se selezionata, il workbench sarà disponibile nel selettore degli ambienti di lavoro nella prossima sessione di FreeCAD. L'ambiente di avvio non può essere deselezionato. Gli ambienti di lavoro non selezionati vengono spostati in fondo all'elenco.
  • Autocaricamento: Se selezionato, l'ambiente verrà caricato automaticamente all'avvio di FreeCAD. Il caricamento di più ambienti renderà l'avvio più lento, ma il passaggio tra ambienti, che sono già stati caricati, è più veloce.
  • Carica adesso: Premere questo pulsante per caricare l'ambiente di lavoro nella sessione corrente di FreeCAD.
Autocaricamento L'ambiente di lavoro che viene caricato all'avvio di FreeCAD.
Posizione selettore ambiente di lavoro disponibile dalla versione 0.21 Definisce dove appare il selettore Workbench. Le opzioni sono:
  • Toolbar: In una barra degli strumenti dedicata.
  • Angolo sinistro: Nell'angolo sinistro della barra dei menu.
  • Angolo destro: Nell'angolo destro della barra dei menu.
Ricorda il workbench attivo nella scheda Se selezionato, FreeCAD ricorderà e ripristinerà l'ambiente di lavoro che era attivo per ciascuna scheda nell'Area di visualizzazione principale.

Python

Questa sezione delle preferenze (disponibile dalla versione 0.21) ha tre schede: Macro, Console Python ed Editor.

Macro

Nella scheda Macro è possibile specificare quanto segue:

Nome Descrizione
Esegui le macro in ambiente locale Se selezionato, le variabili definite dalle macro vengono create come variabili locali, altrimenti come variabile Python globali
Percorso macro Specifica il percorso dei file macro
Registra i comandi GUI Se selezionato, le macro registrate conterranno anche i comandi dell'interfaccia utente
Registra come commento Se selezionato, le macro registrate conterranno anche i comandi dell'interfaccia utente ma come commenti. Ciò è utile se non si desidera eseguire azioni visibili durante l'esecuzione della macro ma per rendere visibile cosa si potrebbe fare.
Mostra lo script dei comandi nella console Python Se selezionato, i comandi eseguiti dagli script macro vengono visualizzati nella console Python. Questa console viene visualizzata utilizzando il menu Visualizza → Pannelli → Console Python.
Dimensione dell'elenco delle macro recenti Controlla il numero di macro recenti da visualizzare nel menu.
Keyboard Shortcut count Controlla il numero di macro recenti a cui vengono assegnate in modo dinamico le scorciatoie.
Modificatori tastiera Controlla quali modificatori di tastiera vengono utilizzati per le scorciatoie, ad esempio Ctrl+Shift+ crea scorciatoie sotto forma di Ctrl+Shift+1, Ctrl+Shift+2, eccetera.

Console Python

Queste preferenze controllano il comportamento della console Python. Questa console può essere aperta utilizzando l'opzione di menu Visualizza → Pannelli → Console Python.

Nota che le impostazioni di colore e carattere per la console sono definite nella scheda Editor.

Nella scheda Console Python (disponibile dalla versione 0.20) puoi specificare quanto segue:

Nome Descrizione
Abilita il ritorno a capo automatico Se selezionata, le parole andranno a capo se superano lo spazio orizzontale disponibile nella console.
Abilita il cursore a blocco Se selezionato, il cursore avrà la forma di un blocco.
Salva la cronologia Se selezionata, la cronologia di Python viene salvata tra le sessioni.

Editor

Queste preferenze controllano il comportamento dell'Editor macro. Questo editor può essere aperto utilizzando l'opzione di menu Macro → Macro... → Modifica o Crea.

Le impostazioni del colore e del carattere vengono utilizzate anche dalla console Python.

Nella scheda Editor è possibile specificare quanto segue

Nome Descrizione
Abilita la numerazione delle righe Se selezionato, le righe del codice saranno numerate.
Abilita il cursore a blocco Se selezionato, il cursore avrà la forma di un blocco.
Dimensione della tabulazione Specifica il raster della tabulatore (quanti spazi). Se ad esempio è impostato su 6, premendo Tab si passerà al carattere 7 o 13 o 19 ecc., a seconda della posizione corrente del cursore. Questa impostazione viene utilizzata solo se è selezionato Mantieni le tabulazioni.
Dimensione dell'indentazione Specifica quanti spazi verranno inseriti quando si preme Tab. Questa impostazione viene utilizzata solo se è selezionato Inserisci gli spazi.
Mantieni le tabulazioni Se selezionato, premendo Tab verrà inserita una tabulazione con il raster definito da Dimensione della tabulazione.
Inserisci gli spazi Se selezionato, premendo Tab verrà inserito il numero di spazi definito da Dimensione dell'indentazione.
Visualizza gli elementi Selezione del tipo di codice. Le impostazioni di colore e di carattere verranno applicate al tipo selezionato. Il risultato può essere visto nel campo Anteprima.
Tipo di carattere Specifica la famiglia di caratteri che deve essere utilizzata per il tipo di codice selezionato
Dimensione Specifica la dimensione del carattere da utilizzare per il tipo di codice selezionato
Colore Specifica il colore da utilizzare per il tipo di codice selezionato.

Addon Manager

Questa sezione delle preferenze ha un'unica scheda: Opzioni di Addon manager.

Opzioni di Addon manager

Queste preferenze controllano il comportamento dell'Addon manager.

Nella scheda Opzioni di Addon manager (disponibile dalla versione 0.20) puoi specificare quanto segue:

Nome Descrizione
Controlla automaticamente gli aggiornamenti all'avvio (richiede git) Se selezionato, il gestore dei componenti aggiuntivi verificherà la presenza di aggiornamenti all'avvio. Git deve essere installato affinché funzioni.
Scarica Macro metadati (circa 10MB) Se selezionato, i metadati delle macro vengono scaricati per la visualizzazione nell'elenco dei componenti aggiuntivi principali del gestore dei componenti aggiuntivi. Questi dati vengono memorizzati nella cache locale.
Frequenza aggiornamento cache Controlla la frequenza con cui vengono aggiornate le informazioni sui metadati e sulla disponibilità del componente aggiuntivo memorizzato nella cache locale. Le opzioni sono:
  • Manuale (nessun aggiornamento automatico)
  • Giornaliero
  • Settimanale
Nascondi Addons contrassegnati con solo Python 2 Se selezionato, i componenti aggiuntivi contrassegnati come "Solo Python 2" non sono inclusi nell'elenco. È improbabile che questi componenti aggiuntivi funzionino nella versione corrente di FreeCAD.
Nascondi gli Addons contrassegnati obsoleti Se selezionato, i componenti aggiuntivi contrassegnati come "Obsoleti" non sono inclusi nell'elenco.
Nascondi gli addons che richiedono una nuova versione di FreeCAD Se selezionato, i componenti aggiuntivi che richiedono una versione più recente di FreeCAD non sono inclusi nell'elenco.
Repository personalizzati I repository personalizzati possono essere specificati qui.

Per aggiungere un repository premere il pulsante . Sia il Repository URL che il Branch, tipicamente master o main, devono essere specificati nella finestra di dialogo che si apre. disponibile dalla versione 0.21

Per rimuovere un repository selezionalo nell'elenco e premere il pulsante . disponibile dalla versione 0.21

Proxy Il gestore Addon include il supporto sperimentale per i proxy che richiedono l'autenticazione, impostati come proxy definiti dall'utente.
Eseguibile Python (opzionale) Il gestore Addon tenta di determinare l'eseguibile Python da utilizzare per l'installazione automatica basata su pip delle dipendenze Python. Per ignorare questa selezione, è possibile impostare qui il percorso dell'eseguibile.
git eseguibile (opzionale) Il gestore Addon tenta di determinare l'eseguibile git. Per ignorare questa selezione, è possibile impostare qui il percorso dell'eseguibile. disponibile dalla versione 0.21
Mostra l'opzione per cambiare i rami (richiede git) Se selezionato, il gestore Addon fornisce un'interfaccia nella schermata dei dettagli dell'addon che consente di cambiare quale ramo git è attualmente estratto. Questo è destinato solo agli utenti esperti, poiché è possibile che una versione non primaria di un componente aggiuntivo possa causare problemi di instabilità e compatibilità. Git deve essere installato affinché funzioni. Usare con cautela.
Disabilita git (torna solo agli scaricamenti ZIP) Se selezionato, i download di git sono disabilitati. disponibile dalla versione 0.21
Addon modalità sviluppatore Se selezionato, vengono attivate le opzioni del gestore Addon destinate agli sviluppatori di addons. disponibile dalla versione 0.21

Import-Export

Le preferenze Importa/Esporta influiscono sulla modalità di importazione ed esportazione dei file. Sono descritte nella pagina Preferenze di Importa/Esporta.

Preferenze relative agli Ambienti di Lavoro

Le preferenze per gli ambienti di lavoro integrati sono elencate nei link seguenti. Questi collegamenti sono elencati anche in Category:Preferences. Alcuni ambienti di lavoro non hanno preferenze.

Scripting

Vedere anche: Script di base per FreeCAD.

Per un esempio di script, vedere Modifica parametri.

Correlazioni



Introduzione

L'interfaccia di FreeCAD è basata sul moderno toolkit Qt, e dispone di una organizzazione ottimale. Alcuni aspetti dell'interfaccia possono essere personalizzati. Ad esempio, è possibile aggiungere barre degli strumenti personalizzate, con strumenti di diversi ambienti di lavoro o strumenti definiti nelle macro e creare le proprie scorciatoie da tastiera. Ma i menu e le barre degli strumenti predefinite fornite con FreeCAD e i suoi ambienti di lavoro non possono essere modificati.

disponibile dalla versione 0.21: La scheda degli Ambienti non è più disponibile. La sua funzionalità è stata spostata nella scheda Ambienti Disponibili nella sezione Ambienti di lavoro dell'Editor delle preferenze.

La finestra di dialogo Personalizza

Utilizzo

  1. I comandi disponibili nella finestra di dialogo Personalizza dipendono dagli ambienti di lavoro che sono stati caricati nella sessione corrente di FreeCAD. Quindi dovresti prima caricare tutti gli ambienti ai cui comandi vuoi avere accesso.
  2. Esistono diversi modi per invocare il comando Personalizza:
    • Selezionare l'opzione dal menu Strumenti → Personalizza....
    • Cliccare col tasto destro sull'area della barra strumenti e selezionare Personalizza... dal menu contestuale.
  3. Si apre la finestra di dialogo Personalizza. Per ulteriori informazioni, vedere Opzioni.
  4. Il bottone Aiuto avvia il comando Cos'è questo..
  5. Premere il bottone Chiudi per chiudere la finestra di dialogo.

Opzioni

Nella finestra di dialogo Personalizza sono disponibili le seguenti schede:

Tastiera

La scheda Tastiera

In questa scheda è possibile definire le scorciatoie da tastiera personalizzate. I collegamenti per i comandi delle macro possono essere definiti nella scheda Macro.

Cercare

Puoi cercare i comandi inserendo almeno 3 caratteri del testo del menu o del nome nel campo di ricerca. La ricerca non fa distinzione tra maiuscole e minuscole.

È anche possibile cercare le scorciatoie:

  • Nel campo di ricerca i tasti speciali nelle scorciatoie devono essere inseriti come stringhe. Ad esempio, per cercare i comandi che utilizzano Ctrl nella loro scorciatoia, inserire ctrl (4 lettere).
  • Aggiungere le parentesi per cercare le scorciatoie a carattere singolo, ad esempio: (c).
  • Aggiungere una virgola e uno spazio tra i caratteri delle scorciatoie multi-carattere, ad esempio: g, b, b.

Aggiungere una scorciatoia

  1. Selezionare una categoria di comandi dall'elenco a discesa Categoria.
  2. Selezionare un comando dal pannello Comandi.
    • Facoltativamente, fare clic sulle intestazioni di colonna Comando, Scelta rapida o Predefinito per riordinare l'elenco.
    • Facoltativamente, trascinare lo splitter a destra del pannello per ridimensionarlo.
  3. La casella Scorciatoia corrente visualizza la scorciatoia corrente, se disponibile.
  4. Inserire una nuova scorciatoia nella casella di input Nuova scorciatoia. La scorciatoia accetta fino a 4 input. Ogni input è un singolo carattere, una combinazione di uno o più tasti speciali o una combinazione di uno o più tasti speciali e un carattere. Usare Backspace per correggere gli errori.
  5. Altri comandi attivi (vedi le Note) che già usano la scorciatoia saranno elencati nella Lista priorità scorciatoia.
  6. Premere il pulsante Assegna per assegnare la nuova scorciatoia.
  7. Se la Lista priorità scorciatoia contiene più di un comando: facoltativamente cambia il suo ordine selezionando i singoli comandi e premendo il pulsante Su o il pulsante Giù. Se i comandi attivi condividono la stessa scorciatoia, la scorciatoia attiverà quella più in alto nell'elenco.

Rimuovere una scorciatoia

  1. Selezionare una categoria di comando dall'elenco a discesa Categoria.
  2. Selezionare un comando dal pannello Comandi.
  3. Premere il pulsante Cancella.

Ripristinare una scorciatoia predefinita

  1. Selezionare una categoria di comando dall'elenco a discesa Categoria.
  2. Selezionare un comando dal pannello Comandi.
  3. Premere il pulsante Ripristina.

Ripristinare tutte le scorciatoie predefinite

  1. Premere il pulsante Ripristina tutto.

Note

  • Le scorciatoie funzionano solo per i comandi attivi. I comandi attivi sono comandi che appaiono nel menu standard, o nel menu dell'ambiente attivo, o comandi che appaiono in una barra degli strumenti visibile.

Inizio

Barre degli strumenti

La scheda Barre degli strumenti

In questa scheda è possibile creare e modificare barre degli strumenti personalizzate.

Cercare

Vedere Tastiera

Selezionare l'ambiente

  1. Nell'elenco a discesa a destra selezionare l'ambiente di cui si desidera modificare le barre degli strumenti personalizzate. L'opzione Globale è disponibile per le barre degli strumenti personalizzate che dovrebbero essere disponibili in tutti gli ambienti.

Creare una barra degli strumenti

  1. Premere il pulsante Nuovo ....
  2. Inserire un nome nella finestra di dialogo che si apre.
  3. Premere il pulsante OK.
  4. La nuova barra degli strumenti appare nel pannello a destra.

Rinominare una barra degli strumenti

  1. Selezionare una barra degli strumenti nel pannello a destra.
  2. Premere il pulsante Rinomina....
  3. Inserire un nuovo nome nella finestra di dialogo che si apre.
  4. Premere il pulsante OK.

Eliminare una barra degli strumenti

  1. Selezionare una barra degli strumenti nel pannello a destra.
  2. Premere il pulsante Elimina.

Disabilitare una barra degli strumenti

  1. Deselezionare la casella di controllo davanti al nome della barra degli strumenti nel pannello a destra.
  2. Una barra degli strumenti disabilitata è invisibile nell'interfaccia di FreeCAD.

Aggiungere un comando

  1. È richiesta almeno una barra degli strumenti personalizzata. Vedi Creare una barra degli strumenti.
  2. Selezionare la barra degli strumenti corretta nel pannello a destra. Se non viene selezionata alcuna barra degli strumenti, il comando viene aggiunto alla prima barra degli strumenti nell'elenco.
  3. Selezionare una categoria di comando dall'elenco a discesa Categoria. I comandi macro impostati nella scheda Macro vengono visualizzati nella categoria Macro.
  4. Selezionare un comando dal pannello Comandi, oppure selezionare <Separatore> per aggiungere un separatore (una linea tra due pulsanti della barra degli strumenti).
    • Facoltativamente, trascinare lo splitter a destra del pannello per ridimensionarlo.
  5. Premere il pulsante .

Rimuovere un comando

  1. Se necessario, espandere la barra degli strumenti nel riquadro a destra.
  2. Selezionare un comando.
  3. Premere il pulsante .

Cambiare la posizione di un comando

  1. Se necessario, espandere la barra degli strumenti nel riquadro a destra.
  2. Selezionare un comando.
  3. Premere il pulsante o il pulsante .
  4. Ripetere fino a quando il comando non si trova nella posizione desiderata.

Note

  • Le barre degli strumenti appartenenti all'ambiente corrente vengono aggiornate immediatamente, ma dopo aver disabilitato o riattivato una barra degli strumenti è necessario cambiare ambiente (passare a un ambiente diverso e quindi tornare indietro).
  • Per aggiornare le barre degli strumenti globali è necessario cambiare ambiente (se i comandi sono stati aggiunti o rimossi) o riavviare (se l'ordine di una barra degli strumenti è cambiato o una barra degli strumenti è stata rinominata).

Inizio

Macro

La scheda Macro

In questa scheda è possibile impostare i comandi macro. Una volta configurati, possono essere aggiunti alle barre degli strumenti personalizzate. Le macro installate con Addon Manager vengono impostate automaticamente e aggiunte a una barra degli strumenti Global (vedere Barre degli strumenti ), se si conferma il popup Aggiungi pulsante durante il processo di installazione.

Se si desidera utilizzare una macro scaricata da una fonte diversa, si dovrà installarla manualmente. Vedi Come installare le macro per maggiori informazioni. Si noti che FreeCAD utilizza una cartella dedicata per le macro e solo le macro in quella cartella possono essere impostate. Usare il comando Macro per trovare questa cartella sul proprio sistema.

Aggiungere un comando macro

  1. Nell'elenco a discesa Macro selezionare una macro.
  2. Immettere un Testo di menu. Questo sarà il nome utilizzato per identificare il comando macro e apparirà anche nella barra degli strumenti se non è presente l'icona.
  3. Facoltativamente, inserire un Suggerimento. Questo testo apparirà vicino alla posizione del mouse quando si passa il mouse sull'icona della barra degli strumenti.
  4. Facoltativamente, inserire un Testo di stato. Questo testo apparirà nella barra di stato quando si passa con il mouse sull'icona della barra degli strumenti.
  5. Facoltativamente, inserire la pagina wiki per la macro, se disponibile, nella casella di inserimento Che cos'è questo. Inserire il nome della pagina, non l'URL completo.
  6. Facoltativamente, inserire una scorciatoia nella casella d'immissione Acceleratore. Vedere Tastiera per maggiori informazioni.
  7. Per aggiungere un'icona:
    1. Premere il pulsante Pixmap ....
    2. Si apre la finestra di dialogo Scegli Icona.
    3. Se necessario, premere il pulsante Cartella icone... per aggiungere una cartella di icone.
    4. Selezionare un'icona dal pannello. La finestra di dialogo Scegli Icona si chiude automaticamente.
  8. Premere il pulsante Aggiungi.
  9. Il comando macro appare nel pannello a sinistra.
  10. È ora possibile selezionare il comando macro nella scheda Barre degli strumenti.

Rimuovere un comando macro

  1. Selezionare il comando macro nel pannello a sinistra.
  2. Premere il pulsante Elimina.

Cambiare un comando macro

  1. Fare doppio clic sul comando macro nel pannello a sinistra.
  2. Apportare le modifiche richieste. Notare che non si può rimuovere l'icona, la si può solo sostituire.
  3. Premere il pulsante Sostituisci.

Inizio

Movimenti Spaceball

Questa scheda è vuota se non viene rilevata alcuna Spaceball. Vedere: 3Dconnexion input devices.

Inizio

Pulsanti Spaceball

Questa scheda è vuota se non viene rilevata alcuna Spaceball. Vedere: 3Dconnexion input devices.

Inizio

Temi

FreeCAD supporta i temi completi dell'interfaccia, tramite fogli di stile .qss. Il formato qss è molto simile al formato css utilizzato nelle pagine Web, aggiunge fondamentalmente metodi per fare riferimento ai diversi widget ed elementi dell'interfaccia Qt. Puoi cambiare il tema predefinito (che prende semplicemente lo stile definito dal tuo sistema desktop) selezionando un foglio di stile nel menu Preferenze di FreeCAD.

Puoi anche creare il tuo tema se non sei soddisfatto dei temi forniti con FreeCAD, ad esempio modificando un foglio di stile esistente. Il tuo nuovo foglio di stile deve essere posizionato in una cartella specifica per essere trovato da FreeCAD:

  • %APPDATA%/FreeCAD/Gui/Stylesheets (per Windows). La cartella %APPDATA% può essere trovata inserendo App.getUserAppDataDir() dalla console di Python.
  • $HOME/.FreeCAD/Gui/Stylesheets (per Linux).
  • $HOME/Library/Application Support/FreeCAD/Gui/Stylesheets (per macOS).

Inizio

Componenti aggiuntivi

I componenti aggiuntivi di Addon Manager offrono un altro modo per personalizzare l'interfaccia utente. Sono disponibili diversi Preference Packs per cambiare il tema.

Nella categoria Ambienti di Lavoro dell'Addon Manager si possono trovare alcuni addons dell'utente triplus:

Inizio



Introduzione

Una proprietà è una parte di informazione sotto forma di numero o di stringa di testo che viene allegata a un documento di FreeCAD oppure a un oggetto di un documento. Le proprietà pubbliche possono essere visualizzate e, se consentito, modificate nell'editore delle proprietà.

In FreeCAD le proprietà svolgono un ruolo molto importante. Dato che gli oggetti in FreeCAD sono "parametrici", ciò significa che il loro comportamento è definito dalle loro proprietà e dal modo in cui queste proprietà vengono utilizzate come input per i loro metodi delle classi. Vedere anche FeaturePython Custom Properties e PropertyLink: InList e OutList

Tutti i tipi di proprietà

In FreeCAD gli oggetti script personalizzati possono utilizzare uno qualsiasi dei tipi di proprietà definiti nel sistema di base:

Name Unit (if any) Remark
Acceleration m/s^2
AmountOfSubstance mol
Angle °
Area m^2
Bool
BoolList
Color
ColorList
CurrentDensity A/m^2 introduced in version 0.21
Density kg/m^3
Direction
DissipationRate m^2/s^3 introduced in version 0.21
Distance m
DynamicViscosity Pa*s introduced in version 0.21
ElectricalCapacitance F introduced in version 0.21
ElectricalConductance S introduced in version 0.21
ElectricalConductivity S/m introduced in version 0.21
ElectricalInductance H introduced in version 0.21
ElectricalResistance Ohm introduced in version 0.21
ElectricCharge C introduced in version 0.21
ElectricCurrent A introduced in version 0.21
ElectricPotential V introduced in version 0.20
Enumeration
ExpressionEngine
File
FileIncluded
Float
FloatConstraint
FloatList
Font
Force N
Frequency Hz
HeatFlux W/m^2 introduced in version 0.21
Integer
IntegerConstraint
IntegerList
IntegerSet
InverseArea 1/m^2 introduced in version 0.21
InverseLength 1/m introduced in version 0.21
InverseVolume 1/m^3 introduced in version 0.21
KinematicViscosity m^2/s introduced in version 0.21
Length m
Link
LinkChild
LinkGlobal
LinkHidden
LinkList
LinkListChild
LinkListGlobal
LinkListHidden
LinkSub
LinkSubChild
LinkSubGlobal
LinkSubHidden
LinkSubList
LinkSubListChild
LinkSubListGlobal
LinkSubListHidden
LuminousIntensity cd introduced in version 0.21
MagneticFieldStrength A/m introduced in version 0.21
MagneticFlux Wb or V*s introduced in version 0.21
MagneticFluxDensity T introduced in version 0.21
Magnetization A/m introduced in version 0.21
Map
Mass kg introduced in version 0.21
Material
MaterialList
Matrix
PartShape a Part property, is accessed as
Part::PropertyPartShape
Path
Percent
PersistentObject
Placement
PlacementLink
PlacementList
Position
Power W introduced in version 0.21
Precision
Pressure Pa
PythonObject
Quantity
QuantityConstraint
Rotation
ShearModulus Pa introduced in version 0.21
SpecificEnergy m^2/s^2 or J/kg introduced in version 0.21
SpecificHeat J/kg/K introduced in version 0.21
Speed m/s
Stiffness m/s^2
Stress Pa introduced in version 0.21
String
StringList
Temperature K introduced in version 0.21
ThermalConductivity W/m/K introduced in version 0.21
ThermalExpansionCoefficient 1/K introduced in version 0.21
ThermalTransferCoefficient W/m^2/K introduced in version 0.21
Time s introduced in version 0.21
UltimateTensileStrength Pa introduced in version 0.21
UUID
VacuumPermittivity s^4*A^2 / (m^3*kg)
Vector
VectorDistance
VectorList
Velocity m/s introduced in version 0.21
Volume l or m^3
VolumeFlowRate l/s or m^3/s introduced in version 0.21
VolumetricThermalExpansionCoefficient 1/K introduced in version 0.21
Work J introduced in version 0.21
XLink
XLinkList
XLinkSub
XLinkSubList
YieldStrength Pa introduced in version 0.21
YoungsModulus Pa introduced in version 0.21

Internamente, il nome della proprietà ha il prefisso App::Property:

App::PropertyBool
App::PropertyFloat
App::PropertyFloatList
...

Ricordare che queste sono della proprietà types. Un singolo oggetto può avere molte proprietà dello stesso tipo, ma con nomi diversi.

Per esempio:

obj.addProperty("App::PropertyFloat", "Length")
obj.addProperty("App::PropertyFloat", "Width")
obj.addProperty("App::PropertyFloat", "Height")

Ciò indica un oggetto con tre proprietà di tipo "Float", denominate rispettivamente "Length", "Width", e "Height".

Script

Vedere anche: Script di base per FreeCAD

Prima viene creato un oggetto script, quindi gli vengono assegnate le proprietà.

obj = App.ActiveDocument.addObject("Part::Feature", "CustomObject")

obj.addProperty("App::PropertyFloat", "Velocity", "Parameter", "Body speed")
obj.addProperty("App::PropertyBool", "VelocityEnabled", "Parameter", "Enable body speed")

In generale, le proprietà Data sono assegnate usando il metodo addProperty() dell'oggetto. D'altra parte, le proprietà View sono normalmente fornite automaticamente dall'oggetto genitore da cui deriva l'oggetto script.

Per esempio:

  • Derivato da App::FeaturePython fornisce solo 4 proprietà View: "Display Mode", "On Top When Selected", "Show In Tree", e "Visibility".
  • Derivato da Part::Feature fornisce 17 proprietà View: le quattro precedenti più "Angular Deflection", "Bounding Box", "Deviation", "Draw Style", "Lighting", "Line Color", "Line Width", "Point Color", "Point Size", "Selectable", "Selection Style", "Shape Color", e "Transparency".

Tuttavia, le proprietà View possono anche essere assegnate usando il metodo addProperty() dell'oggetto fornitore della vista.

obj.ViewObject.addProperty("App::PropertyBool", "SuperVisibility", "Base", "Make the object glow")

Codice sorgente

Nel codice sorgente, le proprietà si trovano in vari file src/App/Property*.

Vengono importati e inizializzati in src/App/Application.cpp.

#include "Property.h"
#include "PropertyContainer.h"
#include "PropertyUnits.h"
#include "PropertyFile.h"
#include "PropertyLinks.h"
#include "PropertyPythonObject.h"
#include "PropertyExpressionEngine.h"




FreeCAD, come molte applicazioni moderne di progettazione come Revit o CATIA, è basato sul concetto di Ambiente di Lavoro. Un ambiente di lavoro può essere considerato come un insieme di strumenti appositamente raggruppati per un certo compito. In un tradizionale laboratorio di mobili, avresti un tavolo da lavoro per la persona che lavora con il legno, un altro per quello che lavora con i pezzi di metallo, e forse un terzo per quello che monta tutti i pezzi insieme.

In FreeCAD, viene applicato lo stesso concetto. Gli strumenti sono raggruppati per ambienti di lavoro in base ai compiti correlati.

Quando si passa da un ambiente di lavoro ad un altro, cambiano anche gli strumenti disponibili visualizzati sull'interfaccia. Le barre degli strumenti, le barre dei comandi e eventualmente altre parti dell'interfaccia si adattano al nuovo ambiente, ma il contenuto della scena visualizzata non cambia. Si può, ad esempio, iniziare a disegnare forme 2D utilizzando l'ambiente Draft e poi continuare a lavorare su di esse con l'ambiente Part.

Notare che a volte un Ambiente viene indicato come un Modulo. Gli Ambienti e i Moduli sono però entità diverse. Un Modulo è un'estensione di FreeCAD, mentre un Ambiente di lavoro è un tipo speciale di modulo con una GUI configurata (barre degli strumenti e menu).

Ambienti incorporati

Attuale

I seguenti ambienti di lavoro sono inclusi in ogni installazione di FreeCAD:

  • Menu di Base. Questo non è realmente un ambiente di lavoro, ma piuttosto una categoria di comandi e strumenti "standard" che possono essere utilizzati in tutti gli ambienti di lavoro.
  • Ambiente CAM viene utilizzato per produrre istruzioni G-Code. Questo ambiente di lavoro era chiamato "Path Workbench" nella versione 0.21 e precedenti.
  • Ambiente Draft contiene strumenti 2D e operazioni CAD 2D e 3D di base.
  • Ambiente FEM fornisce un flusso di lavoro di analisi agli elementi finiti (FEA).
  • Ambiente Inspection è realizzato per fornirti strumenti specifici per l'esame delle forme. È ancora nelle prime fasi di sviluppo.
  • Ambiente Part per lavorare con primitive geometriche ed operazioni booleane.
  • Ambiente Ingegneria inversa ha lo scopo di fornire strumenti specifici per convertire forme/solidi/mesh in forme parametriche compatibili con FreeCAD.
  • Ambiente Robot per lo studio dei movimenti dei robot. Attualmente non mantenuto.

Obsoleto

I seguenti ambienti di lavoro non sono più inclusi dalla versione 0.21:

  • Ambiente Start consente di passare rapidamente agli ambienti di lavoro più comuni.

I seguenti ambienti di lavoro non sono più inclusi dopo la versione 0.20:

Ambienti aggiuntivi

Gli ambienti di lavoro per FreeCAD sono facilmente programmabili in Python, quindi ci sono molte persone che stanno sviluppando degli ambienti aggiuntivi al di fuori dell'area principale di sviluppo di FreeCAD.

La pagina Ambienti complementari elenca tutti quelli che sono noti a questa comunità. La maggior parte è facilmente installabile da FreeCAD, usando Addon manager, che si trova nel menu Strumenti → Addon manager.




L'icona dell'ambiente Mesh

Introduzione

L'Ambiente Mesh gestisce i reticoli triangolari degli oggetti mesh. Gli oggetti mesh sono un tipo speciale di oggetti 3D, composti da facce triangolari (le maglie della griglia) connesse lungo i loro bordi e nei loro vertici. Oggetti tessellati.

Molte applicazioni 3D utilizzano i mesh come tipo principale di oggetti 3D, ad esempio: Sketchup, Blender, Maya e 3D Studio Max. Dato che i mesh sono oggetti molto semplici, contenenti solo vertici (punti), bordi e facce (triangoli), sono molto facili da creare, modificare, suddividere, allungare, e altrettanto facili da trasferire da un'applicazione all'altra senza alcuna perdita di informazioni. Inoltre, dal momento che contengono dati molto semplici, le applicazioni 3D ne possono gestire grandi quantità senza alcun problema. Per queste ragioni, gli oggetti mesh sono spesso il tipo di oggetto 3D utilizzato dalle applicazioni che si occupano di cinema, animazione e creazione di immagini.

Tuttavia, nel campo ingegneristico le mesh presentano una grande limitazione: non possono definire con precisione le superfici curve. Questo è il motivo per cui FreeCAD si affida invece a Brep. L'ambiente Mesh offre alcuni comandi per manipolare direttamente le mesh, ma viene spesso utilizzato per importare dati di mesh 3D e convertirle in un solido da utilizzare con Part o PartDesign.

Strumenti

Tutti gli strumenti dell'ambiente Mesh sono accessibili dal menu Meshes. Quasi tutti sono disponibili anche in una delle barre degli strumenti Mesh.

  • Adatta i segmenti...: crea segmenti di mesh separati per tipi di superficie specifiche di un oggetto mesh e può identificarne i parametri.
  • Decima...: riduce il numero di facce negli oggetti mesh.
  • Operazioni booleane
    • Unione: crea un oggetto mesh che è l'unione di due oggetti mesh.
    • Intersezione: crea un oggetto mesh che è l'intersezione di due oggetti mesh.
    • Differenza: crea un oggetto mesh che è la differenza di due oggetti mesh.
  • Unisci: crea un oggetto mesh combinando le maglie di due o più oggetti mesh.

Preferenze

Le preferenze di Mesh si trovano nelle seguenti categorie dell'editor delle preferenze:

Note




L'icona dell'ambiente Part

Introduzione

Le funzionalità di modellazione di solidi di FreeCAD sono basate sul kernel OpenCASCADE (OCCT), un sistema CAD di livello professionale che offre funzionalità avanzate per la creazione e manipolazione della geometria 3D. L'ambiente Part è su un livello superiore alle librerie OCCT, che fornisce all'utente l'accesso alle primitive e alle funzioni geometriche OCCT. Essenzialmente tutte le funzioni di disegno 2D e 3D in FreeCAD, negli ambienti Draft, Sketcher, PartDesign, ecc. si basano sulle funzioni esposte dall'ambiente Parte. Pertanto, L'ambiente Part può essere considerato il componente principale delle funzioni di disegno di FreeCAD.

Una discussione più dettagliata dell'ambiente Part e dell'ambiente PartDesign può essere trovata qui: Part e PartDesign.

Gli oggetti creati con Part sono relativamente semplici; sono pensati per essere utilizzati con le operazioni booleane (unioni e tagli) al fine di costruire forme più complesse. Questo paradigma di modellazione è noto come flusso di lavoro geometria solida costruttiva (CSG) ed era la metodologia tradizionale utilizzata nei primi sistemi CAD. D'altra parte, l'ambiente PartDesign fornisce un flusso di lavoro più moderno per la costruzione di forme: utilizza schizzi parametrici definiti, che vengono estrusi per formare un corpo solido di base, che viene poi modificato da trasformazioni parametriche (editazione delle funzioni), fino a quando non si ottiene l'oggetto finale.

Gli oggetti Parte sono più complessi degli oggetti mesh creati con l'ambiente Mesh, e consentono operazioni più avanzate come le operazioni booleane coerenti, la cronologia delle modifiche e il comportamento parametrico.

Part Workbench è lo strato base che espone le funzioni di disegno OCCT a tutti gli ambienti di FreeCAD.

Gli strumenti

Gli strumenti si trovano nel menu Part o nel menu Measure.

Primitive

Questi sono strumenti per creare oggetti primitivi.

  • Cubo: Crea un cubo.
  • Cono: Crea un cono.
  • Toro: Crea un toro.
  • Tubo: Crea un tubo.
  • Crea primitive...: uno strumento per creare una delle seguenti primitive:
    • Piano: crea un piano.
    • Cubo: crea un cubo. Questo oggetto può anche essere creato con lo strumento Cubo.
    • Cilindro: crea un cilindro. Questo oggetto può anche essere creato con lo strumento Cilindro.
    • Cono: crea un cono. Questo oggetto può anche essere creato con lo strumento Cono.
    • Sfera: crea una sfera. Questo oggetto può anche essere creato con lo strumento Sfera.
    • Ellissoide: crea un ellissoide.
    • Toro: crea un toro. Questo oggetto può anche essere creato con lo strumento Toro.
    • Prisma: crea un prisma.
    • Cuneo crea un cuneo.
    • Elica: crea un'elica.
    • Spirale: crea una spirale.
    • Cerchio: crea un arco circolare.
    • Ellisse: crea un arco ellittico.
    • Punto: crea un punto.
    • Linea: crea una linea.
    • Poligono regolare: crea un poligono regolare.

Creazione e modifica

Questi sono strumenti per creare nuovi oggetti e modificare quelli esistenti.

  • Rivoluziona: Crea un solido tramite la rivoluzione di un oggetto (non solido) attorno ad un asse.
  • Specchia: Riflette l'oggetto selezionato rispetto ad un asse stabilito.
  • Raccorda: Raccorda (arrotonda) i bordi di un oggetto.
  • Smussa: Smussa i bordi di un oggetto.
  • Crea faccia: Crea una faccia da un insieme di linee (contorni).
  • Loft: Loft da un profilo all'altro.
  • Sweep: fa scorrere uno o più profili lungo un percorso.
  • Seziona: Crea una sezione intersecando un oggetto con un piano di sezione.
  • Sezioni...: Crea una o più sezioni trasversali attraverso un oggetto.
  • Strumenti offset:
    • Offset 3D: Crea una forma parallela ad una data distanza dall'originale.
    • Offset 2D: Crea un contorno parallelo ad una certa distanza dall'originale, ingrandisce o contrae una faccia piana.

Boolean

Questi strumenti eseguono operazioni booleane.

  • Sottrai: Sottrae un oggetto da un altro.
  • Unisci: Unisce (fonde) due o più oggetti.
  • Interseca: Estrae la parte comune (intersezione) di due oggetti.

Misura

Altri strumenti

  • Importa CAD: Importazione da file *.IGES, *.STEP, o *.BREP.
  • Esporta CAD: Esportazione in file *.IGES, *.STEP, o *.BREP.
  • Inverti le forme: Capovolge le normali di tutte le facce dell'oggetto selezionato.

Strumenti del menu contestuale

  • Aspetto: Determina l'aspetto di un intero oggetto (colore, trasparenza, ecc.).

Preferenze

  • Preferenze: Preferenze disponibili per gli strumenti di Part (l'ambiente Part utilizza anche le preferenze di PartDesign).
  • Preferenze di Importa e esporta: preferenze disponibili per l'importazione e l'esportazione in diversi formati di file.
  • Ottimizzazione: Alcuni parametri extra per mettere a punto il comportamento di Part.

Script

Vedere Script di Part

Tutorial




L'ambiente Drawing non è più incluso dopo la versione 0.20.
L'ambiente TechDraw è il suo sostituto più avanzato.
L'icona di Drawing

Introduzione

L'ambiente Disegno (Drawing) consente di trasferire su carta il lavoro realizzato in 3D.

Permette di produrre delle viste (proiezioni sul piano) del modello, di posizionarle in una finestra 2D e di inserire la finestra in una tavola, ad esempio, in un foglio con il bordo, il titolo e il logo e, infine, di stampare la tavola.

Strumenti

Questi strumenti permettono di creare, configurare e esportare le proiezioni dei solidi come disegni 2D.


  • Apri SVG: apre un foglio di disegno preventivamente salvato in un file SVG.
  • Nuovo Disegno A3: crea un nuovo disegno su un foglio di default A3 orizzontale di FreeCAD.
  • Annotazione: aggiunge una annotazione al foglio di disegno corrente.
  • Clip: aggiunge un gruppo di clip al foglio di disegno corrente.
  • Simbolo: aggiunge il contenuto di un file in formato SVG come un simbolo nel foglio di disegno corrente
  • Vista Draft: Inserisce una speciale vista Draft dell'oggetto selezionato nel foglio del disegno corrente

Flusso di lavoro

Il documento contiene un oggetto di forma 3D (Schenkel) da si vuole produrre un disegno. Pertanto viene creata una "Pagina". Una pagina è istanziata da un modello, ad esempio il modello "A3_Landscape". Il modello è un documento SVG che può contenere una cornice di pagina, un logo e altri elementi.

Nella pagina si possono inserire una o più viste. Ogni vista ha una posizione nella pagina, un fattore di scala (proprietà di scala) e delle proprietà aggiuntive. Ogni volta che la pagina, la vista o l'oggetto a cui si fa riferimento subiscono delle modifiche, la pagina viene rigenerata e viene anche aggiornata la sua visualizzazione.

Script

Per ora le funzioni offerte dall'interfaccia grafica (GUI) sono molto limitate, quindi gli script API sono più interessanti.

Vedere la pagina Esempi dell'API di Drawing per una descrizione delle funzioni utilizzate per creare pagine e viste di disegno.

Modelli di squadrature

FreeCAD viene fornito con una serie di modelli di pagina predefiniti, ma si possono trovare altri modelli in Modelli di squadrature.

Estendere il modulo Drawing

Alcune ulteriori note sulla programmazione del Modulo Disegno sono contenute nella pagina Drawing Documentation (en) Drawing Documentation (it). Dette note aiutano a capire rapidamente come lavora questo modulo e permettono ai programmatori di avviare rapidamente la programmazione per esso.

Tutorials

Macro

  • Macro Disegno automatico: Permette all'utente di ottenere la vista del proprio oggetto in un disegno con 4 diverse posizioni (frontale, superiore, iso, destra). Necessita di qualche modifica per essere perfettamente efficace.
  • Macro CartoucheFC: Questa macro della GUI riempie semplicemente tutti i campi del cartiglio del foglio di lavoro per l'implementazione del disegno di FreeCAD, il formato della data e il simbolo della modalità di proiezione si adattano a la regione UE o gli Stati Uniti selezionati.
  • Macro CartoucheFC 2: Questa macro della GUI riempie semplicemente tutti i campi del cartiglio modello 2 del foglio di lavoro per implementazione del disegno di FreeCAD.
  • Macro CartoucheFC Full: Questa macro della GUI riempie semplicemente tutti i campi del cartiglio nei Modelli vari completi del foglio di lavoro per implementazione del disegno di FreeCAD, il formato del la data e il simbolo della modalità di proiezione si adattano alla regione UE o agli Stati Uniti selezionati.
  • Procedura guidata/aggiornamento forme macro angolo: apre una finestra di dialogo che richiede le dimensioni del pezzo d'angolo, quindi crea l'oggetto nel documento e crea una visualizzazione della pagina con viste dall'alto, frontale e laterale del pezzo.

Collegamenti esterni




L'ambiente Raytracing non è più incluso dopo la versione 0.20.
Al suo posto dovrebbe essere utilizzato l'ambiente esterno Render Workbench.
L'icona di Raytracing

Introduzione

L'Ambiente Raytracing viene utilizzato per generare immagini fotorealistiche dei modelli elaborandole con un renderer esterno.

Il modulo Raytracing lavora con dei modelli, che sono file di progetto che definiscono una scena per il modello 3D. È possibile posizionare luci e geometrie come i piani terra e contiene anche i segnaposto per la posizione della telecamera e per le informazioni sul materiale degli oggetti nella scena. Il progetto può quindi essere esportato in un file pronto per il rendering o essere eseguito direttamente in FreeCAD.

Attualmente sono supportati due renderizzatori: POV-Ray e LuxRender. Per poter eseguire il rendering direttamente da FreeCAD, sul sistema deve essere installato almeno uno di questi renderer, e deve essere configurato il suo percorso nelle preferenze di FreeCAD per Raytracing. Senza alcun renderer installato, si può comunque esportare un file della scena e utilizzarlo successivamente in uno di questi renderer, o su una macchina diversa.

L'ambiente Raytracing è obsoleto, l'ambiente esterno Render Workbench ne è il sostituto. Tuttavia, le informazioni in questa pagina sono generalmente utili per il nuovo ambiente di lavoro, poiché entrambi funzionano sostanzialmente allo stesso modo.

Flusso di lavoro tipico

  1. Creare o aprire un progetto di FreeCAD, aggiungere alcuni oggetti solidi sul modulo Part o PartDesign-based; i mesh non sono ancora supportati
  2. Creare un progetto Raytracing (luxrender o povray)
  3. Selezionare gli oggetti che si desidera aggiungere al progetto raytracing e aggiungerli con lo strumento "Inserisci Parte"
  4. Esportare o elaborare direttamente



Flusso di lavoro del Raytracing Workbench; il workbench prepara un file di progetto da un determinato modello e quindi chiama un programma esterno per produrre il rendering effettivo della scena. Il renderer esterno può essere usato indipendentemente da FreeCAD.

Strumenti

Strumenti di progetto

Questi sono gli strumenti principali per esportare il proprio lavoro 3D su renderer esterni.

  • Nuovo progetto PovRay: inserisce un nuovo progetto PovRay nel documento.
  • Nuovo progetto LuxRender: inserisce un nuovo progetto LuxRender nel documento.
  • Inserisci parte: inserisce una vista di una parte in un progetto di raytracing.
  • Reset camera: abbina la posizione della telecamera di un progetto di raytracing alla vista corrente.
  • Esporta progetto...: esporta un progetto di raytracing in un file di scena per il rendering in un renderer esterno.
  • Render: esegue il rendering di un progetto raytracing con un renderer esterno.

Utilità

Questi sono degli strumenti di supporto per eseguire manualmente azioni specifiche.

Preferenze

  • Preferenze: preferenze disponibili per gli strumenti Raytracing.

Tutorials

Creare manualmente un file povray

Gli strumenti di utilità descritti prima consentono di esportare la corrente vista 3D e tutto il suo contenuto in un file Povray. In primo luogo, è necessario caricare un documento o crearne uno e poi orientare la vista 3D come si desidera. Dopo, scegliere Utilità → Esporta la vista ... nel menu di Raytracing.

Nella finestra di dialogo Esporta pagina, selezionare la destinazione per salvare il file *.pov. Successivamente aprire il file in Povray e generare la renderizzazione:

Come è noto, le applicazioni di renderizzazione possono produrre immagini di grandi dimensioni e ottima qualità:

Script

Vedere Esempio di API Raytracing per informazioni sulla scrittura di scene a livello di codice.

Link

POV-Ray

LuxRender

Render per future implementazioni

Esportare in Kerkythea

Sebbene l'esportazione diretta nel formato XML di Kerkythea non sia ancora supportata, è possibile esportare gli oggetti come file Mesh (.obj) e poi importarli in Kerkythea.

  • se si utilizza Kerkythea per Linux, ricordarsi di installare il pacchetto WINE (necessario per far funzionare Kerkythea in Linux)
  • è possibile convertire i modelli in mesh con l'aiuto dell'ambiente Mesh e poi esportare questi mesh, come file .obj
  • Se l'esportazione della mesh ha provocato errori (capovolgimento di normali, buchi ...) puoi tentare la fortuna con netfabb studio basic
Gratuito per uso personale, disponibile per Windows, Linux e Mac OSX.
Ha strumenti di riparazione standard che ripareranno il tuo modello nella maggior parte dei casi.
  • un altro buon programma per l'analisi/riparazione di mesh è Meshlab
Open Source, disponibile per Windows, Linux e Mac OSX.
Ha strumenti di riparazione standard che ripareranno il tuo modello nella maggior parte dei casi (riempire i fori, riorientare le normali, ecc.)
  • è possibile utilizzare "make compound" e poi "make single copy" oppure è possibile fondere i solidi in un gruppo prima di convertirli in mesh
  • ricordatevi di impostare in Kerkythea un fattore di importazione di 0.001 per obj-modeler, in quanto Kerkythea si aspetta che il file obj sia in m (ma l'unità standard in FreeCAD è il mm)
Within WIndows 7 64-bit Kerkythea does not seem to be able to save these settings.
So remember to do that each time you start Kerkythea
  • se si importano più oggetti in Kerkythea è possibile utilizzare la funzione "File → Unisci" di Kerkythea

Sviluppo

Queste pagine si riferiscono al nuovo ambiente, programmato in Python, destinato a sostituire l'attuale ambiente Raytracing.




L'Ambiente Image non è più incluso dopo la versione 0.20.
La sua funzionalità è stata integrata in Menu di base. Vedere Importa e Std ViewLoadImage.
L'icona dell'ambiente Image

Introduzione

L'Ambiente Image gestisce diversi tipi di immagini bitmap, e permette di aprirle in FreeCAD.

Strumenti

  • Apri...: apre un'immagine in una nuova finestra.
  • Importa immagine...: importa un'immagine su un piano nella vista 3D.
  • Scala: ridimensiona un'immagine importata su un piano.

Funzioni

  • Come avviene con uno Schizzo, un'immagine importata può essere collegata a uno dei piani principali XY, XZ o YZ e viene fornito un offset positivo o negativo.
  • L'immagine viene importata con una relazione di 1 pixel in 1 millimetro.
  • La raccomandazione è di importare un'immagine con una risoluzione ragionevole.

Flusso di lavoro

Un uso importante di questo ambiente è il tracciamento sull'immagine, con gli strumenti di Draft o Sketcher, per generare un corpo solido basato sui contorni dell'immagine.

Tracciare su un'immagine funziona meglio se l'immagine ha un piccolo offset negativo, ad esempio di -0,1 mm, dal piano di lavoro. Ciò significa che l'immagine è leggermente dietro al piano in cui si disegna la geometria 2D, in modo da non disegnare sull'immagine stessa.

L'offset dell'immagine può essere impostato durante l'importazione o modificato successivamente attraverso le sue proprietà.




L'icona di Draft

Introduzione

L'Ambiente Draft si concentra principalmente sulla creazione e modifica di oggetti 2D in FreeCAD. Ma non è limitato al piano XY del sistema di coordinate globale. I suoi oggetti possono avere qualsiasi orientamento e posizione nello spazio 3D e alcuni oggetti Draft possono essere planari o non planari.

Gli oggetti Draft possono essere utilizzati per il disegno generale, in modo simile a quanto si può fare con Inkscape o AutoCAD. Ma possono anche costituire la base per la creazione di oggetti 3D in altri ambienti di lavoro. Una Polilinea può definire il percorso di un Muro, un Poligono può essere utilizzato per un Estrusione, ecc. Molti degli strumenti di Modifica possono essere comunque applicati agli oggetti 2D e 3D creati con altri ambienti di lavoro. Ad esempio, puoi spostare uno Sketch o creare una Serie ortogonale da un oggetto Part.

L'ambiente Draft fornisce anche strumenti per definire un piano di lavoro, una griglia e un sistema di aggancio per controllare con precisione la posizione della geometria.

Se il tuo obiettivo principale è la produzione di disegni 2D complessi e file DXF e non hai bisogno della modellazione 3D, FreeCAD potrebbe non essere la scelta giusta per te. Potresti invece prendere in considerazione un programma software dedicato per il disegno tecnico, come LibreCAD o QCad.

L'immagine mostra la griglia allineata con il piano XY.
Alla sinistra, in bianco, alcuni oggetti piani.
Alla destra una Polilinea usata come percorso per una serie su tracciato.

Disegnare

  • Linea: crea una linea retta.
  • Polilinea: crea una polilinea (chiamata anche wire), una sequenza di diversi segmenti lineari connessi.
  • Strumenti Arco:
  • Arco: crea un arco circolare da un centro, un raggio, un angolo iniziale e un angolo di apertura.
  • Arco per 3 punti: crea un arco circolare per tre punti che ne definiscono la circonferenza.
  • Cerchio: crea un cerchio da un centro e un raggio.
  • Ellisse: crea un'ellisse da due punti definendo un rettangolo a cui l'ellisse si adatterà.
  • Poligono: crea un poligono regolare da un centro e un raggio.
  • B-spline: crea una curva B-spline da più punti.
  • Strumento Bézier:
  • Punto: crea un punto semplice.
  • Lega facce: crea un oggetto superficie dalle facce selezionate.
  • Forma da testo: crea una forma composta che rappresenta una stringa di testo.

Annotazioni

  • Testo: crea un testo su più righe in un determinato punto.
  • Quota: crea una quota lineare, una quota radiale o una quota angolare.
  • Etichetta: crea un testo su più righe con una linea guida a 2 segmenti e una freccia.
  • Stili di Annotazione...: consente di definire stili che influiscono sulle proprietà visive di oggetti simili ad annotazioni.

Modificare

  • Sposta: sposta o copia gli oggetti selezionati da un punto all'altro.
  • Ruota: ruota o copia gli oggetti selezionati attorno a un punto centrale di un determinato angolo.
  • Scala: ridimensiona o copia gli oggetti selezionati attorno a un punto base.
  • Specchio: crea copie specchiate da oggetti selezionati.
  • Offset: sposta ogni segmento di un oggetto selezionato ad una determinata distanza o crea una copia traslata dell'oggetto selezionato.
  • Stira: allunga gli oggetti spostando i punti selezionati.
  • Clona: crea copie collegate, cloni, ​​di oggetti selezionati.
  • Strumenti Array:
  • Serie: crea una serie ortogonale da un oggetto selezionato. Può opzionalmente creare una serie di Link.
  • Serie polare: crea una serie da un oggetto selezionato, posizionando copie lungo una circonferenza. Facoltativamente, può creare una serie di Link.
  • Serie circolare: crea una serie da un oggetto selezionato, posizionando copie lungo circonferenze concentriche. Facoltativamente, può creare un serie di Link.
  • Serie su tracciato: crea una matrice da un oggetto selezionato posizionando le copie lungo un tracciato.
  • Serie di punti: crea una serie da un oggetto selezionato posizionando copie nei punti da un assieme di punti.
  • Modifica: mette gli oggetti selezionati in modalità Modifica bozza. In questa modalità le proprietà degli oggetti possono essere modificate graficamente.
  • Evidenzia sottoelemento: evidenzia temporaneamente gli oggetti selezionati o gli oggetti base degli oggetti selezionati.
  • Promuovi: promuove gli oggetti selezionati.
  • Declassa: declassa gli oggetti selezionati.

Vassoio di Draft

Il Vassoio di Draft consente di selezionare il piano di lavoro, definire le impostazioni di stile, attivare/disattivare la modalità di costruzione e specificare il livello o il gruppo attivo.

  • Seleziona piano: definisce il piano di lavoro Draft corrente. Disponibile anche nel menu: Draft → Utilità → Seleziona Piano.
  • Imposta stile: imposta lo stile predefinito per i nuovi oggetti. Disponibile anche nel menu: Draft → Utilità → Imposta stile.

Dispositivo Scala annotazione

Con il dispositivo Scala annotazione è possibile specificare la scala di annotazione di Draft.

Dispositivo aggancio

Il dispositivo Aggancio di Draft può essere utilizzato come alternativa alla Barra degli strumenti di aggancio.

Barra degli strumenti di aggancio

La barra degli strumenti di Aggancio (snap) di Draft consente di selezionare le opzioni di aggancio attive. I pulsanti appartenenti alle opzioni attive rimangono premuti. Per informazioni generali sull'aggancio vedere: Aggancio.

  • Aggancia Angolo: aggancia agli speciali punti cardinali sui bordi circolari a multipli di 30° e 45°.
  • Aggancia Estensione: aggancia a una linea immaginaria che si estende oltre i punti finali dei bordi diritti.
  • Aggancia Ortogonale: aggancia alle linee immaginarie che attraversano il punto precedente a multipli di 45°.

Strumenti di utilità di Draft

Strumenti aggiuntivi

Il menu Draft → Utilità contiene diversi strumenti. Alla maggior parte di essi è possibile accedere anche dalle barre degli strumenti o dalla Barra Draft e sono già stati menzionati sopra. Per i seguenti strumenti non è questo il caso:

  • Ripara: ripara gli oggetti Draft problematici trovati in file molto vecchi.

Ulteriori funzioni

  • Piano di lavoro: il piano nella vista 3D dove vengono creati i nuovi oggetti Draft.
  • Aggancio (snap): seleziona punti geometrici esatti o definiti da oggetti esistenti o dalla griglia.
  • Vincolare: per ogni punto successivo è possibile vincolare il movimento del cursore alla direzione X, Y o Z.
  • Modalità costruzione: posiziona i nuovi oggetti Draft in un gruppo dedicato rendendo più facile nasconderli o eliminarli.
  • Campitura: Gli oggetti Draft con una proprietà DatiMake Face possono essere visualizzati con un modello SVG invece di un colore della faccia a tinta unita.

Menu contestuale della vista ad albero

Le seguenti opzioni aggiuntive sono disponibili nel menu contestuale Vista ad albero:

Opzioni di default

Per la maggior parte degli oggetti Draft è disponibile la seguente opzione:

Se c'è un documento attivo il menu contestuale contiene un ulteriore sottomenu:

  • Utilità: un sottoinsieme degli strumenti disponibili nel menu principale Utilità di Draft.

Opzioni del contenitore di livelli

Per un Contenitore di livelli sono disponibili queste opzioni aggiuntive:

Opzioni dei livelli

Per un Livello di Draft sono disponibili queste opzioni aggiuntive.

Opzioni testo

Per un Draft Testo e un Draft Etichetta che contengono uno o più collegamenti ipertestuali a un file locale o remoto o a un URL, questa opzione aggiuntiva è disponibile

  • Apri collegamenti ipertestuali: i collegamenti ipertestuali vengono aperti nell'applicazione appropriata (come definito dal sistema operativo). In caso di collegamenti ipertestuali multipli viene visualizzato un avviso. disponibile dalla versione 1.0

Opzioni polilinea

Per Linea e Polilinea è disponibile questa opzione aggiuntiva:

  • Appiattisci: appiattisce la polilinea sul corrente Piano di lavoro. Questa opzione non funziona correttamente in version 0.19 and below.

Opzioni del piano di lavoro proxy

Per un Piano di lavoro proxy queste opzioni aggiuntive sono disponibili:

  • Memorizza lo stato degli oggetti: aggiorna la proprietà VistaMappa di visibilità del piano di lavoro proxy con lo stato di visibilità corrente degli oggetti nel documento.

Menu contestuale vista 3D

Le seguenti opzioni aggiuntive sono disponibili nel menu contestuale della Vista 3D:

Opzioni di default

Se è presente un documento attivo, il menu contestuale contiene un ulteriore sottomenu:

  • Utilità: un sottoinsieme degli strumenti disponibili nel menu principale Utilità di Draft.

Opzioni testo

Vedere sopra.

Strumenti obsoleti

  • Serie: crea una serie ortogonale da un oggetto selezionato. La serie creata può essere trasformata in una serie polare o in una serie circolare modificandone la proprietà DatiTipo di array. Non disponibile nella versione 0.21 e superiori.
  • Disegno: inserisce le viste degli oggetti selezionati in una pagina disegno tecnico. Non disponibile nella versione 0.21 e superiori.

Preferenze

  • Preferenze: preferenze generali per l'ambiente Draft.

Formato dei file

L'ambiente Draft fornisce a FreeCAD importatori ed esportatori per diversi formati di file. Questi sono utilizzati dai comandi Import e Export.

Test unitari

Vedere anche: Ambiente Test.

Per eseguire i test unitari dell'ambiente, eseguire quanto segue dal terminale del sistema operativo:

freecad -t TestDraft

Script

Vedere anche: Autogenerated API documentation and Script di base per FreeCAD.

L'ambiente include un modulo per creare dei campioni di tutti gli oggetti in un nuovo documento.

Utilizzare questo per verificare che tutti gli oggetti siano prodotti correttamente:

import drafttests.draft_test_objects as dto
doc = dto.create_test_file()

L'esame del codice di questo modulo può aiutare a comprendere l'interfaccia di programmazione.

Tutorial


Script e Macro

Macro


Introduzione

Le macro sono un modo pratico per riprodurre delle azioni complesse in FreeCAd. È sufficiente registrare le azioni così come vengono eseguite, quindi salvare queste azioni con un nome, per poterle ripetere quando si vuole. Dato che le macro sono in realtà un elenco di comandi Python, è anche possibile modificarle e creare degli script molto complessi.

Sebbene gli script Python abbiano normalmente l'estensione .py, le macro di FreeCAD dovrebbero avere l'estensione .FCMacro. Una raccolta di macro scritte da utenti esperti si trova nella pagina raccolta di macro.

Vedere l'Hub degli utenti esperti per saperne di più sul linguaggio di programmazione Python e sulla scrittura di macro. In particolare, si dovrebbe iniziare con queste pagine:

Come funzionano

Abilitare l'output della console nel menu Modifica → Preferenze → Python → Macro → Mostra lo script dei comandi nella console Python. Si noterà che in FreeCAD, ogni azione eseguita, come premere un pulsante, genera un comando Python. Questi comandi possono essere registrati in una macro. Lo strumento principale per creare macro è la barra degli strumenti delle macro: . Su di esso ci sono 4 pulsanti: Registra una macro, interrompi la registrazione, modifica e riproduci la macro corrente.

È molto semplice da usare: premere il pulsante di registrazione, dare un nome alla macro, quindi eseguire alcune azioni. Al termine, fare clic sul pulsante Interrompi registrazione, e le azioni compiute vengono salvate. Ora è possibile accedere alla finestra di dialogo delle macro utilizzando il pulsante Modifica,

Finestra di dialogo Macro, che elenca le macro disponibili nel sistema

Quì è possibile gestire le macro, eliminarle, duplicarle, installarle, modificarle o crearne di nuove partendo da zero. Quando si modifica una macro, essa viene aperta in una finestra dell'editor in cui è possibile apportare le proprie modifiche al codice. È possibile installare delle nuove macro utilizzando il pulsante Addons ..., che collega al Addon Manager.

Esempio

Premere il pulsante di registrazione, fornire un nome, ad esempio, "cilindro 10x10", poi, nell'Ambiente Parte, creare un cilindro con raggio = 10 e altezza = 10. Quindi, premere il pulsante "Interrompi registrazione". Nella finestra di dialogo Modifica macro, è possibile vedere il codice python che è stato registrato, e, volendo, apportarvi delle modifiche. Per eseguire la macro, è sufficiente premere sul pulsante Esegui della barra degli strumenti, mentre la macro è nell'editor. La macro viene sempre salvata su disco, in modo che tutte le modifiche apportate, o ogni nuova macro creata, sono sempre disponibili al successivo avvio di FreeCAD.

Personalizzazione

Naturalmente non è pratico dover caricare una macro nell'editor per poterla utilizzare. FreeCAD fornisce modi migliori per usarle, come ad esempio l'assegnazione ad essa di una scorciatoia da tastiera o l'inserimento di una voce nel menu. Dopo aver creato la macro, tutto questo può essere fatto tramite il menu Strumenti → Personalizza.

In questo modo si può trasformare la macro in un vero strumento, proprio come qualsiasi strumento standard di FreeCAD. Questo, aggiunto alla potenza dello scripting Python all'interno di FreeCAD, rende possibile aggiungere facilmente i propri strumenti all'interfaccia.

Vedi Personalizza le barre degli strumenti per una descrizione più dettagliata.

Creare delle macro senza registrarle

Puoi anche copiare/incollare direttamente il codice Python in una macro, senza registrare l'azione della GUI. Basta creare una nuova macro, modificarla e incollare il codice. È quindi possibile salvare la macro nello stesso modo in cui si salva un documento di FreeCAD. La prossima volta che avvierai FreeCAD, la macro apparirà sotto la voce "Macro..." del menu Macro.

Vedere Come installare le macro per una descrizione più dettagliata.

Repositorio di macro

Ci sono due posti principali per le macro. Il primo è il repository di macro ufficiale sottoposto a revisione paritaria su GitHub. La seconda è la pagina Raccolta di macro da cui puoi scegliere alcune utili macro da aggiungere alla tua installazione di FreeCAD. Le macro di entrambi i repository possono essere installate tramite Addon Manager direttamente da FreeCAD.

Informazioni aggiuntive

Tutorial

È possibile installare manualmente le estensioni, tuttavia è molto più semplice utilizzare semplicemente l'Addon Manager.


Introduzione a Python


Introduzione

Quello che segue è un breve tutorial per chi non conosce Python. Python è un Linguaggio di programmazione open source e multipiattaforma . Ha diverse caratteristiche, che lo rendono diverso dagli altri linguaggi di programmazione, ed è facilmente accessibile ai nuovi utenti:

  • È stato progettato per essere leggibile dagli esseri umani, rendendolo relativamente facile da imparare e da capire.
  • Viene interpretato, questo significa che i programmi non devono essere compilati prima di poter essere eseguiti. Il codice Python può essere eseguito immediatamente, anche riga per riga, se si desidera.
  • Può essere incorporato in altri programmi come linguaggio di scripting. FreeCAD ha un interprete Python incorporato. Si può scrivere codice Python per manipolare parti di FreeCAD. Questa funzionalità è molto potente e comporta che puoi costruire i tuoi strumenti personalizzati.
  • È estensibile, si può facilmente inserire nuovi moduli nella tua installazione di Python ed estenderne la funzionalità. Ad esempio, ci sono moduli che consentono a Python di leggere e scrivere immagini, di comunicare con Twitter, di pianificare attività che devono essere eseguite dal tuo sistema operativo, ecc.

Quella che segue è un'introduzione molto semplice e non un tutorial completo. Ma si spera che fornisca un buon punto di partenza per un'ulteriore esplorazione di FreeCAD e dei suoi meccanismi. Si consiglia vivamente di inserire i seguenti frammenti di codice in un interprete Python.

L'interprete

Di solito, per scrivere programmi per computer, basta aprire un editor di testo (o l'ambiente di programmazione preferito che di base è un editor di testo con alcuni strumenti aggiuntivi), scrivere il programma, quindi compilarlo ed eseguirlo. Spesso si fanno degli errori di scrittura, per cui il programma non funziona, e si ottiene un messaggio di errore che dà informazioni su cosa è andato storto. Quindi si ritorna all'editor di testo, si correggono gli errori, si esegue di nuovo, e così via fino a quando il programma funziona bene.

In Python l'intero processo può essere eseguito in modo trasparente all'interno dell'interprete Python. L'interprete è una finestra Python con un prompt dei comandi, in cui puoi semplicemente digitare il codice Python. Se hai installato Python sul tuo computer (scaricalo dal sito Web Python se sei su Windows o Mac, installalo dal repository del tuo pacchetto se sei su GNU/Linux), avrai un interprete Python nel tuo menu di avvio. Ma, come già accennato, FreeCAD ha anche un interprete Python integrato: la Console Python.

La console di FreeCAD Python

Se non la vedi, clicca su Visualizza → Pannelli → Console Python. La console Python può essere ridimensionata e anche sganciata.

L'interprete mostra la versione di Python, poi un simbolo >>> che è il prompt dei comandi. Scrivere codice nell'interprete è semplice: una linea è un'istruzione. Quando premete Invio, la vostra linea di codice verrà eseguita (dopo essere stata istantaneamente e invisibilmente compilata). Per esempio, provate a scrivere questo:

print("hello")

print() è un comando Python che, ovviamente, stampa qualcosa sullo schermo. Quando si preme Invio, l'operazione viene eseguita e viene stampato il messaggio "hello". Se si commette un errore, per esempio scriviamo:

print(hello)

Python ve lo dirà immediatamente. In questo caso Python non sa cosa sia hello. I caratteri " " specificano che il contenuto è una stringa, gergo di programmazione per un pezzo di testo. Senza questi il comando print() non riconosce hello. Premendo la freccia su si può tornare indietro all'ultima linea di codice e correggerla.

L'interprete Python ha anche un sistema di aiuto integrato. Diciamo che non capiamo cosa è andato storto con print(hello) e vogliamo informazioni specifiche sul comando:

help("print")

Si ottiene una lunga e completa descrizione di tutto quello che può fare il comando print().

Ora che si è capito cos'è l'interprete Python, possiamo continuare con le cose più serie.

Inizio

Variabili

Molto spesso nella programmazione è necessario memorizzare un valore sotto un nome. È qui che entrano in gioco le variabili. Ad esempio, digita questo:

a = "hello"
print(a)

Sicuramente si capisce quello che succede, la stringa "ciao" viene "salvata" sotto il nome "a". Ora, "a" non è più un nome sconosciuto! Si può usare ovunque, per esempio nel comando print. È possibile utilizzare qualsiasi nome che si desideri, basta rispettare alcune semplici regole, tipo non usare spazi o segni di punteggiatura. Ad esempio, si potrebbe tranquillamente scrivere:

hello = "my own version of hello"
print(hello)

Ora hello non è più un indefinito. Le variabili possono essere modificate in qualsiasi momento, per questo si chiamano variabili, il loro contenuto può variare. Per esempio:

myVariable = "hello"
print(myVariable)
myVariable = "good bye"
print(myVariable)

Il valore di myVariable è stato cambiato. Le variabili possono anche essere copiate:

var1 = "hello"
var2 = var1
print(var2)

È consigliabile assegnare nomi significativi alle variabili. Dopo un po' ci si ricorderà più cosa rappresenta la variabile denominata a. Ma se l'hai chiamata, ad esempio, myWelcomeMessage, ricorderai facilmente il suo scopo. Inoltre, il tuo codice sarà un passo avanti verso l'autodocumentazione.

Il Maiuscolo o minuscolo è molto importante, myVariable non è lo stesso di myvariable. Se si dovesse inserire print(myvariable), verrebbe restituito un errore come nome non definito.

Inizio

Numeri

Ovviamente i programmi Python possono gestire tutti i tipi di dati, non solo le stringhe di testo. Una cosa è importante, Python deve sapere con che tipo di dati ha a che fare. Abbiamo visto nel nostro esempio print hello, che il comando print() ha riconosciuto la nostra stringa "hello". Utilizzando i caratteri " ", abbiamo specificato che quella che segue è una stringa di testo.

Possiamo sempre controllare il tipo di dati di una variabile con il comando type():

myVar = "hello"
type(myVar)

Questo significa che il contenuto di myVar è un 'str', che è l'abbreviazione di string. Esistono anche altri tipi di dati di base come numeri interi e a virgola mobile:

firstNumber = 10
secondNumber = 20
print(firstNumber + secondNumber)
type(firstNumber)

Python sa che 10 e 20 sono numeri interi, quindi sono archiviati come 'int' e Python può fare con loro tutto ciò che può fare con i numeri interi. Osserva i risultati di questo codice:

firstNumber = "10"
secondNumber = "20"
print(firstNumber + secondNumber)

Qui abbiamo costretto Python a considerare che le nostre due variabili non sono numeri ma parti di testo. Python può unire due parti di testo insieme, anche se in tal caso, ovviamente, non eseguirà alcuna operazione aritmetica. Ma si stava parlando di numeri interi. Ci sono anche i numeri a virgola mobile. La differenza è che i numeri a virgola mobile possono avere una parte decimale, mentre i numeri interi no:

var1 = 13
var2 = 15.65
print("var1 is of type ", type(var1))
print("var2 is of type ", type(var2))

Numeri interi e a virgola mobile possono essere mescolati insieme senza problemi:

total = var1 + var2
print(total)
print(type(total))

Poiché var2 è un numero a virgola mobile, Python decide automaticamente, che anche il risultato deve essere un numero a virgola mobile. Ma ci sono casi in cui Python non sa quale tipo adottare. Per esempio:

varA = "hello 123"
varB = 456
print(varA + varB)

Quel codice provoca un errore, varA è una stringa e varB è un numero intero e Python non sa cosa fare. Tuttavia, possiamo forzare Python a convertire tra tipi:

varA = "hello"
varB = 123
print(varA + str(varB))

Ora che entrambe le variabili sono stringhe l'operazione funziona. Nota che abbiamo "stringificato" varB al momento della stampa, ma non abbiamo modificato varB stesso. Se volessimo trasformare varB in modo permanente in una stringa, dovremmo farlo in questo modo:

varB = str(varB)

Possiamo anche usare int() e float() per convertire tra numeri interi e numeri a virgola mobile se vogliamo:

varA = "123"
print(int(varA))
print(float(varA))

Avrai notato che abbiamo usato il comando print() in diversi modi. Abbiamo stampato variabili, somme, diverse cose separate da virgole e persino il risultato di un altro comando Python. Forse hai anche notato che questi due comandi:

type(varA)
print(type(varA))

hanno lo stesso risultato. Questo perché siamo nell'interprete e tutto viene stampato automaticamente. Quando scriviamo programmi più complessi, che vengono eseguiti al di fuori dell'interprete, non verranno stampati automaticamente, quindi dovremo usare il comando print(). Tenendo questo presente, smetteremo di usarlo. D'ora in poi scriveremo semplicemente:

myVar = "hello friends"
myVar

Inizio

Liste

Un altro tipo di dati utile è la lista. Una lista è una raccolta di altri dati. Per definire una lista utilizziamo [ ]:

myList = [1, 2, 3]
type(myList)
myOtherList = ["Bart", "Frank", "Bob"]
myMixedList = ["hello", 345, 34.567]

Come puoi notare una lista può contenere qualsiasi tipo di dato. Puoi fare molte cose con una lista. Ad esempio, contare i suoi elementi:

len(myOtherList)

o recuperare un elemento:

myName = myOtherList[0]
myFriendsName = myOtherList[1]

Mentre il comando len() restituisce il numero totale di elementi in una lista, il primo elemento in una lista è sempre nella posizione 0, quindi nella nostra myOtherList "Bob" sarà nella posizione 2. Possiamo fare molto di più con le liste, come l'ordinamento degli elementi e la rimozione o l'aggiunta di elementi.

È interessante notare che una stringa di testo è molto simile a un elenco di caratteri in Python. Prova a fare questo:

myvar = "hello"
len(myvar)
myvar[2]

In genere tutto quello che si può fare con le liste si può fare anche con le stringhe. In effetti le liste e le stringhe sono entrambe delle sequenze.

Oltre a stringhe, numeri interi, numeri a virgola mobile e liste, ci sono altri tipi di dati incorporati, come i dizionari, e puoi persino creare i tuoi tipi di dati con le classi.

Inizio

Indentazione

Un uso importante delle liste è la possibilità di "attraversarle" e fare qualcosa con ogni loro elemento. Ad esempio, si noti quanto segue:

alldaltons = ["Joe", "William", "Jack", "Averell"]
for dalton in alldaltons:
    print(dalton + " Dalton")

In questo esempio, la lista viene iterata (nuovo gergo di programmazione!) con il comando for in e con ognuno dei suoi elementi viene eseguito qualcosa.

Notare la speciale sintassi. Il comando for termina con un : questo indica a Python che ciò che segue è un blocco di uno o più comandi. Subito dopo che viene inserita la riga con il comando che termina con :, il prompt dei comandi cambia in ... il che significa che Python sa che c'è dell'altro in arrivo..

Come fa Python a sapere quante delle prossime righe devono essere eseguite all'interno dell'operazione for in? Per sapere questo, Python si basa sull'indentazione. Le righe successive devono iniziare con uno spazio vuoto, o più spazi vuoti, o una tabulazione, o più tabulazioni. E finché l'indentazione rimane la stessa, le righe saranno considerate parte del blocco for in. Se si inizia una riga con 2 spazi e la successiva con 4, darà un errore. Quando si finisce, scrivere un'altra riga senza indentazione o premere Enter per uscire dal blocco for in.

L'indentazione è molto utile anche per la leggibilità del programma. Se si usano rientri lunghi (ad esempio le tabulazioni invece degli spazi) quando si scrive un programma di grandi dimensioni, si avrà una visione chiara di ciò che viene eseguito all'interno dei blocchi. Vedremo che anche altri comandi utilizzano blocchi di codice indentati.

Il comando for in può essere utilizzato per molte cose che devono essere eseguite più di una volta. Può, ad esempio, essere combinato con il comando range():

serie = range(1, 11)
total = 0
print("sum")
for number in serie:
    print(number)
    total = total + number
print("----")
print(total)

Se è stato eseguito l'esempio di codice in un interprete copiando e incollando, si noterà che il blocco di testo precedente genera un errore. Si copi invece fino alla fine del blocco rientrato, cioè alla fine della riga total = total + number e poi si incolli nell'interprete. Quindi nell'interprete si prema Enter fino a quando il prompt dei tre punti scompare e il codice viene eseguito. Infine, si copino le ultime due righe seguite da un altro Enter. Dovrebbe apparire la risposta finale.

Se si digita nell'interprete help(range) si otterrà:

range(...)
    range(stop) -> list of integers
    range(start, stop[, step]) -> list of integers

Qui le parentesi quadre denotano un parametro opzionale. Tuttavia, tutti dovrebbero essere interi. Di seguito forzeremo il parametro step a essere un intero usando int():

number = 1000
for i in range(0, 180 * number, int(0.5 * number)):
    print(float(i) / number)

Un altro esempio con range():

alldaltons = ["Joe", "William", "Jack", "Averell"]
for n in range(4):
    print(alldaltons[n], " is Dalton number ", n)

Il comando range() ha la strana particolarità di iniziare con 0 (quando non si specifica il numero di partenza) e che il suo ultimo numero è uno in meno del numero finale specificato. Ciò, naturalmente, perché questo sistema funziona bene con gli altri comandi di Python. Ad esempio:

alldaltons = ["Joe", "William", "Jack", "Averell"]
total = len(alldaltons)
for n in range(total):
    print(alldaltons[n])

Un altro uso interessante dei blocchi indentati si ha con il comando if. Questo comando esegue un blocco di codice solo se una certa condizione è soddisfatta, ad esempio:

alldaltons = ["Joe", "William", "Jack", "Averell"]
if "Joe" in alldaltons:
    print("We found that Dalton!!!")

Naturalmente, questo esempio stampa sempre la prima frase, ma si provi a sostituire la seconda riga con:

if "Lucky" in alldaltons:

Qui non viene stampato nulla. Possiamo anche specificare un'istruzione else:

alldaltons = ["Joe", "William", "Jack", "Averell"]
if "Lucky" in alldaltons:
    print("We found that Dalton!!!")
else:
    print("Such Dalton doesn't exist!")

Inizio

Funzioni

I comandi standard di Python non sono molti e ne conosciamo già alcuni di loro. Ma i comandi possono anche essere creati. In effetti, la maggior parte dei moduli aggiuntivi, che si possono inserire nella propria installazione di Python, fanno esattamente questo e aggiungono dei comandi, che si possono utilizzare. In Python un comando personalizzato si chiama funzione e si crea in questo modo:

def printsqm(myValue):
    print(str(myValue) + " square meters")

printsqm(45)

Il comando def() definisce una nuova funzione, le si assegna un nome e tra parentesi si definiscono gli argomenti, che la funzione utilizzerà. Gli argomenti sono dati, che verranno passati alla funzione. Ad esempio, si osservi il comando len(). Se si scrive semplicemente len(), Python dirà che ha bisogno di un argomento. Il che è ovvio: vuoi conoscere la lunghezza di qualcosa. Se si scrive len(myList) allora myList è l'argomento, che si passa alla funzione len(). E la funzione len() è definita in modo tale da sapere cosa fare con questo argomento. Abbiamo fatto la stessa cosa con la nostra funzione printsqm.

Il nome myValue può essere un qualsiasi oggetto e verrà utilizzato solo all'interno della funzione. È solo un nome, che dai all'argomento, in modo da poterci fare qualcosa. Definendo gli argomenti si deve anche dire alla funzione quanti aspettarsene. Ad esempio, se facendo quanto segue:

printsqm(45, 34)

si otterrà un errore. La nostra funzione è stata programmata per ricevere un solo argomento, ma ne ha ricevuti due, 45 e 34. Proviamo un altro esempio:

def sum(val1, val2):
    total = val1 + val2
    return total

myTotal = sum(45, 34)

Qui abbiamo creato una funzione che riceve due argomenti, li somma e restituisce quel valore. Restituire qualcosa è molto utile, perché possiamo fare qualcosa con il risultato, come memorizzarlo nella variabile myTotal.

Inizio

Moduli

Ora che si ha una buona idea di come funziona Python, c'è bisogno di sapere un'altra cosa: come lavorare con file e moduli.

Fino ad ora, abbiamo scritto le istruzioni Python riga per riga nell'interprete. Questo metodo ovviamente non è adatto per programmi più grandi. Normalmente il codice per i programmi Python è memorizzato in file con estensione .py. Che sono solo semplici file di testo e qualsiasi editor di testo (Linux gedit, emacs, vi o persino Blocco note di Windows) può essere utilizzato per crearli e modificarli.

Esistono diversi modi per eseguire un programma Python. In Windows, fai semplicemente clic con il pulsante destro del mouse, aprilo con Python ed eseguilo. Ma puoi anche eseguirlo dall'interprete Python stesso. Per questo, l'interprete deve sapere dove si trova il tuo programma. In FreeCAD il modo più semplice è posizionare il programma in una cartella, che l'interprete Python di FreeCAD conosce per impostazione predefinita, come la cartella utente Mod di FreeCAD:

  • Su Linux è solitamente /home/<username>/.local/share/FreeCAD/Mod/ (versione 0.20 e superiori) o /home/<username>/. FreeCAD/Mod/ (versione 0.19 e precedenti).
  • Su Windows è %APPDATA%\FreeCAD\Mod\, che di solito è C:\Users\<username>\Appdata\Roaming\FreeCAD\Mod\.
  • Su macOS è solitamente /Users/<username>/Library/Application Support/FreeCAD/Mod/.

Aggiungiamo una sottocartella chiamata scripts e quindi scriviamo un file come questo:

def sum(a,b):
    return a + b

print("myTest.py succesfully loaded")

Salviamo il file come myTest.py nella cartella scripts e nella finestra dell'interprete si scriva:

import myTest

senza l'estensione .py. Questo eseguirà il contenuto del file, riga per riga, proprio come se lo avessimo scritto nell'interprete. Verrà creata la funzione di somma e il messaggio verrà stampato. I file contenenti funzioni, come la nostra, sono chiamati moduli.

Quando scriviamo una funzione sum() nell'interprete, la eseguiamo in questo modo:

sum(14, 45)

Ma quando importiamo un modulo contenente una funzione sum() la sintassi è leggermente diversa:

myTest.sum(14, 45)

Cioè, il modulo viene importato come un "contenitore" e tutte le sue funzioni sono all'interno di quel contenitore. Questo è molto utile, perché possiamo importare molti moduli e mantenere tutto ben organizzato. Fondamentalmente quando vedi something.somethingElse, con un punto in mezzo, significa che somethingElse è all'interno di something.

Possiamo anche importare la nostra funzione sum() direttamente nello spazio dell'interprete principale:

from myTest import *
sum(12, 54)

Quasi tutti i moduli lo fanno: definiscono funzioni, nuovi tipi di dati e classi, che puoi usare nell'interprete o nei tuoi moduli Python, perché nulla impedisce di importare altri moduli all'interno del tuo modulo!

Come facciamo a sapere quali moduli abbiamo, quali funzioni ci sono all'interno e come usarli (ovvero, di che tipo di argomenti hanno bisogno)? Abbiamo già visto che Python ha una funzione help(). Facendo:

help("modules")

ci restituirà un elenco di tutti i moduli disponibili. Possiamo importarne uno qualsiasi e sfogliarne il contenuto con il comando dir():

import math
dir(math)

Vedremo tutte le funzioni contenute nel modulo math, oltre a cose strane denominate __doc__, __file__, __name__. Ogni funzione in un modulo ben fatto ha un __doc__ che spiega come usarla. Ad esempio, vediamo che c'è una funzione sin() all'interno del modulo matematico. Vuoi sapere come usarlo?

print(math.sin.__doc__)

(Potrebbe non essere evidente, ma su entrambi i lati del doc ci sono due caratteri di sottolineatura.)

E infine un ultimo consiglio: quando si lavora su del codice nuovo o esistente, è meglio non utilizzare l'estensione del file macro di FreeCAD, .FCMacro, ma utilizzare invece l'estensione standard .py. Questo perché Python non riconosce l'estensione .FCMacro. Se usi .py il tuo codice può essere facilmente caricato con import, come abbiamo già visto, e anche ricaricato con importlib.reload():

import importlib
importlib.reload(myTest)

C'è comunque un'alternativa:

exec(open("C:/PathToMyMacro/myMacro.FCMacro").read())

Inizio

Iniziare con FreeCAD

Spero che ora tu ti sia fatto una buona idea di come funziona Python e che tu possa iniziare a esplorare ciò che FreeCAD ha da offrire. Le funzioni Python di FreeCAD sono tutte ben organizzate in diversi moduli. Alcuni di essi sono già caricati (importati) all'avvio di FreeCAD. Prova:

dir()

Inizio

Note

  • FreeCAD è stato originariamente progettato per funzionare con Python 2. Poiché Python 2 ha raggiunto la fine del suo ciclo di vita nel 2020, lo sviluppo futuro di FreeCAD sarà effettuato esclusivamente con Python 3 e la compatibilità con le versioni precedenti non sarà supportata.
  • Molte più informazioni su Python possono essere trovate nel tutorial ufficiale di Python e nel manuale di riferimento ufficiale di Python.

Inizio


Script Python in FreeCAD

FreeCAD è stato costruito fin dall'inizio per essere totalmente controllato tramite gli script Python.

Quasi tutte le parti di FreeCAD, come ad esempio l'interfaccia oppure i contenuti della finestra, compresa la rappresentazione di quanto contenuto nelle viste 3D, sono accessibili tramite l'interprete Python incorporato o tramite script personali.

Per questo, FreeCAD risulta probabilmente una delle applicazioni ingegneristiche più profondamente personalizzabili oggi disponibili.

Se non conoscete ancora Python, vi consigliamo di cercare qualche tutorial su internet e di dare un rapido sguardo alla sua struttura.

Python è un linguaggio molto facile da imparare, soprattutto perché può essere eseguito all'interno di un interprete, dove sia i comandi semplici come i programmi completi, possono essere eseguiti "al volo", cioè senza bisogno di compilare nulla.

FreeCAD incorpora un interprete Python. Se non vedete la finestra denominata "Console Python" della figura successiva, potete attivarla con Visualizza → Pannelli → Console Python e mostrare l'interprete.

L'interprete

Tramite l'interprete, è possibile accedere a tutti i moduli Python installati nel sistema, come pure ai moduli incorporati in FreeCAD e a tutti i moduli aggiuntivi di FreeCAD installati successivamente.

La schermata seguente mostra l'interprete Python di FreeCAD:

The FreeCAD Python interpreter

Tramite l'interprete è possibile eseguire del codice Python ed esplorare le classi e le funzioni disponibili.

FreeCAD fornisce un browser delle classi molto utile per esplorare il nuovo mondo di FreeCAD.

Quando si digita il nome di una classe nota seguita da un punto (.) (il che significa che si intende completare aggiungendo qualcos'altro alla classe), si apre la finestra del browser delle classi, dove si può navigare tra le sottoclassi e i metodi disponibili.

Quando si seleziona una voce, viene visualizzato il testo di aiuto associato (se esiste):

The FreeCAD class browser

Per verificare questo, iniziate a digitare App. oppure Gui. e osservate cosa succede.

Generalmente, in Python, per esplorare il contenuto dei moduli e delle classi si utilizza il comando print(dir()).

Ad esempio, digitando print(dir()) si ottiene l'elenco di tutti i moduli attualmente caricati in FreeCAD e con print(dir(App)) si mostra tutto ciò che è contenuto all'interno del modulo App, ecc..

Inoltre l'interprete ricorda i codici che vengono digitati. Questa altra utile caratteristica dell'interprete permette di esplorare all'indietro i comandi digitati e di recuperare, attraverso la cronologia, una riga di codice scritta in precedenza.

Per navigare nella cronologia dei comandi, basta usare i tasti Freccia sù oppure Freccia giù.

Cliccando col tasto destro nella finestra dell'interprete, si rendono disponibili diverse altre opzioni, quali, ad esempio, copiare lo storico (l'intera cronologia, cosa utile quando si desidera sperimentare qualcosa prima di utilizzarla in uno script) oppure inserire un nome di un file con il suo percorso completo.

Inizio

Help di Python

Nel menu Help di FreeCAD, troverai una voce denominata Automatic python modules documentation, che aprirà una finestra del browser contenente una documentazione completa e generata in tempo reale di tutti i moduli Python disponibili per l'interprete di FreeCAD, inclusi i moduli integrati di Python e FreeCAD, i moduli installati dal sistema e i moduli aggiuntivi di FreeCAD. La documentazione lì disponibile dipende da quanto sforzo ogni sviluppatore di moduli ha fatto per documentare il suo codice, ma i moduli Python hanno la reputazione di essere abbastanza ben documentati. La finestra di FreeCAD deve rimanere aperta affinché questo sistema di documentazione funzioni.

Inizio

Moduli incorporati

Poiché FreeCAD è progettato in modo da poter essere eseguito anche senza un'interfaccia utente grafica (GUI), quasi tutte le sue funzionalità sono separate in due gruppi: funzionalità principale, denominata App, e funzionalità GUI, denominata Gui. È possibile accedere a questi due moduli anche da script esterni all'interprete, rispettivamente con i nomi FreeCAD e FreeCADGui.

  • Nel modulo App, si trova tutto ciò che riguarda l'applicazione stessa, cioè i metodi per l'apertura o la chiusura di file e documenti, oppure l'impostazione del documento attivo o la visualizzazione dei contenuti.
  • Nel modulo Gui, si trovano gli strumenti per accedere e gestire gli elementi dell'interfaccia grafica (GUI), cioè gli ambienti di lavoro e le loro barre degli strumenti e, più interessante, la rappresentazione grafica di tutti i contenuti di FreeCAD.

Elencare il contenuto di questi moduli non è molto utile perché crescono abbastanza velocemente con lo sviluppo di FreeCAD. Ma i due strumenti di navigazione forniti (il browser di classe e la guida di Python) dovrebbero fornire una documentazione completa e aggiornata in qualsiasi momento.

Inizio

Gli oggetti App e GUI

Come già accennato, in FreeCAD tutto è separato in core e representation. Ciò include gli oggetti 3D. Si può accedere alle proprietà di definizione degli oggetti (chiamate funzionalità in FreeCAD) tramite il modulo App e modificare il modo in cui sono rappresentate sullo schermo tramite il modulo Gui. Ad esempio, un cubo ha proprietà che lo definiscono (come larghezza, lunghezza, altezza) che sono archiviate in un oggetto App e proprietà di rappresentazione (come il colore delle facce, la modalità di disegno) che sono archiviate in un corrispondente oggetto Gui.

Questo modo di fare le cose consente una vasta gamma di operazioni, come gli algoritmi che funzionano solo sulla parte di definizione delle caratteristiche, senza la necessità di prendersi cura di nessuna parte visiva, e consente anche di reindirizzare il contenuto del documento ad applicazioni non-grafiche, quali, ad esempio, elenchi, fogli di calcolo, o analisi degli elementi.

Per ogni oggetto App nel tuo documento, esiste un oggetto Gui corrispondente. Infatti il ​​documento stesso ha sia un oggetto App che un oggetto Gui. Questo, ovviamente, si applica solo quando esegui FreeCAD con la sua interfaccia completa. Nella versione da riga di comando non esiste una GUI, quindi sono disponibili solo oggetti App. Nota che la parte Gui degli oggetti viene rigenerata ogni volta che un oggetto App viene contrassegnato come 'da ricalcolare' (ad esempio quando uno dei suoi parametri cambia), quindi qualsiasi modifica fatta direttamente all'oggetto Gui potrebbe andare persa.

Per accedere alla parte App di qualcosa, si digita:

myObject = App.ActiveDocument.getObject("ObjectName")

dove "ObjectName" è il nome del vostro oggetto. Inoltre è possibile digitare:

myObject = App.ActiveDocument.ObjectName

Per accedere alla parte Gui dello stesso oggetto, si digita:

myViewObject = Gui.ActiveDocument.getObject("ObjectName")

dove "ObjectName" è il nome del vostro oggetto. Inoltre è possibile digitare:

myViewObject = App.ActiveDocument.ObjectName.ViewObject

Se sei in modalità riga di comando e non hai la GUI, l'ultima riga restituirà None.

Inizio

Gli oggetti del documento

In FreeCAD tutto il tuo lavoro risiede all'interno dei documenti. Un documento contiene la tua geometria e può essere salvato in un file. È possibile aprire più documenti contemporaneamente. Il documento, come la geometria contenuta all'interno, ha oggetti App e Gui. L'oggetto App contiene le tue effettive definizioni della geometria, mentre l'oggetto Gui contiene le diverse viste del tuo documento. Puoi aprire più finestre, ognuna delle quali visualizza il tuo lavoro con un fattore di zoom diverso o da una direzione diversa. Queste viste fanno tutte parte dell'oggetto Gui del tuo documento.

Per accedere alla parte App del documento attualmente aperto (attivo), digitare:

myDocument = App.ActiveDocument

Per creare un nuovo documento, digitare:

myDocument = App.newDocument("Document Name")

Per accedere alla parte Gui del documento attualmente aperto (attivo), digitare:

myGuiDocument = Gui.ActiveDocument

Per accedere alla vista corrente, digitare:

myView = Gui.ActiveDocument.ActiveView

Inizio

Utilizzo di moduli aggiuntivi

I moduli FreeCAD e FreeCADGui sono responsabili solo della creazione e della gestione degli oggetti nel documento FreeCAD. In realtà non fanno altro che creare o modificare la geometria. Questo perché la geometria può essere di diversi tipi e quindi richiede moduli aggiuntivi, ciascuno responsabile della gestione di un determinato tipo di geometria. Ad esempio, l'Ambiente Part, utilizzando il kernel OpenCascade, è in grado di creare e manipolare la geometria di tipo BRep. Mentre l'Ambiente Mesh è in grado di costruire e modificare oggetti mesh. In questo modo FreeCAD è in grado di gestire un'ampia varietà di tipi di oggetti, che possono coesistere tutti nello stesso documento, e nuovi tipi possono essere facilmente aggiunti in futuro.

Inizio

Creare degli oggetti

Ogni modulo ha il proprio modo di gestire la geometria, ma una cosa che di solito tutti possono fare è creare oggetti nel documento. Ma il documento di FreeCAD è anche a conoscenza dei tipi di oggetti disponibili forniti dai moduli:

FreeCAD.ActiveDocument.supportedTypes()

elencherà tutti i possibili oggetti che puoi creare. Ad esempio, creiamo una mesh (gestita dal modulo Mesh) e una parte (gestita dal modulo Part):

myMesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "myMeshName")
myPart = FreeCAD.ActiveDocument.addObject("Part::Feature", "myPartName")

Il primo argomento è il tipo di oggetto, il secondo il nome dell'oggetto. I nostri due oggetti sembrano quasi uguali: non contengono ancora alcuna geometria e la maggior parte delle loro proprietà sono le stesse quando li ispezioni con dir(myMesh) e dir(myPart). Ad eccezione di una cosa, myMesh ha una proprietà Mesh e myPart ha una proprietà Shape. È qui che vengono archiviati i dati Mesh e Part. Ad esempio, creiamo un cubo Part e memorizziamolo nel nostro oggetto myPart:

import Part
cube = Part.makeBox(2, 2, 2)
myPart.Shape = cube

Si può provare a memorizzare il cubo all'interno della proprietà Mesh dell'oggetto myMesh, ma verrà restituito un errore. Questo perché ogni proprietà è fatta per memorizzare solo un certo tipo. In una proprietà Mesh, puoi salvare solo elementi creati con il modulo Mesh. Nota che la maggior parte dei moduli ha anche una scorciatoia per aggiungere la propria geometria al documento:

import Part
cube = Part.makeBox(2, 2, 2)
Part.show(cube)

Inizio

Modificare gli oggetti

La modifica di un oggetto avviene allo stesso modo:

import Part
cube = Part.makeBox(2, 2, 2)
myPart.Shape = cube

Ora cambiamo la sua forma in una più grande:

biggercube = Part.makeBox(5, 5, 5)
myPart.Shape = biggercube

Inizio

Interrogare gli oggetti

È sempre possibile sapere di che tipo è un oggetto con:

myObj = FreeCAD.ActiveDocument.getObject("myObjectName")
print(myObj.TypeId)

o controllare se un oggetto è derivato da uno di quelli base (struttura di Parte, struttura di Mesh, etc) con:

print(myObj.isDerivedFrom("Part::Feature"))

Ora puoi davvero iniziare a giocare con FreeCAD! Per un elenco completo dei moduli disponibili e dei relativi strumenti, visita la sezione Category:API.

Inizio


Introduzione

Per accedere al modulo Mesh devi prima importarlo:

import Mesh

Creazione

Per creare un oggetto mesh vuoto basta usare il costruttore standard:

mesh = Mesh.Mesh()

Inoltre è possibile creare un oggetto da un file:

mesh = Mesh.Mesh("D:/temp/Something.stl")

Oppure crearlo tramite un gruppo di triangoli descritti dai loro vertici:

triangles = [
# triangle 1
[-0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000], [-0.5000, 0.5000, 0.0000],
#triangle 2
[-0.5000, -0.5000, 0.0000], [0.5000, -0.5000, 0.0000], [0.5000, 0.5000, 0.0000],
]
meshObject = Mesh.Mesh(triangles)
Mesh.show(meshObject)

Il Kernel Mesh si occupa di creare una corretta struttura topologica dei dati individuando i punti e i bordi coincidenti.

Inizio

Modellazione

Per creare geometrie regolari è possibile utilizzare uno dei metodi create*(). Un toroide, ad esempio, può essere creato come segue:

m = Mesh.createTorus(8.0, 2.0, 50)
Mesh.show(m)

I primi due parametri definiscono i raggi del toro e il terzo parametro è un fattore di sub-campionamento che stabilisce quanti triangoli vengono creati. Maggiore è questo valore e più il corpo è liscio, più questo valore è piccolo e più il corpo è grossolano (sfaccettato).

Il modulo Mesh fornisce anche tre metodi Booleani: union(), intersection() e difference():

m1, m2              # are the input mesh objects
m3 = Mesh.Mesh(m1)  # create a copy of m1
m3.unite(m2)        # union of m1 and m2, the result is stored in m3
m4 = Mesh.Mesh(m1)
m4.intersect(m2)    # intersection of m1 and m2
m5 = Mesh.Mesh(m1)
m5.difference(m2)   # the difference of m1 and m2
m6 = Mesh.Mesh(m2)
m6.difference(m1)   # the difference of m2 and m1, usually the result is different to m5

Ecco un esempio che crea un tubo usando il metodo difference():

import FreeCAD, Mesh
cylA = Mesh.createCylinder(2.0, 10.0, True, 1.0, 36)
cylB = Mesh.createCylinder(1.0, 12.0, True, 1.0, 36)
cylB.Placement.Base = (FreeCAD.Vector(-1, 0, 0)) # move cylB to avoid co-planar faces
pipe = cylA
pipe = pipe.difference(cylB)
pipe.flipNormals() # somehow required
doc = FreeCAD.ActiveDocument
obj = d.addObject("Mesh::Feature", "Pipe")
obj.Mesh = pipe
doc.recompute()

Inizio

Note

Una nutrita (anche se difficile da usare) libreria di script riferiti a Mesh sono gli script dell'unita di test del Modulo Mesh. In questa unit test sono letteralmente chiamati tutti i metodi e sono ottimizzate tutte le proprietà e gli attributi. Quindi, se siete abbastanza coraggiosi, date un'occhiata al modulo unit test.

Vedere anche: Mesh API.

Inizio


Introduzione

Qui si spiega come controllare il modulo Part direttamente dall'interprete Python di FreeCAD o da qualsiasi script esterno. Assicurarsi di sfogliare la sezione Script e la sezione Script di base per FreeCAD se hai bisogno di maggiori informazioni su come funziona lo scripting Python in FreeCAD. Se non conosci Python, è una buona idea leggere prima la Introduzione a Python.

Vedere anche

Diagramma delle classi

Questa è una panoramica delle classi del Linguaggio di Modellazione Unificato (UML) più importanti del modulo Parte:

Python classes of the Part module
Python classes of the Part module

Inizio

Geometria

Gli oggetti geometrici sono le fondamenta per la costruzione di tutti gli oggetti topologici:

  • Geom Classe base degli oggetti geometrici
  • Line Linea retta in 3D, definita dal punto iniziale e dal punto finale
  • Circle Cerchio o arco definito dal centro, dal punto iniziale e dal punto finale
  • Ecc.

Inizio

Topologia

Sono disponibili i seguenti tipi di dati topologici:

  • compound Un gruppo di qualsiasi tipo di oggetto topologico.
  • compsolid Un solido composito è un insieme di solidi collegati dalle loro facce. E' una estensione dei concetti wire e shell ai solidi.
  • solid Una parte di spazio limitato da shell. E' tridimensionale
  • shell Una serie di facce connesse nei loro bordi. Una shell (guscio) può essere aperta o chiusa.
  • face In 2D è una parte di un piano; in 3D è una parte di una superficie. La sua geometria è vincolata (delimitata/tagliata) dai suoi bordi.
  • wire Una serie di bordi (una polilinea) collegati tra di loro nei vertici. Può essere un profilo aperto o chiuso, secondo se i bordi sono interamente concatenati oppure no.
  • edge Un elemento topologico corrispondente ad una curva limitata. Un bordo è generalmente delimitato dai vertici. Ha una dimensione.
  • vertex Un elemento topologico corrispondente ad un punto. Esso non ha dimensioni.
  • shape Un termine generico che comprende tutti i precedenti.

Inizio

Esempio: Creare una semplice topologia

Wire

Creeremo ora una topologia tramite la costruzione della semplice geometria. Come caso di studio, utilizzeremo una forma come quella che si vede nella figura, composta da quattro vertici, due archi e due linee.

Inizio

Creare la geometria

Per prima cosa creiamo le parti geometriche distinte di questo wire. Assicurarsi che le parti, che devono essere collegate in seguito, condividano gli stessi vertici.

Quindi creiamo prima i punti:

import FreeCAD as App
import Part
V1 = App.Vector(0, 10, 0)
V2 = App.Vector(30, 10, 0)
V3 = App.Vector(30, -10, 0)
V4 = App.Vector(0, -10, 0)

Inizio

Arco

Circle


Per creare un arco di cerchio prima creiamo un punto di supporto poi creiamo l'arco di cerchio tramite tre punti:

VC1 = App.Vector(-10, 0, 0)
C1 = Part.Arc(V1, VC1, V4)
VC2 = App.Vector(40, 0, 0)
C2 = Part.Arc(V2, VC2, V3)

Inizio

Linea

Line


La linea (segmento) può essere creata molto semplicemente tramite due punti:

L1 = Part.LineSegment(V1, V2)
L2 = Part.LineSegment(V3, V4)

Inizio

Unire tutto

L'ultimo passaggio consiste nell'unire tutti gli elementi geometrici di base e produrre una forma topologica:

S1 = Part.Shape([C1, L1, C2, L2])

Inizio

Creare un prisma

Ora si può estrudere il contorno nella direzione voluta e creare una forma 3D reale:

W = Part.Wire(S1.Edges)
P = W.extrude(App.Vector(0, 0, 10))

Inizio

Mostra tutto

Part.show(P)

Inizio

Creare forme di base

Si possono creare facilmente gli oggetti topologici di base con i metodi make...() del modulo Part:

b = Part.makeBox(100, 100, 100)
Part.show(b)

Alcuni metodi make...() disponibili:

  • makeBox(l, w, h, [p, d]) Crea un riquadro situato in p e rivolto nella direzione d con le dimensioni (l,w,h).
  • makeCircle(radius) Crea un cerchio con un dato raggio.
  • makeCone(radius1, raggio2, altezza) Crea un cono dati i raggi e l'altezza.
  • makeCylinder(radius, height) Crea un cilindro con un determinato raggio e altezza.
  • makeLine((x1, y1, z1), (x2, y2, z2)) Crea una linea da due punti.
  • makePlane(length, width) Crea un piano con lunghezza e larghezza.
  • makePolygon(list) Crea un poligono da una serie di punti.
  • makeSphere(radius) Crea una sfera con un dato raggio.
  • makeTorus(radius1, raggio2) Crea un toro con i raggi dati.

Vedere la pagina API di Part o Documentazione Python Part API autogenerata per un elenco completo dei metodi disponibili del modulo Part.

Inizio

Importare i moduli necessari

Per prima cosa dobbiamo importare i moduli di FreeCAD e Part in modo da poter utilizzare i loro contenuti in Python:

import FreeCAD as App
import Part

Inizio

Creare un vettore

Per la costruzione di forme, i Vettori sono una delle informazioni più importanti. Di solito contengono tre numeri (ma non necessariamente sempre): le coordinate cartesiane X, Y e Z. È possibile creare un vettore nel modo seguente:

myVector = App.Vector(3, 2, 0)

Abbiamo appena creato un vettore alle coordinate X = 3, Y = 2, Z = 0. Nel modulo Part, i vettori sono usati ovunque. Le forme di Part utilizzano anche un altro tipo di rappresentazione del punto chiamata Vertice, che è semplicemente un contenitore per un vettore. Si accede al vettore di un vertice in questo modo:

myVertex = myShape.Vertexes[0]
print(myVertex.Point)
> Vector (3, 2, 0)

Inizio

Creare un bordo

Un bordo non è altro che una linea con due vertici:

edge = Part.makeLine((0, 0, 0), (10, 0, 0))
edge.Vertexes
> [<Vertex object at 01877430>, <Vertex object at 014888E0>]

Nota: È anche possibile creare un bordo passando due vettori:

vec1 = App.Vector(0, 0, 0)
vec2 = App.Vector(10, 0, 0)
line = Part.LineSegment(vec1, vec2)
edge = line.toShape()

È possibile trovare la lunghezza e il centro di un bordo in questo modo:

edge.Length
> 10.0
edge.CenterOfMass
> Vector (5, 0, 0)

Inizio

Mostrare la forma sullo schermo

Con le operazioni precedenti abbiamo creato un oggetto bordo, ma esso non è visibile da nessuna parte sullo schermo. Questo perché la scena 3D di FreeCAD mostra solo quello che gli si chiede di visualizzare. Per farlo, usiamo questo semplice metodo:

Part.show(edge)

La funzione show crea un oggetto nel nostro documento FreeCAD e gli assegna la forma "edge". Utilizzare questo metodo ogni volta che si vuole visualizzare il proprio prodotto sullo schermo.

Inizio

Creare un contorno

Un contorno è una linea multi-spigolo e può essere creato da un elenco di bordi o anche da un elenco di contorni:

edge1 = Part.makeLine((0, 0, 0), (10, 0, 0))
edge2 = Part.makeLine((10, 0, 0), (10, 10, 0))
wire1 = Part.Wire([edge1, edge2]) 
edge3 = Part.makeLine((10, 10, 0), (0, 10, 0))
edge4 = Part.makeLine((0, 10, 0), (0, 0, 0))
wire2 = Part.Wire([edge3, edge4])
wire3 = Part.Wire([wire1, wire2])
wire3.Edges
> [<Edge object at 016695F8>, <Edge object at 0197AED8>, <Edge object at 01828B20>, <Edge object at 0190A788>]
Part.show(wire3)

Part.show(wire3) mostrerà i 4 bordi che compongono il nostro contorno. Altre informazioni utili possono essere facilmente recuperate con:

wire3.Length
> 40.0
wire3.CenterOfMass
> Vector (5, 5, 0)
wire3.isClosed()
> True
wire2.isClosed()
> False

Inizio

Creare una faccia

Sono valide solo le facce create da contorni chiusi. Nell'esempio, wire3 è un contorno chiuso, ma wire2 non è un contorno chiuso (vedi esempio precedente)

face = Part.Face(wire3)
face.Area
> 99.99999999999999
face.CenterOfMass
> Vector (5, 5, 0)
face.Length
> 40.0
face.isValid()
> True
sface = Part.Face(wire2)
sface.isValid()
> False

Solamente le facce hanno un'area, non i contorni né i bordi.

Inizio

Creare una circonferenza

Un cerchio può essere creato in questo semplice modo:

circle = Part.makeCircle(10)
circle.Curve
> Circle (Radius : 10, Position : (0, 0, 0), Direction : (0, 0, 1))

Se si vuole crearlo in una determinata posizione e con una direzione prestabilita:

ccircle = Part.makeCircle(10, App.Vector(10, 0, 0), App.Vector(1, 0, 0))
ccircle.Curve
> Circle (Radius : 10, Position : (10, 0, 0), Direction : (1, 0, 0))

ccircle verrà creato a distanza 10 dall'origine di X e sarà rivolto verso l'asse X. Nota: makeCircle() accetta solo App.Vector() per la posizione e le normali, ma non tuple. È inoltre possibile creare una parte di cerchio fornendo un angolo iniziale e un angolo finale come:

from math import pi
arc1 = Part.makeCircle(10, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 180)
arc2 = Part.makeCircle(10, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 180, 360)

Unendo arc1 con arc2 (sono due semicerchi) si ottiene un cerchio completo. Gli angoli devono essere forniti in gradi; se avete angoli in radianti convertirli usando semplicemente la formula: gradi = radianti * 180/pi o utilizzando il modulo matematico math di Python:

import math
degrees = math.degrees(radians)

Inizio

Creare un arco attraverso dei punti

Sfortunatamente non esiste una funzione makeArc(), ma abbiamo la funzione Part.Arc() per creare un arco attraverso tre punti. Crea un oggetto arco, che unisce il punto iniziale al punto finale attraverso il punto medio. La funzione toShape() dell'oggetto arc deve essere chiamata per ottenere un oggetto edge, come quando si usa Part.LineSegment invece di Part.makeLine.

arc = Part.Arc(App.Vector(0, 0, 0), App.Vector(0, 5, 0), App.Vector(5, 5, 0))
arc
> <Arc object>
arc_edge = arc.toShape()
Part.show(arc_edge)

Arc() accetta solo App.Vector() per i punti e non tuple. Si può anche ottenere un arco usando una porzione di cerchio:

from math import pi
circle = Part.Circle(App.Vector(0, 0, 0), App.Vector(0, 0, 1), 10)
arc = Part.Arc(circle,0,pi)

Gli archi sono bordi validi, come le linee, quindi possono essere usati anche nei contorni.

Inizio

Creare un poligono

Un poligono è semplicemente un contorno con più bordi dritti. La funzione makePolygon() prende una lista di punti e crea un contorno attraverso quei punti:

lshape_wire = Part.makePolygon([App.Vector(0, 5, 0), App.Vector(0, 0, 0), App.Vector(5, 0, 0)])

Inizio

Creare una curva di Bézier

Le curve di Bézier vengono utilizzate per modellare curve morbide utilizzando una serie di poli (punti) e pesi opzionali. La funzione seguente crea un Part.BezierCurve() da una serie di punti FreeCAD.Vector(). Nota: quando si usano "getting" e "setting" per un singolo polo o peso, gli indici iniziano da 1, non da 0.

def makeBCurveEdge(Points):
   geomCurve = Part.BezierCurve()
   geomCurve.setPoles(Points)
   edge = Part.Edge(geomCurve)
   return(edge)

Inizio

Creare un piano

Un piano è una superficie rettangolare piana. Il metodo utilizzato per crearne uno è makePlane(length, width, [start_pnt, dir_normal]). Per impostazione predefinita start_pnt = Vector(0, 0, 0) e dir_normal = Vector(0, 0, 1). Usando dir_normal = Vector(0, 0, 1) si creerà il piano rivolto nella direzione positiva dell'asse Z, mentre dir_normal = Vector(1, 0, 0) si creerà il piano rivolto nella direzione positiva dell'asse X:

plane = Part.makePlane(2, 2)
plane
> <Face object at 028AF990>
plane = Part.makePlane(2, 2, App.Vector(3, 0, 0), App.Vector(0, 1, 0))
plane.BoundBox
> BoundBox (3, 0, 0, 5, 0, 2)

BoundBox è il parallelepipedo che racchiude il piano e la cui diagonale parte da (3,0,0) e termina in (5,0,2). Qui lo spessore di BoundBox sull'asse y è zero, poiché la nostra forma è totalmente piatta.

Nota: makePlane() accetta solo App.Vector() per start_pnt e dir_normal e non tuple.

Inizio

Creare una ellisse

Per creare un'ellisse ci sono diversi modi:

Part.Ellipse()

Crea un'ellisse con raggio maggiore 2 e raggio minore 1 con centro in (0,0,0).

Part.Ellipse(Ellipse)

Crea una copia dell'ellisse data.

Part.Ellipse(S1, S2, Center)

Crea un'ellisse centrata sul punto Center, in cui il piano dell'ellisse è definito da Center, S1 e S2, il suo asse maggiore è definito da Center e S1, il suo raggio maggiore è la distanza tra Center e S1, e il suo raggio minore è la distanza tra S2 e l'asse maggiore.

Part.Ellipse(Center, MajorRadius, MinorRadius)

Crea un'ellisse con il raggio maggiore e il raggio minore MajorRadius e MinorRadius, situata nel piano definito da Center e la normale (0,0,1)

eli = Part.Ellipse(App.Vector(10, 0, 0), App.Vector(0, 5, 0), App.Vector(0, 0, 0))
Part.show(eli.toShape())

Nel codice sopra abbiamo passato S1, S2 e il centro. Analogamente a Arc, Ellipse crea un oggetto ellisse, ma non un bordo, quindi dobbiamo convertirlo in un bordo usando toShape() per visualizzarlo.

Nota: Ellipse() accetta solo App.Vector() per i punti, ma non le tuple.

eli = Part.Ellipse(App.Vector(0, 0, 0), 10, 5)
Part.show(eli.toShape())

Per il costruttore Ellisse precedente abbiamo passato il centro, MajorRadius e MinorRadius.

Inizio

Creare un toro

Utilizzare il metodo makeTorus(radius1, radius2, [pnt, dir, angle1, angle2, angle]). Per impostazione predefinita PNT=Vector(0,0,0), dir=Vector(0,0,1), angle1=0, angle2=360 e angolo=360. Si consideri un toro, come un cerchio piccolo che si muove lungo un cerchio grande. Radius1 è il raggio del cerchio grande, radius2 è il raggio del cerchio piccolo, pnt è il centro del toro e dir è la direzione normale. angle1 e angle2 sono angoli in radianti per il cerchio piccolo cerchio, l'ultimo parametro angolo serve per realizzare una porzione del toro:

torus = Part.makeTorus(10, 2)

Il codice precedente creerà un toro con diametro 20 (raggio 10) e spessore di 4 (raggio del cerchio piccolo pari a 2)

tor=Part.makeTorus(10, 5, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 180)

Il codice sopra creerà una fetta del toro.

tor=Part.makeTorus(10, 5, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 360, 180)

Il codice precedente creerà un semi toro; solo l'ultimo parametro viene modificato vale a dire l'angolo e gli angoli rimanenti sono predefiniti. Impostare il valore dell'angolo a 180 creerà il toro da 0 a 180, cioè, un mezzo toro.

Inizio

Creare un cubo o parallelepipedo

Utilizzando makeBox(length, width, height, [pnt, dir]). Per impostazione predefinita pnt=Vector(0,0,0) e dir=Vector(0,0,1).

box = Part.makeBox(10, 10, 10)
len(box.Vertexes)
> 8

Inizio

Creare una sfera

Utilizzare makeSphere(radius, [pnt, dir, angle1, angle2, angle3]). Per impostazione predefinita pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1), angle1 = -90, angle2 = 90 e angle3 = 360. Angle1 e angle2 sono il minimo e il massimo verticale della sfera, angolo3 è il diametro della sfera.

sphere = Part.makeSphere(10)
hemisphere = Part.makeSphere(10, App.Vector(0, 0, 0), App.Vector(0, 0, 1), -90, 90, 180)

Inizio

Creare un cilindro

Utilizzare makeCylinder(radius, height, [pnt, dir, angle]). Per impostazione predefinita pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1) e angle = 360.

cylinder = Part.makeCylinder(5, 20)
partCylinder = Part.makeCylinder(5, 20, App.Vector(20, 0, 0), App.Vector(0, 0, 1), 180)

Inizio

Creare un cono

Utilizzare makeCone(raggio1, raggio2, altezza, [pnt, dir, angolo]). Per impostazione predefinita pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1) e angle = 360.

cone = Part.makeCone(10, 0, 20)
semicone = Part.makeCone(10, 0, 20, App.Vector(20, 0, 0), App.Vector(0, 0, 1), 180)

Inizio

Modificare le forme

Esistono diversi modi per modificare le forme. Alcuni sono semplici operazioni di trasformazione come lo spostamento o la rotazione di forme, altri sono più complessi, come l'unione e la sottrazione di una forma da un'altra.

Inizio

Operazioni di trasformazione

Traslare una forma

La traslazione è l'atto di spostare una forma da un luogo all'altro. Qualsiasi forma (bordo, faccia, cubo, ecc...) può essere traslata allo stesso modo:

myShape = Part.makeBox(2, 2, 2)
myShape.translate(App.Vector(2, 0, 0))

Questo sposterà la forma "myShape" di 2 unità nella direzione dell'asse x.

Inizio

Ruotare una forma

Per ruotare una forma, è necessario specificare il centro, l'asse e l'angolo di rotazione:

myShape.rotate(App.Vector(0, 0, 0),App.Vector(0, 0, 1), 180)

Il codice precedente ruota la forma di 180 gradi attorno all'asse z.

Inizio

Trasformazioni matriciali

Una matrice è un modo molto conveniente per memorizzare le trasformazioni nel mondo 3D. In un'unica matrice è possibile impostare valori di traslazione, rotazione e ridimensionamento da applicare a un oggetto. Per esempio:

myMat = App.Matrix()
myMat.move(App.Vector(2, 0, 0))
myMat.rotateZ(math.pi/2)

Nota. Le matrici di FreeCAD lavorano in radianti. Inoltre, quasi tutte le operazioni di matrici che accettano un vettore possono anche accettare tre numeri, quindi le seguenti due linee fanno la stessa cosa:

myMat.move(2, 0, 0)
myMat.move(App.Vector(2, 0, 0))

Una volta impostata la nostra matrice, possiamo applicarla alla nostra forma. FreeCAD fornisce due metodi per farlo: transformShape() e transformGeometry(). La differenza è che con il primo, sei sicuro che non si verificheranno deformazioni (vedi Ridimensionare una forma di seguito). Possiamo applicare la nostra trasformazione in questo modo:

myShape.transformShape(myMat)

oppure

myShape.transformGeometry(myMat)

Inizio

Ridimensionare una forma

Scalare (ridimensionare) una forma è una delle operazioni più pericolose perché, a differenza della traslazione o della rotazione, il ridimensionamento non uniforme (con valori diversi per gli assi x, y, z) può modificare la struttura della forma. Ad esempio, la scalatura di un cerchio con un valore in orizzontale diverso da quello in verticale lo trasformerà in un ellisse, forma che matematicamente si comporta in modo molto diverso. Per il ridimensionamento, non possiamo usare transformShape(), ma dobbiamo usare transformGeometry():

myMat = App.Matrix()
myMat.scale(2, 1, 1)
myShape=myShape.transformGeometry(myMat)

Inizio

Operazioni Booleane

Sottrazione

La sottrazione di una forma da un'altra è chiamata "cut" in FreeCAD e viene eseguita in questo modo:

cylinder = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
sphere = Part.makeSphere(5, App.Vector(5, 0, 0))
diff = cylinder.cut(sphere)

Inizio

Intersezione

Allo stesso modo, l'intersezione tra le due forme è chiamato "common" e viene eseguita così:

cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.Vector(0, 0, 1))
common = cylinder1.common(cylinder2)

Inizio

Unione

L'unione è chiamata "fuse" e funziona allo stesso modo:

cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.Vector(0, 0, 1))
fuse = cylinder1.fuse(cylinder2)

Inizio

Sezione

Una "section" è l'intersezione tra una forma solida e una forma piana. Restituirà una curva di intersezione, una curva composta composta da bordi.

cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.Vector(0, 0, 1))
section = cylinder1.section(cylinder2)
section.Wires
> []
section.Edges
> [<Edge object at 0D87CFE8>, <Edge object at 019564F8>, <Edge object at 0D998458>, 
 <Edge  object at 0D86DE18>, <Edge object at 0D9B8E80>, <Edge object at 012A3640>, 
 <Edge object at 0D8F4BB0>]

Inizio

Estrusione

Estrusione è l'atto di "spingere" una forma piatta in una certa direzione per produrre un corpo solido. Ad esempio, si pensi di "spingere" un cerchio e di produrre un tubo:

circle = Part.makeCircle(10)
tube = circle.extrude(App.Vector(0, 0, 2))

Se il cerchio è vuoto (sola circonferenza), si ottiene un tubo (cavo). Se il cerchio è in realtà un disco, con una faccia piena, si ottiene un cilindro solido:

wire = Part.Wire(circle)
disc = Part.Face(wire)
cylinder = disc.extrude(App.Vector(0, 0, 2))

Inizio

Esplorare le forme

Si può facilmente esplorare la struttura dei dati topologici:

import Part
b = Part.makeBox(100, 100, 100)
b.Wires
w = b.Wires[0]
w
w.Wires
w.Vertexes
Part.show(w)
w.Edges
e = w.Edges[0]
e.Vertexes
v = e.Vertexes[0]
v.Point

Digitando le righe sopra nell'interprete Python, si otterrà una buona comprensione della struttura degli oggetti Part. Qui, il comando makeBox() crea una forma solida. Questo solido, come tutti i solidi Part, contiene delle facce. Le facce contengono sempre delle linee (polilinee), che sono lieste di bordi, che delimitano la faccia. Ogni faccia ha almeno un contorno chiuso (ne può avere più di uno se la faccia presenta dei fori). Nel contorno, possiamo guardare a ciascun bordo separatamente, e all'interno di ogni bordo, possiamo vedere i vertici. I bordi dritti hanno solo due vertici, ovviamente.

Digitando le righe di cui sopra nell'interprete Python, si otterrà una buona descrizione della struttura degli oggetti Parte. Qui, il nostro comando makeBox() crea una forma solida. Questo solido, come tutti i solidi Parte, contiene delle facce. Le facce contengono sempre delle linee (polilinee), che sono liste di bordi che delimitano la faccia. Ciascuna faccia ha almeno un contorno chiuso (ne può avere più di uno se la faccia presenta dei fori). Nel contorno, possiamo guardare a ciascun bordo separatamente, e all'interno di ogni bordo, possiamo vedere i vertici. Ovviamente, i bordi diritti hanno solo due vertici.

Inizio

Analizzare i bordi

Nel caso di un bordo, che è una curva arbitraria, è molto probabile che si voglia fare una discretizzazione. In FreeCAD i bordi sono parametrizzati in base alla loro lunghezza. Ciò significa che si può percorrere un bordo/curva in base alla sua lunghezza:

import Part
box = Part.makeBox(100, 100, 100)
anEdge = box.Edges[0]
print(anEdge.Length)

Ora è possibile accedere a molte proprietà del bordo usando la lunghezza come posizione. Ciò significa, che se il bordo è lungo 100 mm, la posizione iniziale è 0 e la posizione finale 100.

anEdge.tangentAt(0.0)          # tangent direction at the beginning
anEdge.valueAt(0.0)            # Point at the beginning
anEdge.valueAt(100.0)          # Point at the end of the edge
anEdge.derivative1At(50.0)     # first derivative of the curve in the middle
anEdge.derivative2At(50.0)     # second derivative of the curve in the middle
anEdge.derivative3At(50.0)     # third derivative of the curve in the middle
anEdge.centerOfCurvatureAt(50) # center of the curvature for that position
anEdge.curvatureAt(50.0)       # the curvature
anEdge.normalAt(50)            # normal vector at that position (if defined)

Inizio

Utilizzare una selezione

Qui ora vediamo come possiamo usare una selezione che l'utente ha fatto nel visualizzatore. Prima di tutto creiamo una scatola e la mostriamo nel visualizzatore.

import Part
Part.show(Part.makeBox(100, 100, 100))
Gui.SendMsgToActiveView("ViewFit")

Ora selezioniamo alcune facce o bordi. Con questo script è possibile iterare sopra tutti gli oggetti selezionati e sui relativi elementi secondari:

for o in Gui.Selection.getSelectionEx():
    print(o.ObjectName)
    for s in o.SubElementNames:
        print("name: ", s)
        for s in o.SubObjects:
            print("object: ", s)

Selezionate alcuni bordi e questo script calcolerà la lunghezza:

length = 0.0
for o in Gui.Selection.getSelectionEx():
    for s in o.SubObjects:
        length += s.Length

print("Length of the selected edges: ", length)

Inizio

Esempio completo: La bottiglia OCC

Un esempio tipico si trova nella pagina OpenCasCade Technology Tutorial che spiega come costruire una bottiglia. Questo è un buon esercizio anche per FreeCAD. In effetti, se si segue il nostro esempio qui sotto e la pagina di OCC contemporaneamente, si capisce bene come sono implementate le strutture di OCC in FreeCAD. Lo script completo è anche incluso nell'installazione di FreeCAD (all'interno della cartella Mod/Part) e può essere chiamato dall'interprete python digitando:

import Part
import MakeBottle
bottle = MakeBottle.makeBottle()
Part.show(bottle)

Inizio

Lo script

Ai fini di questo tutorial considereremo una versione ridotta dello script. In questa versione la bottiglia non sarà svuotata e il collo della bottiglia non sarà filettato.

import FreeCAD as App
import Part, math

def makeBottleTut(myWidth = 50.0, myHeight = 70.0, myThickness = 30.0):
    aPnt1=App.Vector(-myWidth / 2., 0, 0)
    aPnt2=App.Vector(-myWidth / 2., -myThickness / 4., 0)
    aPnt3=App.Vector(0, -myThickness / 2., 0)
    aPnt4=App.Vector(myWidth / 2., -myThickness / 4., 0)
    aPnt5=App.Vector(myWidth / 2., 0, 0)

    aArcOfCircle = Part.Arc(aPnt2, aPnt3, aPnt4)
    aSegment1=Part.LineSegment(aPnt1, aPnt2)
    aSegment2=Part.LineSegment(aPnt4, aPnt5)

    aEdge1=aSegment1.toShape()
    aEdge2=aArcOfCircle.toShape()
    aEdge3=aSegment2.toShape()
    aWire=Part.Wire([aEdge1, aEdge2, aEdge3])

    aTrsf=App.Matrix()
    aTrsf.rotateZ(math.pi) # rotate around the z-axis

    aMirroredWire=aWire.copy()
    aMirroredWire.transformShape(aTrsf)
    myWireProfile=Part.Wire([aWire, aMirroredWire])

    myFaceProfile=Part.Face(myWireProfile)
    aPrismVec=App.Vector(0, 0, myHeight)
    myBody=myFaceProfile.extrude(aPrismVec)

    myBody=myBody.makeFillet(myThickness / 12.0, myBody.Edges)

    neckLocation=App.Vector(0, 0, myHeight)
    neckNormal=App.Vector(0, 0, 1)

    myNeckRadius = myThickness / 4.
    myNeckHeight = myHeight / 10.
    myNeck = Part.makeCylinder(myNeckRadius, myNeckHeight, neckLocation, neckNormal)
    myBody = myBody.fuse(myNeck)

    return myBody

el = makeBottleTut()
Part.show(el)

Inizio

Spiegazione dettagliata

import FreeCAD as App
import Part, math

Ovviamente, avremo bisogno dei moduli FreeCAD e Part.

def makeBottleTut(myWidth = 50.0, myHeight = 70.0, myThickness = 30.0):
    aPnt1=App.Vector(-myWidth / 2., 0, 0)
    aPnt2=App.Vector(-myWidth / 2., -myThickness / 4., 0)
    aPnt3=App.Vector(0, -myThickness / 2., 0)
    aPnt4=App.Vector(myWidth / 2., -myThickness / 4., 0)
    aPnt5=App.Vector(myWidth / 2., 0, 0)

Qui definiamo la nostra funzione makeBottleTut. Questa funzione può essere chiamata senza argomenti, come abbiamo fatto in precedenza, nel qual caso si utilizzano i valori di default per la larghezza, l'altezza e lo spessore. Poi, si definisce un paio di punti che verranno utilizzati per costruire il nostro profilo base.

...
    aArcOfCircle = Part.Arc(aPnt2, aPnt3, aPnt4)
    aSegment1=Part.LineSegment(aPnt1, aPnt2)
    aSegment2=Part.LineSegment(aPnt4, aPnt5)

Qui definiamo la geometria: un arco, creato da tre punti, e due segmenti di linea, creati da due punti.

...
    aEdge1=aSegment1.toShape()
    aEdge2=aArcOfCircle.toShape()
    aEdge3=aSegment2.toShape()
    aWire=Part.Wire([aEdge1, aEdge2, aEdge3])

Ricordate la differenza tra geometria e forme? Qui costruiremo forme partendo dalla nostra geometria di costruzione. Prima costruiremo tre bordi (i bordi possono essere dritti o curvi), poi costruiremo un contorno con quei tre bordi.

...
    aTrsf=App.Matrix()
    aTrsf.rotateZ(math.pi) # rotate around the z-axis

    aMirroredWire=aWire.copy()
    aMirroredWire.transformShape(aTrsf)
    myWireProfile=Part.Wire([aWire, aMirroredWire])

Prima abbiamo costruito solo metà profilo. È più facile che costruire tutto l'intero profilo nello stesso modo, successivamente possiamo semplicemente rispecchiare quello che abbiamo costruito, e poi unire le due parti. Per prima cosa è necessario creare una matrice. Una matrice è un modo molto comune per applicare trasformazioni agli oggetti nel mondo 3D, in quanto essa può contenere in un'unica struttura tutte le trasformazioni di base che gli oggetti 3D possono subire (spostamento, rotazione e scalatura). Dopo aver creato la matrice, la specchiamo e creiamo una copia del nostro contorno applicando ad esso quella matrice di trasformazione. Ora abbiamo due contorni, e con essi possiamo produrre un terzo profilo, dal momento che i contorni sono in realtà liste di bordi.

...
    myFaceProfile=Part.Face(myWireProfile)
    aPrismVec=App.Vector(0, 0, myHeight)
    myBody=myFaceProfile.extrude(aPrismVec)

    myBody=myBody.makeFillet(myThickness / 12.0, myBody.Edges)

Ora che abbiamo un contorno chiuso, esso può essere trasformato in una faccia. Una volta che abbiamo una faccia, possiamo estruderla. In questo modo, abbiamo effettivamente creato un solido. Poi si applica un piccolo arrotondamento al nostro oggetto, perché vogliamo ottenere una forma graziosa, non è vero?

...
    neckLocation=App.Vector(0, 0, myHeight)
    neckNormal=App.Vector(0, 0, 1)

    myNeckRadius = myThickness / 4.
    myNeckHeight = myHeight / 10.
    myNeck = Part.makeCylinder(myNeckRadius, myNeckHeight, neckLocation, neckNormal)

A questo punto, il corpo della nostra bottiglia è creato, ma abbiamo ancora bisogno di creare un collo. Così facciamo un nuovo solido, con un cilindro.

...
    myBody = myBody.fuse(myNeck)

L'operazione di fusione è molto potente. Si prenderà cura di incollare ciò che deve essere incollato e di rimuovere le parti che devono essere rimosse.

...
    return myBody

Poi, otteniamo il nostro solido Parte come risultato della nostra funzione.

el = makeBottleTut()
Part.show(el)

Infine, chiamiamo la funzione per creare effettivamente la parte, e quindi renderla visibile.

Inizio

Cubo forato

Ecco un esempio completo della costruzione di una scatola perforata.

La costruzione è fatta lato per lato. Quando il cubo è finito, viene scavato un foro con un cilindro che l'attraversa.

import FreeCAD as App
import Part, math

size = 10
poly = Part.makePolygon([(0, 0, 0), (size, 0, 0), (size, 0, size), (0, 0, size), (0, 0, 0)])

face1 = Part.Face(poly)
face2 = Part.Face(poly)
face3 = Part.Face(poly)
face4 = Part.Face(poly)
face5 = Part.Face(poly)
face6 = Part.Face(poly)
     
myMat = App.Matrix()

myMat.rotateZ(math.pi / 2)
face2.transformShape(myMat)
face2.translate(App.Vector(size, 0, 0))

myMat.rotateZ(math.pi / 2)
face3.transformShape(myMat)
face3.translate(App.Vector(size, size, 0))

myMat.rotateZ(math.pi / 2)
face4.transformShape(myMat)
face4.translate(App.Vector(0, size, 0))

myMat = App.Matrix()

myMat.rotateX(-math.pi / 2)
face5.transformShape(myMat)

face6.transformShape(myMat)               
face6.translate(App.Vector(0, 0, size))

myShell = Part.makeShell([face1, face2, face3, face4, face5, face6])   
mySolid = Part.makeSolid(myShell)

myCyl = Part.makeCylinder(2, 20)
myCyl.translate(App.Vector(size / 2, size / 2, 0))

cut_part = mySolid.cut(myCyl)

Part.show(cut_part)

Inizio

Caricare e salvare

Ci sono diversi modi per salvare il tuo lavoro. Ovviamente puoi salvare il tuo documento FreeCAD, ma puoi anche salvare oggetti Part direttamente in formati CAD comuni, come BREP, IGS, STEP e STL.

Salvare una forma in un file è facile. Per tutti gli oggetti di forma sono disponibili i metodi exportBrep(), exportIges(), exportStep() and exportStl(). Così, facendo:

import Part
s = Part.makeBox(10, 10, 10)
s.exportStep("test.stp")

salviamo il nostro box in un file STEP. Per caricare un file BREP, IGES o STEP basta fare:

import Part
s = Part.Shape()
s.read("test.stp")

Per convertire un file STEP in un file IGS fare:

import Part
 s = Part.Shape()
 s.read("file.stp")       # incoming file igs, stp, stl, brep
 s.exportIges("file.igs") # outbound file igs

Inizio


Convertire oggetti Parte in Mesh

La conversione di oggetti di alto livello come le forme di Parte in oggetti semplici come gli oggetti Mesh è una operazione piuttosto semplice, nella quale tutte le facce di un oggetto Parte vengono triangolate (suddivise in maglie di una rete). Il risultato di tale triangolazione (tassellatura) viene poi utilizzato per costruire un oggetto mesh:

import Mesh

obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape
faces = []

triangles = shp.tessellate(1) # the number represents the precision of the tessellation
for tri in triangles[1]:
    face = []
    for i in tri:
        face.append(triangles[0][i])
    faces.append(face)

m = Mesh.Mesh(faces)
Mesh.show(m)

Esempio alternativo::

import Mesh
import MeshPart

obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape

mesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "Mesh")
mesh.Mesh = MeshPart.meshFromShape(
        Shape=shp,
        LinearDeflection=0.01,
        AngularDeflection=0.025,
        Relative=False)

Convertire Mesh in oggetti Parte

La conversione delle mesh in oggetti parte è un'operazione comune. Molto spesso riceverai dati 3D in formato mesh. Le mesh sono abbastanza pratiche per rappresentare la geometria a forma libera e grandi scene visive, in quanto sono molto leggere. Ma in FreeCAD generalmente preferiamo oggetti di livello superiore, solidi, che possono trasportare molte più informazioni e consentire facce curve.

Convertire gli oggetti mesh in oggetti di livello superiore, come sono gli oggetti gestiti dal Ambiente Parte di FreeCAD non è un'operazione facile. L'oggetto Mesh può contenere migliaia di triangoli (per esempio quando è generato da uno scanner 3D), e manipolare solidi costituiti dallo stesso numero di facce sarebbe estremamente difficile. Quindi, in genere, si desidera ottimizzare l'oggetto durante la conversione.

FreeCAD attualmente offre due metodi per convertire mesh in oggetti Parte. Il primo metodo è una semplice conversione, diretta, senza alcuna ottimizzazione:

import Mesh
import Part

mesh = Mesh.createTorus()
shape = Part.Shape()
shape.makeShapeFromMesh(mesh.Topology, 0.05) # the second arg is the tolerance for sewing
solid = Part.makeSolid(shape)
Part.show(solid)

Il secondo metodo offre la possibilità di considerare complanari le sfaccettature delle maglie quando l'angolo tra di loro è inferiore a un certo valore, riducendo il numero di facce nel risultato finale:

import Mesh
import Part
import MeshPart

obj = FreeCADGui.Selection.getSelection()[0] # a Mesh object must be preselected
mesh = obj.Mesh
segments = mesh.getPlanarSegments(0.00001) # use rather strict tolerance here
faces = []

for i in segments:
    if len(i) > 0:
        # a segment can have inner holes
        wires = MeshPart.wireFromSegment(mesh, i)
        # we assume that the exterior boundary is that one with the biggest bounding box
        if len(wires) > 0:
            ext = None
            max_length=0
            for i in wires:
                if i.BoundBox.DiagonalLength > max_length:
                    max_length = i.BoundBox.DiagonalLength
                    ext = i

            wires.remove(ext)
            # all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
            for i in wires:
                i.reverse()

            # make sure that the exterior wires comes as first in the list
            wires.insert(0, ext)
            faces.append(Part.Face(wires))

solid = Part.Solid(Part.Shell(faces))
Part.show(solid)



Introduzione

Le geometrie che appaiono nelle viste 3D di FreeCAD sono visualizzate (renderizzate) dalla libreria Coin3d. Coin3D è un'implementazione delle funzionalità standard di OpenInventor. Anche il software openCascade fornisce queste funzionalità, ma fin dagli inizi dello sviluppo di FreeCAD, è stato deciso di non utilizzare il visualizzatore di OpenCascade e di sostituirlo con il software Coin3D in quanto più performante. Un buon modo per conoscere questa libreria è quello di consultare il manuale Open Inventor Mentor.

Descrizione

OpenInventor è in realtà un linguaggio di descrizione della scena 3D. La scena descritta in Open Inventor viene renderizzata (visualizzata) sul vostro schermo con OpenGL. Coin3D si occupa di questo processo, quindi non è necessario che il programmatore tratti complesse chiamate a OpenGL, ma deve solo fornire un codice Open Inventor valido. Il principale vantaggio è che Open Inventor è uno standard molto conosciuto e ben documentato.

Sostanzialmente, uno dei lavori più importanti che FreeCAD esegue per noi consiste nel tradurre le informazioni sulla geometria OpenCascade in linguaggio Open Inventor.

Open Inventor descrive una scena 3D in forma di grafo della scena (Scenegraph), come indicato qui sotto:

Immagine tratta da Inventor mentor

Un grafo della scena di Open Inventor è una struttura di tipo "grafico ad albero" e descrive tutto ciò che fa parte di una scena 3D, come ad esempio la geometria, i colori, i materiali, le luci, ecc, e organizza tutti i dati in una struttura gerarchica, pratica e chiara. Tutto può essere raggruppato in sotto-strutture (nodi-figlio), il che consente di organizzare i contenuti della scena più o meno nel modo desiderato. Ecco un esempio di un file di Open Inventor:

#Inventor V2.0 ascii
 
Separator { 
    RotationXYZ {	
       axis Z
       angle 0
    }
    Transform {
       translation 0 0 0.5
    }
    Separator {	
       Material {
          diffuseColor 0.05 0.05 0.05
       }
       Transform {
          rotation 1 0 0 1.5708
          scaleFactor 0.2 0.5 0.2
       }
       Cylinder {
       }
    }
}

Come si vede, la struttura è molto semplice. Si utilizzano i nodi (separator) per organizzare i dati in blocchi, un po' come si fa per organizzare i file in cartelle e sottocartelle. Ogni dichiarazione riguarda ciò che viene in seguito, per esempio, i primi due elementi del nostro nodo radice (root separator) sono una rotazione e una traslazione e agiscono entrambi sull'elemento successivo, che è un nodo (separator). In tale nodo sono definiti un materiale e una ulteriore trasformazione. Pertanto, il nostro cilindro sarà influenzato da entrambe le trasformazioni, da quella che è stata applicata direttamente ad esso e da quella che è stata applicata al suo nodo (separator) genitore.

Per organizzare la una scena, sono disponibili molti altri tipi di elementi, come gruppi, commutatori o annotazioni. Per gli oggetti si possono definire dei materiali molto complessi, con colori, texture, modalità di ombreggiatura e trasparenza. Si possono anche definire luci, punti di vista (camera) e perfino il movimento. È anche possibile incorporare parti di script nei file di Open Inventor, per definire comportamenti più complessi.

Se siete interessati a saperne di più su Open Inventor, consultate direttamente il suo manuale più famoso, il libro: Inventor mentor.

Normalmente, in FreeCAD, non è necessario interagire direttamente con il grafo della scena di Open Inventor. Ogni oggetto in un documento di FreeCAD, sia che si tratti di un Mesh, di una forma Parte o di qualsiasi altra cosa, viene automaticamente convertito in codice Open Inventor e inserito nel grafo della scena principale che appare in una vista 3D. Questo grafo della scena viene costantemente aggiornato quando si apportano delle modifiche, oppure si aggiungono o si rimuovono degli oggetti nel documento. In realtà, ogni oggetto (nell'ambito App) ha un fornitore di vista (un corrispondente oggetto nell'ambito Gui), responsabile del rilascio del codice Open Inventor.

Poter accedere al direttamente al grafo della scena presenta comunque molti vantaggi. Ad esempio, si può modificare temporaneamente la visualizzazione di un oggetto, oppure si possono aggiungere alla scena oggetti che nel documento di FreeCAD non hanno esistenza reale, come la geometria di costruzione, i riferimenti, i suggerimenti grafici oppure strumenti quali i manipolatori oppure informazioni sullo schermo.

FreeCAD dispone di diversi strumenti per visualizzare o modificare il codice Open Inventor. Ad esempio, il seguente codice Python mostra la rappresentazione Open Inventor di un oggetto selezionato:

obj = FreeCAD.ActiveDocument.ActiveObject
viewprovider = obj.ViewObject
print viewprovider.toString()

Inoltre, c'è anche un modulo Python che consente l'accesso completo a tutto quello che è gestito da Coin3D, come il grafo della scena di FreeCAD. Continuate quindi la lettura in Pivy.

Esempi di codifica

Si veda Coin3d snippets per gentile concessione della ricerca di MariwanJ per Design456 Workbench. Il repository di codice può essere trovato su https://github.com/MariwanJ/COIN3D_Snippet.

Inizio


Introduzione

Pivy è una libreria di associazione Python per Coin, la libreria di rendering 3D utilizzata in FreeCAD per visualizzare gli oggetti nella vista 3D. Coin è un'implementazione open source della specifica "Open Inventor" per gestire la grafica. Pertanto, in FreeCAD, i termini "Pivy", "Coin" o "Open Inventor" si riferiscono essenzialmente alla stessa cosa.

Pivy, quando importato in un interprete Python in esecuzione, ci consente di comunicare direttamente con qualsiasi scena grafica Coin in esecuzione, come la vista 3D, o anche di crearne di nuove. Pivy non è necessario per compilare FreeCAD, ma è richiesto in fase di esecuzione quando si eseguono ambienti di lavoro basati su Python, che creano forme sullo schermo, come Draft e Arch. Per questo motivo, Pivy viene normalmente installato durante l'installazione di una distribuzione di FreeCAD.

La libreria Coin è divisa in vari moduli, Coin stessa, per manipolare grafi di scene e associarli a diversi sistemi GUI, come Windows e Qt. Se presenti nel sistema, tali moduli sono disponibili anche per Pivy. Il modulo Coin è sempre presente, ed è quello che useremo in tutti gli esempi, e non sarà necessario preoccuparsi di associare la nostra visualizzazione 3D ad alcuna interfaccia, perché questo viene già fatto da FreeCAD stesso. Tutto quello che dobbiamo fare è:

from pivy import coin

Grafo della scena

Abbiamo già visto nella pagina Grafo della scena (Scenegraph) come è organizzata una tipica scena di Coin. Tutto ciò che appare in una vista 3D di FreeCAD è un Scenegraph di Coin, organizzato allo stesso modo. Abbiamo un nodo radice (principale), e tutti gli oggetti sullo schermo sono suoi figli.

FreeCAD dispone di un modo semplice per accedere al nodo radice (root) di una scena grafica in vista 3D:

sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
print(sg)

Ciò restituisce il nodo principale (root):

<pivy.coin.SoSelection; proxy of <Swig Object of type 'SoSelection *' at 0x360cb60> >

Siamo in grado di ispezionare i figli immediati della nostra scena:

for node in sg.getChildren():
    print(node)

Alcuni di questi nodi, ad esempio SoSeparator o SoGroup, possono avere dei propri figli. L'elenco completo degli oggetti Coin disponibili si può trovare nella documentazione ufficiale di Coin.

Ora proviamo ad aggiungere qualcosa al nostro Scenegraph. Aggiungiamo un bel cubo rosso:

col = coin.SoBaseColor()
col.rgb = (1, 0, 0)
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)

Ora, proviamo questo:

col.rgb = (1, 1, 0)

Come si può notare tutto è sempre accessibile e modificabile al volo. Non c'è bisogno di ricalcolare o ridisegnare nulla, Coin si prende cura di tutto. È possibile aggiungere elementi al grafo di scena, modificare le proprietà, nascondere delle cose, mostrare oggetti temporanei, qualsiasi cosa. Naturalmente, questo riguarda solo la visualizzazione nella vista 3D. Questa visualizzazione viene determinata da FreeCAD all'apertura del file attivo e quando un oggetto ha bisogno di essere ricalcolato. Quindi, se si modifica l'aspetto di un oggetto di FreeCAD esistente, tali modifiche andranno perse se l'oggetto viene ricalcolato o quando si riapre il file.

Come già accennato, in uno scenegraph di openInventor l'ordine è importante. Un nodo influisce su ciò che viene dopo. Ad esempio, se vogliamo avere la possibilità di spostare il nostro cubo, dovremo aggiungere un nodo SoTranslation prima del cubo:

col = coin.SoBaseColor()
col.rgb = (1, 0, 0)
trans = coin.SoTranslation()
trans.translation.setValue([0, 0, 0])
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(trans)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)

Per muovere il nostro cubo ora possiamo fare:

trans.translation.setValue([2, 0, 0])

Infine, la rimozione di qualcosa viene eseguita con:

sg.removeChild(myCustomNode)

Inizio

Il Callback

Un meccanismo di callback è un sistema che permette a una libreria, che si sta utilizzando, come la nostra libreria Coin, di richiamare, cioè, di chiamare una determinata funzione dell'oggetto Python attualmente in esecuzione. In questo modo Coin può avvisarci se nella scena si verifica qualche evento specifico. Coin può controllare cose molto diverse, come la posizione del mouse, i clic di un pulsante del mouse, i tasti della tastiera che vengono premuti e tante altre cose.

FreeCAD fornisce un modo semplice per utilizzare tali callback:

from pivy import coin

class ButtonTest:
    def __init__(self):
        self.view = FreeCADGui.ActiveDocument.ActiveView
        self.callback = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.getMouseClick) 

    def getMouseClick(self, event_cb):
        event = event_cb.getEvent()
        if event.getState() == coin.SoMouseButtonEvent.DOWN:
            print("Alert!!! A mouse button has been improperly clicked!!!")
            self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.callback)

ButtonTest()

Il callback deve essere iniziato da un oggetto, perché questo oggetto deve essere ancora in esecuzione quando il callback si verifica. Vedere anche la lista completa di possibili eventi e dei loro parametri, o la documentazione ufficiale di Coin.

Inizio

Documentazione

Purtroppo, Pivy non ha ancora una propria documentazione adeguata, ma dato che è una traduzione esatta di Coin, si può tranquillamente utilizzare la documentazione di Coin come riferimento, e utilizzare lo stile Python al posto dello stile C++.

In C++:

SoFile::getClassTypeId()

In Pivy:

SoFile.getClassId()

Meno recente

Questi collegamenti forniscono documentazione di riferimento per Coin v3.x. Le differenze con v4.x sono minime, quindi potrebbero essere comunque utili.

Inizio

PyQt/it


Introduzione

Oltre ai tipi di oggetti standard, come le Annotazioni, gli oggetti Mesh e gli oggetti Parte, FreeCAD offre anche la straordinaria possibilità di costruire al 100% oggetti parametrici in script di Python, chiamati Python Features (Caratteristiche Python). Questi oggetti si comportano esattamente come un qualsiasi altro oggetto di FreeCAD, e sono salvati e ripristinati automaticamente con salva/apri il file.

Una particolarità deve essere compresa: per motivi di sicurezza, i file di FreeCAD non contengono mai alcun codice incorporato. Il codice Python che scrivi per creare oggetti parametrici non viene mai salvato all'interno di un file. Ciò significa che se apri un file contenente tale oggetto su un'altra macchina, e quel codice Python non è disponibile su quella macchina, l'oggetto non verrà completamente ricreato. Se distribuisci tali oggetti ad altri, dovrai distribuire anche il tuo script Python, ad esempio come Macro.

Nota: è possibile impacchettare il codice Python all'interno di un file FreeCAD utilizzando la serializzazione json con un App::PropertyPythonObject, ma quel codice non può mai essere eseguito direttamente, e quindi ha poca utilità per il nostro scopo qui.

Le Python Features seguono le stesse regole di tutte le altre funzionalità di FreeCAD: sono divise in una parte App e una parte GUI. La parte App, cioè il Document Object (oggetto del documento), definisce la geometria dell'oggetto, mentre la sua parte grafica, cioè il View Provider Object (fornitore della vista dell'oggetto), definisce come l'oggetto viene disegnato sullo schermo. Il View Provider Object, come qualsiasi altro elemento di FreeCAD, è disponibile solo quando si esegue FreeCAD nella sua GUI (interfaccia grafica). Per costruire il proprio oggetto, sono disponibili diversi metodi e proprietà. La Proprietà deve essere una qualsiasi dei tipi di proprietà predefinite che FreeCAD mette a disposizione. Le proprietà disponibili sono quelle che appaiono nella finestra di visualizzazione delle proprietà per consentire all'utente di modificarle. Con questa procedura, gli oggetti FeaturePython sono realmente e totalmente parametrici. E' possibile definire separatamente le proprietà per l'oggetto e per la sua ViewObject (rappresentazione).

Esempio di base

L'esempio seguente si trova nel file src/Mod/TemplatePyMod/FeaturePython.py, con molti altri esempi:

'''Examples for a feature class and its view provider.'''

import FreeCAD, FreeCADGui
from pivy import coin

class Box:
    def __init__(self, obj):
        '''Add some custom properties to our box feature'''
        obj.addProperty("App::PropertyLength", "Length", "Box", "Length of the box").Length = 1.0
        obj.addProperty("App::PropertyLength", "Width", "Box", "Width of the box").Width = 1.0
        obj.addProperty("App::PropertyLength", "Height", "Box", "Height of the box").Height = 1.0
        obj.Proxy = self

    def onChanged(self, fp, prop):
        '''Do something when a property has changed'''
        FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")

    def execute(self, fp):
        '''Do something when doing a recomputation, this method is mandatory'''
        FreeCAD.Console.PrintMessage("Recompute Python Box feature\n")

class ViewProviderBox:
    def __init__(self, obj):
        '''Set this object to the proxy object of the actual view provider'''
        obj.addProperty("App::PropertyColor","Color", "Box", "Color of the box").Color = (1.0, 0.0, 0.0)
        obj.Proxy = self

    def attach(self, obj):
        '''Setup the scene sub-graph of the view provider, this method is mandatory'''
        self.shaded = coin.SoGroup()
        self.wireframe = coin.SoGroup()
        self.scale = coin.SoScale()
        self.color = coin.SoBaseColor()

        data=coin.SoCube()
        self.shaded.addChild(self.scale)
        self.shaded.addChild(self.color)
        self.shaded.addChild(data)
        obj.addDisplayMode(self.shaded, "Shaded");
        style=coin.SoDrawStyle()
        style.style = coin.SoDrawStyle.LINES
        self.wireframe.addChild(style)
        self.wireframe.addChild(self.scale)
        self.wireframe.addChild(self.color)
        self.wireframe.addChild(data)
        obj.addDisplayMode(self.wireframe, "Wireframe");
        self.onChanged(obj,"Color")

    def updateData(self, fp, prop):
        '''If a property of the handled feature has changed we have the chance to handle this here'''
        # fp is the handled feature, prop is the name of the property that has changed
        l = fp.getPropertyByName("Length")
        w = fp.getPropertyByName("Width")
        h = fp.getPropertyByName("Height")
        self.scale.scaleFactor.setValue(float(l), float(w), float(h))
        pass

    def getDisplayModes(self,obj):
        '''Return a list of display modes.'''
        modes=[]
        modes.append("Shaded")
        modes.append("Wireframe")
        return modes

    def getDefaultDisplayMode(self):
        '''Return the name of the default display mode. It must be defined in getDisplayModes.'''
        return "Shaded"

    def setDisplayMode(self,mode):
        '''Map the display mode defined in attach with those defined in getDisplayModes.\
                Since they have the same names nothing needs to be done. This method is optional'''
        return mode

    def onChanged(self, vp, prop):
        '''Here we can do something when a single property got changed'''
        FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")
        if prop == "Color":
            c = vp.getPropertyByName("Color")
            self.color.rgb.setValue(c[0], c[1], c[2])

    def getIcon(self):
        '''Return the icon in XPM format which will appear in the tree view. This method is\
                optional and if not defined a default icon is shown.'''
        return """
            /* XPM */
            static const char * ViewProviderBox_xpm[] = {
            "16 16 6 1",
            "   c None",
            ".  c #141010",
            "+  c #615BD2",
            "@  c #C39D55",
            "#  c #000000",
            "$  c #57C355",
            "        ........",
            "   ......++..+..",
            "   .@@@@.++..++.",
            "   .@@@@.++..++.",
            "   .@@  .++++++.",
            "  ..@@  .++..++.",
            "###@@@@ .++..++.",
            "##$.@@$#.++++++.",
            "#$#$.$$$........",
            "#$$#######      ",
            "#$$#$$$$$#      ",
            "#$$#$$$$$#      ",
            "#$$#$$$$$#      ",
            " #$#$$$$$#      ",
            "  ##$$$$$#      ",
            "   #######      "};
            """

    def dumps(self):
        '''When saving the document this object gets stored using Python's json module.\
                Since we have some un-serializable parts here -- the Coin stuff -- we must define this method\
                to return a tuple of all serializable objects or None.'''
        return None

    def loads(self,state):
        '''When restoring the serialized object from document we have the chance to set some internals here.\
                Since no data were serialized nothing needs to be done here.'''
        return None

def makeBox():
    FreeCAD.newDocument()
    a=FreeCAD.ActiveDocument.addObject("App::FeaturePython", "Box")
    Box(a)
    ViewProviderBox(a.ViewObject)

makeBox()

Cose da notare

Se il tuo oggetto si basa sul ricalcolo non appena viene creato, devi farlo manualmente nella funzione __init__ poiché non viene chiamato automaticamente. Questo esempio non lo richiede, perché il metodo onChanged della classe Box ha lo stesso effetto della funzione execute, ma gli esempi seguenti si basano sull'essere ricalcolati prima che qualsiasi cosa venga visualizzata nella vista 3D. Negli esempi, questo viene fatto manualmente con ActiveDocument.recompute(), ma in scenari più complessi devi decidere dove ricalcolare l'intero documento o l'oggetto FeaturePython.

Questo esempio produce una serie di analisi dello stack di eccezioni nella finestra di visualizzazione del report. Questo perché il metodo onChanged della classe Box viene chiamato ogni volta che viene aggiunta una proprietà in __init__. Quando viene aggiunta la prima, le proprietà Width e Height non esistono ancora e quindi il tentativo di accedervi fallisce.

Una spiegazione di __getstate__ e __setstate__ è nel thread del forum obj.Proxy.Type è un dizionario, non una stringa.

obj.addProperty(...) returns obj, so that the value of the property can be set on the same line:

obj.addProperty("App::PropertyLength", "Length", "Box", "Length of the box").Length = 1.0

Which is equivalent to:

obj.addProperty("App::PropertyLength", "Length", "Box", "Length of the box")
obj.Length = 1.0

Un altro esempio più complesso

In questo esempio si utilizza il Modulo Part per creare un ottaedro, quindi si crea la sua rappresentazione Coin con Pivy.

Prima si crea l'oggetto del documento:

import FreeCAD, FreeCADGui, Part
import pivy
from pivy import coin

class Octahedron:
  def __init__(self, obj):
     "Add some custom properties to our box feature"
     obj.addProperty("App::PropertyLength","Length","Octahedron","Length of the octahedron").Length=1.0
     obj.addProperty("App::PropertyLength","Width","Octahedron","Width of the octahedron").Width=1.0
     obj.addProperty("App::PropertyLength","Height","Octahedron", "Height of the octahedron").Height=1.0
     obj.addProperty("Part::PropertyPartShape","Shape","Octahedron", "Shape of the octahedron")
     obj.Proxy = self

  def execute(self, fp):
     # Define six vetices for the shape
     v1 = FreeCAD.Vector(0,0,0)
     v2 = FreeCAD.Vector(fp.Length,0,0)
     v3 = FreeCAD.Vector(0,fp.Width,0)
     v4 = FreeCAD.Vector(fp.Length,fp.Width,0)
     v5 = FreeCAD.Vector(fp.Length/2,fp.Width/2,fp.Height/2)
     v6 = FreeCAD.Vector(fp.Length/2,fp.Width/2,-fp.Height/2)

     # Make the wires/faces
     f1 = self.make_face(v1,v2,v5)
     f2 = self.make_face(v2,v4,v5)
     f3 = self.make_face(v4,v3,v5)
     f4 = self.make_face(v3,v1,v5)
     f5 = self.make_face(v2,v1,v6)
     f6 = self.make_face(v4,v2,v6)
     f7 = self.make_face(v3,v4,v6)
     f8 = self.make_face(v1,v3,v6)
     shell=Part.makeShell([f1,f2,f3,f4,f5,f6,f7,f8])
     solid=Part.makeSolid(shell)
     fp.Shape = solid

  # helper mehod to create the faces
  def make_face(self,v1,v2,v3):
     wire = Part.makePolygon([v1,v2,v3,v1])
     face = Part.Face(wire)
     return face

In seguito si crea il fornitore della vista dell'oggetto (view provider object), responsabile di mostrare l'oggetto nella scena 3D:

class ViewProviderOctahedron:
  def __init__(self, obj):
     "Set this object to the proxy object of the actual view provider"
     obj.addProperty("App::PropertyColor","Color","Octahedron","Color of the octahedron").Color=(1.0,0.0,0.0)
     obj.Proxy = self

  def attach(self, obj):
     "Setup the scene sub-graph of the view provider, this method is mandatory"
     self.shaded = coin.SoGroup()
     self.wireframe = coin.SoGroup()
     self.scale = coin.SoScale()
     self.color = coin.SoBaseColor()

     self.data=coin.SoCoordinate3()
     self.face=coin.SoIndexedFaceSet()

     self.shaded.addChild(self.scale)
     self.shaded.addChild(self.color)
     self.shaded.addChild(self.data)
     self.shaded.addChild(self.face)
     obj.addDisplayMode(self.shaded,"Shaded");
     style=coin.SoDrawStyle()
     style.style = coin.SoDrawStyle.LINES
     self.wireframe.addChild(style)
     self.wireframe.addChild(self.scale)
     self.wireframe.addChild(self.color)
     self.wireframe.addChild(self.data)
     self.wireframe.addChild(self.face)
     obj.addDisplayMode(self.wireframe,"Wireframe");
     self.onChanged(obj,"Color")

  def updateData(self, fp, prop):
     "If a property of the handled feature has changed we have the chance to handle this here"
     # fp is the handled feature, prop is the name of the property that has changed
     if prop == "Shape":
        s = fp.getPropertyByName("Shape")
        self.data.point.setNum(6)
        cnt=0
        for i in s.Vertexes:
           self.data.point.set1Value(cnt,i.X,i.Y,i.Z)
           cnt=cnt+1

        self.face.coordIndex.set1Value(0,0)
        self.face.coordIndex.set1Value(1,1)
        self.face.coordIndex.set1Value(2,2)
        self.face.coordIndex.set1Value(3,-1)

        self.face.coordIndex.set1Value(4,1)
        self.face.coordIndex.set1Value(5,3)
        self.face.coordIndex.set1Value(6,2)
        self.face.coordIndex.set1Value(7,-1)

        self.face.coordIndex.set1Value(8,3)
        self.face.coordIndex.set1Value(9,4)
        self.face.coordIndex.set1Value(10,2)
        self.face.coordIndex.set1Value(11,-1)

        self.face.coordIndex.set1Value(12,4)
        self.face.coordIndex.set1Value(13,0)
        self.face.coordIndex.set1Value(14,2)
        self.face.coordIndex.set1Value(15,-1)

        self.face.coordIndex.set1Value(16,1)
        self.face.coordIndex.set1Value(17,0)
        self.face.coordIndex.set1Value(18,5)
        self.face.coordIndex.set1Value(19,-1)

        self.face.coordIndex.set1Value(20,3)
        self.face.coordIndex.set1Value(21,1)
        self.face.coordIndex.set1Value(22,5)
        self.face.coordIndex.set1Value(23,-1)

        self.face.coordIndex.set1Value(24,4)
        self.face.coordIndex.set1Value(25,3)
        self.face.coordIndex.set1Value(26,5)
        self.face.coordIndex.set1Value(27,-1)

        self.face.coordIndex.set1Value(28,0)
        self.face.coordIndex.set1Value(29,4)
        self.face.coordIndex.set1Value(30,5)
        self.face.coordIndex.set1Value(31,-1)

  def getDisplayModes(self,obj):
     "Return a list of display modes."
     modes=[]
     modes.append("Shaded")
     modes.append("Wireframe")
     return modes

  def getDefaultDisplayMode(self):
     "Return the name of the default display mode. It must be defined in getDisplayModes."
     return "Shaded"

  def setDisplayMode(self,mode):
     return mode

  def onChanged(self, vp, prop):
     "Here we can do something when a single property got changed"
     FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")
     if prop == "Color":
        c = vp.getPropertyByName("Color")
        self.color.rgb.setValue(c[0],c[1],c[2])

  def getIcon(self):
     return """
        /* XPM */
        static const char * ViewProviderBox_xpm[] = {
        "16 16 6 1",
        "    c None",
        ".   c #141010",
        "+   c #615BD2",
        "@   c #C39D55",
        "#   c #000000",
        "$   c #57C355",
        "        ........",
        "   ......++..+..",
        "   .@@@@.++..++.",
        "   .@@@@.++..++.",
        "   .@@  .++++++.",
        "  ..@@  .++..++.",
        "###@@@@ .++..++.",
        "##$.@@$#.++++++.",
        "#$#$.$$$........",
        "#$$#######      ",
        "#$$#$$$$$#      ",
        "#$$#$$$$$#      ",
        "#$$#$$$$$#      ",
        " #$#$$$$$#      ",
        "  ##$$$$$#      ",
        "   #######      "};
        """

  def dumps(self):
     return None

  def loads(self,state):
     return None

Infine, dopo che l'oggetto e il suo visualizzatore sono definiti, basta solo chiamarli (La classe Octahedron e il codice della classe viewprovider possono essere copiati direttamente nella console Python di FreeCAD)::

FreeCAD.newDocument()
a=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Octahedron")
Octahedron(a)
ViewProviderOctahedron(a.ViewObject)

Rendere gli oggetti selezionabili

Se volete rendere il vostro oggetto selezionabile, o almeno una parte di esso, facendo clic su di esso nella finestra, è necessario includere la sua geometria Coin all'interno di un nodo SoFCSelection. Se l'oggetto ha una rappresentazione complessa, con widget, annotazioni, etc, si potrebbe voler includere solo una parte di esso in un SoFCSelection. Tutto quello che compone un SoFCSelection viene costantemente analizzato da FreeCAD per rilevare selezioni/preselezioni, quindi non ha senso sovraccaricarlo con delle scansioni non necessarie.

Una volta che le parti dello scenegraph, che devono essere selezionabili, si trovano all'interno dei nodi SoFCSelection, è necessario fornire due metodi per gestire il percorso di selezione. Il percorso di selezione può assumere la forma di una stringa che fornisce i nomi di ciascun elemento nel percorso o di un array di oggetti scenegraph. I due metodi che fornisci sono getDetailPath, che converte da un percorso stringa in un array di oggetti scenegraph, e getElementPicked, che prende un elemento su cui è stato fatto clic nello scenegraph e restituisce il suo nome di stringa (nota, non il suo percorso di stringa).

Ecco l'esempio della molecola sopra, adattato per rendere selezionabili gli elementi della molecola:

class Molecule:
    def __init__(self, obj):
        ''' Add two point properties '''
        obj.addProperty("App::PropertyVector","p1","Line","Start point")
        obj.addProperty("App::PropertyVector","p2","Line","End point").p2=FreeCAD.Vector(5,0,0)

        obj.Proxy = self

    def onChanged(self, fp, prop):
        if prop == "p1" or prop == "p2":
            ''' Print the name of the property that has changed '''
            fp.Shape = Part.makeLine(fp.p1,fp.p2)

    def execute(self, fp):
        ''' Print a short message when doing a recomputation, this method is mandatory '''
        fp.Shape = Part.makeLine(fp.p1,fp.p2)

class ViewProviderMolecule:
    def __init__(self, obj):
        ''' Set this object to the proxy object of the actual view provider '''
        obj.Proxy = self
        self.ViewObject = obj
        sep1=coin.SoSeparator()
        sel1 = coin.SoType.fromName('SoFCSelection').createInstance()
        # sel1.policy.setValue(coin.SoSelection.SHIFT)
        sel1.ref()
        sep1.addChild(sel1)
        self.trl1=coin.SoTranslation()
        sel1.addChild(self.trl1)
        sel1.addChild(coin.SoSphere())
        sep2=coin.SoSeparator()
        sel2 = coin.SoType.fromName('SoFCSelection').createInstance()
        sel2.ref()
        sep2.addChild(sel2)
        self.trl2=coin.SoTranslation()
        sel2.addChild(self.trl2)
        sel2.addChild(coin.SoSphere())
        obj.RootNode.addChild(sep1)
        obj.RootNode.addChild(sep2)
        self.updateData(obj.Object, 'p2')
        self.sel1 = sel1
        self.sel2 = sel2

    def getDetailPath(self, subname, path, append):
        vobj = self.ViewObject
        if append:
            path.append(vobj.RootNode)
            path.append(vobj.SwitchNode)

            mode = vobj.SwitchNode.whichChild.getValue()
            if mode >= 0:
                mode = vobj.SwitchNode.getChild(mode)
                path.append(mode)
                sub = Part.splitSubname(subname)[-1]
                if sub == 'Atom1':
                    path.append(self.sel1)
                elif sub == 'Atom2':
                    path.append(self.sel2)
                else:
                    path.append(mode.getChild(0))
        return True

    def getElementPicked(self, pp):
        path = pp.getPath()
        if path.findNode(self.sel1) >= 0:
            return 'Atom1'
        if path.findNode(self.sel2) >= 0:
            return 'Atom2'
        raise NotImplementedError

    def updateData(self, fp, prop):
        "If a property of the handled feature has changed we have the chance to handle this here"
        # fp is the handled feature, prop is the name of the property that has changed
        if prop == "p1":
            p = fp.getPropertyByName("p1")
            self.trl1.translation=(p.x,p.y,p.z)
        elif prop == "p2":
            p = fp.getPropertyByName("p2")
            self.trl2.translation=(p.x,p.y,p.z)

    def dumps(self):
        return None

    def loads(self,state):
        return None

def makeMolecule():
    FreeCAD.newDocument()
    a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Molecule")
    Molecule(a)
    ViewProviderMolecule(a.ViewObject)
    FreeCAD.ActiveDocument.recompute()

Lavorare con forme semplici

Se l'oggetto parametrico produce semplicemente una forma, non è necessario utilizzare un fornitore di vista dell'oggetto (view provider object). La forma viene visualizzata utilizzando la rappresentazione della forma standard di FreeCAD:

import FreeCAD as App
import FreeCADGui
import FreeCAD
import Part
class Line:
    def __init__(self, obj):
        '''"App two point properties" '''
        obj.addProperty("App::PropertyVector","p1","Line","Start point")
        obj.addProperty("App::PropertyVector","p2","Line","End point").p2=FreeCAD.Vector(1,0,0)
        obj.Proxy = self

    def execute(self, fp):
        '''"Print a short message when doing a recomputation, this method is mandatory" '''
        fp.Shape = Part.makeLine(fp.p1,fp.p2)

a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Line")
Line(a)
a.ViewObject.Proxy=0 # just set it to something different from None (this assignment is needed to run an internal notification)
FreeCAD.ActiveDocument.recompute()

Lo stesso codice con l'uso di ViewProviderLine

import FreeCAD as App
import FreeCADGui
import FreeCAD
import Part

class Line:
    def __init__(self, obj):
         '''"App two point properties" '''
         obj.addProperty("App::PropertyVector","p1","Line","Start point")
         obj.addProperty("App::PropertyVector","p2","Line","End point").p2=FreeCAD.Vector(100,0,0)
         obj.Proxy = self

    def execute(self, fp):
        '''"Print a short message when doing a recomputation, this method is mandatory" '''
        fp.Shape = Part.makeLine(fp.p1,fp.p2)

class ViewProviderLine:
   def __init__(self, obj):
      ''' Set this object to the proxy object of the actual view provider '''
      obj.Proxy = self

   def getDefaultDisplayMode(self):
      ''' Return the name of the default display mode. It must be defined in getDisplayModes. '''
      return "Flat Lines"

a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Line")
Line(a)
ViewProviderLine(a.ViewObject)
App.ActiveDocument.recompute()

Struttura di Scenegraph

Potresti aver notato che gli esempi sopra costruiscono i loro scenegraphs in modi leggermente diversi. Alcuni usano obj.addDisplayMode(node, "modename") mentre altri usano obj.SwitchNode.getChild(x).addChild(y).

Ogni caratteristica in un documento di FreeCAD si basa sulla seguente struttura di scenegraph:

RootNode
 \- SwitchNode
     \- Shaded
      - Wireframe
      - etc

SwitchNode mostra solo uno dei suoi figli, a seconda della modalità di visualizzazione selezionata in FreeCAD.

Gli esempi che utilizzano addDisplayMode stanno costruendo i loro scenegraph esclusivamente dagli elementi dello scenegraph di coin3d. Dietro le quinte, addDisplayMode aggiunge un nuovo figlio a SwitchNode; il nome di quel nodo corrisponderà alla modalità di visualizzazione, che è stata passata.

Gli esempi che utilizzano SwitchNode.getChild(x).addChild costruiscono anche parte della loro geometria utilizzando le funzioni dell'ambiente Part, come fp.Shape = Part.makeLine(fp.p1 ,fp.p2). Questo costruisce i diversi scenegraph della modalità di visualizzazione sotto SwitchNode; quando in seguito arriveremo ad aggiungere elementi coin3d allo scenegraph, dobbiamo aggiungerli agli scenegraph della modalità di visualizzazione esistenti usando addChild piuttosto che creare un nuovo figlio di SwitchNode.

Quando si utilizza addDisplayMode() per aggiungere geometria allo scenegraph, ogni modalità di visualizzazione dovrebbe avere il proprio nodo che viene passato a addDisplayMode(); non riutilizzare lo stesso nodo per questo. Ciò confonderà il meccanismo di selezione. Va bene se il nodo di ciascuna modalità di visualizzazione ha gli stessi nodi geometrici aggiunti sotto di esso, solo la radice di ciascuna modalità di visualizzazione deve essere distinta.

Ecco l'esempio della molecola sopra, adattato per essere disegnato solo con oggetti scenegraph Coin3D invece di utilizzare oggetti dall'ambiente Part:

import Part
from pivy import coin

class Molecule:
    def __init__(self, obj):
        ''' Add two point properties '''
        obj.addProperty("App::PropertyVector","p1","Line","Start point")
        obj.addProperty("App::PropertyVector","p2","Line","End point").p2=FreeCAD.Vector(5,0,0)

        obj.Proxy = self

    def onChanged(self, fp, prop):
        pass

    def execute(self, fp):
        ''' Print a short message when doing a recomputation, this method is mandatory '''
        pass

class ViewProviderMolecule:
    def __init__(self, obj):
        ''' Set this object to the proxy object of the actual view provider '''
        self.constructed = False
        obj.Proxy = self
        self.ViewObject = obj

    def attach(self, obj):
        material = coin.SoMaterial()
        material.diffuseColor = (1.0, 0.0, 0.0)
        material.emissiveColor = (1.0, 0.0, 0.0)
        drawStyle = coin.SoDrawStyle()
        drawStyle.pointSize.setValue(10)
        drawStyle.style = coin.SoDrawStyle.LINES
        wireframe = coin.SoGroup()
        shaded = coin.SoGroup()
        self.wireframe = wireframe
        self.shaded = shaded

        self.coords = coin.SoCoordinate3()
        self.coords.point.setValues(0, 2, [FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(1, 0, 0)])
        wireframe += self.coords
        wireframe += drawStyle
        wireframe += material
        shaded += self.coords
        shaded += drawStyle
        shaded += material

        g = coin.SoGroup()
        sel1 = coin.SoType.fromName('SoFCSelection').createInstance()
        sel1.style = 'EMISSIVE_DIFFUSE'
        p1 = coin.SoType.fromName('SoIndexedPointSet').createInstance()
        p1.coordIndex.set1Value(0, 0)
        sel1 += p1
        g += sel1
        wireframe += g
        shaded += g

        g = coin.SoGroup()
        sel2 = coin.SoType.fromName('SoFCSelection').createInstance()
        sel2.style = 'EMISSIVE_DIFFUSE'
        p2 = coin.SoType.fromName('SoIndexedPointSet').createInstance()
        p2.coordIndex.set1Value(0, 1)
        sel2 += p2
        g += sel2
        wireframe += g
        shaded += g

        g = coin.SoGroup()
        sel3 = coin.SoType.fromName('SoFCSelection').createInstance()
        sel3.style = 'EMISSIVE_DIFFUSE'
        p3 = coin.SoType.fromName('SoIndexedLineSet').createInstance()
        p3.coordIndex.setValues(0, 2, [0, 1])
        sel3 += p3
        g += sel3
        wireframe += g
        shaded += g

        obj.addDisplayMode(wireframe, 'Wireframe')
        obj.addDisplayMode(shaded, 'Shaded')

        self.sel1 = sel1
        self.sel2 = sel2
        self.sel3 = sel3
        self.constructed = True
        self.updateData(obj.Object, 'p2')

    def getDetailPath(self, subname, path, append):
        vobj = self.ViewObject
        if append:
            path.append(vobj.RootNode)
            path.append(vobj.SwitchNode)

            mode = vobj.SwitchNode.whichChild.getValue()
            FreeCAD.Console.PrintWarning("getDetailPath: mode {} is active\n".format(mode))
            if mode >= 0:
                mode = vobj.SwitchNode.getChild(mode)
                path.append(mode)
                sub = Part.splitSubname(subname)[-1]
                print(sub)
                if sub == 'Atom1':
                    path.append(self.sel1)
                elif sub == 'Atom2':
                    path.append(self.sel2)
                elif sub == 'Line':
                    path.append(self.sel3)
                else:
                    path.append(mode.getChild(0))
        return True

    def getElementPicked(self, pp):
        path = pp.getPath()
        if path.findNode(self.sel1) >= 0:
            return 'Atom1'
        if path.findNode(self.sel2) >= 0:
            return 'Atom2'
        if path.findNode(self.sel3) >= 0:
            return 'Line'
        raise NotImplementedError

    def updateData(self, fp, prop):
        "If a property of the handled feature has changed we have the chance to handle this here"
        # fp is the handled feature, prop is the name of the property that has changed
        if not self.constructed:
            return
        if prop == "p1":
            p = fp.getPropertyByName("p1")
            self.coords.point.set1Value(0, p)
        elif prop == "p2":
            p = fp.getPropertyByName("p2")
            self.coords.point.set1Value(1, p)

    def getDisplayModes(self, obj):
        return ['Wireframe', 'Shaded']

    def getDefaultDisplayMode(self):
        return 'Shaded'

    def setDisplayMode(self, mode):
        return mode

    def dumps(self):
        return None

    def loads(self,state):
        return None

def makeMolecule():
    FreeCAD.newDocument()
    a=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Molecule")
    Molecule(a)
    b=ViewProviderMolecule(a.ViewObject)
    a.touch()
    FreeCAD.ActiveDocument.recompute()
    return a,b

a,b = makeMolecule()

Oggetti con script di Part Design

Quando si creano oggetti con script in Part Design, il processo è simile agli oggetti con script discussi sopra, ma con alcune considerazioni aggiuntive. Dobbiamo gestire 2 proprietà della forma, una per la forma, che vediamo nella vista 3D e un'altra per la forma utilizzata dagli strumenti del modello, come le caratteristiche del modello polare. Le forme dell'oggetto devono anche essere fuse con qualsiasi materiale esistente già nel Corpo (o tagliate da esso nel caso di funzioni sottrattive). E dobbiamo tenere conto della collocazione e dell'attaccamento dei nostri oggetti in modo un po' diverso.

Le feature di oggetti solidi con script di Part Design devono essere basate su PartDesign::FeaturePython, PartDesign::FeatureAdditivePython o PartDesign::FeatureSubtractivePython piuttosto che su Part::FeaturePython. Solo le varianti Additive e Subtractive possono essere utilizzate nelle feature di ripetizione e, se basate su Part::FeaturePython, quando l'utente rilascia l'oggetto in un Body di Part Design, diventa una BaseFeature invece di essere trattato dal Body come un oggetto di Part Design nativo. Nota: tutti questi dovrebbero essere solidi, quindi se stai creando una caratteristica non solida dovrebbe essere basata su Part::FeaturePython altrimenti la caratteristica successiva nell'albero tenterà di fondersi come un solido e fallirà .

Di seguito è riportato un semplice esempio di creazione di una primitiva Tube, simile alla primitiva Tube nell'ambiente Part, tranne per il fatto che questa sarà un oggetto feature solido di Part Design. Per questo useremo 2 file separati: pdtube.FCMacro e pdtube.py. Il file .FCMacro verrà eseguito dall'utente per creare l'oggetto. Il file .py conterrà le definizioni delle classi, importate da .FCMacro. Il motivo per farlo in questo modo è mantenere la natura parametrica dell'oggetto dopo aver riavviato FreeCAD e aperto un documento contenente uno dei nostri tubi.

Innanzitutto, il file di definizione della classe:

# -*- coding: utf-8 -*-
#classes should go in pdtube.py
import FreeCAD, FreeCADGui, Part
class PDTube:
    def __init__(self,obj):
        obj.addProperty("App::PropertyLength","Radius1","Tube","Radius1").Radius1 = 5
        obj.addProperty("App::PropertyLength","Radius2","Tube","Radius2").Radius2 = 10
        obj.addProperty("App::PropertyLength","Height","Tube","Height of tube").Height = 10
        self.makeAttachable(obj)
        obj.Proxy = self

    def makeAttachable(self, obj):

        if int(FreeCAD.Version()[1]) >= 19:
            obj.addExtension('Part::AttachExtensionPython')
        else:
            obj.addExtension('Part::AttachExtensionPython', obj)

        obj.setEditorMode('Placement', 0) #non-readonly non-hidden

    def execute(self,fp):
        outer_cylinder = Part.makeCylinder(fp.Radius2, fp.Height)
        inner_cylinder = Part.makeCylinder(fp.Radius1, fp.Height)
        if fp.Radius1 == fp.Radius2: #just make cylinder
            tube_shape = outer_cylinder
        elif fp.Radius1 < fp.Radius2:
            tube_shape = outer_cylinder.cut(inner_cylinder)
        else: #invert rather than error out
            tube_shape = inner_cylinder.cut(outer_cylinder)

        if not hasattr(fp, "positionBySupport"):
            self.makeAttachable(fp)
        fp.positionBySupport()
        tube_shape.Placement = fp.Placement

        #BaseFeature (shape property of type Part::PropertyPartShape) is provided for us
        #with the PartDesign::FeaturePython and related classes, but it might be empty
        #if our object is the first object in the tree.  it's a good idea to check
        #for its existence in case we want to make type Part::FeaturePython, which won't have it

        if hasattr(fp, "BaseFeature") and fp.BaseFeature != None:
            if "Subtractive" in fp.TypeId:
                full_shape = fp.BaseFeature.Shape.cut(tube_shape)
            else:
                full_shape = fp.BaseFeature.Shape.fuse(tube_shape)
            full_shape.transformShape(fp.Placement.inverse().toMatrix(), True) #borrowed from gears workbench
            fp.Shape = full_shape
        else:
            fp.Shape = tube_shape
        if hasattr(fp,"AddSubShape"): #PartDesign::FeatureAdditivePython and
                                      #PartDesign::FeatureSubtractivePython have this
                                      #property but PartDesign::FeaturePython does not
                                      #It is the shape used for copying in pattern features
                                      #for example in making a polar pattern
            tube_shape.transformShape(fp.Placement.inverse().toMatrix(), True)
            fp.AddSubShape = tube_shape

class PDTubeVP:
    def __init__(self, obj):
        '''Set this object to the proxy object of the actual view provider'''
        obj.Proxy = self

    def attach(self,vobj):
        self.vobj = vobj

    def updateData(self, fp, prop):
        '''If a property of the handled feature has changed we have the chance to handle this here'''
        pass

    def getDisplayModes(self,obj):
        '''Return a list of display modes.'''
        modes=[]
        modes.append("Flat Lines")
        modes.append("Shaded")
        modes.append("Wireframe")
        return modes

    def getDefaultDisplayMode(self):
        '''Return the name of the default display mode. It must be defined in getDisplayModes.'''
        return "Flat Lines"

    def setDisplayMode(self,mode):
        '''Map the display mode defined in attach with those defined in getDisplayModes.\
                Since they have the same names nothing needs to be done. This method is optional'''
        return mode

    def onChanged(self, vp, prop):
        '''Here we can do something when a single property got changed'''
        #FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")
        pass

    def getIcon(self):
        '''Return the icon in XPM format which will appear in the tree view. This method is\
                optional and if not defined a default icon is shown.'''
        return """
            /* XPM */
            static const char * ViewProviderBox_xpm[] = {
            "16 16 6 1",
            "   c None",
            ".  c #141010",
            "+  c #615BD2",
            "@  c #C39D55",
            "#  c #000000",
            "$  c #57C355",
            "        ........",
            "   ......++..+..",
            "   .@@@@.++..++.",
            "   .@@@@.++..++.",
            "   .@@  .++++++.",
            "  ..@@  .++..++.",
            "###@@@@ .++..++.",
            "##$.@@$#.++++++.",
            "#$#$.$$$........",
            "#$$#######      ",
            "#$$#$$$$$#      ",
            "#$$#$$$$$#      ",
            "#$$#$$$$$#      ",
            " #$#$$$$$#      ",
            "  ##$$$$$#      ",
            "   #######      "};
            """

    def dumps(self):
        '''When saving the document this object gets stored using Python's json module.\
                Since we have some un-serializable parts here -- the Coin stuff -- we must define this method\
                to return a tuple of all serializable objects or None.'''
        return None

    def loads(self,state):
        '''When restoring the serialized object from document we have the chance to set some internals here.\
                Since no data were serialized nothing needs to be done here.'''
        return None

E ora il file macro per creare l'oggetto:

# -*- coding: utf-8 -*-

#pdtube.FCMacro
import pdtube
#above line needed if the class definitions above are place in another file: PDTube.py
#this is needed if the tube object is to remain parametric after restarting FreeCAD and loading
#a document containing the object

body = FreeCADGui.ActiveDocument.ActiveView.getActiveObject("pdbody")
if not body:
    FreeCAD.Console.PrintError("No active body.\n")
else:
    from PySide import QtGui
    window = FreeCADGui.getMainWindow()
    items = ["Additive","Subtractive","Neither additive nor subtractive"]
    item,ok =QtGui.QInputDialog.getItem(window,"Select tube type","Select whether you want additive, subtractive, or neither:",items,0,False)
    if ok:
        if item == items[0]:
            className = "PartDesign::FeatureAdditivePython"
        elif item == items[1]:
            className = "PartDesign::FeatureSubtractivePython"
        else:
            className = "PartDesign::FeaturePython" #not usable in pattern features, such as polar pattern

        tube = FreeCAD.ActiveDocument.addObject(className,"Tube")
        pdtube.PDTube(tube)
        pdtube.PDTubeVP(tube.ViewObject)
        body.addObject(tube) #optionally we can also use body.insertObject() for placing at particular place in tree

Available object types

The list of all object types you can create with FreeCAD.ActiveDocument.addObject() can be obtained with FreeCAD.ActiveDocument.supportedTypes(). Only object types with a name ending in Python can be used for scripted objects. These are listed here (for FreeCAD v0.21):

  • App::DocumentObjectGroupPython
  • App::FeaturePython
  • App::GeometryPython
  • App::LinkElementPython
  • App::LinkGroupPython
  • App::LinkPython
  • App::MaterialObjectPython
  • App::PlacementPython
  • Part::CustomFeaturePython
  • Part::FeaturePython
  • Part::Part2DObjectPython
  • Path::FeatureAreaPython
  • Path::FeatureAreaViewPython
  • Path::FeatureCompoundPython
  • Path::FeaturePython
  • Path::FeatureShapePython
  • Sketcher::SketchObjectPython
  • TechDraw::DrawComplexSectionPython
  • TechDraw::DrawLeaderLinePython
  • TechDraw::DrawPagePython
  • TechDraw::DrawRichAnnoPython
  • TechDraw::DrawTemplatePython
  • TechDraw::DrawTilePython
  • TechDraw::DrawTileWeldPython
  • TechDraw::DrawViewPartPython
  • TechDraw::DrawViewPython
  • TechDraw::DrawViewSectionPython
  • TechDraw::DrawViewSymbolPython
  • TechDraw::DrawWeldSymbolPython

Metodi disponibili

Vedi Metodi FeaturePython per i riferimenti completi.

Proprietà disponibili

Le proprietà sono i veri e propri mattoni per la costruzione degli oggetti FeaturePython. Attraverso di esse, l'utente è in grado di interagire e modificare l'oggetto. Dopo aver creato un nuovo oggetto FeaturePython nel documento (obj=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Box")), è possibile ottenere un elenco delle proprietà disponibili digitando:

obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython", "Box")
obj.supportedProperties()

Si ottiene un elenco di proprietà disponibili, che sono descritte in modo più approfondito nella pagina FeaturePython Custom Properties:

Quando si aggiungono delle proprietà agli oggetti personalizzati, stare attenti a questo:

  • Non utilizzare i caratteri "<" o ">" nelle descrizioni delle proprietà (questo spezza le parti xml nel file .fcstd)
  • Le proprietà sono memorizzate in ordine alfabetico nel file .fcstd. Se si dispone di una forma (Shape) nelle proprietà, qualsiasi proprietà il cui nome, in ordine alfabetico, viene dopo "Shape", verrà caricato DOPO la forma (Shape), e questo può causare strani comportamenti.

The properties are defined in the PropertyStandard C++ header file.

Tipi di proprietà

Di default, le proprietà possono essere aggiornate. È possibile creare delle proprietà di sola lettura, per esempio nel caso si vuole mostrare il risultato di un metodo. È anche possibile nascondere una proprietà. Il tipo di proprietà può essere impostata usando

obj.setEditorMode("MyPropertyName", mode)

dove mode è un indice che può essere impostato:

 0 -- default mode, lettura e scrittura
 1 -- solo lettura
 2 -- nascosto

The mode can also be set using a list of strings, e.g. obj.setEditorMode("Placement", ["ReadOnly", "Hidden"]).

Gli EditorModes non sono fissati nel file reload di FreeCAD. Questo può essere fatto dalla funzione __setstate__ . Vedere http://forum.freecadweb.org/viewtopic.php?f=18&t=13460&start=10#p108072. Usando setEditorMode le proprietà sono in sola lettura soltanto in PropertyEditor. Esse possono ancora essere modificate da un comando Python. Per renderle davvero in sola lettura le impostazioni devono essere passate direttamente all'interno della funzione addProperty. Per un esempio, vedere http://forum.freecadweb.org/viewtopic.php?f=18&t=13460&start=20#p109709.

Utilizzando l'impostazione diretta nella funzione addProperty, si hanno anche più possibilità. In particolare, è interessante contrassegnare una proprietà come proprietà di output. In questo modo FreeCAD non contrassegnerà l'elemento come variato durante la modifica (quindi non è necessario ricalcolare).

Esempio di proprietà di output (vedi anche https://forum.freecadweb.org/viewtopic.php?t=24928):

obj.addProperty("App::PropertyString", "MyCustomProperty", "", "", 8)

I tipi di proprietà che possono essere impostati all'ultimo parametro della funzione addProperty sono:

  0 -- Prop_None, nessun tipo di proprietà speciale
  1 -- Prop_ReadOnly, la proprietà è di sola lettura nell'editor
  2 -- Prop_Transient, la proprietà non verrà salvata nel file
  4 -- Prop_Hidden, la proprietà non apparirà nell'editor
  8 -- Prop_Output, la proprietà modificata non tocca il suo contenitore principale
  16 -- Prop_NoRecompute, la proprietà modificata non tocca il suo contenitore per il ricalcolo
  32 -- Prop_NoPersist, la proprietà non verrà affatto salvata nel file

È possibile trovare questi diversi tipi di proprietà definiti nell'intestazione del codice sorgente C++ per PropertyContainer.

Available extensions

The list of available extensions can be obtained with grep -RI EXTENSION_PROPERTY_SOURCE_TEMPLATE in the repository of the source code and is given here (for FreeCAD v0.21).

For objects:

  • App::GeoFeatureGroupExtensionPython
  • App::GroupExtensionPython
  • App::LinkBaseExtensionPython
  • App::LinkExtensionPython
  • App::OriginGroupExtensionPython
  • Part::AttachExtensionPython
  • TechDraw::CosmeticExtensionPython

For view objects:

  • Gui::ViewProviderExtensionPython
  • Gui::ViewProviderGeoFeatureGroupExtensionPython
  • Gui::ViewProviderGroupExtensionPython
  • Gui::ViewProviderOriginGroupExtensionPython
  • PartGui::ViewProviderAttachExtensionPython
  • PartGui::ViewProviderSplineExtensionPython

There exist other extensions but they do not work as-is:

  • App::ExtensionPython
  • TechDrawGui::ViewProviderCosmeticExtensionPython
  • TechDrawGui::ViewProviderDrawingViewExtensionPython
  • TechDrawGui::ViewProviderPageExtensionPython
  • TechDrawGui::ViewProviderTemplateExtensionPython

Ulteriori informazioni

Pagine aggiuntive:

Interessanti thread del forum sugli oggetti con script:

Oltre agli esempi presentati qui dare un'occhiata al codice sorgente di FreeCAD src/Mod/TemplatePyMod/FeaturePython.py per ulteriori esempi.



Introduzione

FreeCAD può essere importato come modulo Python in altri programmi o in una console autonoma di Python, insieme con tutti i suoi moduli e componenti. E' anche possibile importare l'interfaccia utente di FreeCAD come modulo Python, ma con alcune restrizioni indicate nelle avvertenze.

Utilizzare FreeCAD senza GUI

La prima, diretta, facile e utile applicazione che si può fare grazie a questo è quella di importare i documenti di FreeCAD in un vostro programma. Nell'esempio che segue, si importa la geometria Parte di un documento di FreeCAD in Blender. Segue lo script completo. È impressionante la sua semplicità:

FREECADPATH = '/usr/lib/freecad-python3/lib/' # path to your FreeCAD.so or FreeCAD.pyd file,
# for Windows you must either use \\ or / in the path, using a single \ is problematic
# FREECADPATH = 'C:\\FreeCAD\\bin'
import Blender, sys
sys.path.append(FREECADPATH)
 
def import_fcstd(filename):
   try:
       import FreeCAD
   except ValueError:
       Blender.Draw.PupMenu('Error%t|FreeCAD library not found. Please check the FREECADPATH variable in the import script is correct')
   else:
       scene = Blender.Scene.GetCurrent()
       import Part
       doc = FreeCAD.open(filename)
       objects = doc.Objects
       for ob in objects:
           if ob.Type[:4] == 'Part':
               shape = ob.Shape
               if shape.Faces:
                   mesh = Blender.Mesh.New()
                   rawdata = shape.tessellate(1)
                   for v in rawdata[0]:
                       mesh.verts.append((v.x,v.y,v.z))
                   for f in rawdata[1]:
                       mesh.faces.append.append(f)
                   scene.objects.new(mesh,ob.Name)
       Blender.Redraw()

def main():
   Blender.Window.FileSelector(import_fcstd, 'IMPORT FCSTD', 
                        Blender.sys.makename(ext='.fcstd'))    
 
# This lets you import the script without running it
if __name__=='__main__':
   main()

La prima e più importante cosa da fare è che Python trovi la libreria di FreeCAD. Se la trova, tutti i moduli di FreeCAD, come il modulo Parte (che si è utilizzato) saranno automaticamente disponibili. Così si prenda semplicemente la variabile sys.path, che è il posto dove Python cerca i moduli, e vi si aggiunga il percorso della libreria FreeCAD. Questa modifica è solo temporanea, e sarà persa quando chiuderemo l'interprete Python. Un modo alternativo potrebbe essere: creare un collegamento alla propria libreria di FreeCAD in uno dei percorsi di ricerca di Python. Si pone il percorso nella costante (FREECADPATH) in modo che per un altro utente dello script sia più facile configurarlo per il proprio sistema. Per gli utenti Windows è importante che il percorso venga specificato utilizzando \\ o / come separatore anziché solo \ poiché questo è un carattere di escape.

FREECADPATH = 'C:\\FreeCAD\\bin' # path to your FreeCAD.so or FreeCAD.pyd file
import sys
sys.path.append(FREECADPATH)

Quando si è sicuri che la libreria è stata caricata (la sequenza try/except), si può lavorare con FreeCAD, allo stesso modo che si farebbe all'interno dell'interprete Python di FreeCAD. Si apre il documento FreeCAD che viene passato dalla funzione main(), e si fa una lista dei suoi oggetti. Poi, siccome si è deciso di preoccuparsi solo della geometria del pezzo, controlliamo se la proprietà Type di ogni oggetto contiene "Part", e dopo la tasselliamo.

import Part
       doc = FreeCAD.open(filename)
       objects = doc.Objects
       for ob in objects:
           if ob.Type[:4] == 'Part':

Il tassellamento produce una lista di vertici e un elenco di facce definite dai vertici indicizzati. Questo è perfetto, poiché è esattamente lo stesso modo in cui Blender definisce i Mesh. Quindi, il nostro compito è ridicolmente semplice, basta aggiungere il contenuto di entrambi gli elenchi ai vertici e alle facce di una mesh di Blender. Quando tutto è fatto, basta ridisegnare lo schermo, e questo è tutto!

if ob.Type[:4] == 'Part':
               shape = ob.Shape
               if shape.Faces:
                   mesh = Blender.Mesh.New()
                   rawdata = shape.tessellate(1)
                   for v in rawdata[0]:
                       mesh.verts.append((v.x,v.y,v.z))
                   for f in rawdata[1]:
                       mesh.faces.append.append(f)
                   scene.objects.new(mesh,ob.Name)
       Blender.Redraw()

Ovviamente questo script è molto semplice (in realtà ne ho fatto uno più avanzato FreeCAD to Blender importer), è probabile che si voglia estenderlo, per esempio per importare anche oggetti mesh, o importare la geometria di una parte che non ha facce, o importare altri formati di file che FreeCAD è in grado di leggere. Si potrebbe anche voler esportare la geometria in un documento di FreeCAD, cosa che può essere fatto allo stesso modo. Si potrebbe anche voler costruire un dialogo per permettere all'utente di scegliere cosa importare, ecc.. La bellezza di tutto questo risiede proprio nel fatto che lasciate lavorare FreeCAD in ombra, mentre i suoi risultati sono presentati nel programma di vostra scelta.

Nota: controllare Headless FreeCAD per eseguire FreeCAD senza la GUI.

Utilizzare FreeCAD con GUI

Dalla versione 4.2, Qt ha la capacità affascinante di incorporare i plug-in della GUI dipendenti da Qt in applicazioni ospite (host) non-Qt e condividere il ciclo di eventi dell'ospite.

In particolare, per FreeCAD questo significa che esso può essere importato (incorporato) all'interno di un'altra applicazione con tutta la sua interfaccia utente dentro un'altra applicazione ospite la quale ha, a questo punto, il pieno controllo di FreeCAD.

L'intero codice python per ottenere questo ha solo due linee:

import FreeCADGui 
FreeCADGui.showMainWindow()

Se l'applicazione ospite è basata su Qt, allora questa soluzione dovrebbe funzionare su tutte le piattaforme che supportano Qt. Tuttavia, l'ospite deve basarsi sulla stessa versione Qt di FreeCAD perché altrimenti si potrebbe incorrere in errori di esecuzione inaspettati.

Per le applicazioni non-Qt, tuttavia, ci sono alcune limitazioni di cui è necessario essere a conoscenza. Questa soluzione probabilmente non funziona con tutti gli altri toolkit. Per Windows funziona fintanto che l'applicazione ospite è basata direttamente su Win32 o su qualsiasi altro toolkit che utilizza internamente l'API Win32, come wxWidgets, MFC o WinForms. Al fine di farla funzionare sotto X11 l'applicazione ospite deve linkare la libreria "glib".

Notare che, questa soluzione, naturalmente, non funziona per nessuna applicazione da console perché non c'è nessun ciclo di eventi in esecuzione.

Avvertenze

Anche se è possibile importare FreeCAD con un interprete Python esterno, questo non è uno scenario di utilizzo comune e richiede una certa cura. In generale, è meglio usare il Python incluso con FreeCAD, eseguire FreeCAD da linea di comando, o come un sottoprocesso. Vedere Avvio e configurazione per maggiori informazioni sulle ultime due opzioni.

Dato che il modulo Python di FreeCAD viene compilato da C ++ (invece di essere un puro modulo Python), esso può essere importato solo da un interprete Python compatibile. Generalmente questo significa che l'interprete Python deve essere compilato con lo stesso compilatore C che è stato utilizzato per costruire FreeCAD. Le informazioni sul compilatore utilizzato per costruire un interprete Python (compreso quello costruito con FreeCAD) si possono trovare nel seguente modo:

>>> import sys
>>> sys.version
'2.7.13 (default, Dec 17 2016, 23:03:43) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]'

Riferimenti



Introduzione

Questa pagina contiene degli esempi, pezzi, di codice Python utilizzabili in FreeCAD, raccolti dalle esperienze degli utenti e dalle discussioni nei forum. Dopo averli letti, è possibile usarli per iniziare a creare degli script personali ...

Frammenti

Un tipico file InitGui.py

Ogni modulo deve contenere, oltre al file del modulo principale, un file InitGui.py che ha il compito di inserire il modulo nella finestra grafica principale (GUI).

Questo è un esempio semplice di un file InitGui.py:

class ScriptWorkbench (Workbench): 
    MenuText = "Scripts"
    def Initialize(self):
        import Scripts # assuming Scripts.py is your module
        list = ["Script_Cmd"] # That list must contain command names, that can be defined in Scripts.py
        self.appendToolbar("My Scripts",list) 
        
Gui.addWorkbench(ScriptWorkbench())

Inizio

Un tipico file del modulo

Il seguente è un esempio di un file del modulo principale. Esso contiene tutto ciò che il modulo deve seguire. È il file Scripts.py richiamato dall'esempio precedente. In esso è possibile inserire tutti i comandi personalizzati.

import FreeCAD, FreeCADGui 
 
class ScriptCmd: 
   def Activated(self): 
       # Here your write what your ScriptCmd does...
       FreeCAD.Console.PrintMessage('Hello, World!')
   def GetResources(self): 
       return {'Pixmap' : 'path_to_an_icon/myicon.png', 'MenuText': 'Short text', 'ToolTip': 'More detailed text'} 
       
FreeCADGui.addCommand('Script_Cmd', ScriptCmd())

Inizio

Importare un nuovo tipo di file

In FreeCAD, è facile creare un importatore per un nuovo tipo di file. FreeCAD non considera che si importano dati in un documento aperto, ma piuttosto che si può semplicemente aprire direttamente il nuovo tipo di file. Quindi, quello che si deve fare è aggiungere la nuova estensione di file alla lista delle estensioni conosciute di FreeCAD, scrivere il codice che legge il file e creare gli oggetti di FreeCAD che si desidera:

Per aggiungere la nuova estensione di file all'elenco si deve aggiungere questa riga al file InitGui.py :

# Assumes Import_Ext.py is the file that has the code for opening and reading .ext files
FreeCAD.addImportType("Your new File Type (*.ext)","Import_Ext")

Poi nel file Import_Ext.py:

def open(filename): 
   doc=App.newDocument()
   # here you do all what is needed with filename, read, classify data, create corresponding FreeCAD objects
   doc.recompute()

L'esportazione di un proprio documento in un nuovo tipo di file funziona allo stesso modo, ma si utilizza:

FreeCAD.addExportType("Your new File Type (*.ext)","Export_Ext")

Inizio

Aggiungere una linea

Una linea ha semplicemente 2 punti.

import Part,PartGui 
doc=App.activeDocument() 
# add a line element to the document and set its points 
l=Part.LineSegment()
l.StartPoint=(0.0,0.0,0.0)
l.EndPoint=(1.0,1.0,1.0)
doc.addObject("Part::Feature","Line").Shape=l.toShape() 
doc.recompute()

Inizio

Aggiungere un poligono

Un poligono è semplicemente un insieme di segmenti di linea collegati tra di loro (una polilinea in AutoCAD). Non è necessario che sia chiuso.

import Part, PartGui 
doc = App.activeDocument()
n = list() 

# create a 3D vector, set its coordinates and add it to the list 
v = App.Vector(0,0,0) 
n.append(v) 
v = App.Vector(10,0,0) 
n.append(v) 
#... repeat for all nodes 

# Create a polygon object and set its nodes 
p = doc.addObject("Part::Polygon","Polygon") 
p.Nodes = n 
doc.recompute()

Inizio

Aggiungere e rimuovere un oggetto in un gruppo

doc=App.activeDocument() 
grp=doc.addObject("App::DocumentObjectGroup", "Group") 
lin=doc.addObject("Part::Feature", "Line")
grp.addObject(lin) # adds the lin object to the group grp
grp.removeObject(lin) # removes the lin object from the group grp

Nota: È anche possibile annidare dei gruppi in altri gruppi e creare dei sottogruppi...

Inizio

Aggiungere un Mesh

import Mesh
doc=App.activeDocument()
# create a new empty mesh
m = Mesh.Mesh()
# build up box out of 12 facets
m.addFacet(0.0,0.0,0.0, 0.0,0.0,1.0, 0.0,1.0,1.0)
m.addFacet(0.0,0.0,0.0, 0.0,1.0,1.0, 0.0,1.0,0.0)
m.addFacet(0.0,0.0,0.0, 1.0,0.0,0.0, 1.0,0.0,1.0)
m.addFacet(0.0,0.0,0.0, 1.0,0.0,1.0, 0.0,0.0,1.0)
m.addFacet(0.0,0.0,0.0, 0.0,1.0,0.0, 1.0,1.0,0.0)
m.addFacet(0.0,0.0,0.0, 1.0,1.0,0.0, 1.0,0.0,0.0)
m.addFacet(0.0,1.0,0.0, 0.0,1.0,1.0, 1.0,1.0,1.0)
m.addFacet(0.0,1.0,0.0, 1.0,1.0,1.0, 1.0,1.0,0.0)
m.addFacet(0.0,1.0,1.0, 0.0,0.0,1.0, 1.0,0.0,1.0)
m.addFacet(0.0,1.0,1.0, 1.0,0.0,1.0, 1.0,1.0,1.0)
m.addFacet(1.0,1.0,0.0, 1.0,1.0,1.0, 1.0,0.0,1.0)
m.addFacet(1.0,1.0,0.0, 1.0,0.0,1.0, 1.0,0.0,0.0)
# scale to a edge langth of 100
m.scale(100.0)
# add the mesh to the active document
me=doc.addObject("Mesh::Feature","Cube")
me.Mesh=m

Inizio

Aggiungere un arco o un cerchio

import Part
doc = App.activeDocument()
c = Part.Circle() 
c.Radius=10.0  
f = doc.addObject("Part::Feature", "Circle") # create a document with a circle feature 
f.Shape = c.toShape() # Assign the circle shape to the shape property 
doc.recompute()

Inizio

Accedere alla rappresentazione di un oggetto e modificarla

A ogni oggetto di un documento di FreeCAD è associato un oggetto di rappresentazione della sua vista in cui sono memorizzati tutti i parametri che definiscono il modo in cui l'oggetto deve apparire, come il colore, la larghezza di linea, ecc... Vedere anche lo snippet sottostante Elencare i componenti di un oggetto.

gad = Gui.activeDocument() # access the active document containing all 
                           # view representations of the features in the
                           # corresponding App document 

v = gad.getObject("Cube")  # access the view representation to the Mesh feature 'Cube' 
v.ShapeColor               # prints the color to the console 
v.ShapeColor=(1.0,1.0,1.0) # sets the shape color to white

Inizio

Sostituire la forma del mouse con un'immagine

import PySide2
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import QApplication
from PySide2.QtGui import QColor, QPixmap, QImage, QPainter, QCursor
from PySide2.QtCore import Qt

myImage = QtGui.QPixmap("Complete_Path_to_image.bmp")
cursor = QtGui.QCursor(myImage)
QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(cursor))

Inizio

Sostituire la forma del mouse con un'immagine (croce) inclusa

L'immagine viene creata da Gimp esportata in un file .XPM. Copiare ed utilizzare il codice tra parentesi "{" code to copy "}"

import PySide2
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import QApplication
from PySide2.QtGui import QColor, QPixmap, QImage, QPainter, QCursor
from PySide2.QtCore import Qt

cross32x32Icon = [
"32 32 2 1",
" 	c None",
".	c #FF0000",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                                ",
"............... . ..............",
"                                ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               ",
"                .               "
]

myImage = QtGui.QPixmap(cross32x32Icon)
cursor = QtGui.QCursor(myImage)
QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(cursor))

Inizio

Osservare il cambiamento della telecamera nel visualizzatore 3D tramite Python

Questo può essere fatto aggiungendo un Sensore Node alla fotocamera:

from pivy import coin
def callback(*args):
    cam, sensor = args
    print()
    print("Cam position : {}".format(cam.position.getValue().getValue()))
    print("Cam rotation : {}".format(cam.orientation.getValue().getValue()))

camera_node = Gui.ActiveDocument.ActiveView.getCameraNode()
node_sensor = coin.SoNodeSensor(callback, camera_node)
node_sensor.attach(camera_node)

Inizio

Controllare gli eventi del mouse nel visualizzatore 3D tramite Python

La struttura di Inventor permette di aggiungere uno o più nodi di richiamo (callback) al grafo di scena (Scenegraph) della vista. In FreeCAD è installato di default un nodo callback per la vista che permette di aggiungere funzioni C++ globali o statiche. In appropriate associazioni Python vengono forniti alcuni metodi per utilizzare questa tecnica all'interno del codice Python.

App.newDocument()
v=Gui.activeDocument().activeView()
 
#This class logs any mouse button events. As the registered callback function fires twice for 'down' and
#'up' events we need a boolean flag to handle this.
class ViewObserver:
   def logPosition(self, info):
       down = (info["State"] == "DOWN")
       pos = info["Position"]
       if (down):
           FreeCAD.Console.PrintMessage("Clicked on position: ("+str(pos[0])+", "+str(pos[1])+")\n")
       
o = ViewObserver()
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition)


Ora, cliccate in qualche parte nella zona nella vista 3D e osservate i messaggi nella finestra di output. Per terminare l'osservazione basta chiamare:

v.removeEventCallback("SoMouseButtonEvent",c)

Sono supportati i seguenti tipi di eventi:

  • SoEvent -- Tutti i tipi di eventi
  • SoButtonEvent -- Tutti gli eventi del mouse e della tastiera
  • SoLocation2Event -- Eventi di movimento 2D (normalmente i movimenti del mouse)
  • SoMotion3Event -- Eventi di movimento 3D (normalmente di spaceball)
  • SoKeyboardEvent -- Eventi dei tasti alto e basso
  • SoMouseButtonEvent -- Eventi dei pulsanti del mouse verso il basso e verso l'alto
  • SoSpaceballButtonEvent -- Eventi di SpaceBall in basso e in alto

La funzione di Python che può essere registrata con addEventCallback() si aspetta una difinizione. Secondo l'evento controllato la definizione può contenere chiavi differenti.

Per tutti gli eventi esistono le seguenti chiavi:

  • Type -- Il nome del tipo di evento, ad esempio SoMouseEvent, SoLocation2Event, ...
  • Time -- L'ora corrente come stringa
  • Position -- Una tupla di due interi, dipendenti dalla posizione del mouse
  • ShiftDown -- un valore booleano, vero (true) se Shift è stato premuto altrimenti false
  • CtrlDown -- un valore booleano, true se è stato premuto Ctrl altrimenti false
  • AltDown -- un valore booleano, true se è stato premuto Alt altrimenti false

Per tutti gli eventi dei pulsanti, ad esempio eventi di tastiera, mouse o spaceball:

  • State -- Una stringa 'UP' se il pulsante è verso l'alto, 'DOWN' se è verso il basso o 'UNKNOWN' per tutti gli altri casi

Per gli eventi da tastiera:

  • Key -- Un carattere del tasto premuto

Per gli eventi del pulsante del mouse

  • Button -- Il pulsante premuto, potrebbe essere BUTTON1, ..., BUTTON5 o ANY

Per gli eventi di Spaceball:

  • Button -- Il pulsante premuto, potrebbe essere BUTTON1, ..., BUTTON7 o ANY

E infine eventi di movimento:

  • Translation -- Una tupla di tre numeri in virgola mobile
  • Rotation -- Un quaternione per la rotazione, cioè una tupla di quattro numeri in virgola mobile

Inizio

Visualizzare i tasti premuti e gli eventi dei comandi

Questa macro visualizza nel report i tasti premuti e tutti gli eventi dei comandi

App.newDocument()
v=Gui.activeDocument().activeView()
class ViewObserver:
   def logPosition(self, info):
       try:
           down = (info["Key"])
           FreeCAD.Console.PrintMessage(str(down)+"\n") # here the character pressed
           FreeCAD.Console.PrintMessage(str(info)+"\n") # list all events command
           FreeCAD.Console.PrintMessage("_______________________________________"+"\n")
       except Exception:
           None
 
o = ViewObserver()
c = v.addEventCallback("SoEvent",o.logPosition)

#v.removeEventCallback("SoEvent",c) # remove ViewObserver

Inizio

Manipolare il grafo della scena in Python

È anche possibile ottenere il Scenegraph (grafo della scena) in Python e modificarlo, con il modulo 'Pivy' - una associazione di Python per Coin.

from pivy.coin import *                # load the pivy module
view = Gui.ActiveDocument.ActiveView   # get the active viewer
root = view.getSceneGraph()            # the root is an SoSeparator node
root.addChild(SoCube())
view.fitAll()

L'API in Python di Pivy viene creato utilizzando lo strumento SWIG. In FreeCAD si usano alcuni nodi auto-scritti che non è possibile creare direttamente in Python. Tuttavia, è possibile creare un nodo dal suo nome interno. Si può creare una istanza di tipo 'SoFCSelection' con:

type = SoType.fromName("SoFCSelection")
node = type.createInstance()

Inizio

Aggiungere e rimuovere oggetti nel grafo della scena

Questo è un modo per aggiungere dei nuovi nodi al Scenegraph. Accertarsi di aggiungere sempre un SoSeparator per contenere la geometria, le coordinate e le informazioni sui materiale di uno stesso oggetto. L'esempio seguente aggiunge una linea rossa da (0,0,0) a (10,0,0):

from pivy import coin
sg = Gui.ActiveDocument.ActiveView.getSceneGraph()
co = coin.SoCoordinate3()
pts = [[0,0,0],[10,0,0]]
co.point.setValues(0,len(pts),pts)
ma = coin.SoBaseColor()
ma.rgb = (1,0,0)
li = coin.SoLineSet()
li.numVertices.setValue(2)
no = coin.SoSeparator()
no.addChild(co)
no.addChild(ma)
no.addChild(li)
sg.addChild(no)

Per rimuoverla, è sufficiente scrivere:

sg.removeChild(no)

Inizio

Salvare il grafo della scena in 3 serie di 36 file

Visualizza il frammento di codice espandendo questa sezione

import math
import time
from FreeCAD import Base
from pivy import coin

size=(1000,1000)
dirname = "C:/Temp/animation/"
steps=36
angle=2*math.pi/steps

matX=Base.Matrix()
matX.rotateX(angle)
stepsX=Base.Placement(matX).Rotation

matY=Base.Matrix()
matY.rotateY(angle)
stepsY=Base.Placement(matY).Rotation

matZ=Base.Matrix()
matZ.rotateZ(angle)
stepsZ=Base.Placement(matZ).Rotation

view=Gui.ActiveDocument.ActiveView
cam=view.getCameraNode()
rotCamera=Base.Rotation(*cam.orientation.getValue().getValue())

# this sets the lookat point to the center of circumsphere of the global bounding box
view.fitAll()

# the camera's position, i.e. the user's eye point
position=Base.Vector(*cam.position.getValue().getValue())
distance=cam.focalDistance.getValue()

# view direction
vec=rotCamera.multVec(Base.Vector(0,0,-1))

# this is the point on the screen the camera looks at
# when rotating the camera we should make this point fix
lookat=position+vec*distance

# around x axis
for i in range(steps):
    rotCamera=stepsX.multiply(rotCamera)
    cam.orientation.setValue(*rotCamera.Q)
    vec=rotCamera.multVec(Base.Vector(0,0,-1))
    pos=lookat-vec*distance
    cam.position.setValue(pos.x,pos.y,pos.z)
    Gui.updateGui()
    time.sleep(0.3)
    view.saveImage(dirname+"x-%d.png" % i,*size)

# around y axis
for i in range(steps):
    rotCamera=stepsY.multiply(rotCamera)
    cam.orientation.setValue(*rotCamera.Q)
    vec=rotCamera.multVec(Base.Vector(0,0,-1))
    pos=lookat-vec*distance
    cam.position.setValue(pos.x,pos.y,pos.z)
    Gui.updateGui()
    time.sleep(0.3)
    view.saveImage(dirname+"y-%d.png" % i,*size)

# around z axis
for i in range(steps):
    rotCamera=stepsZ.multiply(rotCamera)
    cam.orientation.setValue(*rotCamera.Q)
    vec=rotCamera.multVec(Base.Vector(0,0,-1))
    pos=lookat-vec*distance
    cam.position.setValue(pos.x,pos.y,pos.z)
    Gui.updateGui()
    time.sleep(0.3)
    view.saveImage(dirname+"z-%d.png" % i,*size)

Inizio

Aggiungere dei widget personalizzati all'interfaccia

È possibile creare widget personalizzati con Qt designer, trasformarli in uno script Python e poi caricarli nell'interfaccia di FreeCAD con PySide.

Il codice Python prodotto dal compilatore Ui di Python (lo strumento che converte i file .ui di Qt-designer nel codice Python) appare in genere come questo (è semplice, si può anche codificare direttamente in Python):

class myWidget_Ui(object):
    def setupUi(self, myWidget):
        myWidget.setObjectName("my Nice New Widget")
        myWidget.resize(QtCore.QSize(QtCore.QRect(0,0,300,100).size()).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget
 
        self.label = QtGui.QLabel(myWidget) # creates a label
        self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
        self.label.setObjectName("label") # sets its name, so it can be found by name

    def retranslateUi(self, draftToolbar): # built-in QT function that manages translations of widgets
        myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))

Dopo, basta creare un riferimento alla finestra Qt di FreeCAD, inserire un widget personalizzato in essa, e "trasformare" questo widget nel proprio con il codice Ui che abbiamo appena creato:

app = QtGui.qApp
FCmw = app.activeWindow() # the active qt window, = the freecad window since we are inside it
# FCmw = FreeCADGui.getMainWindow() # use this line if the 'addDockWidget' error is declared
myNewFreeCADWidget = QtGui.QDockWidget() # create a new dckwidget
myNewFreeCADWidget.ui = myWidget_Ui() # load the Ui script
myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui
FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window

Inizio

Aggiungere una scheda alla Combo View

Il seguente codice consente di aggiungere una nuova scheda nel pannello Vista combinata di FreeCAD, oltre le schede standard "Modello" e "Azioni" . Questo codice utilizza anche il modulo uic per caricare un file UI direttamente nella nuova scheda.

# create new Tab in ComboView
from PySide import QtGui,QtCore
#from PySide import uic

def getMainWindow():
   "returns the main window"
   # using QtGui.qApp.activeWindow() isn't very reliable because if another
   # widget than the mainwindow is active (e.g. a dialog) the wrong widget is
   # returned
   toplevel = QtGui.qApp.topLevelWidgets()
   for i in toplevel:
       if i.metaObject().className() == "Gui::MainWindow":
           return i
   raise Exception("No main window found")

def getComboView(mw):
   dw=mw.findChildren(QtGui.QDockWidget)
   for i in dw:
       if str(i.objectName()) == "Combo View":
           return i.findChild(QtGui.QTabWidget)
       elif str(i.objectName()) == "Python Console":
           return i.findChild(QtGui.QTabWidget)
   raise Exception ("No tab widget found")

mw = getMainWindow()
tab = getComboView(getMainWindow())
tab2=QtGui.QDialog()
tab.addTab(tab2,"A Special Tab")

#uic.loadUi("/myTaskPanelforTabs.ui",tab2)
tab2.show()
#tab.removeTab(2)

Inizio

Abilitare o disabilitare una finestra

Questo script dà la possibilità di manipolare l'interfaccia utente dalla Python console/it per mostrare/nascondere diversi componenti nella interface/it di FreeCAD come:

from PySide import QtGui
mw = FreeCADGui.getMainWindow()
dws = mw.findChildren(QtGui.QDockWidget)

# objectName may be :
# "Report view"
# "Tree view"
# "Property view"
# "Selection view"
# "Combo View"
# "Python console"
# "draftToolbar"

for i in dws:
  if i.objectName() == "Report view":
    dw = i
    break

va = dw.toggleViewAction()
va.setChecked(True)        # True or False
dw.setVisible(True)        # True or False

Inizio

Aprire una pagina web personalizzata

import WebGui
WebGui.openBrowser("http://www.example.com")

Inizio

Ottenere il contenuto HTML di una pagina web aperta

from PySide import QtGui,QtWebKit
a = QtGui.qApp
mw = a.activeWindow()
v = mw.findChild(QtWebKit.QWebFrame)
html = unicode(v.toHtml())
print( html)

Inizio

Reperire le coordinate di 3 punti o oggetti selezionati

# -*- coding: utf-8 -*-
# the line above to put the accentuated in the remarks
# If this line is missing, an error will be returned
# extract and use the coordinates of 3 objects selected
import Part, FreeCAD, math, PartGui, FreeCADGui
from FreeCAD import Base, Console
sel = FreeCADGui.Selection.getSelection() # " sel " contains the items selected
if len(sel)!=3 :
  # If there are no 3 objects selected, an error is displayed in the report view
  # The \r and \n at the end of line mean return and the newline CR + LF.
  Console.PrintError("Select 3 points exactly\r\n")
else :
  points=[]
  for obj in sel:
    points.append(obj.Shape.BoundBox.Center)

  for pt in points:
    # display of the coordinates in the report view
    Console.PrintMessage(str(pt.x)+"\r\n")
    Console.PrintMessage(str(pt.y)+"\r\n")
    Console.PrintMessage(str(pt.z)+"\r\n")

  Console.PrintMessage(str(pt[1]) + "\r\n")

Inizio

Lista di oggetti

# -*- coding: utf-8 -*-
import FreeCAD,Draft
# List all objects of the document
doc = FreeCAD.ActiveDocument
objs = FreeCAD.ActiveDocument.Objects
#App.Console.PrintMessage(str(objs) + "\n")
#App.Console.PrintMessage(str(len(FreeCAD.ActiveDocument.Objects)) + " Objects"  + "\n")

for obj in objs:
    a = obj.Name                                             # list the Name  of the object  (not modifiable)
    b = obj.Label                                            # list the Label of the object  (modifiable)
    try:
        c = obj.LabelText                                    # list the LabeText of the text (modifiable)
        App.Console.PrintMessage(str(a) +" "+ str(b) +" "+ str(c) + "\n") # Displays the Name the Label and the text
    except:
        App.Console.PrintMessage(str(a) +" "+ str(b) + "\n") # Displays the Name and the Label of the object

#doc.removeObject("Box") # Clears the designated object

Inizio

Ottenere la dimensione di un oggetto, dato il suo nome

for edge in FreeCAD.ActiveDocument.MyObjectName.Shape.Edges: # replace "MyObjectName" for list
    print( edge.Length)

Inizio

Funzione residente per una azione con un clic del mouse

Qui con SelObserver sopra uno obietto selezionato

# -*- coding: utf-8 -*-
# causes an action to the mouse click on an object
# This function remains resident (in memory) with the function "addObserver(s)"
# "removeObserver(s) # Uninstalls the resident function
class SelObserver:
    def setPreselection(self,doc,obj,sub):                # Preselection object
        App.Console.PrintMessage(str(sub)+ "\n")          # The part of the object name

    def addSelection(self,doc,obj,sub,pnt):               # Selection object
        App.Console.PrintMessage("addSelection"+ "\n")
        App.Console.PrintMessage(str(doc)+ "\n")          # Name of the document
        App.Console.PrintMessage(str(obj)+ "\n")          # Name of the object
        App.Console.PrintMessage(str(sub)+ "\n")          # The part of the object name
        App.Console.PrintMessage(str(pnt)+ "\n")          # Coordinates of the object
        App.Console.PrintMessage("______"+ "\n")

    def removeSelection(self,doc,obj,sub):                # Remove the selection
        App.Console.PrintMessage("removeSelection"+ "\n")

    def setSelection(self,doc):                           # Set selection
        App.Console.PrintMessage("setSelection"+ "\n")

    def clearSelection(self,doc):                         # If click on the screen, clear the selection
        App.Console.PrintMessage("clearSelection"+ "\n")  # If click on another object, clear the previous object
s =SelObserver()
FreeCADGui.Selection.addObserver(s)                       # install the function mode resident
#FreeCADGui.Selection.removeObserver(s)                   # Uninstall the resident function

Altro esempio con ViewObserver sopra uno obbietto selezionato

App.newDocument()
v=Gui.activeDocument().activeView()
 
#This class logs any mouse button events. As the registered callback function fires twice for 'down' and
#'up' events we need a boolean flag to handle this.
class ViewObserver:
   def __init__(self, view):
       self.view = view
   
   def logPosition(self, info):
       down = (info["State"] == "DOWN")
       pos = info["Position"]
       if (down):
           FreeCAD.Console.PrintMessage("Clicked on position: ("+str(pos[0])+", "+str(pos[1])+")\n")
           pnt = self.view.getPoint(pos)
           FreeCAD.Console.PrintMessage("World coordinates: " + str(pnt) + "\n")
           info = self.view.getObjectInfo(pos)
           FreeCAD.Console.PrintMessage("Object info: " + str(info) + "\n")

o = ViewObserver(v)
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition)

Inizio

Visualizzare il documento attivo

class DocObserver:                      # document Observer
    def slotActivateDocument(self,doc):
        print(doc.Name)

obs=DocObserver()
App.addDocumentObserver(obs)
#App.removeDocumentObserver(obs)                 # desinstalle la fonction residente

Per rimuovere la chiamata dell'osservatore:

App.removeDocumentObserver(obs)                 # desinstalle la fonction residente

Inizio

Trovare o selezionare tutti gli elementi sotto il cursore

from pivy import coin
import FreeCADGui

def mouse_over_cb( event_callback):
    event = event_callback.getEvent()
    pos = event.getPosition().getValue()
    listObjects = FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo((int(pos[0]),int(pos[1])))
    obj = []
    if listObjects:
        FreeCAD.Console.PrintMessage("\n *** Objects under mouse pointer ***")
        for o in listObjects:
            label = str(o["Object"])
            if not label in obj:
                obj.append(label)
        FreeCAD.Console.PrintMessage("\n"+str(obj))


view = FreeCADGui.ActiveDocument.ActiveView

mouse_over = view.addEventCallbackPivy( coin.SoLocation2Event.getClassTypeId(), mouse_over_cb )

# to remove Callback :
#view.removeEventCallbackPivy( coin.SoLocation2Event.getClassTypeId(), mouse_over)

####
#The easy way is probably to use FreeCAD's selection.
#FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo(mouse_coords)

####
#you get that kind of result :
#'Document': 'Unnamed', 'Object': 'Box', 'Component': 'Face2', 'y': 8.604081153869629, 'x': 21.0, 'z': 8.553047180175781

####
#You can use this data to add your element to FreeCAD's selection :
#FreeCADGui.Selection.addSelection(FreeCAD.ActiveDocument.Box,'Face2',21.0,8.604081153869629,8.553047180175781)

Inizio

Elencare i componenti di un oggetto

Questa funzione elenca i componenti ed estrae le coordinate XYZ di un oggetto, i bordi (edge) e le loro lunghezze, le sue facce e la loro superficie.

Questa funzione elenca i componenti di un oggetto ed estrae:

  • questo oggetto e le sue coordinate XYZ,
  • i suoi bordi e le loro lunghezze, centro di massa e coordinate
  • le sue facce e il loro centro di massa
  • le sue facce e le loro superfici e coordinate
# -*- coding: utf-8 -*-
# This function list the components of an object
# and extract this object its XYZ coordinates,
# its edges and their lengths center of mass and coordinates
# its faces and their center of mass
# its faces and their surfaces and coordinates
# 8/05/2014

import Draft,Part
def detail():
    sel = FreeCADGui.Selection.getSelection()   # Select an object
    if len(sel) != 0:                           # If there is a selection then
        Vertx=[]
        Edges=[]
        Faces=[]
        compt_V=0
        compt_E=0
        compt_F=0
        pas    =0
        perimetre = 0.0   
        EdgesLong = []

        # Displays the "Name" and the "Label" of the selection
        App.Console.PrintMessage("Selection > " + str(sel[0].Name) + "  " + str(sel[0].Label) +"\n"+"\n")

        for j in enumerate(sel[0].Shape.Edges):                                     # Search the "Edges" and their lengths
            compt_E+=1
            Edges.append("Edge%d" % (j[0]+1))
            EdgesLong.append(str(sel[0].Shape.Edges[compt_E-1].Length))
            perimetre += (sel[0].Shape.Edges[compt_E-1].Length)                     # calculates the perimeter

            # Displays the "Edge" and its length
            App.Console.PrintMessage("Edge"+str(compt_E)+" Length > "+str(sel[0].Shape.Edges[compt_E-1].Length)+"\n")

            # Displays the "Edge" and its center mass
            App.Console.PrintMessage("Edge"+str(compt_E)+" Center > "+str(sel[0].Shape.Edges[compt_E-1].CenterOfMass)+"\n")

            num = sel[0].Shape.Edges[compt_E-1].Vertexes[0]
            Vertx.append("X1: "+str(num.Point.x))
            Vertx.append("Y1: "+str(num.Point.y))
            Vertx.append("Z1: "+str(num.Point.z))
            # Displays the coordinates 1
            App.Console.PrintMessage("X1: "+str(num.Point[0])+" Y1: "+str(num.Point[1])+" Z1: "+str(num.Point[2])+"\n")

            try:
                num = sel[0].Shape.Edges[compt_E-1].Vertexes[1]
                Vertx.append("X2: "+str(num.Point.x))
                Vertx.append("Y2: "+str(num.Point.y))
                Vertx.append("Z2: "+str(num.Point.z))
            except:
                Vertx.append("-")
                Vertx.append("-")
                Vertx.append("-")
            # Displays the coordinates 2
            App.Console.PrintMessage("X2: "+str(num.Point[0])+" Y2: "+str(num.Point[1])+" Z2: "+str(num.Point[2])+"\n")

            App.Console.PrintMessage("\n")
        App.Console.PrintMessage("Perimeter of the form  : "+str(perimetre)+"\n") 

        App.Console.PrintMessage("\n")
        FacesSurf = []
        for j in enumerate(sel[0].Shape.Faces):                                      # Search the "Faces" and their surface
            compt_F+=1
            Faces.append("Face%d" % (j[0]+1))
            FacesSurf.append(str(sel[0].Shape.Faces[compt_F-1].Area))

            # Displays 'Face' and its surface
            App.Console.PrintMessage("Face"+str(compt_F)+" >  Surface "+str(sel[0].Shape.Faces[compt_F-1].Area)+"\n")

            # Displays 'Face' and its CenterOfMass
            App.Console.PrintMessage("Face"+str(compt_F)+" >  Center  "+str(sel[0].Shape.Faces[compt_F-1].CenterOfMass)+"\n")

            # Displays 'Face' and its Coordinates
            FacesCoor = []
            fco = 0
            for f0 in sel[0].Shape.Faces[compt_F-1].Vertexes:                        # Search the Vertexes of the face
                fco += 1
                FacesCoor.append("X"+str(fco)+": "+str(f0.Point.x))
                FacesCoor.append("Y"+str(fco)+": "+str(f0.Point.y))
                FacesCoor.append("Z"+str(fco)+": "+str(f0.Point.z))

            # Displays 'Face' and its Coordinates
            App.Console.PrintMessage("Face"+str(compt_F)+" >  Coordinate"+str(FacesCoor)+"\n")

            # Displays 'Face' and its Volume
            App.Console.PrintMessage("Face"+str(compt_F)+" >  Volume  "+str(sel[0].Shape.Faces[compt_F-1].Volume)+"\n")
            App.Console.PrintMessage("\n")

        # Displays the total surface of the form
        App.Console.PrintMessage("Surface of the form    : "+str(sel[0].Shape.Area)+"\n")

        # Displays the total Volume of the form
        App.Console.PrintMessage("Volume  of the form    : "+str(sel[0].Shape.Volume)+"\n")

detail()

Inizio

List the PropertiesList

import FreeCADGui
from FreeCAD import Console
o = App.ActiveDocument.ActiveObject
op = o.PropertiesList
for p in op:
    Console.PrintMessage("Property: "+ str(p)+ " Value: " + str(o.getPropertyByName(p))+"\r\n")

Inizio

Aggiungere una singola Proprietà Comment

import Draft
obj = FreeCADGui.Selection.getSelection()[0]
obj.addProperty("App::PropertyString","GComment","Draft","Font name").GComment = "Comment here"
App.activeDocument().recompute()

Inizio

Ricerca e estrazione di dati

Esempi di ricerca e decodifica di informazioni su un oggetto.

Ogni sezione separata da "############" è indipendente e può essere copiata direttamente nella console Python, o in una macro o usata come macro a sè stante. La descrizione della macro si trova nel commento.

Le informazioni ricercate in questo modo sono visualizzate nella finestra dei rapporti attivabile con Visualizza -> Viste -> Report

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
 
# Exemples de recherche et de decodage d'informations sur un objet
# Chaque section peut etre copiee directement dans la console Python ou dans une macro ou utilisez la macro tel quel
# Certaines commandes se repetent seul l'approche est differente
# L'affichage se fait dans la Vue rapport : Menu Affichage > Vues > Vue rapport
#
# Examples of research and decoding information on an object
# Each section can be copied directly into the Python console, or in a macro or uses this macro
# Certain commands as repeat alone approach is different
# Displayed in Report view: View > Views > report view
#
# rev:30/08/2014:29/09/2014:17/09/2015 22/11/2019 30/12/2022
 
from FreeCAD import Base
import DraftVecUtils, Draft, Part

##################################################################################
# info in the object

box = App.ActiveDocument.getObject('Box')                                 # object 
####
print(dir(box))                                                           # all options disponible in the object
####
print(box.Name)                                                           # object name
####
print(box.Content)                                                        # content of the object in XML format
##################################################################################
#
# example of using the information listed
#
# search the name of the active document 
mydoc = FreeCAD.activeDocument().Name                                     # Name of active Document
App.Console.PrintMessage("Active docu    : "+(mydoc)+"\n")
##################################################################################

# search the document name and the name of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
object_FullName = sel[0].FullName                                         # file Name and Name of the object selected
App.Console.PrintMessage("object_FullName: "+(object_FullName)+"\n")
##################################################################################

# search the label of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
object_Label = sel[0].Label                                               # Label of the object (modifiable)
App.Console.PrintMessage("object_Label   : "+(object_Label)+"\n")
##################################################################################

#TypeID object FreeCAD selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
App.Console.PrintMessage("sel            : "+str(sel[0])+"\n\n")          # sel[0] first object selected
##################################################################################

# search the Name of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
object_Name  = sel[0].Name                                                # Name of the object (not modifiable)
App.Console.PrintMessage("object_Name    : "+str(object_Name)+"\n\n")
##################################################################################

# search the Sub Element Name of the sub object selected
try:
    SubElement = FreeCADGui.Selection.getSelectionEx()                    # sub element name with getSelectionEx()
    element_ = SubElement[0].SubElementNames[0]                           # name of 1 element selected
    App.Console.PrintMessage("elementSelec   : "+str(element_)+"\n\n")            
except:
    App.Console.PrintMessage("Oups"+"\n\n")            
##################################################################################

# give the length of the subObject selected
SubElementLength = Gui.Selection.getSelectionEx()[0].SubObjects[0].Length # sub element or element name with getSelectionEx()
App.Console.PrintMessage("SubElement length: "+str(SubElementLength)+"\n")# length
##################################################################################

# list the edges and the coordinates of the object[0] selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
i = 0
for j in enumerate(sel[0].Shape.Edges):                                   # list all Edges
    i += 1
    App.Console.PrintMessage("Edges n : "+str(i)+"\n")
    a = sel[0].Shape.Edges[j[0]].Vertexes[0]
    App.Console.PrintMessage("X1             : "+str(a.Point.x)+"\n")     # coordinate XYZ first point
    App.Console.PrintMessage("Y1             : "+str(a.Point.y)+"\n")     #
    App.Console.PrintMessage("Z1             : "+str(a.Point.z)+"\n")     #
    try:
        a = sel[0].Shape.Edges[j[0]].Vertexes[1]
        App.Console.PrintMessage("X2             : "+str(a.Point.x)+"\n") # coordinate XYZ second point
        App.Console.PrintMessage("Y2             : "+str(a.Point.y)+"\n") #
        App.Console.PrintMessage("Z2             : "+str(a.Point.z)+"\n") #
    except:
        App.Console.PrintMessage("Oups"+"\n")    
App.Console.PrintMessage("\n")    
##################################################################################

# give the sub element name, length, coordinates, BoundBox, BoundBox.Center, Area of the SubObjects selected
try:
    SubElement = FreeCADGui.Selection.getSelectionEx()                                        # sub element name with getSelectionEx()
    subElementName = Gui.Selection.getSelectionEx()[0].SubElementNames[0]                     # sub element name with getSelectionEx()
    App.Console.PrintMessage("subElementName : "+str(subElementName)+"\n")
    
    subObjectLength = Gui.Selection.getSelectionEx()[0].SubObjects[0].Length                  # sub element Length
    App.Console.PrintMessage("subObjectLength: "+str(subObjectLength)+"\n\n")
    
    subObjectX1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.x         # sub element coordinate X1
    App.Console.PrintMessage("subObject_X1   : "+str(subObjectX1)+"\n")
    subObjectY1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.y         # sub element coordinate Y1
    App.Console.PrintMessage("subObject_Y1   : "+str(subObjectY1)+"\n")
    subObjectZ1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.z         # sub element coordinate Z1
    App.Console.PrintMessage("subObject_Z1   : "+str(subObjectZ1)+"\n\n")

    try:
        subObjectX2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.x     # sub element coordinate X2
        App.Console.PrintMessage("subObject_X2   : "+str(subObjectX2)+"\n")
        subObjectY2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.y     # sub element coordinate Y2
        App.Console.PrintMessage("subObject_Y2   : "+str(subObjectY2)+"\n")
        subObjectZ2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.z     # sub element coordinate Z2
        App.Console.PrintMessage("subObject_Z2   : "+str(subObjectZ2)+"\n\n")
    except:
        App.Console.PrintMessage("Oups"+"\n\n")            

    subObjectBoundBox = Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox              # sub element BoundBox coordinates
    App.Console.PrintMessage("subObjectBBox  : "+str(subObjectBoundBox)+"\n")
    
    subObjectBoundBoxCenter = Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox.Center # sub element BoundBoxCenter
    App.Console.PrintMessage("subObjectBBoxCe: "+str(subObjectBoundBoxCenter)+"\n")
    
    surfaceFace = Gui.Selection.getSelectionEx()[0].SubObjects[0].Area                        # Area of the face selected
    App.Console.PrintMessage("surfaceFace    : "+str(surfaceFace)+"\n\n")
except:
    App.Console.PrintMessage("Oups"+"\n\n")            
##################################################################################

# give the area of the object
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
surface = sel[0].Shape.Area                                               # Area object complete
App.Console.PrintMessage("surfaceObjet   : "+str(surface)+"\n\n")
##################################################################################

# give the Center Of Mass and coordinates of the object
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
CenterOfMass = sel[0].Shape.CenterOfMass                                  # Center of Mass of the object
App.Console.PrintMessage("CenterOfMass   : "+str(CenterOfMass)+"\n")
App.Console.PrintMessage("CenterOfMassX  : "+str(CenterOfMass[0])+"\n")   # coordinates [0]=X [1]=Y [2]=Z
App.Console.PrintMessage("CenterOfMassY  : "+str(CenterOfMass[1])+"\n")   # or CenterOfMass.x, CenterOfMass.y, CenterOfMass.z
App.Console.PrintMessage("CenterOfMassZ  : "+str(CenterOfMass[2])+"\n\n")
##################################################################################

# list the all faces of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
for j in enumerate(sel[0].Shape.Faces):                                   # List alles faces of the object
    App.Console.PrintMessage("Face           : "+str("Face%d" % (j[0]+1))+"\n")
App.Console.PrintMessage("\n\n")
##################################################################################

# give the volume of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
volume_ = sel[0].Shape.Volume                                             # Volume of the object
App.Console.PrintMessage("volume_        : "+str(volume_)+"\n\n")
##################################################################################
 
# give the BoundBox of the oject selected all type
objs = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
if len(objs) >= 1:                                                         # serch the object type
    if hasattr(objs[0], "Shape"):
        s = objs[0].Shape
    elif hasattr(objs[0], "Mesh"):      # upgrade with wmayer thanks #http://forum.freecadweb.org/viewtopic.php?f=13&t=22331
        s = objs[0].Mesh
    elif hasattr(objs[0], "Points"):
        s = objs[0].Points

boundBox_= s.BoundBox                                                     # BoundBox of the object
App.Console.PrintMessage("boundBox_      : "+str(boundBox_)+"\n")         # 
 
boundBoxLX   = boundBox_.XLength                                          # Length x boundBox rectangle
boundBoxLY   = boundBox_.YLength                                          # Length y boundBox rectangle
boundBoxLZ   = boundBox_.ZLength                                          # Length z boundBox rectangle

boundBoxXMin = boundBox_.XMin                                             # coordonate XMin
boundBoxYMin = boundBox_.YMin                                             # coordonate YMin
boundBoxZMin = boundBox_.ZMin                                             # coordonate ZMin
boundBoxXMax = boundBox_.XMax                                             # coordonate XMax
boundBoxYMax = boundBox_.YMax                                             # coordonate YMax
boundBoxZMax = boundBox_.ZMax                                             # coordonate ZMax

boundBoxDiag= boundBox_.DiagonalLength                                    # Diagonal Length boundBox rectangle
boundBoxCenter = boundBox_.Center                                         # BoundBox Center
boundBoxCenterOfGravity = boundBox_.CenterOfGravity                       # BoundBox CenterOfGravity

App.Console.PrintMessage("boundBoxLX     : "+str(boundBoxLX)+"\n")
App.Console.PrintMessage("boundBoxLY     : "+str(boundBoxLY)+"\n")
App.Console.PrintMessage("boundBoxLZ     : "+str(boundBoxLZ)+"\n\n")

App.Console.PrintMessage("boundBoxXMin   : "+str(boundBoxXMin)+"\n")
App.Console.PrintMessage("boundBoxYMin   : "+str(boundBoxYMin)+"\n")
App.Console.PrintMessage("boundBoxZMin   : "+str(boundBoxZMin)+"\n")
App.Console.PrintMessage("boundBoxXMax   : "+str(boundBoxXMax)+"\n")
App.Console.PrintMessage("boundBoxYMax   : "+str(boundBoxYMax)+"\n")
App.Console.PrintMessage("boundBoxZMax   : "+str(boundBoxZMax)+"\n\n")

App.Console.PrintMessage("boundBoxDiag   : "+str(boundBoxDiag)+"\n")
App.Console.PrintMessage("boundBoxCenter : "+str(boundBoxCenter)+"\n")

App.Console.PrintMessage("boundBox Center of Gravity : "+str(boundBoxCenterOfGravity )+"\n\n")

##################################################################################

# give the complete placement of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
pl = sel[0].Shape.Placement                                               # Placement Vector XYZ and Yaw-Pitch-Roll
App.Console.PrintMessage("Placement      : "+str(pl)+"\n")
##################################################################################

# give the placement Base (xyz) of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
pl = sel[0].Shape.Placement.Base                                          # Placement Vector XYZ
App.Console.PrintMessage("PlacementBase  : "+str(pl)+"\n\n")
##################################################################################
 
# give the placement Base (xyz) of the object selected
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
oripl_X = sel[0].Placement.Base[0]                                        # decode Placement X
oripl_Y = sel[0].Placement.Base[1]                                        # decode Placement Y
oripl_Z = sel[0].Placement.Base[2]                                        # decode Placement Z

# same 
#oripl_X = sel[0].Placement.Base.x                                        # decode Placement X
#oripl_Y = sel[0].Placement.Base.y                                        # decode Placement Y
#oripl_Z = sel[0].Placement.Base.z                                        # decode Placement Z
 
App.Console.PrintMessage("oripl_X        : "+str(oripl_X)+"\n")
App.Console.PrintMessage("oripl_Y        : "+str(oripl_Y)+"\n")
App.Console.PrintMessage("oripl_Z        : "+str(oripl_Z)+"\n\n")
##################################################################################

# give the placement rotation of the object selected (x, y, z, angle rotation)
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
rotation = sel[0].Placement.Rotation                                      # decode Placement Rotation
App.Console.PrintMessage("rotation              : "+str(rotation)+"\n\n")
##################################################################################

# give the placement rotation of the object selected (x, y, z, angle rotation)
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
pl = sel[0].Shape.Placement.Rotation                                      # decode Placement Rotation other method
App.Console.PrintMessage("Placement Rot         : "+str(pl)+"\n\n")
##################################################################################

# give the rotation of the object selected (angle rotation)
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
pl = sel[0].Shape.Placement.Rotation.Angle                                # decode Placement Rotation Angle
App.Console.PrintMessage("Placement Rot Angle   : "+str(pl)+"\n\n")
##################################################################################

# give the rotation.Q of the object selected (angle rotation in Radian) for convert: math.degrees(angleInRadian)
sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
Rot   = sel[0].Placement.Rotation.Q                                       # Placement Rotation Q
App.Console.PrintMessage("Rot           : "+str(Rot)+ "\n")
 
Rot_0 = sel[0].Placement.Rotation.Q[0]                                    # decode Placement Rotation Q
App.Console.PrintMessage("Rot_0         : "+str(Rot_0)+ " rad ,  "+str(180 * Rot_0 / 3.1416)+" deg "+"\n") # or math.degrees(angle)
 
Rot_1 = sel[0].Placement.Rotation.Q[1]                                    # decode Placement Rotation 1
App.Console.PrintMessage("Rot_1         : "+str(Rot_1)+ " rad ,  "+str(180 * Rot_1 / 3.1416)+" deg "+"\n") # or math.degrees(angle)
 
Rot_2 = sel[0].Placement.Rotation.Q[2]                                    # decode Placement Rotation 2
App.Console.PrintMessage("Rot_2         : "+str(Rot_2)+ " rad ,  "+str(180 * Rot_2 / 3.1416)+" deg "+"\n") # or math.degrees(angle)

Rot_3 = sel[0].Placement.Rotation.Q[3]                                    # decode Placement Rotation 3
App.Console.PrintMessage("Rot_3         : "+str(Rot_3)+"\n\n")

Rot_Axis = sel[0].Placement.Rotation.Axis                                 # Placement Rotation .Axis
App.Console.PrintMessage("Rot_Axis      : "+str(Rot_Axis)+ "\n")
 
Rot_Angle = sel[0].Placement.Rotation.Angle                               # Placement Rotation .Angle
App.Console.PrintMessage("Rot_Angle     : "+str(Rot_Angle)+ "\n\n")
##################################################################################

# give the rotation of the object selected toEuler (angle rotation in degrees)
sel = FreeCADGui.Selection.getSelection()                             # select object with getSelection()
angle   = sel[0].Shape.Placement.Rotation.toEuler()                   # angle Euler
App.Console.PrintMessage("Angle          : "+str(angle)+"\n")
Yaw   = sel[0].Shape.Placement.Rotation.toEuler()[0]                  # decode angle Euler Yaw (Z) lacet (alpha)
App.Console.PrintMessage("Yaw            : "+str(Yaw)+"\n")
Pitch = sel[0].Shape.Placement.Rotation.toEuler()[1]                  # decode angle Euler Pitch (Y) tangage (beta)
App.Console.PrintMessage("Pitch          : "+str(Pitch)+"\n")
Roll  = sel[0].Shape.Placement.Rotation.toEuler()[2]                  # decode angle Euler Roll (X) roulis (gamma)
App.Console.PrintMessage("Roll           : "+str(Roll)+"\n\n")

rot = App.Rotation()
rot.setYawPitchRoll(45,45,0)
print("Angle: ", rot.Angle)
print("Axis: ", rot.Axis)
print("RawAxis: ", rot.RawAxis)
print("YawPitchRoll: ", rot.getYawPitchRoll())
print("Rotation: ", rot)
print("Quaternion: ", rot.Q)

##################################################################################

# find Midpoint of the selected line
import Draft, DraftGeomUtils
sel = FreeCADGui.Selection.getSelection()
vecteur = DraftGeomUtils.findMidpoint(sel[0].Shape.Edges[0])              # find Midpoint
App.Console.PrintMessage(vecteur)
Draft.makePoint(vecteur)
##################################################################################

Inizio

Ricerca manuale di un elemento dall'etichetta

# Extract the coordinate X,Y,Z and Angle giving the label (here "Cylindre")
App.Console.PrintMessage("Base.x       : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.x)+"\n")
App.Console.PrintMessage("Base.y       : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.y)+"\n")
App.Console.PrintMessage("Base.z       : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.z)+"\n")
App.Console.PrintMessage("Base.Angle   : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Rotation.Angle)+"\n\n")
##################################################################################

Nota: Solitamente gli angoli sono espressi in radianti. Per convertirli:

  1. da gradi a radianti :
    • angolo in radianti = pi * (angolo in gradi) / 180
    • angolo in radianti = math.radians(angolo in gradi)
  2. da radianti a gradi :
    • angolo in gradi = 180 * (angolo in radianti) / pi
    • angolo in gradi = math.degrees(angolo in radianti)

Inizio

Coordinate cartesiane

Questo codice visualizza le coordinate cartesiane dell'elemento selezionato.

Modificare il valore di "numberOfPoints" se si desidera un diverso numero di punti (modificare la precisione)

numberOfPoints = 100                                                         # Decomposition number (or precision you can change)
selectedEdge = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0].copy() # select one element
points  = selectedEdge.discretize(numberOfPoints)                            # discretize the element
i=0
for p in points:                                                             # list and display the coordinates
    i+=1
    print( i, " X", p.x, " Y", p.y, " Z", p.z)

Altro metodo per visualizzare "Int" e "Float" (interi e valori in virgola mobile)

import Part
from FreeCAD import Base

c=Part.makeCylinder(2,10)        # create the circle
Part.show(c)                     # display the shape

# slice accepts two arguments:
#+ the normal of the cross section plane
#+ the distance from the origin to the cross section plane. Here you have to find a value so that the plane intersects your object
s=c.slice(Base.Vector(0,1,0),0)  # 

# here the result is a single wire
# depending on the source object this can be several wires
s=s[0]

# if you only need the vertexes of the shape you can use
v=[]
for i in s.Vertexes:
    v.append(i.Point)

# but you can also sub-sample the section to have a certain number of points (int) ...
p1=s.discretize(20)
ii=0
for i in p1:
    ii+=1
    print( i )                                             # Vector()
    print( ii, ": X:", i.x, " Y:", i.y, " Z:", i.z )       # Vector decode
Draft.makeWire(p1,closed=False,face=False,support=None)    # to see the difference accuracy (20)

## uncomment to use
#import Draft
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True)  # first transform the DWire in Wire         "downgrade"
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True)  # second split the Wire in single objects   "downgrade"
#
##Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True) # to attach lines contiguous SELECTED use "upgrade"


# ... or define a sampling distance (float)
p2=s.discretize(0.5)
ii=0
for i in p2:
    ii+=1
    print( i )                                             # Vector()
    print( ii, ": X:", i.x, " Y:", i.y, " Z:", i.z )       # Vector decode 
Draft.makeWire(p2,closed=False,face=False,support=None)  # to see the difference accuracy (0.5)

## uncomment to use
#import Draft
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True)  # first transform the DWire in Wire         "downgrade"
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True)  # second split the Wire in single objects   "downgrade"
#
##Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True) # to attach lines contiguous SELECTED use "upgrade"

Inizio

Selezionare tutti gli oggetti nel documento

import FreeCAD
for obj in FreeCAD.ActiveDocument.Objects:
    print( obj.Name )                               # display the object Name
    objName = obj.Name
    obj = App.ActiveDocument.getObject(objName)
    Gui.Selection.addSelection(obj)                 # select the object

Inizio

Selezionare una faccia di un oggetto in base a Nome oggetto e Numero faccia

# select one face of the object
import FreeCAD, Draft
App=FreeCAD
nameObject = "Box"                             # objet
faceSelect = "Face3"                           # face to selection
loch=App.ActiveDocument.getObject(nameObject)  # objet
Gui.Selection.clearSelection()                 # clear all selection
Gui.Selection.addSelection(loch,faceSelect)    # select the face specified
s = Gui.Selection.getSelectionEx()
#Draft.makeFacebinder(s)                       #

Inizio

Ottienere il vettore normale di una faccia di un oggetto con Nome oggetto e Numero faccia (r.Q)

## normal of a face by giving the number of the face and the name of the object (rotation Q with yL, uV) = (App.Vector (x, y, z), angle))
## normal d'une face en donnant le numero de la face et le nom de l'objet (rotation Q avec yL, uV) = (App.Vector(x, y, z),angle))
from FreeCAD import Vector

numero_Face = 2      # number of the face searched (begin 0, 1, 2, 3 .....)
nomObjet    = "Box"  # object name
yL = Gui.ActiveDocument.getObject(nomObjet).Object.Shape.Faces[numero_Face].CenterOfMass
uv = Gui.ActiveDocument.getObject(nomObjet).Object.Shape.Faces[numero_Face].Surface.parameter(yL)

nv = Gui.ActiveDocument.getObject(nomObjet).Object.Shape.Faces[numero_Face].normalAt(uv[0], uv[1])
direction = yL.sub(nv + yL)
print("Direction  : ",direction)

r = App.Rotation(App.Vector(0,0,1),direction)
print("Rotation   : ", r)
print("Rotation Q : ", r.Q)

Inizio

Ottienere il vettore normale di una faccia di un oggetto tramite Nome oggetto e numero di Faccia

numero_Face = 2       # number of the face searched (begin 0, 1, 2, 3 .....)
nomObjet    = "Box"   # object name
normal      = Gui.ActiveDocument.getObject(nomObjet).Object.Shape.Faces[numero_Face].normalAt(0,0)
print("Face"+str(numero_Face), " : ", normal)

Inizio

Ottienere il vettore normale di un oggetto selezionato e il numero di Faccia

## normal of a face by giving the number of the face of the selected object
selectionObjects = FreeCADGui.Selection.getSelection()     
numero_Face = 3    # numero de la face recherchee
normal = selectionObjects[0].Shape.Faces[numero_Face].normalAt(0,0)
print(normal)
# selectionne la face numerotee
Gui.Selection.clearSelection()
Gui.Selection.addSelection(selectionObjects[0],"Face"+str(numero_Face))

Inizio

Ottenere il vettore normale alla superficie

Questo esempio mostra come trovare vettore normale alla superficie trovando prima i parametri u, v di un punto sulla superficie e utilizzando poi i parametri u, v per trovare il vettore normale

def normal(self):
   ss=FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0].copy()#SubObjects[0] is the edge list
   points  = ss.discretize(3.0)#points on the surface edge, 
             #this example just use points on the edge for example. 
             #However point is not necessary on the edge, it can be anywhere on the surface. 
   face=FreeCADGui.Selection.getSelectionEx()[0].SubObjects[1]
   for pp in points:
      pt=FreeCAD.Base.Vector(pp.x,pp.y,pp.z)#a point on the surface edge
      uv=face.Surface.parameter(pt)# find the surface u,v parameter of a point on the surface edge
      u=uv[0]
      v=uv[1]
      normal=face.normalAt(u,v)#use u,v to find normal vector
      print( normal)
      line=Part.makeLine((pp.x,pp.y,pp.z), (normal.x,normal.y,normal.z))
      Part.show(line)

Inizio

Ottenere il vettore normale della faccia e creare una linea nel punto cliccato con il mouse

import PySide2
import Draft, Part, FreeCAD, FreeCADGui
import FreeCADGui as Gui
from FreeCAD import Base

FreeCAD.ActiveDocument.openTransaction("Tyty")    # memorise les actions (avec annuler restore)
selectedFace = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0]
pointClick = FreeCADGui.Selection.getSelectionEx()[0].PickedPoints[0]

########## section direction
plr = FreeCAD.Placement()
yL = pointClick
uv = selectedFace.Surface.parameter(yL)
nv = direction = selectedFace.normalAt(uv[0], uv[1])
r = App.Rotation(App.Vector(0,0,1),nv)
plr.Rotation.Q = r.Q
plr.Base = pointClick
########## section direction

line = Draft.make_wire([App.Vector(0.0,0.0,0.0), App.Vector(0.0,0.0,20.0)] )    # create line
line.Placement=plr
FreeCAD.ActiveDocument.recompute()
print( "Direction (radian) : ",direction )    # direction in radian

Inizio

Ottieni il vettore normale di una superficie da un file STL

def getNormal(cb):
    if cb.getEvent().getState() == coin.SoButtonEvent.UP:
        pp = cb.getPickedPoint()
        if pp:
            vec = pp.getNormal().getValue()
            index = coin.cast(pp.getDetail(), "SoFaceDetail").getFaceIndex()
            print("Normal: {}, Face index: {}".format(str(vec), index))

from pivy import coin
meth=Gui.ActiveDocument.ActiveView.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), getNormal)

hai finito quindi fai questo per uscire:

Gui.ActiveDocument.ActiveView.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), meth)

Inizio

Creare un oggetto della posizione della fotocamera

# create one object of the position to camera with "getCameraOrientation()"
# the object is still facing the screen
import Draft

plan = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()
plan = str(plan)
###### extract data
a    = ""
for i in plan:
    if i in ("0123456789e.- "):
        a+=i
a = a.strip(" ")
a = a.split(" ")
####### extract data

#print( a)
#print( a[0])
#print( a[1])
#print( a[2])
#print( a[3])

xP = float(a[0])
yP = float(a[1])
zP = float(a[2])
qP = float(a[3])

pl = FreeCAD.Placement()
pl.Rotation.Q = (xP,yP,zP,qP)         # rotation of object
pl.Base = FreeCAD.Vector(0.0,0.0,0.0) # here coordinates XYZ of Object
rec = Draft.makeRectangle(length=10.0,height=10.0,placement=pl,face=False,support=None) # create rectangle
#rec = Draft.makeCircle(radius=5,placement=pl,face=False,support=None)                   # create circle
print( rec.Name)

stesso codice semplificato

import Draft
pl = FreeCAD.Placement()
pl.Rotation = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()
pl.Base = FreeCAD.Vector(0.0,0.0,0.0)
rec = Draft.makeRectangle(length=10.0,height=10.0,placement=pl,face=False,support=None)

Inizio

Leggere e scrivere una Expression

import Draft
doc = FreeCAD.ActiveDocument

pl=FreeCAD.Placement()
pl.Rotation.Q=(0.0,-0.0,-0.0,1.0)
pl.Base=FreeCAD.Vector(0.0,0.0,0.0)
obj = Draft.makeCircle(radius=1.0,placement=pl,face=False,support=None)    # create circle

print( obj.PropertiesList )                                                  # properties disponible in the obj

doc.getObject(obj.Name).setExpression('Radius', u'2mm')                    # modify the radius
doc.getObject(obj.Name).setExpression('Placement.Base.x', u'10mm')         # modify the placement 
doc.getObject(obj.Name).setExpression('FirstAngle', u'90')                 # modify the first angle
doc.recompute()

expressions = obj.ExpressionEngine                                         # read the expression list
print( expressions)

for i in expressions:                                                      # list and separate the data expression
    print( i[0]," = ",i[1])

Inizio

Creare uno schizzo su una superficie in PartDesign

Questo frammento può essere utile se si desidera creare uno schizzo su una superficie in PartDesign dall'interno di una macro. Tenere presente che il corpo potrebbe essere None, se non è selezionato alcun corpo attivo e che la Selezione potrebbe essere vuota.

body = Gui.ActiveDocument.ActiveView.getActiveObject('pdbody')
first_selection = Gui.Selection.getSelectionEx()[0]

feature = first_selection.Object
face_name = first_selection.SubElementNames[0]

sketch = App.ActiveDocument.addObject('Sketcher::SketchObject','MySketch')
body.addObject(sketch)
sketch.MapMode = 'FlatFace'
sketch.Support = (feature, face_name)

App.ActiveDocument.recompute()

Inizio

Come simulare un Clic del Mouse su una data coordinata

La posizione è relativa al widget GL. Vedere discussione sul forum.

from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets

mw = Gui.getMainWindow()
gl = mw.findChild(QtWidgets.QOpenGLWidget)
me = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease, QtCore.QPoint(800,300), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)

app = QtWidgets.QApplication.instance()
app.sendEvent(gl, me)

Se si ha un punto 3D e si vuole ottenere il punto 2D sul widget OpenGL, usare questo:

from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets
from FreeCAD import Base

x, y, z, = 10,10,10
v = Gui.ActiveDocument.ActiveView
point3d = Base.Vector(x, y, z)
point2d = v.getPointOnScreen(point3d)
size = v.getSize()
coordX = point2d[0]
coordY = size[1] - point2d[1]

me = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease, QtCore.QPoint(coordX,coordY), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)

Inizio

Come creare una faccia con fori utilizzando l'API Python

Questo frammento dimostra come creare una faccia con fori interni tramite l'API Python. Vedi discussione sul forum.

import FreeCAD, Part

# Create poles that will define the Face
pts = [(-2, 2, 0),
       (0, 2, 1),
       (2, 2, 0),
       (2, -2, 0),
       (0, -2, 1),
       (-2, -2, 0)]

bs = Part.BSplineCurve()
bs.buildFromPoles(pts, True)  # True makes this periodic/closed

# Make the Face from the curve
myFace = Part.makeFilledFace([bs.toShape()])

# Create geometry for holes that will be cut in the surface
hole0 = Part.Geom2d.Circle2d(FreeCAD.Base.Vector2d(0,0), 1.0)
hole1 = Part.Geom2d.Circle2d(FreeCAD.Base.Vector2d(0,1.5), 0.1)

edge0 = hole0.toShape(myFace)
edge1 = hole1.toShape(myFace)
wireb = Part.Wire(bs.toShape())
wire0 = Part.Wire(edge0)
wire1 = Part.Wire(edge1)

# Cut holes in the face
myFace.cutHoles([wire0])
myFace.validate()  # This is required
myFace.cutHoles([wire1])
myFace.validate()

Part.show(myFace)

Inizio

Chiudere e riavviare FreeCAD

import PySide2 
from PySide2 import QtWidgets, QtCore, QtGui

def restart_freecad():
    """Shuts down and restarts FreeCAD"""

    args = QtWidgets.QApplication.arguments()[1:]
    if FreeCADGui.getMainWindow().close():
        QtCore.QProcess.startDetached(
            QtWidgets.QApplication.applicationFilePath(), args
        )

Inizio

Coin3D

Vedere Frammenti Coin3d

Inizio

Correlazioni

Inizio


Introduzione

Questa pagina mostra come si possono facilmente creare delle funzionalità avanzate con Python.

In questo esercizio, andremo a creare un nuovo strumento che disegna una linea partendo da due punti cliccati nella vista 3D.

Questo strumento può essere collegato a un comando di FreeCAD, e tale comando può essere chiamato da un qualsiasi elemento dell'interfaccia, ad esempio da una voce di menu o da un pulsante in una barra degli strumenti.

Lo script principale

Per prima cosa scriviamo uno script che contenga tutta la nostra funzionalità. Dopo, salviamo questo script in un file e lo importiamo in FreeCAD, in modo che tutte le classi e le funzioni che scriviamo diventino disponibili in FreeCAD. Lanciamo perciò il nostro editor di testo preferito, e digitiamo le seguenti righe:

import FreeCADGui, Part
from pivy.coin import *

class line:

    """This class will create a line after the user clicked 2 points on the screen"""

    def __init__(self):
        self.view = FreeCADGui.ActiveDocument.ActiveView
        self.stack = []
        self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.getpoint)

    def getpoint(self, event_cb):
        event = event_cb.getEvent()
        if event.getState() == SoMouseButtonEvent.DOWN:
            pos = event.getPosition()
            point = self.view.getPoint(pos[0], pos[1])
            self.stack.append(point)
            if len(self.stack) == 2:
                l = Part.LineSegment(self.stack[0], self.stack[1])
                shape = l.toShape()
                Part.show(shape)
                self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.callback)

Inizio

Spiegazione dettagliata

import Part, FreeCADGui
from pivy.coin import *

In Python, quando si desidera utilizzare le funzioni di un altro modulo è necessario importarlo. Nel nostro caso, abbiamo bisogno delle funzioni del Ambiente Parte per creare la linea, e del modulo Gui FreeCADGui per accedere alla Vista 3D. Inoltre, abbiamo anche bisogno del contenuto completo della libreria di Coin, in modo da poter utilizzare direttamente tutti gli oggetti Coin, come, ad esempio, SoMouseButtonEvent, ecc ..

class line:

Qui definiamo la nostra classe principale.

Perché utilizzare una classe e non una funzione? Il motivo è che abbiamo bisogno che il nostro strumento rimanga "vivo" mentre aspettiamo che l'utente clicchi sullo schermo.

Una funzione termina quando il suo compito è stato svolto, invece un oggetto (una classe definisce un oggetto) rimane attivo finché non viene distrutto.

"""This class will create a line after the user clicked 2 points on the screen"""

In Python, ogni classe o funzione può avere una stringa di documentazione (docstring). In FreeCAD, questo è particolarmente utile perché quando chiameremo la classe nell'interprete, la stringa di descrizione verrà visualizzata come tooltip (nota di descrizione o aiuto).

def __init__(self):

Le classi di Python possono sempre contenere una funzione __init__, che viene eseguita quando la classe viene chiamata per creare un oggetto. Qui metteremo tutto quello che vogliamo che accada quando il nostro strumento line inizia.

self.view = FreeCADGui.ActiveDocument.ActiveView

In una classe, di solito si aggiunge self. prima di un nome di variabile, in modo che sia facilmente accessibile a tutte le funzioni dentro e fuori la classe. In questo script, usiamo self.view per accedere e manipolare la vista 3D attiva.

self.stack = []

Qui creiamo una lista vuota per archiviare i punti 3D inviati dalla funzione getpoint().

self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.getpoint)

Questa è la parte importante.

Dato che in realtà si tratta una scena Coin3d, FreeCAD utilizza il meccanismo di callback (richiamo) di Coin, il quale permette di chiamare una funzione ogni volta che nella scena accade un determinato evento.

Nel nostro caso, stiamo creando un callback per gli eventi SoMouseButtonEvent e li colleghiamo alla funzione getpoint. Adesso, ogni volta che un pulsante del mouse viene premuto o rilasciato, viene eseguita la funzione getpoint.

Notare che alla addEventCallbackPivy() esiste anche un'alternativa, chiamata addEventCallback() la quale dispensa dall'uso di pivy. Ma, dal momento che pivy è un modo molto efficace e naturale per accedere a ogni parte di una scena di Coin, è meglio utilizzarlo il più possibile!

Inizio

def getpoint(self, event_cb):

Ora definiamo la funzione getpoint, che sarà eseguita quando un pulsante del mouse verrà premuto in una vista 3D. Questa funzione riceverà un argomento, che chiamiamo event_cb.

Da questo evento callback possiamo accedere all'oggetto event, che contiene diverse parti di informazioni

Per maggiori informazioni sugli eventi controllabili consultate questa pagina.

if event.getState() == SoMouseButtonEvent.DOWN:

La funzione getpoint viene chiamata ogni volta che un pulsante del mouse viene premuto o rilasciato. Invece, noi vogliamo definire un punto 3D solo quando viene premuto (altrimenti otteniamo due punti 3D molto vicini l'uno all'altro). Pertanto quì dobbiamo verificare e stabilire questo.

pos = event.getPosition()

Qui otteniamo le coordinate dello schermo nella posizione del cursore del mouse

point = self.view.getPoint(pos[0], pos[1])

Questa funzione ci fornisce un vettore di FreeCAD (x, y, z) contenente il punto 3D che giace sul piano focale, esattamente sotto il cursore del mouse. Se siamo in vista camera, immaginiamo un raggio proveniente dalla fotocamera, passante per il cursore del mouse, che colpisce il piano focale. Questo è il nostro punto 3D. Se siamo in vista ortogonale, il raggio è parallelo alla direzione di visualizzazione.

self.stack.append(point)

Aggiungiamo il nostro nuovo punto nella pila (stack)

if len(self.stack) == 2:

Abbiamo già abbastanza punti? Se sì, allora disegnamo la linea!

l = Part.LineSegment(self.stack[0], self.stack[1])

Qui usiamo la funzione Line() del Modulo Parte che crea una linea da due vettori di FreeCAD.

Tutto quanto che si crea e si modifica all'interno del modulo Parte, rimane nel modulo Parte. Quindi, fino ad ora, abbiamo creato una linea Parte. Essa non è legata ad alcun oggetto del nostro documento attivo, perciò sullo schermo non viene ancora visualizzato nulla.

shape = l.toShape()

Il documento di FreeCAD può accettare solo shape (forme) dal modulo Parte. Le shape sono il tipo più generico di forme del modulo Part. Dobbiamo quindi convertire la nostra linea in una shape prima di poterla aggiunge al documento.

Part.show(shape)

Il modulo Parte ha una funzione molto utile, show(), che crea un nuovo oggetto nel documento e collega ad esso una shape (forma).

Possiamo anche creare prima un nuovo oggetto nel documento, poi associare manualmente ad esso la shape.

self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.callback)

Siccome con la nostra linea abbiamo finito, terminiamo il meccanismo di callback, che consuma preziosi cicli di CPU.

Inizio

Test e Utilizzo dello script

Ora, salviamo il nostro script in qualche posizione in cui l'interprete Python di FreeCAD possa trovarlo.

Durante l'importazione dei moduli, l'interprete punta nei seguenti luoghi: i percorsi di installazione di Python, la directory bin di FreeCAD, e tutte le directory dei moduli FreeCAD. Quindi, la soluzione migliore è quella di creare una nuova directory in una delle FreeCAD Mod directories, e salvare in essa il nostro script. Per esempio, creiamo una directory "MyScripts", e salviamo il nostro script come "exercise.py".

Now let's save our script in a folder where the FreeCAD Python interpreter can find it. When importing modules, the interpreter will look in the following places: the Python installation paths, the FreeCAD bin folder, and all FreeCAD Mod (module) folders. So the best solution is to create a new folder in one of the Mod folders. Let's create a MyScripts folder there and save our script in it as exercise.py.

Adesso che tutto è pronto, basta avviare FreeCAD, creare un nuovo documento, e, nell'interprete Python, eseguire:

import exercise

Se non viene visualizzato nessun messaggio di errore, significa che il nostro script "exercise" è stato caricato.

Ora possiamo controllare il suo contenuto con:

dir(exercise)

Il comando dir() è un comando integrato di Python che elenca il contenuto di un modulo. Possiamo vedere che la nostra classe line() è lì, in attesa.

Non rimane che provarla scrivendo:

'line' in dir(exercise)

Now let's test it:

exercise.line()

Poi, clicchiamo due volte nella vista 3D, e bingo, ecco la nostra linea! Per farne una nuova, basta riscrivere ancora exercise.line(), e ancora, e ancora ... Siete contenti, no?

Inizio

Includere lo script nell'interfaccia di FreeCAD

Per essere davvero efficace il nostro nuovo strumento linea (line) dovrebbe avere un suo pulsante sull'interfaccia, in modo da non dover digitare ogni volta tutte queste cose.

Il modo più semplice è quello di trasformare la nostra nuova directory MyScripts in un ambiente di lavoro completo di FreeCAD.

È facile. Basta solo inserire un file chiamato InitGui.py nella directory MyScripts. Il file InitGui.py conterrà le istruzioni per creare un nuovo ambiente di lavoro (workbench), poi aggiungere ad esso il nostro nuovo strumento.

Oltre a questo dobbiamo anche modificare un po' il nostro codice di exercise, in modo che lo strumento line() sia riconosciuto come un comando ufficiale di FreeCAD.

Cominciamo creando un file InitGui.py, e scriviamo in esso il seguente codice:

For our new line tool to be really useful, and to avoid having to type all that stuff, it should have a button in the interface. One way to do this is to transform our new MyScripts folder into a full FreeCAD workbench. This is easy, all that is needed is to put a file called InitGui.py inside the MyScripts folder. InitGui.py will contain the instructions to create a new workbench, and add our new tool to it. Besides that we will also need to change our exercise code a bit, so the line() tool is recognized as an official FreeCAD command. Let's start by creating an InitGui.py file, and writing the following code in it:

class MyWorkbench (Workbench):

    MenuText = "MyScripts"

    def Initialize(self):
        import exercise
        commandslist = ["line"]
        self.appendToolbar("My Scripts", commandslist)

Gui.addWorkbench(MyWorkbench())

A questo punto, penso che dovreste già capire da soli lo script precedente.

Creiamo una nuova classe che chiamiamo MyWorkbench, le diamo un titolo (MenuText), e definiamo una funzione Initialize() che verrà eseguita quando l'ambiente di lavoro verrà caricato in FreeCAD. In tale funzione, si carica il contenuto del nostro file exercise, e si aggiungono i comandi di FreeCAD contenuti in una lista di comandi.

Dopo, costruiamo una barra degli strumenti denominata "My Scripts" a cui assegniamo la nostra lista comandi. Al momento, ovviamente, disponiamo di un solo strumento, quindi la nostra lista dei comandi contiene un solo elemento.

Quando il nostro ambiente di lavoro è pronto, lo aggiungiamo all'interfaccia principale.

Questo non basta ancora perché un comando di FreeCAD deve essere formattato in un certo modo per poter funzionare. Quindi è necessario modificare un po' il nostro strumento line().

Ora il nostro nuovo script exercise.py deve essere come questo:

import FreeCADGui, Part
from pivy.coin import *

class line:

    """This class will create a line after the user clicked 2 points on the screen"""

    def Activated(self):
        self.view = FreeCADGui.ActiveDocument.ActiveView
        self.stack = []
        self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.getpoint)

    def getpoint(self, event_cb):
        event = event_cb.getEvent()
        if event.getState() == SoMouseButtonEvent.DOWN:
            pos = event.getPosition()
            point = self.view.getPoint(pos[0], pos[1])
            self.stack.append(point)
            if len(self.stack) == 2:
                l = Part.LineSegment(self.stack[0], self.stack[1])
                shape = l.toShape()
                Part.show(shape)
                self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(), self.callback)

    def GetResources(self):
        return {'Pixmap': 'path_to_an_icon/line_icon.png', 'MenuText': 'Line', 'ToolTip': 'Creates a line by clicking 2 points on the screen'}

FreeCADGui.addCommand('line', line())

Quì abbiamo trasformato la nostra funzione __init__() in una funzione Activated(), perchè, quando i comandi di FreeCAD vengono eseguiti, essi eseguono automaticamente la funzione Activated().

Inoltre, abbiamo aggiunto una funzione GetResources(), che fornisce a FreeCAD le informazioni per trovare l'icona dello strumento, il nome e la descrizione (tooltip) del nostro strumento.

Qualunque immagine jpg, png o svg può fungere da icona, essa può essere di qualsiasi dimensione, ma è meglio usare una dimensione vicina all'aspetto finale, come, ad esempio, 16x16, 24x24 o 32x32.

Poi, abbiamo aggiunto la classe line() come un comando ufficiale di FreeCAD con il metodo AddCommand().

Questo è tutto, ora basta riavviare FreeCAD e avremo un bell'ambiente di lavoro con il nostro nuovo strumento line()!

Inizio

Cosa si può aggiungere?

Se questo esercizio vi è piaciuto, perché non cercare di migliorare questo piccolo strumento? Si possono fare molte cose, come ad esempio:

  • Aggiungere assistenza per gli utenti: fino ad ora abbiamo fatto uno strumento molto spoglio, l'utente potrebbe essere un po' disorientato quando lo utilizza. Perciò si potrebbe aggiungere qualche informazione, che suggerisca come procedere. Ad esempio, si potrebbero mostrare dei messaggi nella console di FreeCAD. In merito, visita il modulo FreeCAD.Console
  • Aggiungere la possibilità di digitare manualmente le coordinate dei punti 3D. Guarda la funzione input() di Python, per esempio
  • Aggiungere la possibilità di definire più di 2 punti
  • Aggiungere controlli per altri eventi. Al momento verifichiamo solo gli eventi del pulsante del mouse, ma se ​​vogliamo anche fare qualcosa quando il mouse viene spostato oppure visualizzare le coordinate attuali?
  • Assegnare un nome all'oggetto creato

Non esitate a scrivere le vostre domande o idee nel forum!

Don't hesitate to ask questions or share ideas on the forum!

Inizio


Introduzione

In questa pagina mostreremo come creare una semplice interfaccia grafica con Qt Designer, lo strumento ufficiale di Qt per la progettazione di interfacce; la finestra di dialogo verrà convertita in codice Python, quindi verrà utilizzata all'interno di FreeCAD. Si assume che l'utente sappia come scrivere ed eseguire Python in generale.

In questo esempio, l'intera interfaccia è definita in Python. Anche se questo è possibile per interfacce piccole, per interfacce più grandi la raccomandazione è di caricare i file .ui creati direttamente nel programma.

Due metodi generali per creare delle interfacce, includendo l'interfaccia nel file Python o usando i file .ui.

Progettare la finestra

Nelle applicazioni CAD, il disegno di una buona UI (interfaccia utente) è molto importante. L'utente esegue quasi tutte le operazioni tramite qualche componente dell'interfaccia: legge le finestre di dialogo, preme i pulsanti, sceglie tra le icone, ecc. Quindi è molto importante pensare attentamente a ciò che si intende fare, a come si desidera che l'utente si comporti, e a quale sarà il flusso di lavoro delle proprie azioni.

Quando si progetta l'interfaccia, è bene tenere presenti alcune cose:

  • Finestre di dialogo modali e non-modali: una finestra di dialogo modale appare sullo schermo in primo piano, blocca l'azione della finestra principale e costringe l'utente a rispondere alla finestra di dialogo, mentre un dialogo non-modale permette di continuare a lavorare sulla finestra principale. In alcuni casi è meglio usare la prima soluzione, in altri casi no.
  • Identificare ciò che è necessario e ciò che è facoltativo. Accertarsi che l'utente sappia esattamente quello che deve fare. Etichettare tutto con una descrizione adeguata, realizzare dei suggerimenti per l'uso degli strumenti, ecc.
  • Separare i comandi dei parametri. Questo solitamente si ottiene con pulsanti e campi per inserire i testi. L'utente sa che cliccando su un pulsante si produce una azione, e che, invece, sostituendo un valore all'interno di un campo di testo si modifica un parametro da qualche parte. In genere, oggi gli utenti sanno bene che cosa è un pulsante, che cosa è un campo di input, ecc. Il toolkit Qt, che stiamo per usare, è il più avanzato strumento di costruzione di interfacce. Non dovrete preoccuparvi molto di fare le cose chiare, dal momento che sarà già esso stesso molto chiaro.

Ora che abbiamo definito con precisione quello che faremo, è il momento di aprire Qt Designer.

Disegneremo una finestra di dialogo molto semplice, simile a questa:

Dopo utilizzeremo questa finestra di dialogo all'interno di FreeCAD per produrre un bel piano rettangolare. Forse pensate che produrre dei bei piani rettangolari non è particolarmente utile, però, in un secondo tempo, sarà facile apportarvi delle modifiche e creare delle cose più complesse.

Quando viene aperto, Qt Designer ha questo aspetto:

Qt Designer è molto semplice da usare. Sulla barra di sinistra ci sono gli elementi, che possono essere trascinati sul tuo widget. Sul lato destro ci sono i pannelli delle proprietà, che mostrano tutti i tipi di proprietà modificabili degli elementi selezionati. Quindi, si inizia con la creazione di un nuovo widget.

  1. Selezionare "Dialogo senza pulsanti", poiché non vogliamo i pulsanti OK/Annulla predefiniti.
  2. Avremo bisogno di Etichette. Le etichette sono semplici stringhe di testo che appaiono sul tuo widget per informare l'utente finale. Quando si seleziona un'etichetta, si nota che sul lato destro appariranno diverse proprietà, che puoi modificare, come: stile del carattere, altezza, ecc... Quindi trasciniamo 3 etichette separate sul nostro widget:
    • Un'etichetta per il titolo
    • Un'altra etichetta per scrivere "Altezza"
    • E un'altra etichetta per scrivere "Larghezza"
  3. Ora abbiamo bisogno di LineEdit (2 di loro in realtà). Trascinane due sul widget. LineEdits sono campi di testo, che l'utente finale può compilare. Quindi abbiamo bisogno di un LineEdit per Height e uno per Width. Anche qui possiamo modificare le proprietà. Ad esempio, perché non impostare un valore predefinito? Diciamo ad esempio: 1,00 per ciascuno. In questo modo, quando l'utente vedrà la finestra di dialogo, entrambi i valori saranno già compilati. Se l'utente finale è soddisfatto, può premere direttamente il pulsante, risparmiando tempo prezioso.
  4. Poi aggiungiamo un PushButton. Questo è il pulsante che l'utente finale dovrà premere dopo aver compilato entrambi i campi.

Notare che qui si sono scelti dei comandi molto semplici, ma Qt dispone di molte altre opzioni, ad esempio, è possibile utilizzare Spinboxes invece di LineEdits, ecc .. Date un'occhiata a ciò che è disponibile, esplorate, vi verranno sicuramente altre idee.

Questo è tutto quello che si deve fare in Qt Designer. Un'ultima cosa, però, rinominare tutti i propri elementi con nomi più adeguati, così negli script sarà più facile identificarli:

Convertire il dialogo in Python

Ora, salviamo il nostro widget da qualche parte. Esso verrà salvato come un file .ui, che potremo facilmente convertire in script di Python tramite pyuic. Su Windows, il programma pyuic è incluso con PyQt (da verificare), su Linux probabilmente è necessario installarlo separatamente tramite il proprio gestore di pacchetti (su sistemi debian-based è parte del pacchetto di strumenti PyQt4-dev-tools). Per fare la conversione, è necessario aprire una finestra di terminale (o una finestra del prompt dei comandi in Windows), portarsi nella cartella in cui si è salvato il file .ui, e digitare:

pyuic mywidget.ui > mywidget.py

In Windows pyuic.py si trova in "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" Per creare il file batch "compQt4.bat:

@"C:\Python27\python" "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" -x %1.ui > %1.py

Nella console Dos digitare senza estensione

compQt4 myUiFile

In macOS, puoi recuperare la versione appropriata (la stessa utilizzata internamente in FreeCAD 0.19) di QT e Pyside con questi comandi (pip richiesto)

python3 -m pip install pyqt5
python3 -m pip install pySide2

Questo installerà uic nella cartella "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/PySide2/uic" e Designer in "/Library/Frameworks/Python.framework/Versions /3.7/lib/python3.7/site-packages/PySide2/Designer.app". Per comodità puoi creare un link di uic in /usr/local/bin per poterlo richiamare semplicemente con uic -g python... invece di digitare tutto il percorso del programma, e un link a Designer per recuperarlo in la cartella Applicazioni del mac con

sudo ln -s /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/PySide2/uic /usr/local/bin
ln -s /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/PySide2/Designer.app /Applications

In Linux : da fare

Dato che, dopo la versione 0.13, FreeCAD si è progressivamente allontanato da PyQt a favore di PySide (Choice your PySide install building PySide), per costruire il file basato su PySide ora è necessario utilizzare:

pyside-uic mywidget.ui -o mywidget.py

In Windows uic.py si trova in "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" Per creare il file batch "compSide.bat":

@"C:\Python27\python" "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" %1.ui > %1.py

Nella console Dos digitare senza estensione

compSide myUiFile

In Linux : da fare

Su alcuni sistemi il programma si chiama pyuic4 invece di pyuic. Questa operazione converte semplicemente il file .ui in uno script Python. Se apriamo il file mywidget.py, è molto facile capire il suo contenuto:

from PySide import QtCore, QtGui

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(187, 178)
        self.title = QtGui.QLabel(Dialog)
        self.title.setGeometry(QtCore.QRect(10, 10, 271, 16))
        self.title.setObjectName("title")
        self.label_width = QtGui.QLabel(Dialog)
        ...

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

   def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
        self.title.setText(QtGui.QApplication.translate("Dialog", "Plane-O-Matic", None, QtGui.QApplication.UnicodeUTF8))
        ...

Come potete vedere ha una struttura molto semplice: viene creata una classe denominata Ui_Dialog, che memorizza gli elementi dell'interfaccia del nostro widget. Questa classe ha due metodi, uno per la creazione del widget, e uno per la traduzione del suo contenuto, questo fa parte del meccanismo generale di Qt per tradurre gli elementi dell'interfaccia. Il metodo di installazione crea semplicemente, uno per uno, i widget come li abbiamo definiti in Qt Designer, e imposta le loro opzioni come abbiamo deciso in precedenza. Poi, viene tradotta l'intera interfaccia e, infine, vengono collegati gli slot (di cui parleremo più avanti).

Ora possiamo creare un nuovo widget, e utilizzare questa classe per creare la sua interfaccia. A questo punto, possiamo già vedere in azione il nostro widget e, per provarlo, mettiamo il nostro file mywidget.py in un luogo dove FreeCAD possa trovarlo (nella directory bin di FreeCAD, o in una qualsiasi delle sottodirectory Mod), e, nell'interprete Python di FreeCAD, digitiamo:

from PySide import QtGui
import mywidget
d = QtGui.QWidget()
d.ui = mywidget.Ui_Dialog()
d.ui.setupUi(d)
d.show()

Ecco apparire la nostra finestra di dialogo! Notare che il nostro interprete Python sta ancora funzionando in quanto stiamo usando un dialogo non-modale. Per chiudere la finestra, (ovviamente, oltre a cliccare sulla sua icona di chiusura) possiamo digitare:

d.hide()

Ora che siamo in grado di mostrare e nascondere la nostra finestra di dialogo, basta solo aggiungere una ultima parte: per fargli fare qualcosa!

Provando per un po' Qt Designer, scoprirete presto un'intera sezione chiamata "signals and slots" (segnali e porte di ingresso dei segnali).

In pratica, funziona così: i componenti dei widget (nella terminologia Qt, questi elementi sono a loro volta dei widget) sono in grado di inviare dei segnali. Tali segnali differiscono a seconda del tipo widget. Ad esempio, un pulsante può inviare un segnale quando viene premuto e quando viene rilasciato. Questi segnali possono essere collegati agli slot. Gli slot possono essere una funzionalità speciale di altri widget (ad esempio una finestra di dialogo ha uno slot "close" al quale è possibile collegare il segnale di un pulsante di chiusura), o possono essere funzioni personalizzate.

La Documentazione di riferimento di PyQt elenca tutti i widget Qt, che cosa possono fare, quali segnali possono inviare, ecc..

Qui, come esempio, creiamo una nuova funzione che genera un piano basato su altezza e larghezza, e colleghiamo tale funzione al segnale "pressed" (premuto) emesso dal pulsante "Create!".

Allora, cominciamo con l'importazione dei nostri moduli FreeCAD, inserendo la seguente riga all'inizio dello script, dove importiamo già QtCore e QtGui:

import FreeCAD, Part

Dopo, aggiungiamo una nuova funzione alla nostra classe Ui_Dialog:

def createPlane(self):
    try:
        # first we check if valid numbers have been entered
        w = float(self.width.text())
        h = float(self.height.text())
    except ValueError:
        print("Error! Width and Height values must be valid numbers!")
    else:
        # create a face from 4 points
        p1 = FreeCAD.Vector(0,0,0)
        p2 = FreeCAD.Vector(w,0,0)
        p3 = FreeCAD.Vector(w,h,0)
        p4 = FreeCAD.Vector(0,h,0)
        pointslist = [p1,p2,p3,p4,p1]
        mywire = Part.makePolygon(pointslist)
        myface = Part.Face(mywire)
        Part.show(myface)
        self.hide()

Poi, bisogna dire a Qt di collegare il pulsante alla funzione, inserendo la seguente riga appena prima di QtCore.QMetaObject.connectSlotsByName (Dialog):

QtCore.QObject.connect(self.create,QtCore.SIGNAL("pressed()"),self.createPlane)

Questo, come vedete, collega il segnale "pressed()" del nostro oggetto create (il pulsante "Create!"), allo slot chiamato createPlane, che abbiamo appena definito. Questo è tutto!

Ora, come tocco finale, possiamo aggiungere una piccola funzione per creare il dialogo, così sarà più facile chiamarlo.

Fuori dalla classe Ui_Dialog, aggiungiamo questo codice:

class plane():
   def __init__(self):
       self.d = QtGui.QWidget()
       self.ui = Ui_Dialog()
       self.ui.setupUi(self.d)
       self.d.show()

(Promemoria di Python: ogni volta che viene creato un nuovo oggetto il metodo __init__ di una classe viene eseguito automaticamente!)

Poi, da FreeCAD, basta solo fare:

import mywidget
myDialog = mywidget.plane()

Questo è tutto amici ... Ora è possibile provare diverse cose, come ad esempio inserire il widget nell'interfaccia di FreeCAD (vedere la pagina Modelli di codici), oppure creare strumenti personalizzati molto più avanzati, utilizzando altri elementi nel proprio widget.

Lo script completo

Questo è lo script completo di riferimento:

# Form implementation generated from reading ui file 'mywidget.ui'
#
# Created: Mon Jun  1 19:09:10 2009
#      by: PyQt4 UI code generator 4.4.4
# Modified for PySide 16:02:2015 
# WARNING! All changes made in this file will be lost!

from PySide import QtCore, QtGui
import FreeCAD, Part 

class Ui_Dialog(object):
   def setupUi(self, Dialog):
       Dialog.setObjectName("Dialog")
       Dialog.resize(187, 178)
       self.title = QtGui.QLabel(Dialog)
       self.title.setGeometry(QtCore.QRect(10, 10, 271, 16))
       self.title.setObjectName("title")
       self.label_width = QtGui.QLabel(Dialog)
       self.label_width.setGeometry(QtCore.QRect(10, 50, 57, 16))
       self.label_width.setObjectName("label_width")
       self.label_height = QtGui.QLabel(Dialog)
       self.label_height.setGeometry(QtCore.QRect(10, 90, 57, 16))
       self.label_height.setObjectName("label_height")
       self.width = QtGui.QLineEdit(Dialog)
       self.width.setGeometry(QtCore.QRect(60, 40, 111, 26))
       self.width.setObjectName("width")
       self.height = QtGui.QLineEdit(Dialog)
       self.height.setGeometry(QtCore.QRect(60, 80, 111, 26))
       self.height.setObjectName("height")
       self.create = QtGui.QPushButton(Dialog)
       self.create.setGeometry(QtCore.QRect(50, 140, 83, 26))
       self.create.setObjectName("create")

       self.retranslateUi(Dialog)
       QtCore.QObject.connect(self.create,QtCore.SIGNAL("pressed()"),self.createPlane)
       QtCore.QMetaObject.connectSlotsByName(Dialog)

   def retranslateUi(self, Dialog):
       Dialog.setWindowTitle("Dialog")
       self.title.setText("Plane-O-Matic")
       self.label_width.setText("Width")
       self.label_height.setText("Height")
       self.create.setText("Create!")
       print("tyty")
   def createPlane(self):
       try:
           # first we check if valid numbers have been entered
           w = float(self.width.text())
           h = float(self.height.text())
       except ValueError:
           print("Error! Width and Height values must be valid numbers!")
       else:
           # create a face from 4 points
           p1 = FreeCAD.Vector(0,0,0)
           p2 = FreeCAD.Vector(w,0,0)
           p3 = FreeCAD.Vector(w,h,0)
           p4 = FreeCAD.Vector(0,h,0)
           pointslist = [p1,p2,p3,p4,p1]
           mywire = Part.makePolygon(pointslist)
           myface = Part.Face(mywire)
           Part.show(myface)

class plane():
  def __init__(self):
      self.d = QtGui.QWidget()
      self.ui = Ui_Dialog()
      self.ui.setupUi(self.d)
      self.d.show()

Altri esempi

Link utili


Sviluppare applicazioni per FreeCAD


Licenze utilizzate in FreeCAD

FreeCAD utilizza due licenze diverse, una per l'applicazione stessa e una per la documentazione:

GNU Lesser General Public License, versione 2 or superiore (LGPL2+) Per tutto il codice sorgente di FreeCAD trovato nell'archivio official Git repository. Il + significa che, a scelta, si può anche utilizzare FreeCAD secondo i termini di una versione successiva della licenza, come LGPL3

Creative Commons Attribution 3.0 License (CC-BY-3.0) Per la documentazione e il sito web .

Vedere la pagina debian copyright file di FreeCAD per maggiori dettagli sulle licenze utilizzate dai diversi componenti open-source utilizzati in FreeCAD

Impatto delle licenze

Di seguito è riportata una spiegazione più semplificata di cosa significa per te la licenza LGPL:

Tutti gli utenti

Chiunque può scaricare, utilizzare e ridistribuire FreeCAD gratuitamente, senza alcuna restrizione. La propria copia di FreeCAD è veramente propria, così come i file che si producono con FreeCAD. Non si verrà obbligati ad aggiornare FreeCAD dopo un certo tempo, né a modificare l'utilizzo di FreeCAD. L'uso di FreeCAD non vincola ad alcun tipo di contratto o obbligo. Il codice sorgente di FreeCAD è pubblico e può essere ispezionato, quindi è possibile verificare che non faccia cose ad insaputa come ad esempio inviare i dati personali da qualche parte.

Utenti professionali

FreeCAD può essere utilizzato liberamente per qualsiasi tipo di scopo, privato, commerciale o istituzionale. Qualsiasi versione di FreeCAD può essere distribuita e installata ovunque, qualsiasi numero di volte. Si può anche modificare e adattare FreeCAD per i propri scopi senza alcuna restrizione. Tuttavia, non è possibile rendere gli sviluppatori di FreeCAD responsabili per eventuali danni o perdite aziendali che potrebbero verificarsi dall'utilizzo di FreeCAD.

Sviluppatori di software Open-source

È possibile utilizzare FreeCAD come base per sviluppare la propria applicazione o semplicemente estenderla creando nuovi moduli per essa. Se FreeCAD è incorporato nella propria applicazione, si può scegliere la licenza GPL o LGPL, o qualsiasi altra licenza compatibile con LGPL, per consentire o meno l'uso del proprio lavoro in software proprietario. Se si sta sviluppando un modulo da utilizzare come estensione e non si include alcun codice di FreeCAD in esso, si può scegliere qualsiasi licenza si desideri. Tuttavia, se un giorno si desiderasse vedere il proprio modulo integrato in FreeCAD, è una buona idea utilizzare la stessa licenza LGPL di FreeCAD stesso, poiché FreeCAD accetterà solo codice con licenze LGPL, MIT o BSD.

Sviluppatori di software Closed-source

La licenza LGPL consente di utilizzare FreeCAD come componente per la propria applicazione e non si è obbligati a rendere l'applicazione open source. Si riceverà supporto dagli sviluppatori di FreeCAD purché non si tratti di una "strada a senso unico". La licenza prevede tuttavia due condizioni importanti:

1) Si deve informare chiaramente gli utenti che l'applicazione utilizza FreeCAD e che FreeCAD è LGPL.

2) La licenza LGPL prevede inoltre che gli utenti debbano essere in grado di scambiare il componente di FreeCAD modificato con l'equivalente originale di FreeCAD. Ciò andrebbe ottenuto collegandosi dinamicamente ai componenti di FreeCAD, in modo che gli utenti possano modificarlo. Tuttavia, questo è spesso difficile da ottenere con le esigenze odierne. In FreeCAD, comprendiamo che il punto importante non è limitare la libertà data agli utenti di FreeCAD dalla licenza LGPL. Quindi un equivalente del collegamento dinamico è offrire la scelta ai propri utenti, rendendo i propri utenti consapevoli della possibilità di utilizzare FreeCAD gratuitamente. Questo può essere fatto in diversi modi.

Se una qualsiasi delle due condizioni di cui sopra è inaccettabile per se o non può essere implementata, allora si deve rendere LGPL anche il proprio componente di FreeCAD e rilasciare il codice sorgente con tutte le modifiche apportate ad esso.

Esiste un caso speciale chiamato derivatives, ovvero quando si pubblica fondamentalmente una versione "rinominata" di FreeCAD. I derivati ​​che non sono open source sono vietati dalla licenza LGPL. La comunità di FreeCAD è attiva ed efficiente nel trovare versioni rinominate, segnalandole alle piattaforme in cui sono state trovate ed esponendole finché non vengono rimosse.

Files

I modelli e gli altri file prodotti con FreeCAD non sono soggetti ad alcuna licenza di cui sopra, né vincolati ad alcun tipo di restrizione o proprietà. I propri file sono veramente propri. È possibile impostare il proprietario del file e specificare i propri termini di licenza per i file prodotti all'interno di FreeCAD, tramite il menu File → Informazioni sul progetto.

Il logo di FreeCAD è un marchio di proprietà della FPA (associazione del progetto FreeCAD). Ciò significa che la FPA è l'unico organismo autorizzato a dire chi ha il diritto di utilizzare o meno il logo di FreeCAD. I file del logo, che fanno parte del codice sorgente di FreeCAD o sono disponibili altrove, ad esempio su questo wiki, sono tuttora sotto le stesse licenze del resto di FreeCAD (LGPL per il codice sorgente e Creative Commons per questo wiki). Si è comunque liberi di utilizzare il logo di FreeCAD ovunque, alle stesse condizioni del resto di FreeCAD, il che significa, fondamentalmente, che si deve usarlo per fare riferimento a FreeCAD e non usarlo, ad esempio, per il proprio prodotto, o in qualsiasi altro modo che non faccia riferimento a FreeCAD.

Dichiarazione dello sviluppatore principale

So che la discussione sulla licenza "giusta" per l'open source occupava una parte significativa della larghezza di banda di Internet e quindi ecco il motivo per cui, a mio avviso, FreeCAD dovrebbe avere questa.

Ho scelto la LGPL per il progetto e conosco i pro e i contro della LGPL e ti darò alcune ragioni per questa decisione.

FreeCAD è un misto tra una libreria e un'applicazione, quindi la GPL sarebbe un po' forte per questo. Impedirebbe la scrittura di moduli commerciali per FreeCAD perché impedirebbe il collegamento con le librerie di base di FreeCAD. Potresti chiedere perché i moduli commerciali? Pertanto Linux è un buon esempio. Linux avrebbe così tanto successo se la libreria GNU C fosse GPL e quindi impedisse il collegamento con applicazioni non GPL? E anche se amo la libertà di Linux, voglio anche essere in grado di utilizzare l'ottimo driver grafico 3D NVIDIA. Comprendo e accetto il motivo per cui NVIDIA non desidera divulgare il codice del driver. Lavoriamo tutti per le aziende e abbiamo bisogno di essere pagati o almeno di cibo. Quindi per me, una coesistenza di software open source e closed source non è una brutta cosa, quando obbedisce alle regole della LGPL. Mi piacerebbe vedere qualcuno scrivere un processore di importazione/esportazione Catia per FreeCAD e distribuirlo gratuitamente o per qualche soldo. Non mi piace costringerlo a dare via più di quello che vuole. Non andrebbe bene né per lui né per FreeCAD.

Tuttavia questa decisione viene presa solo per il sistema principale di FreeCAD. Ogni autore di un modulo applicativo può prendere la propria decisione.

Jürgen Riegel

—15 Ottobre 2006



Nel febbraio 2022 il monitoraggio dei bug di FreeCAD è stato migrato a GitHub Issues. Il bug tracker Mantis descritto di seguito è ora in modalità di sola lettura.
link=https://freecadweb.org/tracker/MantisBT è il framework bugtracker utilizzato da FreeCAD
link=https://freecadweb.org/tracker/MantisBT è il framework bugtracker utilizzato da FreeCAD

Il FreeCAD BugTracker è il posto dove segnalare i bug, presentare le richieste di funzionalità, patch, o richiedere di fondere un proprio ramo, se avete sviluppato qualcosa usando Git. Il tracker è suddiviso in moduli, quindi cercate di essere specifici e di presentare la richiesta nella sottosezione appropriata. In caso di dubbio, lasciare il messaggio nella sezione "FreeCAD".


Flusso di lavoro raccomandato

Come mostrato nel diagramma di flusso sopra, prima di creare i ticket, cercare sempre prima nei forum e nel bugtracker per scoprire se il problema è già noto. Ciò consente di far risparmiare un sacco di tempo e di lavoro agli sviluppatori ed ai volontari che possono perciò dedicare più tempo per rendere FreeCAD ancora più fantastico.

Segnalare i bug

Quando si pensa di aver trovato un bug, si è invitati a segnalarlo lì, se si è prima discusso la questione nelle sedi opportune.

Prima di segnalare un bug, si prega di verificare i seguenti punti:

  • Assicurarsi di utilizzare la versione più aggiornata di FreeCAD. NOTAː il tuo bug potrebbe essere corretto nella versione di sviluppo (instabile). L'utente medio esegue la versione stabile di FC.
  • Assicurarsi che il proprio bug sia davvero un bug, cioè qualcosa che dovrebbe funzionare ma non funziona. Assicurarsi che lo stesso bug non sia già stato segnalato cercando prima nel bugtracker e nel forum.
    • Ricordareː se non si è sicuri, non esitare a spiegare il problema o bug nel fHelp forum e chiedere cosa fare.
    • Notaː prima di postare sul forum leggere le Forum Guidelines.
  • Descrivere il più chiaramente possibile il problema e come può essere riprodotto. Se non siamo in grado di verificare il bug, potremmo non essere in grado di risolverlo.
    • Ciò significa riportarlo in modo chiaro, ben formattato, passo dopo passo in modo che anche un utente amatoriale possa riprodurlo.
    • Racommandazioneː anche le schermate del bug sono molto utili da includere. Utenti Windows: non allegare schermate in formato Word o PDF. Usare lo strumento di cattura di Windows per salvare la cattura come immagine PNG.
    • Racommandazioneː ancora meglio, una GIF animata o screencast aumenta la probabilità di riprodurre il problema.
  • Aggiungere un file FreeCAD di esempio (file .FCStd) in modo che gli sviluppatori o tester possano riprodurre rapidamente il bug.
    • Si prega di non comprimere il file *.FCStd, è già zippato.
    • Le dimensioni dei file allegabili sono limitate. Se il proprio file *.FCStd è troppo grande per essere allegato, si può utilizzare un servizio di archiviazione online (molti sono gratuiti come Google Drive, Microsoft OneDrive, Dropbox).
  • Includere tutte le informazioni dal pulsante "Copia negli Appunti" nel dialogo Help (menu) -> About FreeCAD. Assicurarsi che i dati includano la versione di OCC o OCE utlizzata.
  • Si prega di inviare un rapporto separato per ogni bug.
  • Se il proprio bug causa un arresto anomalo in FreeCAD e si è su un sistema che lo supporta, si può provare a eseguire un backtrace di debug e allegare detta traccia al ticket. Questo può far risparmiare molto tempo agli sviluppatori nell'individuare la fonte del crash. Vedere Debugging per maggiori dettagli.

Richiedere delle nuove funzioni

Se desiderate qualcosa che in FreeCAD che non è ancora implementato, it is not a bug but a feature request questo non è un bug, ma una richiesta di nuove funzionalità.

  1. IMPORTANTEː Prima di richiedere una potenziale funzione assicurarsi di essere il primo a farlo cercando nei forum e nel bugtracker. Se non ci sono ticket o discussioni preesistenti, il passaggio successivo èː
  2. Avviare un thread del forum per discutere la propria richiesta di funzione con la comunità tramite il Open Discussion forum.
  3. Una volta che la comunità ha accettato che si tratta di una funzione valida, è quindi possibile aprire un ticket sul tracker (da registrare come "richiesta di funzione" invece di "bug").
  • NOTA #1 Per mantenere le cose organizzate, ricordarsi di indicare l'URL del thread del forum nel ticket e il numero del ticket (come collegamento) nel thread del forum.
  • NOTA #2 Tenere presente che non ci sono garanzie che il desiderio sarà soddisfatto.
Pagina di segnalazione Bugtracker di FreeCAD: utilizzare il menu a discesa per designare correttamente il tipo di ticket

Inviare patch

Nel caso in cui si programmi una correzione di un bug, un'estensione o qualcos'altro che può essere di uso pubblico in FreeCAD, inviare la patch come "Pull Request" a GitHub.

  1. Per una richiesta ampia, complessa o che cambia il comportamento, aprire un thread del forum nel Developer subforum per annunciare e discutere la tua patch. Per piccole correzioni di bug questo non è necessario.
  2. Inviare la Pull Request (PR) al FreeCAD GitHub repo. Il messaggio di invio della PR sarà precompilato con una lista di controllo da seguire per garantire che il tuo invio abbia le migliori possibilità di una rapida accettazione. Se non si è mai lavorato con git prima o non si ha familiarità con l'invio di una PR a github, leggere la nostra introduzione alla pagina wiki github.
  3. Si deve essere presenti alla discussione, sia nel forum che nella richiesta della pull di GitHub, in modo che il codice possa potenzialmente essere unito in modo più efficace.

Richiedere la fusione

(Stesse linee guida di come Inviare delle patches)

Se avete creato un ramo git contenente delle modifiche che desiderate far confluire nel codice di FreeCAD, potete fare la richiesta di avere la recensione e la fusione del vostro ramo, se ​​gli sviluppatori di FreeCAD sono d'accordo. È necessario pubblicare prima il ramo in un repository git pubblico (github, bitbucket, sourceforge ...) e poi fornire l'URL del vostro ramo nella richiesta di unione.

Suggerimenti e trucchi per MantisBT

Markup di MantisBT

MantisBT (Mantis Bug Tracker) ha il proprio markup.

  • @mention - funziona proprio come su GitHub dove anteponendo "@" al nome utente di qualcuno questi riceverà un'e-mail che è stato "menzionato" in un thread del ticket
  • #1234 - Aggiungendo un hash tag davanti a un numero viene presentata una scorciatoia per collegarsi a un altro ticket all'interno di MantisBT.
    Nota: se si passa il mouse su un ticket, viene mostrato il riepilogo + se il ticket è chiuso, e sarà anche barrato come #1234.
  • ~5678 - una scorciatoia che collega a una nota di bug all'interno di un ticket. Questo può essere utilizzato per fare riferimento alla risposta di qualcuno all'interno del thread. Per ogni persona che pubblica un post viene mostrato un numero ~#### univoco accanto al proprio nome utente. Guardando l'immagine nell'esempio, si vede che la scorciatoia fa riferimento al numero del ticket:numero del commento di detto ticket
  • <del></del> - L'uso di questi tag crea un testo barrato.
  • <code></code> - Per presentare una riga o un blocco di codice, usare questo tag che lo colorerà e lo differenzierà elegantemente.

MantisBT BBCode

Oltre al suddetto Markup di MantisBT si ha anche la possibilità di utilizzare il formato BBCode. Per un elenco completo, vedere la pagina del plug-in BBCode plus. Ecco un elenco di tag BBCode supportatiː
[img][/img] - Images
[url][/url] - Links
[email][/email] - Email addresses
[color=red][/color] - Colored text
[highlight=yellow][/highlight] - Highlighted text
[size][/size] - Font size
[list][/list] - Lists
[list=1][/list] - Numbered lists (number is starting number)
[*] - List items
[b][/b] - Bold
[u][/u] - underline
[i][/i] - Italic
[s][/s] - Strikethrough
[left][/left] - Left align
[center][/center] - Center
[right][/right] - Right align
[justify][/justify] - Justify
[hr] - Horizontal rule
[sub][/sub] - Subscript
[sup][/sup] - Superscript
[table][/table] - Table
[table=1][/table] - Table with border of specified width
[tr][/tr] - Table row
[td][/td] - Table column
[code][/code] - Code block
[code=sql][/code] - Code block with language definition
[code start=3][/code] - Code block with line numbers starting at number
[quote][/quote] - Quote by *someone* (no name)
[quote=name][/quote] - Quote by *name*

MantisBT <=> GitHub Markup

Di seguito sono riportate parole chiave speciali del plug-in MantisBT Source-Integration che si collegheranno al repository GitHub di FreeCAD. Vedere GitHub and MantisBT.

  • c:FreeCAD:git commit hash: - c sta per 'commit'. FreeCAD sta per il repository GitHub di FreeCAD. 'git commit hash' è l'hash git commit specifico a cui fare riferimento. Nota: i due punti finali sono necessari. Esempioː cːFreeCADː709d2f325db0490016807b8fa6f49d1c867b6bd8ː
  • d:FreeCAD:git commit hash: - simile a quanto sopra, d sta per 'diff' che fornirà una vista Diff del commit. Esempioː dːFreeCADː709d2f325db0490016807b8fa6f49d1c867b6bd8ː
  • p:FreeCAD:pullrequest: - simile a quanto sopra, p sta per Pull Request. Esempioː pːFreeCADː498ː

GitHub e MantisBT

Il bugtracker di FreeCAD ha un plug-in chiamato Source Integration che essenzialmente collega il repository GitHub di FreeCAD al nostro tracker MantisBT. Rende più facile tracciare e associare i commit git ai rispettivi ticket MantisBT. Il plug-in Source Integration scansiona i messaggi di git commit alla ricerca di parole chiave specifiche per eseguire le seguenti azioni:

Nota Le seguenti parole chiave devono essere aggiunte nel messaggio git commit e non nell'oggetto PR

Riferimento remoto a un ticket

L'utilizzo di questo modello assocerà automaticamente un commit git a un ticket (Nota: questo non chiuderà il ticket.) Il formato MantisBT riconoscerà:

  • bug #1234
  • bugs #1234, #5678
  • issue #1234
  • issues #1234, #5678
  • report #1234
  • reports #1234, #5678

Per i curiosi ecco la regex che MantisBT utilizza per questa operazione:
/(?:bugs?|issues?|reports?)+\s*:?\s+(?:#(?:\d+)[,\.\s]*)+/i

Risoluzione remota di un ticket

Il formato MantisBT riconoscerà:

  • fix #1234
  • fixed #1234
  • fixes #1234
  • fixed #1234, #5678
  • fixes #1234, #5678
  • resolve #1234
  • resolved #1234
  • resolves #1234
  • resolved #1234, #5678
  • resolves #1234, #5678

Per i curiosi ecco la regex che MantisBT utilizza per questa operazione:
/(?:fixe?d?s?|resolved?s?)+\s*:?\s+(?:#(?:\d+)[,\.\s]*)+/i



Questa pagina spiega passo dopo passo come compilare FreeCAD 0.19 o più recente su Windows utilizzando il compilatore MSVC di Microsoft. Per informazioni sull'utilizzo di MSYS2/MinGW, vedere Compilare su MinGW. Per altre piattaforme vedere Compilare FreeCAD.

Prerequisiti

La compilazione di FreeCAD su Windows richiede diversi strumenti e librerie.

Programmi richiesti

  • Un compilatore. FreeCAD è testato con Visual Studio (MSVC): altri compilatori potrebbero funzionare, ma le istruzioni per l'uso non sono incluse qui. Per maggiori dettagli, vedere la sezione Compilatore di seguito.
  • Git (Sono disponibili anche frontend GUI per Git, vedere la sezione successiva.)
  • CMake versione 3.11.x o successiva.
    Suggerimento: Scegliendo l'opzione Add CMake to the system PATH for all users, durante l'installazione di CMake, si renderà CMake accessibile dal prompt dei comandi di Windows, il che può essere utile.
  • Il LibPack. Questo è un singolo pacchetto contenente tutte le librerie necessarie per compilare FreeCAD su Windows. Scaricare la versione del LibPack che corrisponde alla versione di FreeCAD che si desidera compilare. Per compilare FreeCAD 0.20 scaricare il LibPack versione 2.6, per FreeCAD 0.19 scaricare il LibPack versione 1.0. Estrarre il LibPack in una posizione facilmente accessibile. (Se il tuo computer non riconosce l'estensione .7z, installare il programma 7-zip.)
    Nota: Si consiglia caldamente di compilare FreeCAD con la versione del compilatore per cui è progettato il LibPack. Ad esempio, si potrebbero riscontrare problemi durante la compilazione di FreeCAD 0.20 utilizzando MSVC 2017 perché il LibPack è progettato per essere compilato con MSVC 2019 o versioni successive.
    Per aggiornare il LibPack in un secondo momento, consultare la sezione Aggiornamento del Libpack.

Programmi opzionali

  • Un frontend GUI per Git. Ci sono diversi frontend disponibili, vedere questa lista. Il vantaggio principale di un frontend è che non si devono imparare i comandi Git per scaricare il codice sorgente di FreeCAD o per inviare patch al repository GitHub di FreeCAD.

Di seguito descriviamo la gestione del codice sorgente usando il frontend TortoiseGit. Questo frontend si integra direttamente in Windows con Esplora file e dispone di una grande comunità di utenti per ricevere assistenza in caso di problemi.

  • NSIS viene utilizzato per generare il programma di installazione di Windows di FreeCAD.

Codice sorgente

A questo punto si può scaricare il codice sorgente di FreeCAD:

Utilizzo di un frontend

Quando si utilizza il frontend di Git TortoiseGit:

  1. Creare una nuova cartella in cui verrà scaricato il codice sorgente.
  2. Fare clic con il tasto destro su questa cartella in Esplora file di Windows e selezionare nel menu contestuale Git Clone.
  3. Apparirà una finestra di dialogo. In esso, inserisci l'URL per il repository Git di FreeCAD

https://github.com/FreeCAD/FreeCAD.git

e clicca OK.

L'ultimo codice sorgente verrà scaricato dal repository Git di FreeCAD e la cartella verrà tracciata da Git.

Usando la riga di comando

Per creare un ramo locale e scaricare il codice sorgente è necessario aprire un terminale (prompt dei comandi) e portarsi nella directory in cui si desidera creare il sorgente, quindi digitare:

git clone https://github.com/FreeCAD/FreeCAD.git

Compilatore

Il compilatore predefinito (consigliato) è MS Visual Studio (MSVC). Sebbene sia possibile utilizzare altri compilatori, ad esempio gcc tramite Cygwin o MinGW, questi non sono testati o esaminati qui.

È possibile ottenere una versione gratuita di MSVC (per uso individuale) scaricando la versione Community di MS Visual Studio.

Per chi vuole evitare l'installazione completa dell'ingombrante MSVC al solo scopo di avere un compilatore può vedere Compilare in Windows - Occupare meno spazio.

Nota: Sebbene l'edizione Community di MSVC sia gratuita, per utilizzare l'IDE per un periodo di prova superiore a 30 giorni è necessario creare un account Microsoft. Se compilerai solo utilizzando la riga di comando, non avrai bisogno dell'IDE e quindi di nessun account Microsoft.

Come IDE alternativo gratuito e OpenSource puoi usare KDevelop. Puoi usare KDevelop per modificare e scrivere codice C++, ma devi usare la riga di comando per compilare.

Configurazione opzionale del percorso di sistema

Facoltativamente è possibile includere i percorsi di alcune cartelle nella variabile PATH di sistema. Ciò è utile se si desidera accedere ai programmi in queste cartelle dalla riga di comando/powershell o se si desidera che il compilatore o CMake trovino programmi speciali. Oltre a questo, potrebbe essere necessario aggiungere cartelle al PATH se non si sono utilizzate le opzioni corrispondenti durante l'installazione del programma.

  • Si può includere la cartella del tuo LibPack nella variabile PATH del tuo sistema. Ciò è utile se si prevede di creare più configurazioni / versioni di FreeCAD.
  • Se non si ha utilizzato l'opzione per aggiungere CMake al PERCORSO durante l'installazione, aggiungere la sua cartella di installazione

C:\Program Files\CMake\bin to the PATH.

  • Se non si ha utilizzato l'opzione per aggiungere TortoiseGit al PERCORSO durante l'installazione, aggiungere la sua cartella d'installazione

C:\Program Files\TortoiseGit\bin to the PATH.

Per aggiungere percorsi di cartelle alla variabile PATH:

  1. Nel menu Start di Windows, fare clic con il pulsante destro del mouse su "Computer" e scegliere "Proprietà".
  2. Nella finestra di dialogo visualizzata, fare clic su "Impostazioni di sistema avanzate".
  3. Si aprirà un'altra finestra di dialogo. Fare clic nella scheda Avanzate in Variabili d'ambiente.
  4. Ancora una volta si aprirà un'altra finestra di dialogo. Selezionare quindi la variabile Percorso e fare clic su Modifica.
  5. Si aprirà un'altra finestra di dialogo. Fare clic su Nuovo e aggiungere al percorso la cartella di Git o LibPack.
  6. Infine cliccare OK e chiudere tutte le finestre di dialogo cliccando ancora OK.

Configurazione

Una volta che hai tutti gli strumenti, le librerie e il codice sorgente di FreeCAD necessari, sei pronto per iniziare il processo di configurazione e compilazione. Questo processo procederà in cinque fasi:

  1. Eseguire CMake una prima volta per esaminare il tuo sistema e iniziare l'avanzamento della configurazione (verrà segnalato che l'operazione non è riuscita).
  2. Aggiustare le impostazioni CMake necessarie per configurare i percorsi del LibPack e abilitare Qt5.
  3. Rieseguire CMake per finalizzare la configurazione (questa volta dovrebbe riuscire).
  4. Utilizzare CMake per generare il sistema di compilazione di Visual Studio.
  5. Utilizzare Visual Studio per creare FreeCAD.

CMake

Inizialmente configurare l'ambiente di compilazione utilizzando CMake:

  1. Aprire la GUI di CMake
  2. Specificare la cartella di origine di FreeCAD.
  3. Specificare una cartella di compilazione. Questa può essere build nella cartella in cui è stato clonato il repository, perché questo percorso è ignorato da git. Non utilizzare la cartella di origine. CMake creerà questa cartella se non esiste.
  4. Fare clic su Configura.
  5. Nella finestra di dialogo, che appare, specificare il generatore, che si desidera utilizzare: nella maggior parte dei casi verranno utilizzate le impostazioni predefinite in questa finestra di dialogo. Per lo standard MS Visual Studio utilizzare Visual Studio xx 2yyy dove xx è la versione del compilatore e 2yyy l'anno del suo rilascio. Si consiglia di utilizzare l'opzione predefinita Use default native compilers.

Nota: È importante specificare la variante col numero di bit corretta. Se hai la variante a 64 bit di LibPack devi usare anche il compilatore x64.

Questo avvierà la configurazione e fallirà a causa delle impostazioni mancanti. Questo è normale: non hai ancora specificato la posizione del LibPack. Tuttavia, potrebbero verificarsi altri errori, che richiedono ulteriori azioni da parte tua.

Se non riesce, con il messaggio che Visual Studio non è stato trovato, il supporto CMake in MSVC non è ancora installato. Per farlo:

  1. Aprire l'IDE MSVC
  2. Utilizzare il menu Strumenti → Ottieni strumenti e funzionalità
  3. Nella scheda Workloads abilita Desktop development with C++
  4. Sul lato destro ora si dovrebbe vedere il messaggio, che il componente Visual C++ tools for CMake verrà installato.
  5. Installarlo.

Se fallisce, con un messaggio relativamente alla versione Python errata o Python mancante, allora:

  1. Usare la casella "Search:" in CMake per cercare la stringa "Python"
  2. Se si ottiene un percorso come C:/Program Files/Python38/python.exe, CMake ha trovato, che Python è già installato sul tuo PC, ma che quella versione non è compatibile con il LibPack. Poiché il LibPack include una versione compatibile di Python, modificare le seguenti impostazioni Python nei percorsi di CMake (supponendo che il LibPack si trovi nella cartella D:/FreeCAD-build/FreeCADLibs_2_8_x64_VC2019):

Se non appaiono errori da Visual Studio o da Python, va tutto bene, ma CMake non ha ancora tutte le impostazioni necessarie. Pertanto successivamente:

  1. Cercare in CMake la variabile FREECAD_LIBPACK_DIR e specificare la posizione della cartella LibPack, che è stata scaricata in precedenza.
  2. (Se si sta compilando FreeCAD 0.19) Cercare la variabile BUILD_QT5 e abilitare questa opzione.
  3. (Se si sta pianificando di eseguire direttamente dalla cartella di compilazione, ad esempio per il debug) Cercare e attivare le seguenti opzioni:
    • FREECAD_COPY_DEPEND_DIRS_TO_BUILD
    • FREECAD_COPY_LIBPACK_BIN_TO_BUILD
    • FREECAD_COPY_PLUGINS_BIN_TO_BUILD
  4. Fare di nuovo clic su Configure.

Ora non dovrebbero apparire errori. Se si continua a riscontrare errori, che non si riesce a diagnosticare, visitare le pagine Install/Compile forum sul sito Web del forum di FreeCAD. Se CMake ha terminato correttamente, cliccare su Generate. Fatto ciò si può chiudere CMake e avviare la compilazione di FreeCAD utilizzando Visual Studio. Tuttavia, per la prima compilazione, tenerlo aperto nel caso in cui si desideri o sia necessario modificare alcune opzioni per il processo di compilazione.

Opzioni per il processo di compilazione

Il sistema di generazione CMake offre la flessibilità necessaria per il processo di creazione. Ciò significa che è possibile attivare e disattivare alcune funzionalità o moduli tramite le variabili di CMake.

Ecco una descrizione di alcune di queste variabili:

Nome Variabile Descrizione Valore di Default
BUILD_XXX Fare il Build di FreeCAD con il componente XXX. Se non si vuole o non si ha bisogno di compilare ad es. l'ambiente OpenSCAD, disabilitare la variabile BUILD_OPENSCAD. FreeCAD quindi non avrà questo ambiente di lavoro. Nota: Alcuni componenti sono necessari per altri componenti. Se per esempio deselezioni BUILD_ROBOT CMake ti informerà che il componente Path non può essere compilato correttamente. Pertanto controllare l'output di CMake dopo aver modificato un'opzione BUILD_XXX! dipende
BUILD_ENABLE_CXX_STD La versione standard del linguaggio C++. C++14 è il più alto possibile per FreeCAD 0.19 mentre almeno C++17 è richiesto per FreeCAD 0.20. Vedere anche la nota nella sezione Compilazione con Visual Studio 15 (2017) e successive dipende
BUILD_DESIGNER_PLUGIN Per creare il plug-in Qt Designer, consultare questa sezione di seguito OFF
BUILD_FLAT_MESH Necessaria per avere una build che includa la funzionalità CreateFlatMesh OFF
CMAKE_INSTALL_PREFIX La cartella di output durante la creazione della destinazione INSTALL, vedere anche la sezione Esecuzione e installazione di FreeCAD Cartella d'installazione predefinita del programma in Windows
FREECAD_COPY_DEPEND_DIRS_TO_BUILD Copia le librerie dipendenti necessarie per eseguire FreeCAD.exe nella cartella di compilazione. Vedere anche la sezione Esecuzione e installazione di FreeCAD.
Nota: le opzioni FREECAD_COPY_XXX appaiono solo se le librerie non sono già state copiate. Se si ha solo bisogno di aggiornare/passare a un'altra versione di LibPack, consultare la sezione Aggiornamento del LibPack. Se si desidera ripristinare le opzioni per qualche motivo, si devono eliminare tutte le cartelle nella cartella di compilazione, ad eccezione della cartella LibPack. In CMake cancellare la cache e avviare come se si dovesse compilare per la prima volta.
OFF
FREECAD_COPY_LIBPACK_BIN_TO_BUILD Copia i file binari LibPack necessari per eseguire FreeCAD.exe nella cartella di compilazione. Vedere anche la sezione Esecuzione e installazione di FreeCAD. OFF
FREECAD_COPY_PLUGINS_BIN_TO_BUILD Copia i file del plugin di Qt necessari per eseguire FreeCAD.exe nella cartella di compilazione. Vedere anche la sezione Esecuzione e installazione di FreeCAD. OFF
FREECAD_LIBPACK_USE Attiva o disattiva l'utilizzo di FreeCAD LibPack. ON
FREECAD_LIBPACK_DIR Directory in cui si trova il LibPack. Cartella del codice sorgente di FreeCAD
FREECAD_RELEASE_PDB Crea librerie di debug (*.pdb) anche per build di rilascio. Non influisce sulla velocità (come farebbe una vera build di debug) e può essere molto utile per individuare arresti anomali nel codice di FreeCAD. Nel caso in cui FreeCAD si arresti in modo anomalo, verrà creato un file crash.dmp che può essere caricato con MSVC e se si dispone dei file PDB corrispondenti più il codice sorgente di quella versione è possibile eseguire il debug attraverso il codice. Senza i file PDB non è possibile eseguire il debug del codice e tutto ciò che il debugger mostra è il nome della DLL in cui si è verificato il crash. ON
FREECAD_USE_MP_COMPILE_FLAG Aggiunge l'opzione /MP (multiprocessore) ai progetti di Visual Studio, abilitando accelerazioni nelle CPU multi-core. Questo può accelerare notevolmente le build sui processori moderni.
Nota: Se disattivi FREECAD_USE_PCH, la compilazione può sovraccaricare rapidamente lo spazio dell'heap, anche se hai 16 GB di RAM.
ON
FREECAD_USE_PCH Precompila the headers per risparmiare tempo di compilazione. ON
FREECAD_USE_PYBIND11 Include la libreria PyBind11. Necessario avere una build che includa la funzionalità CreateFlatMesh.
Nota: dopo averla attivata si potrebbe ricevere un errore di configurazione. Basta configurare di nuovo e il problema dovrebbe scomparire.
OFF

Compilare FreeCAD

A seconda del compilatore, il processo per la compilazione di FreeCAD sarà leggermente diverso. Nelle sezioni seguenti sono descritti i flussi di lavoro noti. Se stai costruendo con Qt Creator, passa a Compilazione con Qt Creator (obsoleto), altrimenti procedi direttamente:

Compilazione dalla riga di comando cmd.exe

Se si vuole compilare dalla riga di comando, l'output di CMake mostrerà il comando corretto da eseguire (che dipende dalla release directory configurata). Ma questo comando produrrà una compilazione "Debug" che non funziona su Windows e si traduce in un errore di importazione Numpy in FreeCAD (che è un problema noto ma difficile da risolvere). È necessario specificare l'opzione --config Release per forzare una build Release:

cmake --build E:/release --config Release

Tenere presente che l'impostazione delle variabili CMake come CMAKE_BUILD_TYPE non ha alcun effetto, funziona solo specificando l'opzione --config come mostrato sopra.

Compilazione con Visual Studio 15 (2017) e successive

Rilascio della Build

  1. Avviare l'IDE di Visual Studio. Questo si può fare cliccando sul pulsante Apri progetto nella GUI di CMake o facendo doppio clic sul file FreeCAD.sln, che si trova nella cartella di compilazione.
  2. Nella barra degli strumenti dell'IDE MSVC assicurarsi di utilizzare per la prima compilazione Release.
  3. C'è una finestra chiamata Solution Explorer. Elenca tutti i possibili target di compilazione. Per avviare una compilazione completa, fare clic con il pulsante destro del mouse sul target ALL_BUILD e quindi scegliere Build.

Ci vorrà molto tempo.

Per compilare un FreeCAD pronto all'uso, compila la destinazione INSTALLA , vedere la sezione Esecuzione e installazione di FreeCAD.

Se non ricevi errori, hai finito. Congratulazioni! Puoi uscire da MSVC o tenerlo aperto.

Importante: A partire da Visual Studio 17.4 non è possibile utilizzare l'ottimizzazione del codice attiva per impostazione predefinita per il target SketcherGui. In tal caso, i vincoli angolari verranno posizionati in modo errato negli schizzi. Per risolvere questo problema, fare clic con il pulsante destro del mouse su questo target in Esplora soluzioni MSVC e selezionare l'ultima voce Proprietà nel menu contestuale. Nella finestra di dialogo che appare andare su C/C++ → Ottimizzazione e disabilitare l'impostazione Ottimizzazione. Infine costruire di nuovo il target ALL_BUILD.

Compilazione di Debug

Per una compilazione di debug è necessario utilizzare Python incluso nel LibPack. Per verificarlo:

  1. Cercare "Python" nella GUI di CMake
  2. Se si nota un percorso come C:/Program Files/Python38/python.exe, significa che CMake ha riconosciuto il Python, che è installato sul tuo PC, e non quello del LibPack. In questo caso adattare queste diverse impostazioni Python in CMake alle seguenti (assumendo che il LibPack si trovi nella cartella D:\FreeCAD-build\FreeCADLibs_12.5.2_x64_VC17):

Come prerequisito per la build di debug, devi fare questo:

  1. Copiare il contenuto della cartella LibPack bind nella cartella bin della cartella build di FreeCAD (sovrascrivere i file esistenti).
  2. Copiare il contenuto della cartella LibPack libd nella cartella lib della cartella build di FreeCAD.

Adesso puoi compilare:

  1. Avviare l'IDE di Visual Studio. Questo può essere fatto premendo il pulsante Apri progetto nella GUI di CMake o facendo doppio clic sul file FreeCAD.sln, che si trova nella cartella di build.
  2. Nella barra degli strumenti dell'IDE MSVC assicurarsi di utilizzare per la prima compilazione Debug.
  3. C'è una finestra chiamata Solution Explorer. Elenca tutti i possibili obiettivi di compilazione. Per avviare una compilazione completa, fare clic con il pulsante destro del mouse sul target ALL_BUILD e scegliere Build nel menu contestuale.

Richiederà molto tempo.

Se non ci sono stati errori di compilazione e se le opzioni FREECAD_COPY_* menzionate nella Fase di configurazione di CMake sopra sono state abilitate, si può avviare la build di debug:

  1. Fare clic con il pulsante destro del mouse sull'obiettivo FreeCADMain e scegliere Set as Startup Project nel menu contestuale.
  2. Infine fare clic sulla barra degli strumenti sul pulsante con il triangolo verde indicato Local Windows Debugger.

Questo avvierà la build di debug di FreeCAD ed è possibile utilizzare l'IDE MSVC per eseguirne il debug.

Risorse video

Un tutorial in lingua inglese che inizia con la configurazione in CMake Gui e continua con il comando `Build` in Visual Studio 16 2019 è disponibile unlisted su YouTube all'indirizzo Tutorial: Build FreeCAD from source on Windows 10 .

Compilazione con Qt Creator (obsoleto)

Installazione e configurazione di Qt Creator

  • Scaricare e installare Qt Creator
  • Strumenti → Opzioni → Editor di testo → scheda Comportamento:
    • Codifica dei file → Codifiche predefinite:
    • Impostato su: ISO-8859-1 /...csISOLatin1 (Alcuni caratteri creano errori / avvertimenti con Qt Creator se lasciato impostato su UTF-8. Questo sembra risolverlo.)
  • Strumenti → Opzioni → Crea ed esegui:
    • Scheda CMake
      • Riempire la casella Eseguibile con il percorso di cmake.exe
    • Scheda Kit
      • Nome: MSVC 2008
      • Compilatore: Microsoft Visual C++ Compiler 9.0 (x86)
      • Debugger: rilevato automaticamente ...
      • Versione Qt: Nessuna
    • Scheda Generale
      • Deselezionare: crea sempre un progetto prima di distribuirlo
      • Deselezionare: distribuire sempre il progetto prima di eseguirlo

Importare e creare il progetto

  • File → Apri file o progetto
  • Aprire CMakeLists.txt che si trova nel livello più alto della fonte
  • Questo avvierà CMake
  • Scegliere la cartella di costruzione e fare clic su Avanti
  • Impostare il generatore su NMake Generator (MSVC 2008)
  • Cliccare Esegui CMake. Seguire le istruzioni illustrate sopra per configurare CMake a tuo piacimento.

Ora è possibile creare FreeCAD

  • Build → Build All
  • Ci vorrà molto tempo ...

Una volta completato, può essere eseguito: Ci sono 2 triangoli verdi in basso a sinistra. Uno è il debug. L'altro è l'eseguibile. Scegliere quello che si desidera.

Compilazione dalla riga di comando

I passaggi su come compilare dalla riga di comando dipendono dal compilatore. Per MSVC 2017 i passaggi sono:

  1. Nel menu Start di Windows andare a Visual Studio 2017 → Visual Studio Tools e scegliere Prompt dei comandi per sviluppatori per VS 2017
  2. Passare alla tua cartella di build.
  3. Eseguire il comando
msbuild ALL_BUILD.vcxproj /p:Configuration=Release

o

msbuild INSTALL.vcxproj /p:Configuration=Release

Questi passaggi possono anche essere automatizzati. Ecco ad esempio una soluzione per MSVC 2017:

  1. Scaricare lo script compile-FC.txt.
  2. Rinominarlo in compile-FC.bat
  3. In Esplora file di Windows fare Shift + Click con il tasto destro del mouse sulla cartella di build e utilizzare dal menu di scelta rapida "Command prompt here".
  4. Eseguire il comando
compile-FC install

Invece di chiamare compile-FC con l'opzione install si può anche usare debug o release:

debug   - compila FreeCAD nella configurazione di debug

release - compila FreeCAD nella configurazione della versione

install    - compila FreeCAD nella configurazione di rilascio e crea una versione d'installazione

Esecuzione e installazione di FreeCAD

Esistono 2 metodi per eseguire FreeCAD compilato:

Metodo 1: Eseguire FreeCAD.exe che si trova nella cartella di compilazione nella sottocartella bin

Metodo 2: compilare il target INSTALL

Il metodo 2 è quello più semplice, perché assicura automaticamente che tutte le librerie necessarie per eseguire FreeCAD.exe siano nella cartella corretta. FreeCAD.exe e le librerie verranno emessi nella cartella specificata nella variabile CMake CMAKE_INSTALL_PREFIX.

Per il Metodo 1 devi abilitare le opzioni FREECAD_COPY_* menzionate nella Fase di configurazione di CMake sopra.

Risoluzione dei problemi

Durante l'esecuzione di FreeCAD è possibile riscontrare DLL mancanti quando si utilizzano determinati ambienti di lavoro o funzionalità di ambienti di lavoro. Il messaggio di errore nella console di FreeCAD non ti dirà quale DLL manca. Per scoprirlo è necessario utilizzare uno strumento esterno:

import os
os.system(r"~\DependenciesGui.exe")

Nota: invece di ~ si deve specificare il percorso completo di DependenciesGui.exe sul tuo sistema.

  • Ora trascinare il file *.pyd del workbench con il quale si ottengono le DLL mancanti segnalate.

Aggiornamento della compilazione

FreeCAD è sviluppato molto attivamente. Pertanto il suo codice sorgente cambia quasi quotidianamente. Nuove funzionalità vengono aggiunte e i bug corretti. Per beneficiare di queste modifiche al codice sorgente, è necessario ricompilare FreeCAD. Questo avviene in due fasi:

  1. Aggiornamento del codice sorgente
  2. Ricompilazione

Aggiornamento del codice sorgente

Usando un frontend

Quando si utilizza il frontend di Git TortoiseGit:

  1. Fare clic con il tasto destro del mouse sulla cartella del codice sorgente di FreeCAD in Esplora file di Windows e selezionare nel menu di scelta rapida 'Pull' .
  2. Apparirà una finestra di dialogo. Selezionare quale ramo di sviluppo vuoi utilizzare. master è il ramo principale. Pertanto utilizzare questo a meno che non si desideri compilare una nuova funzionalità speciale da un ramo che non è stato ancora unito a "master". (Per ulteriori informazioni sui rami Git, vedere Processo di sviluppo Git).

Finalmente cliccare su OK.

Utilizzando la riga di comando

Aprire un terminale (prompt dei comandi) e passare alla cartella di origine. Quindi digitare:

git pull https://github.com/FreeCAD/FreeCAD.git master

dove master è il nome del ramo di sviluppo principale. Se si vuole ottenere il codice da un altro ramo, usare il suo nome invece di master.

Ricompilazione

  1. Aprire l'IDE MSVC facendo doppio clic sul file FreeCAD.sln o sul file ALL_BUILD.vcxproj nella cartella di compilazione.
  2. Continuare con il passaggio 2 dalla sezione Compilazione con Visual Studio 15 (2017) e successive.

Aggiornamento del Libpack

Se viene rilasciata una nuova versione principale di una dipendenza di terze parti come Open Cascade o se una dipendenza di terze parti ha importanti correzioni di bug, viene rilasciato un nuovo LibPack. Si può trovare l'ultima versione qui.

Per aggiornare il tuo LibPack, la seguente procedura è la pratica migliore:

  1. Eliminare la cartella bin nella tua cartella di compilazione.
  2. Passare alla tua cartella LibPack locale ed eliminare tutto il contenuto.
  3. Estrarre il contenuto del nuovo file ZIP LibPack nella cartella LibPack locale esistente, che ora è vuota.
  4. Aprire CMake e premere il pulsante Configure e poi il pulsante Generate. Questo ricrea la cartella bin appena eliminata e vi copia anche i nuovi file LibPack.
  5. In CMake fare clic sul pulsante Open Project e si aprirà l'IDE MSVC.
  6. Nell'IDE MSVC creare la destinazione INSTALL.

Strumenti

Per partecipare allo sviluppo di FreeCAD è necessario compilare e installare i seguenti strumenti:

Plugin di Qt Designer

FreeCAD usa Qt come toolkit per la sua interfaccia utente. Tutte le finestre di dialogo sono impostate in file UI che possono essere modificati utilizzando il programma Qt Designer che fa parte di qualsiasi installazione di Qt ed è anche incluso nel LibPack. FreeCAD ha il proprio set di widget Qt per fornire funzionalità speciali come l'aggiunta di un'unità ai campi di input e per impostare le proprietà delle preferenze.

Compilazione

Il plugin non può essere caricato da Qt Designer se è stato compilato utilizzando una versione di Qt diversa da quella su cui si basa Qt Designer/Qt Creator. Pertanto il plugin deve essere compilato insieme a FreeCAD:

  • Nelle opzioni di CMake (vedere questa sezione sopra) abilitare l'opzione BUILD_DESIGNER_PLUGIN e riconfigurare.
  • aprire MSVC e creare il target FreeCAD_widgets

Come risultato si otterrà il file del plugin 'FreeCAD_widgets.dll nella cartella
~\src\Tools\plugins\widget\Release

Installazione

Per installare il plugin, copia la DLL in

  • Se si usa il LibPack: nella cartella
    ~\FreeCADLibs_2_8_x64_VC2019\plugins\designer
  • Se si ha un'installazione Qt completa: si può scegliere tra la cartella
    C:\Qt\5.15.2\msvc2019_64\plugins\designer
    o
    C: \Qt\5.15.2\msvc2019_64\bin\designer (si deve prima creare la sottocartella designer.)
    (adattare i percorsi alla propria installazione!).

Infine (ri)avviare Qt Designer e controllare il suo menu Help → Plugins. Se il plugin FreeCAD_widgets.dll è elencato come caricato, ora si può progettare e modificare i file .ui di FreeCAD. In caso contrario, si deve compilare la DLL da se.

Se si preferisce usare Qt Creator invece di Qt Designer, il file del plugin deve essere posizionato in questa cartella:
C:\Qt\Qt5.15.2 \Tools\QtCreator\bin\plugins\designer
Quindi (ri)avviare Qt Creator, passare alla modalità Design e controllare il menu Tools → Form Editor → About Qt Designer Plugins. Se il plugin FreeCAD_widgets.dll è elencato tra quelli caricati, si può progettare e modificare i file .ui di FreeCAD. In caso contrario, ci si deve compilare la DLL.

Creatore di miniature

FreeCAD ha la funzionalità per fornire miniature di anteprima per i file *.FCStd. Ciò significa, che nel file explorer di Windows i file *.FCStd, sono mostrati con uno screenshot del modello che contiene. Per fornire questa funzionalità, FreeCAD deve avere il file FCStdThumbnail.dll installato in Windows.

Installazione

La DLL viene installata in questo modo:

  1. Scaricare questo file ZIP ed estrarlo.
  2. Aprire un prompt dei comandi di Windows con privilegi di amministratore (questi privilegi sono un requisito).
  3. Passare alla cartella in cui si trova la DLL.
  4. Eseguire questo comando
    regsvr32 FCStdThumbnail.dll

Quindi controllare se funziona, assicurarsi che in FreeCAD l'opzione delle preferenze Salva la miniatura nel file di progetto al salvataggio del documento sia abilitata e salvare il modello. Quindi visualizzare in Windows Explorer la cartella del modello salvato utilizzando una vista simboli. Ora si dovrebbe vedere uno screenshot del modello nella vista delle cartelle.

Compilazione

Per compilare FCStdThumbnail.dll

  1. Passare alla cartella sorgente di FreeCAD
    ~\src\Tools\thumbs\ThumbnailProvider
  2. Aprire la GUI di CMake
  3. Specificare come cartella di origine quella in cui ci si trova attualmente.
  4. Usare la stessa cartella della cartella build.
  5. Fare clic su Configure
  6. Nella finestra di dialogo che appare, specificare il generatore in base a quello che si vuole usare. Per lo standard MS Visual Studio utilizzare Visual Studio xx 2yyy dove xx è la versione del compilatore e 2yyy l'anno del suo rilascio. Si consiglia di utilizzare l'opzione predefinita Use default native compilers.
    Nota: È importante specificare la variante col numero di bit corretta. Se si ha la variante a 64 bit di LibPack si deve usare anche il compilatore x64.
  7. Cliccare su Generate.
  8. Ora si dovrebbe avere il file ALL_BUILD.vcxproj nella cartella ~\src\Tools\thumbs\ThumbnailProvider. Fare doppio clic su di esso e si aprirà l'IDE MSVC.
  9. Nella barra degli strumenti dell'IDE MSVC assicurarsi di utilizzare l'obiettivo di compilazione Release.
  10. C'è una finestra chiamata Solution Explorer. Fare clic destro su ALL_BUILD e poi sceglire Build.
  11. Come risultato ora si dovrebbe avere un FCStdThumbnail.dll nella cartella ~\src\Tools\thumbs\ThumbnailProvider\release, che si può installare come descritto sopra.

Compilazione di Open Cascade

Il LibPack viene fornito con una versione di Open Cascade adatta all'uso generale. Tuttavia, in alcune circostanze potresti voler compilare con una versione alternativa di Open Cascade, come ad esempio una delle loro versioni ufficiali o un fork con patch.

Durante la compilazione di Open Cascade per FreeCAD, si tenga presente che non vi è alcuna garanzia che FreeCAD funzioni con tutte le versioni di Open Cascade. Si noti inoltre che quando si utilizza la libreria Netgen, è necessario utilizzare una versione NetGen approvata per la compilazione con la versione Open Cascade che si desidera compilare.

Compilare:

  • Quindi aprire la GUI di CMake per configurare il sistema di compilazione in modo simile alla creazione di FreeCAD. Queste opzioni di CMake devono essere impostate (o esplicitamente non impostate):
Nome Variabile Descrizione Valore di Default
3RDPARTY_DIR Percorso verso i componenti di terze parti. Si consiglia di utilizzare la cartella come input in cui si trova il LibPack utilizzato. Lasciare esplicitamente vuoto questo campo. vuoto
3RDPARTY_DOXYGEN_EXECUTABLE Percorso dell'eseguibile del componente di terze parti Doxygen. Si consiglia di installare Doxygen. Così CMake lo troverà automaticamente. vuoto
3RDPARTY_FREETYPE_DIR Percorso del componente di terze parti necessario Freetype. Si consiglia di utilizzare la cartella come input in cui si trova il LibPack utilizzato. vuoto
3RDPARTY_RAPIDJSON_DIR Disponibile solo se viene utilizzato USE_RAPIDJSON. Percorso del componente di terze parti RapidJSON. Si consiglia di NON utilizzare una cartella LibPack esistente come input. Si può usare la cartella RapidJSOn da un LibPack, ma copiata in una nuova cartella e poi usare questa nuova cartella come input. vuoto
3RDPARTY_TCL_DIR Percorso al componente di terze parti necessario TCL. Si consiglia di NON utilizzare una cartella LibPack esistente come input. Prendere ad esempio una di queste versioni, estrarla e prenderla come cartella di input per CMake. vuoto
3RDPARTY_TK_DIR Percorso del componente di terze parti necessario TK. Si consiglia di NON utilizzare una cartella LibPack esistente come input. Prendere ad esempio una di queste versioni, estrarla e prenderla come cartella di input per CMake. vuoto
3RDPARTY_VTK_DIR Disponibile solo se viene utilizzato USE_VTK. Percorso del componente di terze parti necessario VTK. Si consiglia di utilizzare la cartella come input in cui si trova il LibPack utilizzato. Se si utilizza un'altra cartella, assicurarsi di non utilizzare VTK 9.x o versioni successive. vuoto
BUILD_RELEASE_DISABLE_EXCEPTIONS Disabilita la gestione delle eccezioni per le build di rilascio. Per FreeCAD si deve impostarlo su OFF. ON
INSTALL_DIR Cartella di output durante la creazione della destinazione INSTALL. Se la compilazione è andata a buon fine, prendere i file da questa cartella per aggiornare il tuo LibPack. Cartella d'installazione predefinita del programma in Windows
INSTALL_DIR_BIN Sottocartella di output per la DLL durante la creazione del target INSTALL. Si deve cambiarlo in bin. win64/vc14/bin
INSTALL_DIR_LIB Sottocartella di output per i file .lib durante la creazione della destinazione INSTALL. Si deve cambiarlo in lib. win64/vc14/lib
USE_RAPIDJSON Per compilare Open Cascade con supporto per RapidJSON. L'abilitazione è obbligatoria per ottenere supporto per il formato file glTF. OFF
USE_VTK Per compilare Open Cascade con supporto per VTK. Abilitare questo è ottimale. Si può usarlo per costruire il bridge VTK di Open Cascade. OFF
  • Aprire il progetto in Visual Studio e per prima cosa creare i target ALL_BUILD e poi INSTALL in modalità Release.
  • Ripetere la creazione dei due target nella modalità Debug.

Per creare FreeCAD, utilizzando Open Cascade autocompilato, è necessario eseguire le seguenti operazioni:

  • Copiare tutte le cartelle da INSTALL_DIR nella tua cartella LibPack (sovrascrivere i file esistenti)
  • Passare alla cartella LibPack e andare lì alla sottocartella cmake
  • Aprire il file OpenCASCADEDrawTargets.cmake con un editor di testo
  • Cercare i percorsi assoluti della tua cartella LibPack e rimuoverli. Quindi ad es. il percorso assoluto
    D:/FreeCADLibs_12.5.4_x64_VC17/lib/freetype.lib
    diventerà solo
    freetype.lib
  • Fare lo stesso per il file OpenCASCADEVisualizationTargets.cmake

Compilazione di Netgen

Il LibPack viene fornito con una versione di Netgen che sarà stata testata per essere compilata con la versione Open Cascade del LibPack. Il problema è che ogni nuova versione di Netgen cambia l'API. Anche ogni nuova versione di Open Cascade fa lo stesso. Pertanto non si può semplicemente cambiare in modo semplice la versione di Netgen.

Tuttavia, potresti comunque compliare Netgen. Questa è un'attività semplice:

  • Per prima cosa scaricare il codice sorgente di Netgen, direttamente dal repository git di Netgen.
  • Quindi aprire la GUI di CMake, per configurare il sistema di compilazione in modo simile alla creazione di FreeCAD. Devono essere impostate le seguenti opzioni di CMake :
Nome Variabile Descrizione Valore di Default
CMAKE_INSTALL_PREFIX Cartella di output durante la creazione della destinazione INSTALL. Se la compilazione è andata a buon fine, prendere i file da questa cartella per aggiornare il tuo LibPack. C:/netgen
OpenCasCade_DIR Percorso dei file CMake di Open Cascade. Se si è compilato Open Cascade come descritto nella sezione Compilazione di Open Cascade si può usare la sottocartella cmake della cartella usata come INSTALL_DIR. In caso contrario, usare la sottocartella cmake del tuo LibPack. Si noti che il LibPack deve già contenere una corretta build Open Cascade. Indipendentemente dalla cartella utilizzata, si deve creare anche una sottocartella lib e copiarvi i file freetype.lib e freetyped.lib dal tuo LibPack. vuoto
USE_GUI Impostarlo a OFF ON
USE_NATIVE_ARCH Impostarlo su OFF; questo è necessario solo per supportare le CPU più vecchie che non hanno il set di istruzioni AVX2. ON
USE_OCC Impostarlo a ON OFF
USE_PYTHON Impostarlo a OFF ON
USE_SUPERBUILD Impostarlo a OFF ON
ZLIB_INCLUDE_DIR Percorso del componente di terze parti necessario zlib. Si consiglia di utilizzare la cartella come input in cui si trova il LibPack utilizzato. vuoto
ZLIB_LIBRARY_DEBUG Percorso del file ZLib zlibd.lib. Si trova nella sottocartella lib della cartella LibPack. vuoto
ZLIB_LIBRARY_RELEASE Il percorso del file ZLib zlib.lib. Si trova nella sottocartella lib della cartella LibPack. vuoto
  • Inoltre è necessario aggiungere una nuova voce CMake:

nome: CMAKE_DEBUG_POSTFIX, tipo: stringa, contenuto: _d
Ciò garantisce che i nomi dei file delle librerie di debug abbiano un nome diverso rispetto alle librerie di rilascio e non possano essere successivamente scambiati accidentalmente.

  • Premere il pulsante Configura in CMake per generare i file *.cmake.
  • Necessario solo se devono essere supportate CPU precedenti che non dispongono del set di istruzioni AVX2:
    • Cercare nella tua cartella di build Netgen il file netgen-targets.cmake e aprirlo con un editor di testo. Rimuovere l'impostazione ;/arch:AVX2 nell'opzione INTERFACE_COMPILE_OPTIONS.
    • Premere di nuovo il pulsante "Configure" in CMake.
  • Premere il pulsante "Generate" in CMake.
  • Aprire il progetto in Visual Studio e creare prima i target ALL_BUILD e poi INSTALL in modalità Release.
  • Ripetere la creazione dei due obiettivi nella modalità Debug.

Per compilare FreeCAD, utilizzando Netgen autocompilato, è necessario eseguire le seguenti operazioni:

  • Copiare tutte le cartelle da CMAKE_INSTALL_PREFIX nella tua cartella LibPack (sovrascrivere i file esistenti)

Riferimenti

Vedere anche



Esiste un contenitore Docker FreeCAD sperimentale, che viene testato per lo sviluppo di FreeCAD. Leggi di più su Compilazione con Docker

Panoramica

Nelle distribuzioni Linux recenti FreeCAD si compila facilmente, dato che di solito tutte le dipendenze sono fornite dal gestore di pacchetti. Fondamentalmente si tratta di eseguire 3 passaggi:

  1. Ottenere il codice sorgente di FreeCAD
  2. Ottenere le dipendenze (i pacchetti da cui dipende FreeCAD)
  3. Configurare con cmake e compilare con make

Qui, di seguito, troverete le spiegazioni dettagliate di tutto il processo, delle particolarità che si possono incontrare e alcuni script di compilazione automatica. Se trovate qualcosa di sbagliato o di non aggiornato nel testo successivo (le distribuzioni Linux cambiano spesso), o se utilizzate una distribuzione che non è elencata, discutete il problema nel forum, e aiutateci a correggerlo.

Flusso di lavoro generale per compilare FreeCAD da sorgente. Le dipendenze di terzi devono essere nel sistema, così come il codice sorgente di FreeCAD. CMake configura il sistema in modo che con una singola istruzione make venga compilato l'intero progetto.

Ottenere il codice sorgente

Git

Il modo migliore per ottenere il codice è clonare il repository Git. Per questo è necessario il programma git che può essere facilmente installato nella maggior parte delle distribuzioni Linux e può anche essere ottenuto dal sito web ufficiale.

Git può essere installato tramite il seguente comando:

sudo apt install git

Il seguente comando crea una copia locale della versione più recente del codice sorgente di FreeCAD in una nuova directory chiamata freecad-source.

git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git freecad-source

Per ulteriori informazioni sull'uso di Git e sul contributo del codice al progetto, vedere Gestione del codice sorgente.

Codice sorgente dall'archivio

In alternativa si può scaricare il sorgente dall' archivio, come file .zip o .tar.gz, e scompattarlo nella directory desiderata.

Ottenere le dipendenze

Per compilare FreeCAD si devono installare le dipendenze necessarie menzionate in Librerie di terze parti; i pacchetti che contengono queste dipendenze sono elencati di seguito per diverse distribuzioni Linux. Si noti che i nomi e la disponibilità delle librerie dipendono dalla propria particolare distribuzione; se la distribuzione è vecchia, alcuni pacchetti potrebbero non essere disponibili o avere un nome diverso. In questo caso, consultare la sezione distribuzioni precedenti e non convenzionali sottostante.

Dopo aver installato tutte le dipendenze, procedere con la compilazione di FreeCAD.

Notare che il codice sorgente di FreeCAD ha una dimensione di circa 500 MB; potrebbe essere tre volte più grande se clonate il repository Git con la sua intera cronologia delle modifiche. Ottenere tutte le dipendenze potrebbe richiedere il download di almeno 500 MB di nuovi file; quando questi file vengono decompressi potrebbero richiedere almeno 1500 MB di spazio. Attenzione anche che il processo di compilazione può generare fino a 1500 MB di file aggiuntivi mentre il sistema copia e modifica l'intero codice sorgente. Pertanto, assicurarsi di disporre di spazio libero sufficiente sul disco rigido, almeno 4 GB, durante il tentativo di compilazione.

Debian e Ubuntu

Sui sistemi basati su Debian (Debian, Ubuntu, Mint, ecc.) è abbastanza facile installare tutte le dipendenze necessarie. La maggior parte delle librerie sono disponibili tramite apt o il gestore di pacchetti Synaptic.

Se si ha già installato FreeCAD dai repository ufficiali, si possono installare le sue dipendenze di compilazione con questa singola riga di codice in un terminale:

sudo apt build-dep freecad

In alternativa, sostituire freecad con freecad-daily per installare le dipendenze di build per il ramo di sviluppo principale. Sarà necessario aggiungere i freecad-stable/freecad-daily PPA alle origini del software.

Tuttavia, se la versione di FreeCAD nei repository è vecchia, le dipendenze potrebbero essere quelle sbagliate per compilare una versione recente di FreeCAD. Pertanto, verificare di aver installato i seguenti pacchetti.

Questi pacchetti sono essenziali per il successo di qualsiasi tipo di compilazione:

  • build-essential, installa i compilatori C e C++, le librerie di sviluppo C e il programma make.
  • cmake, strumento essenziale per configurare il sorgente di FreeCAD. Si potrebbe anche voler installare cmake-gui e cmake-curses-gui per un'opzione grafica.
  • libtool, strumenti essenziali per produrre librerie condivise.
  • lsb-release, l'utilità standard di reporting di base è normalmente già installata in un sistema Debian e consente di distinguere programmaticamente tra un'installazione Debian pura o una variante, come Ubuntu o Linux Mint. Non rimuovere questo pacchetto, poiché molti altri pacchetti di sistema potrebbero dipendere da esso.

La compilazione di FreeCAD utilizza il linguaggio Python ed è utilizzato anche in fase di esecuzione come linguaggio di scripting. Se si sta usando una distribuzione basata su Debian, l'interprete Python è normalmente già installato.

  • python3
  • swig, lo strumento che crea interfacce tra codice C++ e Python.

Verificare di aver installato Python 3. Python 2 è diventato obsoleto nel 2019, quindi il nuovo sviluppo in FreeCAD non viene testato con questa versione del linguaggio.

Le librerie Boost devono essere installate:

  • libboost-dev
  • libboost-date-time-dev
  • libboost-filesystem-dev
  • libboost-graph-dev
  • libboost-iostreams-dev
  • libboost-program-options-dev
  • libboost-python-dev
  • libboost-regex-dev
  • libboost-serialization-dev
  • libboost-thread-dev

Le librerie di Coin devono essere installate:

  • libcoin80-dev, per Debian Jessie, Stretch, Ubuntu da 16.04 a 18.10, oppure
  • libcoin-dev, per Debian Buster, Ubuntu 19.04 e successivi, così come per Ubuntu 18.04/18.10 con il freecad-stable/freecad-daily PPA aggiunto alle sorgenti software.

Diverse librerie, che si occupano di matematica, superfici triangolate, ordinamento, mesh, visione artificiale, proiezioni cartografiche, visualizzazione 3D, sistema X11 Window, parsing XML e lettura di file Zip:

  • libeigen3-dev
  • libgts-bin
  • libgts-dev
  • libkdtree++-dev
  • libmedc-dev
  • libopencv-dev or libcv-dev
  • libproj-dev
  • libvtk7-dev or libvtk6-dev
  • libx11-dev
  • libxerces-c-dev
  • libyaml-cpp-dev
  • libzipios++-dev

Python 2 e Qt4

Non è raccomandato per le installazioni più recenti in quanto sia Python 2 che Qt4 sono obsoleti. A partire dalla versione 0.20, FreeCAD non li supporta più.

Per compilare FreeCAD per Debian Jessie, Stretch, Ubuntu 16.04, utilizzando Python 2 e Qt4, installare le seguenti dipendenze.

  • qt4-dev-tools
  • libqt4-dev
  • libqt4-opengl-dev
  • libqtwebkit-dev
  • libshiboken-dev
  • libpyside-dev
  • pyside-tools
  • python-dev
  • python-matplotlib
  • python-pivy
  • python-ply
  • python-pyside

Python 3 e Qt5

Per compilare FreeCAD per Debian Buster, Ubuntu 19.04 e versioni successive, nonché Ubuntu 18.04/18.10 con il freecad-stable/freecad-daily PPA aggiunto alle sorgenti software, installare le seguenti dipendenze.

  • qtbase5-dev
  • qttools5-dev
  • qt5-default (if compiling 0.20 on a machine that still has Qt4)
  • libqt5opengl5-dev
  • libqt5svg5-dev
  • qtwebengine5-dev
  • libqt5xmlpatterns5-dev
  • libqt5x11extras5-dev
  • libpyside2-dev
  • libshiboken2-dev
  • pyside2-tools
  • pyqt5-dev-tools
  • python3-dev
  • python3-matplotlib
  • python3-packaging
  • python3-pivy
  • python3-ply
  • python3-pyside2.qtcore
  • python3-pyside2.qtgui
  • python3-pyside2.qtsvg
  • python3-pyside2.qtwidgets
  • python3-pyside2.qtnetwork
  • python3-pyside2.qtwebengine
  • python3-pyside2.qtwebenginecore
  • python3-pyside2.qtwebenginewidgets
  • python3-pyside2.qtwebchannel
  • python3-pyside2uic

Kernel OpenCascade

Il kernel OpenCascade è la libreria grafica di base per creare forme 3D. Esiste in una versione ufficiale OCCT e in una versione comunitaria OCE. La versione community non è più consigliata perché obsoleta.

Per Debian Buster e Ubuntu 18.10 e successivi, così come Ubuntu 18.04 con freecad-stable/freecad-daily PPA aggiunto alle sorgenti software, installare i pacchetti ufficiali.

  • libocct*-dev
    • libocct-data-exchange-dev
    • libocct-draw-dev
    • libocct-foundation-dev
    • libocct-modeling-algorithms-dev
    • libocct-modeling-data-dev
    • libocct-ocaf-dev
    • libocct-visualization-dev
  • occt-draw

Per Debian Jessie, Stretch, Ubuntu 16.04 e versioni successive, installare i pacchetti della community edition.

  • liboce*-dev
    • liboce-foundation-dev
    • liboce-modeling-dev
    • liboce-ocaf-dev
    • liboce-ocaf-lite-dev
    • liboce-visualization-dev
  • oce-draw

È possibile installare le librerie singolarmente o utilizzando l'espansione dell'asterisco. Cambiare occ con oce se si vogliono installare le librerie della comunità.

sudo apt install libocct*-dev

Pacchetti opzionali

Opzionalmente si possono anche installare i seguenti pacchetti extra:

  • libsimage-dev, per fare in modo che Coin supporti formati di file immagine aggiuntivi.
  • doxygen e libcoin-doc (o libcoin80-doc per i sistemi precedenti), se si vuole generare la documentazione del codice sorgente.
  • libspnav-dev, per il supporto di dispositivi di input 3D, come "Space Navigator" o "Space Pilot" di 3Dconnexion.
  • checkinstall, se si intende registrare i file installati nel gestore pacchetti del tuo sistema, in modo da poterlo disinstallare in seguito.

Comando Singolo per Python 3 e Qt5

Richiede Pyside2 disponibile in Debian buster e nel freecad-stable/freecad-daily PPA|freecad-stable/freecad-daily PPA.

sudo apt install cmake cmake-gui libboost-date-time-dev libboost-dev libboost-filesystem-dev libboost-graph-dev libboost-iostreams-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-serialization-dev libboost-thread-dev libcoin-dev libeigen3-dev libgts-bin libgts-dev libkdtree++-dev libmedc-dev libocct-data-exchange-dev libocct-ocaf-dev libocct-visualization-dev libopencv-dev libproj-dev libpyside2-dev libqt5opengl5-dev libqt5svg5-dev qtwebengine5-dev libqt5x11extras5-dev libqt5xmlpatterns5-dev libshiboken2-dev libspnav-dev libvtk7-dev libx11-dev libxerces-c-dev libzipios++-dev occt-draw pyside2-tools python3-dev python3-matplotlib python3-packaging python3-pivy python3-ply python3-pyside2.qtcore python3-pyside2.qtgui python3-pyside2.qtsvg python3-pyside2.qtwidgets python3-pyside2.qtnetwork python3-pyside2.qtwebengine python3-pyside2.qtwebenginecore python3-pyside2.qtwebenginewidgets python3-pyside2.qtwebchannel python3-markdown python3-git python3-pyside2uic qtbase5-dev qttools5-dev swig libyaml-cpp-dev

NOTA: su alcune versioni di Ubuntu e alcune versioni di Qt, si riceverà un errore che python3-pyside2uic non può essere trovato - su quei sistemi puoi tranquillamente ometterlo. Su Ubuntu 20.04 si dovrà aggiungere pyqt5-dev-tools. Maggiori informazioni possono essere trovate in questa discussione del forum.

Comando Singolo per Python 2 e Qt4

Non raccomandato per le installazioni più recenti in quanto sia Python 2 che Qt4 sono obsoleti.

sudo apt install cmake debhelper dh-exec dh-python libboost-date-time-dev libboost-dev libboost-filesystem-dev libboost-graph-dev libboost-iostreams-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-serialization-dev libboost-thread-dev libcoin80-dev libeigen3-dev libgts-bin libgts-dev libkdtree++-dev libmedc-dev libocct-data-exchange-dev libocct-ocaf-dev libocct-visualization-dev libopencv-dev libproj-dev libpyside-dev libqt4-dev libqt4-opengl-dev libqtwebkit-dev libshiboken-dev libspnav-dev libvtk6-dev libx11-dev libxerces-c-dev libzipios++-dev lsb-release occt-draw pyside-tools python-dev python-matplotlib python-pivy python-ply swig

Gli utenti di Ubuntu 16.04 possono consultare anche la discussione sulla compilazione nel forum: Compilazione su Linux (Kubuntu): CMake non riesce a trovare VTK.

Raspberry Pi

Seguire gli stessi passaggi di Debian e Ubuntu.

Sono stati segnalati problemi durante il tentativo di compilazione in Raspberry PI OS a 32 bit con Python 3 e Qt5, ma la combinazione Python 3 e Qt4 sembra funzionare per le versioni precedenti di FreeCAD (con problemi minori).

Per le versioni più recenti di FreeCAD (>= 0.20) la compilazione con Py3/Qt5 va a buon fine se il sistema operativo installato è Raspberry Pi OS 64-bit o Ubuntu 20.04.

A causa di diversi problemi con Qt, in Ubuntu 20.04 non verranno trovati i normali strumenti PySide.

E: Unable to locate package python3-pyside2uic

In questo caso, si possono installare i pacchetti da PyQt e creare collegamenti simbolici agli strumenti necessari.

sudo apt-get install pyqt5-dev
sudo apt-get install pyqt5-dev-tools
cd /usr/bin/
ln -s pyrcc5 pyside2-rcc
ln -s pyuic5 pyside2-uic

Ora la compilazione può procedere.

cd freecad-build/
cmake ../freecad-source -DBUILD_QT5=ON -DPYTHON_EXECUTABLE=/usr/bin/python3 -DUSE_PYBIND11=ON
make -j2

L'opzione -j di make non dovrebbe essere maggiore di 3 perché il Raspberry Pi ha una memoria limitata. Ci vorranno diverse ore per compilare, quindi è meglio farlo durante la notte.

Per ulteriori informazioni, FreeCAD e Raspberry Pi 4.

Fedora

C'è un bug in cmake distribuito da Fedora 34/35 che fa sì che cmake non riesca a trovare le librerie opencascade. Questo può essere facilmente risolto apportando una piccola modifica al file cmake di livello superiore di opencascade installato su Fedora. Dettagli qui: https://bugzilla.redhat.com/show_bug.cgi?id=2083568.

Nella parte superiore del file OpenCASCADEConfig.cmake, modificare la seguente riga per utilizzare REAL_PATH(). Questa operazione corregge un bug introdotto dall'uso di un collegamento simbolico da /lib a /usr/lib di Fedora, che causa l'errore di cmake.

Questo file è solitamente installato in /usr/lib64/cmake/opencascade/OpenCASCADEConfig.cmake.

get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH)

cambiare in:

file (REAL_PATH ${OpenCASCADE_INSTALL_PREFIX} OpenCASCADE_INSTALL_PREFIX)

Questa banale modifica deve essere apportata all'interno della directory di build una volta che cmake è stato eseguito e ha avuto esito negativo. La riesecuzione di cmake rileverà quindi correttamente le librerie OCCT nel modo normale.

Fedora38/39

Ora installa Python 3.11. Ciò include un notevole cambiamento nel modo in cui Python si inizializza durante l'esecuzione di un programma. Di conseguenza FreeCAD non riesce a trovare OpenCamLib, il che significa che 3D Surface e Waterline non sono disponibili nell'ambiente CAM. Questo problema è stato risolto nel ramo master il 20 marzo 2024 (Pull request #13059).

Sono necessari i seguenti pacchetti:

  • gcc-c++ (or possibly another C++ compiler?)
  • cmake
  • doxygen
  • swig
  • gettext
  • dos2unix
  • desktop-file-utils
  • libXmu-devel
  • freeimage-devel
  • mesa-libGLU-devel
  • opencascade-devel
  • openmpi-devel
  • python3
  • python3-devel
  • python3-pyside2
  • python3-pyside2-devel
  • pyside2-tools
  • boost-devel
  • tbb-devel
  • eigen3-devel
  • qt-devel
  • qt5-qtwebengine-devel
  • qt5-qtxmlpatterns
  • qt5-qtxmlpatterns-devel
  • qt5-qtsvg-devel
  • qt5-qttools-static
  • ode-devel
  • xerces-c
  • xerces-c-devel
  • opencv-devel
  • smesh-devel
  • Coin3
  • Coin3-devel
  • yaml-cpp

(Aprile 2021, sono disponibili Coin4 e Coin4-devel) (se coin2 è l'ultimo disponibile per la tua versione di Fedora, usare i packages di http://www.zultron.com/rpm-repo/)

  • SoQt-devel
  • freetype
  • freetype-devel
  • vtk
  • vtk-devel
  • med
  • med-devel

E facoltativamente:

  • libspnav-devel (per il supporto di dispositivi 3Dconnexion come Space Navigator o Space Pilot)
  • python3-pivy ( https://bugzilla.redhat.com/show_bug.cgi?id=458975 Pivy non è obbligatorio ma necessario per l'ambiente Draft)
  • python3-markdown (affinché Addon Manager visualizzi il markdown nativo)
  • python3-GitPython (affinché Addon Manager utilizzi git per il checkout e l'aggiornamento di workbench e macro)

Per installare tutte le dipendenze contemporaneamente (testato su fedora 36 e 37):

sudo dnf install gcc-c++ cmake doxygen swig gettext dos2unix desktop-file-utils libXmu-devel freeimage-devel mesa-libGLU-devel opencascade-devel openmpi-devel python3 python3-devel python3-pyside2 python3-pyside2-devel pyside2-tools boost-devel tbb-devel eigen3-devel qt-devel qt5-qtwebengine-devel qt5-qtxmlpatterns qt5-qtxmlpatterns-devel qt5-qtsvg-devel qt5-qttools-static ode-devel xerces-c xerces-c-devel opencv-devel smesh-devel Coin3 Coin3-devel SoQt-devel freetype freetype-devel vtk vtk-devel med med-devel libspnav-devel python3-pivy python3-markdown python3-GitPython yaml-cpp

Gentoo

Il modo più semplice per verificare quali pacchetti sono necessari per compilare FreeCAD è verificare tramite portage:

emerge -pv freecad

Questo dovrebbe fornire un bel elenco di pacchetti extra che devi installare sul tuo sistema.

Se FreeCAD non è disponibile su portage, è disponibile su waebbl overlay. Il tracker dei problemi sull'overlay waebbl Github può aiutare a navigare attraverso alcuni problemi, che si potrebbero incontrare. L'overlay fornisce freecad-9999, che si può scegliere di compilare o semplicemente usare per ottenere le dipendenze.

layman -a waebbl

openSUSE

Tumbleweed

I seguenti comandi installeranno i pacchetti richiesti per la creazione di FreeCAD con Qt5 e Python 3.

zypper in --no-recommends -t pattern devel_C_C++ devel_qt5

zypper in libqt5-qtbase-devel libqt5-qtsvg-devel libqt5-qttools-devel boost-devel swig libboost_program_options-devel libboost_mpi_python3-devel libboost_system-devel libboost_program_options-devel libboost_regex-devel libboost_python3-devel libboost_thread-devel libboost_system-devel libboost_headers-devel libboost_graph-devel python3 python3-devel python3-matplotlib python3-matplotlib-qt5 python3-pyside2 python3-pyside2-devel python3-pivy gcc gcc-fortran cmake occt-devel libXi-devel opencv-devel libxerces-c-devel Coin-devel SoQt-devel freetype2-devel eigen3-devel libode6 vtk-devel libmed-devel hdf5-openmpi-devel openmpi2-devel netgen-devel freeglut-devel libspnav-devel f2c doxygen dos2unix glew-devel yaml-cpp

Il seguente comando installerà Qt Creator e GNU Project Debugger.

zypper in libqt5-creator gdb

Se mancano dei pacchetti, si può controllare il file Tumbleweed "FreeCAD.spec" su Open Build Service.

Inoltre, controllare se ci sono patch che devono essere applicate (come 0001 -find-openmpi2-include-files.patch).

Leap

Se c'è una differenza tra i pacchetti disponibili su Tumbleweed e Leap, allora si può leggere il Leap "FreeCAD.spec " su Open Build Service per determinare i pacchetti richiesti.

Vedere la guida piano_jonas unofficial "Compile On openSUSE".

Arch Linux

Ci sarà bisogno delle seguenti librerie dai repository ufficiali:

  • boost
  • cmake
  • coin
  • curl
  • desktop-file-utils
  • eigen
  • gcc-fortran
  • git
  • glew
  • hicolor-icon-theme
  • jsoncpp
  • libspnav
  • med
  • nlohmann-json
  • opencascade
  • pyside2-tools
  • pyside2
  • python-matplotlib
  • python-netcdf4
  • python-packaging
  • python-pivy
  • qt5-svg
  • qt5-tools
  • qt5-webengine
  • shared-mime-info
  • shiboken2
  • swig
  • utf8cpp
  • verdict
  • xerces-c
  • yaml-cpp
sudo pacman -S --needed boost cmake coin curl desktop-file-utils eigen gcc-fortran git glew hicolor-icon-theme jsoncpp libspnav med nlohmann-json opencascade pyside2-tools pyside2 python-matplotlib python-netcdf4 python-packaging python-pivy qt5-svg qt5-tools qt5-webengine shared-mime-info shiboken2 swig utf8cpp xerces-c yaml-cpp

Note: Since version 5.0.1 of the openmpi package the binary libmpi_cxx.so stopped being shipped, this breaks the compilation with the current CMake process. To fix this you need to downgrade the package, see this forum post.

Distribuzioni precedenti e non convenzionali

Su altre distribuzioni, abbiamo pochissimi feedback dagli utenti, quindi potrebbe essere più difficile trovare i pacchetti richiesti.

Inizialmente provare ad individuare le librerie richieste menzionate in librerie di terze parti nel tuo gestore di pacchetti. Attenzione che alcuni di essi potrebbero avere un nome di pacchetto leggermente diverso; cerca name, ma anche libname, name-dev, name-devel e simili. Se ciò non fosse possibile, provare a compilare tu stesso quelle librerie.

FreeCAD richiede la versione del compilatore GNU g++ uguale o superiore alla 3.0.0, poiché FreeCAD è scritto principalmente in C++. Durante la compilazione vengono eseguiti alcuni script Python, quindi l'interprete Python deve funzionare correttamente. Per evitare qualsiasi problema con il linker è anche una buona idea avere i percorsi della libreria nella variabile LD_LIBRARY_PATH o nel file ld.so.conf. Questo è già presente nelle moderne distribuzioni Linux, ma potrebbe essere necessario impostarlo in quelle più vecchie.

Pivy

Pivy (Python wrapper per Coin3d) non è necessario per compilare FreeCAD o per avviarlo, ma è necessario come dipendenza di runtime per l'ambiente Draft. Se non si utilizzerà questo ambiente di lavoro, non ci sarà bisogno di Pivy. Tuttavia, si noti che Draft Workbench è utilizzato internamente da altri workbench, come Arch e BIM, quindi Pivy deve essere installato anche per poter utilizzare questi workbench.

Entro novembre 2015 la versione obsoleta di Pivy inclusa nel codice sorgente di FreeCAD non verrà più compilata su molti sistemi. Questo non dovrebbe essere un grosso problema, poiché normalmente si dovrebbe ottenere Pivy dal gestore dei pacchetti della tua distribuzione; se non si riesce a trovare Pivy, si potrebbe doverlo compilare da solo, vedere Istruzioni per la compilazione di Pivy.

Simboli di Debug

Per risolvere i problemi di crash in FreeCAD, è utile disporre dei simboli di debug di importanti librerie di dipendenze come Qt. A tal fine, si provi ad installare i pacchetti di dipendenza, che terminano con -dbg, -dbgsym, -debuginfo o simili, a seconda della propria distribuzione Linux.

Per Ubuntu, potrebbe essere necessario abilitare repository speciali per poter vedere e installare questi pacchetti di debug con il gestore pacchetti. Vedere Pacchetti di simboli di debug per ulteriori informazioni.

Compilare FreeCAD

La compilazione di FreeCAD 0.20 richiede almeno Python 3.6 e Qt 5.9.

FreeCAD utilizza CMake come sistema di compilazione principale, poiché è disponibile su tutti i principali sistemi operativi. La compilazione con CMake è solitamente molto semplice e avviene in due passaggi.

  1. CMake verifica che tutti i programmi e le librerie necessari siano presenti sul tuo sistema e genera un Makefile configurato per il secondo passaggio. FreeCAD ha diverse opzioni di configurazione tra cui scegliere, ma viene fornito con impostazioni predefinite ragionevoli. Alcune alternative sono dettagliate di seguito.
  2. La compilazione stessa, che viene eseguita con il programma make e che genera gli eseguibili di FreeCAD.

Poiché FreeCAD è un'applicazione di grandi dimensioni, la compilazione dell'intero codice sorgente può richiedere da 10 minuti a un'ora, a seconda della CPU e del numero di core della CPU utilizzati per la compilazione.

Compilazione

Per compilare è sufficiente creare una directory di build, build. Quindi da questa directory di build puntare cmake alla cartella di origine corretta. Puoi usare cmake-gui o ccmake invece di cmake anche nelle istruzioni seguenti. Una volta che cmake ha finito di configurare l'ambiente, usare make per avviare la compilazione vera e propria.

# from your freecad source folder:
mkdir build
cd build
cmake ../
make -j$(nproc --ignore=2)

L'opzione -j di make controlla quanti lavori (file) vengono compilati in parallelo. Il programma nproc stampa il numero di core della CPU nel tuo sistema; utilizzandolo insieme all'opzione -j si può scegliere di processare tanti file quanti sono i core, in modo da velocizzare la compilazione complessiva del programma. Nell'esempio sopra, si utilizzeranno tutti i core del sistema tranne due; questo manterrà il tuo computer reattivo per altri usi mentre la compilazione procede in background. L'eseguibile di FreeCAD apparirà infine nella directory build/bin. Vedere anche Velocizzare la compilazione per migliorare la velocità di compilazione.

Risoluzione dei problemi di cmake

Se si è già eseguita una build e si rimane bloccati su una dipendenza, che non viene riconosciuta o non sembra essere risolta, si provi quanto segue:

  • Eliminare il contenuto della directory di build prima di eseguire nuovamente cmake. FreeCAD è un obiettivo in rapido movimento, si potrebbe incappare su informazioni cmake memorizzate nella cache che puntano a una versione precedente rispetto a quella che il nuovo head del repository può utilizzare. Svuotare la cache può consentire a cmake di recuperare e riconoscere la versione effettivamente necessaria.
  • Se cmake segnala la mancanza di un file specifico, utilizzare uno strumento come "apt-file search", o il suo equivalente in altri sistemi di pacchetti, per scoprire a quale pacchetto appartiene quel file ed installarlo. Tenere presente, che probabilmente si avrà bisogno della versione -dev del pacchetto,che contiene i file di intestazione o di configurazione necessari a FreeCAD per utilizzare il pacchetto.

Compilazione con GNU libc 2.34 e successivi

GNU libc 2.34 introduce una modifica alla libreria che può causare il fallimento delle build su alcuni sistemi Linux con un errore come:

No rule to make target '/usr/lib/x86_64-linux-gnu/libdl.so

Per risolvere questo problema, è necessario creare manualmente un collegamento simbolico dal libdl.so.* installato nel sistema (ora vuoto) alla posizione indicata dal compilatore, che sta cercando il file. Ad esempio (se la copia effettivamente installata di libdl.so sul tuo sistema è /usr/lib/x86_64-linux-gnu/libdl.so.2):

sudo ln -s /usr/lib/x86_64-linux-gnu/libdl.so.2 /usr/lib/x86_64-linux-gnu/libdl.so

Adattare il comando alla struttura del sistema cercando libdl.so* e collegandolo alla posizione appropriata.

Come riparare la directory del codice sorgente

Se si è accidentalmente eseguita una compilazione all'interno della directory del codice sorgente o si sono aggiunti strani file e si desidera ripristinare i contenuti solo nel codice sorgente originale, si possono eseguire i seguenti passaggi.

> .gitignore
git clean -df
git reset --hard HEAD

La prima riga cancella il file .gitignore. Ciò garantisce che i seguenti comandi di pulizia e ripristino influiranno su tutto nella directory e non ignoreranno gli elementi che corrispondono alle espressioni in .gitignore. La seconda riga elimina tutti i file e le directory, che non sono tracciati dal repository git; quindi l'ultimo comando ripristinerà qualsiasi modifica ai file tracciati, incluso il primo comando che ha cancellato il file .gitignore.

Se non si cancella la directory di origine, le successive esecuzioni di cmake potrebbero non acquisire nuove opzioni per il sistema se il codice cambia.

Configurazione

Passando opzioni diverse a cmake, si può modificare il modo in cui FreeCAD viene compilato. La sintassi è la seguente.

cmake -D <var>:<type>=<value> $SOURCE_DIR

Dove $SOURCE_DIR è la directory che contiene il codice sorgente. <type> può essere omesso nella maggior parte dei casi. Lo spazio dopo l'opzione -D può anche essere omesso.

Ad esempio, per evitare di creare l'Ambiente FEM

cmake -D BUILD_FEM:BOOL=OFF ../freecad-source
cmake -DBUILD_FEM=OFF ../freecad-source

Tutte le possibili variabili sono elencate nel file InitializeFreeCADBuildOptions.cmake, che si trova nella directory cMake/FreeCAD_Helpers. In questo file, cercare la parola option per arrivare alle variabili, che possono essere impostate e vedere i loro valori predefiniti.

# ==============================================================================
# =================   All the options for the build process    =================
# ==============================================================================

option(BUILD_FORCE_DIRECTORY "The build directory must be different to the source directory." OFF)
option(BUILD_GUI "Build FreeCAD Gui. Otherwise you have only the command line and the Python import module." ON)
option(FREECAD_USE_EXTERNAL_ZIPIOS "Use system installed zipios++ instead of the bundled." OFF)
option(FREECAD_USE_EXTERNAL_SMESH "Use system installed smesh instead of the bundled." OFF)
...

Come alternativa, utilizzare il comando cmake -LH per elencare la configurazione corrente, e quindi tutte le variabili, che possono essere modificate. Si può anche installare ed utilizzare cmake-gui per avviare un'interfaccia grafica, che mostra tutte le variabili che possono essere modificate. Nelle sezioni successive si elencano alcune delle opzioni più rilevanti, che si potrebbe voler utilizzare.

Per una compilazione di Debug

Creare una build Debug per risolvere i problemi di crash in FreeCAD. Attenzione che con questa build l'Ambiente Sketcher diventa molto lento quando sono presenti schizzi complessi.

cmake -DPYTHON_EXECUTABLE=/usr/bin/python3 -DCMAKE_BUILD_TYPE=Debug ../freecad-source

Per una build di rilascio

Creare una build Release per testare il codice, che non vada in crash. Una build Release verrà eseguita molto più velocemente di una build Debug.

cmake -DPYTHON_EXECUTABLE=/usr/bin/python3 -DCMAKE_BUILD_TYPE=Release ../freecad-source

Compilare per Python 3 e Qt5

Il supporto per Python 2 e Qt4 è stato rimosso in FreeCAD 0.20 e non è necessario abilitare esplicitamente Qt5 e Python 3 se si compilano le versioni più recenti. Il supporto Qt6 è attualmente in fase di sviluppo, ma non funziona ancora. A meno che non si preveda di assistere nello sforzo di migrazione Qt6, FREECAD_QT_VERSION dovrebbe essere lasciato su "Auto" (impostazione predefinita) o impostato esplicitamente su "5".

Per la 0.20 e 0.21_dev:

cmake ../freecad-source

Si noti che quando si passa dalla build 0.20 a quella 0.21_dev, potrebbe essere necessario eliminare CMakeCache.txt prima di eseguire cmake.

Compilazione per una specifica versione di Python

Se l'eseguibile python predefinito nel tuo sistema è un collegamento simbolico a Python 2, cmake tenterà di configurare FreeCAD per questa versione. Si deve quindi scegliere un'altra versione di Python dando il percorso a uno specifico eseguibile:

cmake -DPYTHON_EXECUTABLE=/usr/bin/python3 ../freecad-source

Se non dovesse funzionare, potrebbe essere necessario definire variabili aggiuntive, che puntano alle librerie Python desiderate e includere le directory:

cmake -DPYTHON_EXECUTABLE=/usr/bin/python3.6 \
    -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m \
    -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so \
    -DPYTHON_PACKAGES_PATH=/usr/lib/python3.6/site-packages/ \
    ../freecad-source

È possibile avere diverse versioni indipendenti di Python nello stesso sistema, quindi le posizioni e i numeri di versione dei tuoi file Python dipenderanno dalla tua particolare distribuzione Linux. Usare python3 -V per visualizzare la versione di Python che si sta usando attualmente; sono necessari solo i primi due numeri; ad esempio, se il risultato è Python 3.6.8, è necessario specificare le directory relative alla versione 3.6. Se non si conoscono le directory giuste, provare a cercarle con il comando locate.

locate python3.6

Si può usare python3 -m site in un terminale per determinare la directory site-packages, o dist-packages per i sistemi Debian.

Alcuni componenti di FreeCAD, come PySide, provano a rilevare automaticamente la versione più recente di Python installata sul tuo sistema, che potrebbe fallire se è diversa da quella che si è inserito sopra. L'aggiunta della seguente opzione cMake potrebbe risolvere il problema:

-DPython3_FIND_STRATEGY=LOCATION

Compilare con Qt Creator per Python 3 e Qt5

1. Avviare Qt Creator.

2. Cliccare su Apri progetto.

3. Passare alla directory in cui si trova il codice sorgente, freecad-source/, e scegliere il file CMakeLists.txt più in alto.

4. Selezionando il file, si eseguirà automaticamente cmake su di esso, ma potrebbe fallire se le opzioni appropriate non sono impostate correttamente.

5. Andare a Projects → Build & Run → Imported Kit → Build → Build Settings → CMake. Impostare la directory di compilazione appropriata, build/.

6. Impostare le variabili appropriate nella finestra di dialogo Valore-chiave, di tipo String e Bool.

PYTHON_EXECUTABLE=/usr/bin/python3

7. Se le variabili non caricano correttamente il progetto, potrebbe essere necessario andare su Projects → Manage Kits → Kits → Default (or Imported Kit or similar) → CMake Configuration. Quindi premere Change e aggiungere la configurazione appropriata come descritto sopra. Potrebbe essere necessario aggiungere più variabili sui percorsi Python, se il sistema Python non viene trovato.

PYTHON_EXECUTABLE:STRING=/usr/bin/python3.7
PYTHON_INCLUDE_DIR:STRING=/usr/include/python3.7m
PYTHON_LIBRARY:STRING=/usr/lib/x86_64-linux-gnu/libpython3.7m.so
PYTHON_PACKAGES_PATH:STRING=/usr/lib/python3.7/site-packages

7.1. Premere Apply, quindi OK.

7.2. Assicurarsi che il resto delle opzioni siano impostate correttamente, ad esempio, Qt version dovrebbe essere una versione presente installata nel sistema, come Qt 5.9.5 in PATH (qt5).

Premere Apply, quindi OK per chiudere la configurazione.

Il programma cmake dovrebbe essere eseguito di nuovo automaticamente e dovrebbe riempire l'intera finestra di dialogo Valore-chiave con tutte le variabili, che possono essere configurate.

8. Andare su Projects → Build & Run → Imported Kit → Run → Run Settings → Run → Run Configuration e scegliere FreeCADMain per compilare la versione grafica di FreeCAD, o FreeCADMainCMD per compilare solo la versione della riga di comando.

9. Infine, andare al menu Build → Crea progetto "FreeCAD". Se si tratta di una nuova compilazione, dovrebbero essere necessari diversi minuti, o addirittura ore, a seconda del numero di processori disponibili.

Plug-in Qt designer

Se si desidera sviluppare codice Qt per FreeCAD, ci sarà bisogno del plug-in Qt Designer, che fornisce tutti i widget personalizzati di FreeCAD.

Andare in una directory ausiliaria del codice sorgente, eseguire qmake con il file di progetto indicato, per creare un Makefile; quindi esegui make per compilare il plugin.

cd freecad-source/src/Tools/plugins/widget
qmake plugin.pro
make

Se si sta compilando per Qt5, assicurarsi che il binario qmake sia quello per questa versione, in modo che il risultante Makefile contenga le informazioni necessarie per Qt5.

cd freecad-source/src/Tools/plugins/widget
$QT_DIR/bin/qmake plugin.pro
make

dove $QT_DIR è la directory, che memorizza le librerie binarie Qt, ad esempio /usr/lib/x86_64-linux-gnu/qt5.

La libreria creata è libFreeCAD_widgets.so, che deve essere copiata in $QT_DIR/plugins/designer.

sudo cp libFreeCAD_widgets.so $QT_DIR/plugins/designer

Pivy esterno o interno

In precedenza, era inclusa una versione di Pivy nel codice sorgente di FreeCAD (interno). Se si desiderava usare la copia del tuo sistema di Pivy (esterna), si doveva usare -DFREECAD_USE_EXTERNAL_PIVY=1.

L'utilizzo di Pivy esterno è diventato l'impostazione predefinita durante lo sviluppo di FreeCAD 0.16, pertanto questa opzione non deve più essere impostata manualmente.

Documentazione Doxygen

Se si ha installato Doxygen si può compilare la documentazione del codice sorgente. Vedere la documentazione del codice sorgente per le istruzioni.

Informazioni aggiuntive

Il codice sorgente di FreeCAD è molto vasto e con CMake è possibile configurare molte opzioni. Imparare a utilizzare completamente CMake può essere utile per scegliere le opzioni giuste per le tue esigenze particolari.

Creazione di un pacchetto debian

Se si ha intenzione di creare un pacchetto Debian dai sorgenti, si devono prima installare alcuni pacchetti:

sudo apt install dh-make devscripts lintian

Andare nella directory di FreeCAD e chiamare

debuild

Una volta compilato il pacchetto, si può usare lintian per controllare se il pacchetto contiene errori

lintian freecad-package.deb

Pacchetto *.deb con checkinstall

Lo script Debian checkinstall permette di creare un pacchetto *.deb che può essere installato e rimosso con i comandi standard dpkg. Potrebbe essere necessario installarlo prima (su Ubuntu usare sudo apt install checkinstall). È interattivo e richiede le informazioni richieste fornendo impostazioni predefinite utili. Durante il processo viene installato il pacchetto e vengono creati un file *.deb e un archivio di backup.

È una buona idea definire un nome e una breve descrizione per il pacchetto. Il nome deve essere inserito per disinstallarlo nuovamente e la descrizione sarà elencata da dpkg -l. Il nome predefinito "build" non è molto informativo.

Esempio:

cd freecad-source/build
cmake ..
make
sudo checkinstall                                  # e.g. name=freecad-test1

Il risultato è un file *.deb nella cartella build. checkinstall installerà la build per impostazione predefinita. Ecco come installarlo o disinstallarlo:

cd freecad-source/build
ls | grep freecad
        freecad-test1_20220814-1_amd64.deb
sudo dpkg -i freecad-test1_20220814-1_amd64.deb   # install
dkpg -l | grep freecad                            # find by name
sudo dpkg -r freecad-test1                        # uninstall by name

Aggiornare il codice sorgente

Il sistema CMake permette di aggiornare in modo intelligente il codice sorgente, e ricompilare solo ciò che è cambiato, rendendo più veloci le compilazioni successive.

Spostarsi nella posizione in cui è stato scaricato per la prima volta il codice sorgente di FreeCAD ed estrarre il nuovo codice:

cd freecad-source
git pull

Quindi spostarsi nella directory di build in cui il codice è stato compilato inizialmente ed eseguire cmake, specificando la directory presente (indicata da un punto); quindi attivare la ricompilazione con make.

cd ../freecad-build
cmake .
make -j$(nproc --ignore=2)

Disinstallazione del codice sorgente

Nel caso in cui il codice sorgente compilato sia stato installato con sudo make install (per Debian) i file sono stati copiati nella cartella /usr/local in diverse sottocartelle. Per la disinstallazione è possibile utilizzare il file install_manifest.txt. È stato creato nella cartella build durante la compilazione e contiene tutti i file installati. Finché esiste questo file, l'installazione può essere disinstallata.

cd freecad-source/freecad-build
xargs sudo rm < install_manifest.txt

Risoluzione dei problemi

Per sistemi a 64 bit

Quando si compila FreeCAD per 64 bit, esiste un problema noto con il pacchetto OpenCASCADE (OCCT) a 64 bit. Per far funzionare correttamente FreeCAD, potrebbe essere necessario eseguire lo script configure e impostare ulteriori CXXFLAGS:

./configure CXXFLAGS="-D_OCC64"

Per i sistemi basati su Debian questa opzione non è necessaria quando si usano i pacchetti OpenCASCADE precompilati, perché questi impostano internamente il CXXFLAGS appropriato.

Script di compilazione automatica

Ecco tutto quello che serve per una compilazione completa di FreeCAD. Si tratta di uno script di approccio e funziona su una distro di recente installazione. I comandi richiedono la password di root per l'installazione dei pacchetti e dei nuovi repository online. Questi script dovrebbero funzionare su versioni a 32 e 64 bit. Sono stati scritti per diverse versioni, e dovrebbero essere eseguibili anche su versioni successive, con o senza grandi cambiamenti.

Se si ha uno script di questo tipo per la propria distribuzione preferita, lo si discuta sul forum di FreeCAD in modo che possa essere incorporato.

Ubuntu

Questi script forniscono un modo affidabile, per installare il set corretto di dipendenze necessarie per creare ed eseguire FreeCAD su Ubuntu. Fanno uso degli archivi dei pacchetti personali di Ubuntu (PPA) e dovrebbero funzionare su qualsiasi versione di Ubuntu considerata dal PPA. Il PPA freecad-daily contempla le versioni recenti di Ubuntu, mentre il +archive/ubuntu/freecad-stable freecad-stable PPA si rivolge alle versioni ufficialmente supportate di Ubuntu.

Questo script installa l'istantanea compilata quotidianamente di FreeCAD e le sue dipendenze. Aggiunge il repository giornaliero, ottiene le dipendenze per creare questa versione e installa i pacchetti richiesti. Successivamente procede a inserire il codice sorgente in una directory particolare, crea una directory di compilazione e vi si modifica, configura l'ambiente di compilazione con cmake e infine compila l'intero programma con make. Salvare lo script in un file, renderlo eseguibile ed eseguirlo, ma non usare sudo; i privilegi di superutente verranno richiesti solo per i comandi selezionati.

#!/bin/sh
sudo add-apt-repository --enable-source ppa:freecad-maintainers/freecad-daily && sudo apt-get update
sudo apt-get build-dep freecad-daily
sudo apt-get install freecad-daily

git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git freecad-source
mkdir freecad-build
cd freecad-build
cmake -DPYTHON_EXECUTABLE=/usr/bin/python3 -DFREECAD_USE_PYBIND11=ON ../freecad-source
make -j$(nproc --ignore=2)

Se lo si desidera, si può disinstallare la versione precompilata di FreeCAD (freecad-daily) lasciando le dipendenze in posizione, tuttavia, lasciare questo pacchetto installato consentirà al gestore di pacchetti di mantenere aggiornate anche le sue dipendenze; questo è utile soprattutto se si intende seguire lo sviluppo di FreeCAD e aggiornare e compilare costantemente i sorgenti dal repository Git.

Lo script precedente presuppone, che si voglia compilare l'ultima versione di FreeCAD, quindi che si stia usando il repository "daily", per ottenere le dipendenze. Tuttavia, si può invece ottenere le dipendenze di build della versione "stabile" per l'attuale versione di Ubuntu. In tal caso, sostituire la parte superiore dello script precedente con le seguenti istruzioni. Per Ubuntu 12.04, omettere --enable-source dal comando.

#!/bin/sh
sudo add-apt-repository --enable-source ppa:freecad-maintainers/freecad-stable && sudo apt-get update
sudo apt-get build-dep freecad
sudo apt-get install libqt5xmlpatterns5-dev   # Needed for 0.20; should go away on next packaging update 
sudo apt-get install freecad

Una volta installato il pacchetto freecad dal repository freecad-stable, questo sostituirà l'eseguibile di FreeCAD disponibile dal repository Universe Ubuntu. L'eseguibile sarà chiamato semplicemente freecad, e non freecad-stable.

openSUSE

Non sono necessari repository esterni per compilare FreeCAD. Tuttavia, esiste un'incompatibilità con python3-devel, che deve essere rimossa. FreeCAD può essere compilato da GIT

# install needed packages for development
sudo zypper install gcc cmake OpenCASCADE-devel libXerces-c-devel \
python-devel libqt4-devel python-qt4 Coin-devel SoQt-devel boost-devel \
libode-devel libQtWebKit-devel libeigen3-devel gcc-fortran git swig
 
# create new dir, and go into it
mkdir FreeCAD-Compiled 
cd FreeCAD-Compiled
 
# get the source
git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git free-cad
 
# Now you will have a subfolder in this location called free-cad. It contains the source
 
# make another dir for compilation, and go into it
mkdir FreeCAD-Build1
cd FreeCAD-Build1 
 
# build configuration 
cmake ../free-cad
 
# build FreeCAD
make
 
# test FreeCAD
cd bin
./FreeCAD -t 0

Dato che si sta usando git, la prossima volta che si desidera compilare non è necessario clonare tutto, basta estrarre da git e ricompilare

# go into free-cad dir created earlier
cd free-cad
 
# pull
git pull
 
# get back to previous dir
cd ..
 
# Now repeat last few steps from before.
 
# make another dir for compilation, and go into it
mkdir FreeCAD-Build2
cd FreeCAD-Build2
 
# build configuration 
cmake ../free-cad
 
# build FreeCAD
# Note: to speed up build use all CPU cores: make -j$(nproc)
make
 
# test FreeCAD
cd bin
./FreeCAD -t 0

Debian Squeeze

# get the needed tools and libs
sudo apt-get install build-essential python libcoin60-dev libsoqt4-dev \
libxerces-c2-dev libboost-dev libboost-date-time-dev libboost-filesystem-dev \
libboost-graph-dev libboost-iostreams-dev libboost-program-options-dev \
libboost-serialization-dev libboost-signals-dev libboost-regex-dev \
libqt4-dev qt4-dev-tools python2.5-dev \
libsimage-dev libopencascade-dev \
libsoqt4-dev libode-dev subversion cmake libeigen2-dev python-pivy \
libtool autotools-dev automake gfortran
 
# checkout the latest source
git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git freecad
 
# go to source dir
cd freecad
 
# build configuration 
cmake .
 
# build FreeCAD
# Note: to speed up build use all CPU cores: make -j$(nproc)
make
 
# test FreeCAD
cd bin
./FreeCAD -t 0

Fedora 27/28/29

Postato dall'utente [PrzemoF] nel forum.

#!/bin/bash

ARCH=$(arch)

MAIN_DIR=FreeCAD
BUILD_DIR=build

#FEDORA_VERSION=27
#FEDORA_VERSION=28
FEDORA_VERSION=29

PACKAGES="gcc cmake gcc-c++ boost-devel zlib-devel swig eigen3 qt-devel \
shiboken shiboken-devel pyside-tools python-pyside python-pyside-devel xerces-c \
xerces-c-devel OCE-devel smesh graphviz python-pivy python-matplotlib tbb-devel \
 freeimage-devel Coin3 Coin3-devel med-devel vtk-devel"

FEDORA_29_PACKAGES="boost-python2 boost-python3 boost-python2-devel boost-python3-devel"

if [ "$FEDORA_VERSION" = "29" ]; then
    PACKAGES="$PACKAGES $FEDORA_29_PACKAGES"
fi

echo "Installing packages required to build FreeCAD"
sudo dnf -y install $PACKAGES
cd ~
mkdir $MAIN_DIR || { echo "~/$MAIN_DIR already exist. Quitting.."; exit; }
cd $MAIN_DIR
git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git
mkdir $BUILD_DIR || { echo "~/$BUILD_DIR already exist. Quitting.."; exit; }
cd $BUILD_DIR
cmake ../FreeCAD 
make -j$(nproc)

Arch usando AUR

Arch User Repository (AUR) è una raccolta di ricette create dagli utenti per creare pacchetti, che non sono ufficialmente supportati dai manutentori della distribuzione/comunità. Di solito sono sicuri. Puoi vedere chi mantiene il pacchetto e per quanto tempo lo ha fatto. Si consiglia di controllare i file di compilazione. In quest'area sono disponibili anche software non open source, anche se mantenuti dalla società proprietaria ufficiale.

Prerequisito: git

Passaggi:

  1. Aprire un terminale. Facoltativamente, creare una directory, ad es. mkdir git. Opzionalmente cambiare directory es. cd git.
  2. Clonare il repository AUR: git clone https://aur.archlinux.org/freecad-git.git
  3. Inserire la cartella del repository AUR: cd freecad-git
  4. Compilare, usando Arch makepkg : makepkg -s. Il flag -s o --syncdeps installerà anche le dipendenze richieste.
  5. Installare il pacchetto creato: makepkg --install o fare doppio clic su pkgname-pkgver.pkg.tar.xz all'interno del browser dei file.

Per aggiornare FreeCAD all'ultima build basta ripetere dal passaggio 3. Aggiornare il repository AUR quando c'è qualche modifica sostanziale nella ricetta o nuove funzionalità, usando git checkout -f all'interno della cartella.



Esiste un contenitore Docker FreeCAD sperimentale che viene testato per lo sviluppo di FreeCAD. Ulteriori informazioni su Compile on Docker

Presentazione

Questa pagina descrive come compilare il codice sorgente di FreeCAD su MacOS. Per altre piattaforme, vedere la pagina Compilare FreeCAD.

Queste istruzioni sono state testate su macOS Catalina con XCode 11.6 standard. È noto che funzioni su macOS BigSur Beta con XCode 12.0 beta. Se si prevede di utilizzare XCode Beta, assicurarsi di scaricare il componente aggiuntivo degli strumenti della riga di comando tramite un pacchetto dmg, per risolvere alcuni problemi di dipendenza libz.

Questa pagina funge da punto di partenza rapido e non intende essere esaustiva per quanto riguarda la descrizione di tutte le opzioni di build disponibili.

Se si vuole solo valutare l'ultima build pre-rilascio di FreeCAD, si possono scaricare i binari pre-compilati da qui.

Installare i prerequisiti

Il seguente software deve essere installato per supportare il processo di compilazione.

Homebrew Package Manager

Homebrew è un gestore di pacchetti basato sulla riga di comando per macOS. La Homebrew main page fornisce una riga di comando per l'installazione, che si deve semplicemente incollare in una finestra di terminale.

CMake

CMake è uno strumento di compilazione che genera una configurazione di compilazione basata sulle variabili specificate. Quindi si esegue il comando 'make' per creare effettivamente quella configurazione. La versione da riga di comando di CMake viene installata automaticamente come parte dell'installazione Homebrew di cui sopra. Se si preferisce utilizzare una versione GUI di CMake, la si può scaricare da qui.

Installare le dipendenze

FreeCAD mantiene una "cask" Homebrew, che installa le formule e le dipendenze richieste. Immettere i seguenti comandi brew nel terminale.

brew tap freecad/freecad
brew install eigen
brew install --only-dependencies freecad

brew install potrebbe richiedere un po' di tempo, quindi si può andare a prendere qualcosa da bere. :-).

In alternativa, si possono installare manualmente le singole dipendenze, installando i seguenti pacchetti, utilizzando brew install ...:

  • cmake
  • swig
  • boost
  • boost-python3
  • eigen
  • gts
  • vtk
  • xerces-c
  • qt@5 - Attualmente è supportato solo Qt5, il supporto per Qt6 è un work-in-progress
  • opencascade
  • doxygen
  • pkgconfig
  • coin3d - Si noti che al momento della stesura di questo documento (novembre 2022) verrà installata una versione inutilizzabile di pyside@2 come dipendenza.

Ci sono diversi pacchetti che sono disponibili solo dopo aver toccato la cask di freecad: si deve fare (brew tap freecad/freecad). A causa di alcune soluzioni alternative a bug storici, al momento della stesura di questo articolo (novembre 2022) le versioni di PySide2 e Shiboken2 installate da Homebrew non sono utilizzabili, perché impongono l'uso di Py_Limited_API, che FreeCAD non supporta. Si prevede che questa soluzione alternativa verrà rimossa nei prossimi mesi, ma nel frattempo è necessario utilizzare le versioni cask di FreeCAD di PySide e Shiboken. Usare brew install ..., installare i seguenti pacchetti:

  • freecad/freecad/pyside2@5.15.5
  • freecad/freecad/shiboken2@5.15.5
  • freecad/freecad/med-file
  • freecad/freecad/netgen

Si dovranno anche "collegare" PySide e Shiboken:

brew link freecad/freecad/pyside2@5.15.5 freecad/freecad/shiboken2@5.15.5

In alcuni casi i pacchetti installati da Homebrew non utilizzano la stessa versione di Python: ad esempio, al momento in cui scriviamo PySide2 utilizza Python 3.10, ma boost-python3 utilizza Python 3.11. Sebbene sia possibile "ripristinare" la versione più avanzata (quindi in questo caso boost-python3 utilizza Python 3.10) si tratta di un'operazione avanzata e in molti casi è meglio attendere un aggiornamento dell'altro pacchetto. Se si vuole comunque seguire quel percorso, guardare il comando "brew extract", che si può usare per estrarre una formula in una nuova cask (tipicamente freecad/freecad). È quindi possibile modificare tale formula secondo necessità.

Si dovrà impostare il percorso su Qt: Qt5 è attualmente supportato, mentre il supporto per Qt6 è un work-in-progress. Impostare FREECAD_QT_VERSION su "Auto" o "5" per selezionare Qt5 (impostazione predefinita). Sulla riga di comando, usare qualcosa come:

cmake \
  -DCMAKE_BUILD_TYPE="Release" \
  -DPYTHON_EXECUTABLE="/usr/local/bin/python3" \
  -DQt5_DIR="/usr/local/Cellar/qt@5/5.15.7/lib/cmake/Qt5" \
  -DPySide2_DIR="/usr/local/Cellar/pyside2@5.15.5/5.15.5/lib/cmake/PySide2-5.15.5" \
  -DShiboken2_DIR="/usr/local/Cellar/shiboken2@5.15.5/5.15.5_1/lib/cmake/Shiboken2-5.15.5" \
  ../freecad-source

Ottenere il codice sorgente

Nelle seguenti istruzioni, le cartelle di origine e di build vengono create fianco a fianco in

/Users/username/FreeCAD

ma si può usare qualsiasi cartella si desideri.

mkdir ~/FreeCAD
cd ~/FreeCAD

Il seguente comando clonerà il repository git di FreeCAD in una directory chiamata FreeCAD-git.

git clone https://github.com/FreeCAD/FreeCAD FreeCAD-git

Creare la cartella di compilazione.

mkdir ~/FreeCAD/build

Eseguire CMake

Successivamente, si eseguirà CMake per generare la configurazione della build. Devono essere passate a CMake diverse opzioni. La tabella seguente descrive queste opzioni e fornisce alcuni retroscena.

Opzioni di CMake

Name Value Notes
CMAKE_BUILD_TYPE Release (STRING) Release o Debug. Il debug viene generalmente utilizzato per i test a livello di sviluppatore, ma può essere richiesto anche per i test e la risoluzione dei problemi a livello di utente.
CMAKE_PREFIX_PATH "/usr/local/opt/qt5152;" ... (PATH) Richiesto per compilare con Qt5. Vedere nota sotto. È inoltre necessario aggiungere il percorso alle librerie VTK e al file di configurazione cmake delle librerie NGLIB.
FREECAD_CREATE_MAC_APP 1 (BOOL) Crea un bundle FreeCAD.app nella posizione specificata in CMAKE_INSTALL_PREFIX, quando viene emesso il comando 'make install'.
CMAKE_INSTALL_PREFIX "./.." (PATH) Percorso in cui si desidera generare il pacchetto FreeCAD.app.
FREECAD_USE_EXTERNAL_KDL 1 (BOOL) Richiesto.
BUILD_FEM_NETGEN 1 (BOOL) Richiesto se si sceglie di compilare gli strumenti FEM.

Note: linea di comando per generare CMAKE_PREFIX_PATH:

ls -d $(brew list -1 | grep qt | tail -1 | xargs brew --cellar)/*/lib/cmake

GUI per CMake

Aprire l'app CMake e compilare i campi della cartella sorgente e di compilazione. In questo esempio, sarebbe /Users/username/FreeCAD/FreeCAD-git per l'origine e /Users/username/FreeCAD/build per la cartella di compilazione.

Successivamente, fare clic sul pulsante Configure per popolare l'elenco delle opzioni di configurazione. Verrà visualizzata una finestra di dialogo che chiede di specificare quale generatore utilizzare. Lasciarlo al valore predefinito Unix Makefiles. La configurazione fallirà la prima volta, perché ci sono alcune opzioni, che devono essere cambiate. Nota: sarà necessario selezionare la casella Advanced per ottenere tutte le opzioni.

Impostare le opzioni dalla tabella sopra, quindi fare nuovamente clic su Configure e quindi su Generate.

CMake da riga di comando

Immettere quanto segue nel terminale.

export PREFIX_PATH="/usr/local/opt/qt5152;\
/usr/local/Cellar/nglib/v6.2.2007/Contents/Resources;\
/usr/local/Cellar/vtk@8.2/8.2.0_1/lib/cmake;"
$cd ~/FreeCAD/build
$cmake \
  -DCMAKE_BUILD_TYPE="Release"   \
  -DBUILD_QT5=1                  \
  -DWITH_PYTHON3=1               \
  -DCMAKE_PREFIX_PATH="$PREFIX_PATH" \
  -DPYTHON_EXECUTABLE="/usr/local/bin/python3" \
  -DFREECAD_USE_EXTERNAL_KDL=1   \
  -DCMAKE_CXX_FLAGS='-std=c++14' \
  -DBUILD_FEM_NETGEN=1           \
  -DFREECAD_CREATE_MAC_APP=1     \
  -DCMAKE_INSTALL_PREFIX="./.."  \
  ../FreeCAD-git/

Eseguire make

Infine, da un terminale eseguire make per compilare e collegare FreeCAD e generare l'app bundle.

cd ~/FreeCAD/build
make -j5 install

L'opzione -j specifica quanti processi make devono essere eseguiti contemporaneamente. Uno più il numero di core della CPU è solitamente un buon numero da utilizzare. Tuttavia, se la compilazione fallisce per qualche motivo, è utile eseguire nuovamente make senza l'opzione -j, in modo da poter vedere esattamente dove si è verificato l'errore.

Vedere anche Velocizzare la compilazione.

Se make termina senza errori, si può avviare FreeCAD facendo doppio clic sull'eseguibile nel Finder.

Aggiornare da Github

Lo sviluppo di FreeCAD avviene velocemente; ogni giorno circa ci sono correzioni di bug o nuove funzionalità. Per ottenere le modifiche più recenti, usare git per aggiornare la directory di origine (vedi Source code management), quindi eseguire nuovamente CMake e seguire i passaggi precedenti. Di solito, in questo caso non è necessario iniziare con una directory di build pulita, e le successive compilazioni saranno generalmente molto più veloci della prima.

Compilare con Qt4 e Python 2.7

FreeCAD è passato da Qt 4 a Qt 5 così come homebrew. Qt 4 non è più disponibile come opzione per la nuova build su macOS dopo la transizione Qt 5. Python 2.7 è stato deprecato all'interno dell'homebrew e del prossimo macOS e non lo supportiamo più nemmeno per la build di macOS.

Risoluzione dei problemi

Segfault all'avvio di Qt5

Se Qt4 è stato precedentemente installato tramite brew e quindi si compila con Qt5, è possibile che si verifichi un'eccezione EXC_BAD_ACCESS (SEGSEGV) all'avvio della nuova build Qt5. La soluzione per questo è disinstallare manualmente Qt4.

brew uninstall --ignore-dependencies --force cartr/qt4/shiboken@1.2 cartr/qt4/pyside@1.2 cartr/qt4/pyside-tools@1.2 cartr/qt4/qt-legacy-formula

Fortran

"No CMAKE_Fortran_COMPILER could be found." durante la configurazione - Le versioni precedenti di FreeCAD richiedono l'installazione di un compilatore fortran. Con Homebrew, lanciare "brew install gcc" e provare a configurare di nuovo, dando a cmake il percorso a Fortran ie -DCMAKE_Fortran_COMPILER=/opt/local/bin/gfortran-mp-4.9 . Oppure, preferibilmente usare una versione più aggiornata del sorgente di FreeCAD!

FreeType

Quando si utilizzano versioni di CMake precedenti alla 3.1.0, è necessario impostare manualmente la variabile CMake FREETYPE_INCLUDE_DIR_freetype2, ad esempio /usr/local/include/freetype2

Ulteriori istruzioni per la compilazione

FreeCAD può essere compilato con l'ultimo git master ospitato su github e avviato da una CLI utilizzando le librerie fornite dal tap homebrew-freecad. Per un elenco completo delle istruzioni di compilazione, vedere qui.


Panoramica

Si tratta di librerie che FreeCAD utilizza come dipendenze di terze parti durante la compilazione. Di solito sono librerie collegate dinamicamente e hanno un'estensione .so in Linux/MacOS e .dll in Windows, e sono accompagnate dai loro file di intestazione .h o .hpp o simili. Se è necessaria una libreria modificata o una classe wrapper, il codice della libreria modificata, o wrapper, deve diventare parte del codice sorgente di FreeCAD e compilato insieme ad esso.

Le dipendenze devono essere installate nel sistema prima di procedere con la compilazione; vedi Compilazione in Linux, Compilazione in Windows e Compilazione in MacOS per maggiori informazioni.

Se stai compilando usando Windows, prendi in considerazione l'utilizzo di LibPack invece di provare a installare le librerie singolarmente.

Collegamenti

Nome della libreria Versione necessaria Link per ottenerla
Python >= 3.6 http://www.python.org/
Boost >= 1.33 http://www.boost.org/
OpenCASCADE >= 7.3 http://www.opencascade.org
Qt >= 5.4 https://www.qt.io/
Shiboken2 same as Qt https://wiki.qt.io/Qt_for_Python/Shiboken
PySide2 same as Qt https://wiki.qt.io/Qt_for_Python/Shiboken
Coin3D >= 3.x https://github.com/coin3d/coin
SoQt (deprecated) >= 1.2 https://github.com/coin3d/soqt
Quarter >= 1.0 https://github.com/coin3d/quarter
Pivy >= 0.6.5 https://github.com/coin3d/pivy/
FreeType >= XXX XXX
PyCXX >= XXX XXX
KDL >= XXX https://orocos.org/wiki/orocos/kdl-wiki.html
Point Cloud Library >= XXX XXX
Salome SMESH >= XXX XXX
VTK >= 6.0 XXX
Ply >= 3.11 https://www.dabeaz.com/ply/
Xerces-C++ >= 3.0 https://xerces.apache.org/xerces-c/
Eigen3 >= 3.0 http://eigen.tuxfamily.org/index.php?title=Main_Page
Zipios++ >= 0.1.5 https://snapwebsites.org/project/zipios, https://github.com/Zipios/Zipios
Zlib >= 1.0 http://www.zlib.net/, https://github.com/madler/zlib
libarea >= 0.0.20140514-1 https://github.com/danielfalck/libarea

Dettagli

Python

Versione: 3.3 o superiore

Licenza: licenza Python 3.3

Python 2 è diventato obsoleto nel 2019. L'ulteriore sviluppo di FreeCAD utilizzerà esclusivamente Python 3; la compatibilità con Python 2 non verrà testata, quindi i vecchi ambienti di lavoro e le macro che utilizzano questa versione dovranno essere aggiornati o potrebbero smettere di funzionare. Si prega di avvisare sul forum di FreeCAD se si riscontrano problemi con Python 3.

Python è un popolare linguaggio di scripting per tutti gli usi ampiamente utilizzato in Linux e nel software open source. In FreeCAD, Python viene utilizzato durante la compilazione e anche in fase di esecuzione in diversi modi. È utilizzato

  • per scrivere script di test per testare condizioni diverse, come perdite di memoria, per garantire la funzionalità del software dopo le modifiche, per controlli post-compilazione e test di copertura dei test,
  • per scrivere macro e registrazione di macro,
  • per implementare la logica dell'applicazione per i pacchetti standard,
  • per implementare strumenti ausiliari come Addon Manager,
  • per implementare interi ambienti di lavoro come Draft e Arch,
  • per caricare dinamicamente i pacchetti,
  • per implementare regole per la progettazione (ingegneria della conoscenza)
  • per creare interazioni fantasiose su Internet come gruppi di lavoro e PDM

Su Linux, Python è solitamente già installato nella propria distribuzione. Per Windows è possibile ottenere un binario precompilato da Python.org o usare ActiveState Python, anche se è più difficile ottenere le librerie di debug da quest'ultimo.

Python è stato scelto come linguaggio di scripting per FreeCAD per diversi motivi:

  • È più orientato agli oggetti rispetto a Perl e Tcl.
  • Il codice è più leggibile di Perl e Visual Basic.
  • È più facile da incorporare in un'altra applicazione, a differenza, ad esempio, di Java.

In sintesi, Python è ben documentato ed è facile da incorporare ed estendere in un'applicazione C++. È anche ben testato e gode di un forte sostegno da parte della comunità open source. Letture ulteriori su Python sfogliando la documentazione ufficiale su Python.org.

Boost

Versione: 1.33 o superiore

Licenza: Boost Software License - Versione 1.0

Le librerie Boost C++ sono raccolte di librerie open source sottoposte a revisione paritaria che estendono le funzionalità di C++. Sono pensate per essere ampiamente utili in un ampio spettro di applicazioni e per funzionare bene con la libreria standard C++. La licenza Boost è progettata per incoraggiarne l'uso in progetti open source e closed source.

A causa della loro popolarità e stabilità, molte librerie Boost sono state accettate per l'incorporazione nello standard C++11 e altre sono pianificate per l'inclusione nei successivi standard C++.

Al fine di garantire efficienza e flessibilità, Boost fà ampio uso di modelli. Boost è stata una fonte di intenso lavoro e di ricerca nella programmazione generica e nella meta-programmazione in C++. Maggiori informazioni su Boost visitando la home page di Boost.

OpenCASCADE Technology

Versione: 6.7 o superiore

Licenza: la versione 6.7.0 e successive sono regolate dalla GNU Lesser General Public License (LGPL) versione 2.1 con eccezioni aggiuntive. Le versioni precedenti utilizzano la Open CASCADE Technology Public License.

OpenCASCADE Technology (OCCT) è un kernel CAD completo e di livello professionale. È stato sviluppato nel 1993 e originariamente chiamato CAS.CADE, da Matra Datavision in Francia per le applicazioni Strim (Styler) ed Euclid Quantum. Nel 1999 è stato rilasciato come software open source e da allora si chiama OpenCASCADE.

OCCT è un insieme ampio e complesso di librerie C++ che forniscono le funzionalità richieste da un'applicazione CAD:

  • Un kernel geometrico completo conforme a STEP.
  • Un modello di dati topologici e le funzioni necessarie per lavorare con le forme (taglio, fusione, estrusione e molte altre).
  • Processori d'importazione ed esportazione standard per file come STEP, IGES, VRML.
  • Un visualizzatore 2D e 3D con supporto alla selezione.
  • Una struttura di dati di documenti e progetti con supporto per salvataggio e ripristino, collegamento esterno di documenti, ricalcolo della cronologia di progettazione (modellazione parametrica) e una funzione per caricare dinamicamente nuovi tipi di dati come pacchetto di estensione.

Esistono due versioni principali di OpenCASCADE esistenti in diverse distribuzioni Linux. Una è distribuita dagli sviluppatori originali; è noto come OCCT ed è impacchettato con i nomi occ o occt. L'altra versione è la "community edition", abbreviata OCE, e si trova normalmente con il nome oce. FreeCAD può compilare con entrambe le versioni, tuttavia, dal 2016 FreeCAD consiglia di compilare con le librerie OCCT ufficiali piuttosto che con quelle OCE. Il motivo è che l'edizione della comunità mancano importanti correzioni di bug e funzioni che rendono migliore l'utilizzo di FreeCAD.

Per ulteriori informazioni, visitare il sito web di OpenCASCADE.

Qt

Versione: 4.1 o superiore

Licenza: GPL v2.0/v3.0 o commerciale; dalla versione 4.5 in poi anche LPGL v2.1.

Qt è uno dei toolkit di interfaccia utente grafica (GUI) più popolari disponibili nel mondo open source. FreeCAD utilizza questo toolkit per disegnare l'interfaccia del programma. Per questo, l'applicazione Qt Designer è molto utile in quanto consente agli sviluppatori di disegnare rapidamente finestre di dialogo e finestre, esportarle come file di risorse XML e quindi caricare queste interfacce in fase di esecuzione.

Ulteriori informazioni sulle librerie Qt e la relativa documentazione di programmazione sono disponibili nella Documentazione di Qt.

Shiboken2 e Pyside2

Shiboken è il generatore di binding Python che Python Qt utilizza per creare il modulo PySide, in altre parole, è il sistema utilizzato per esporre l'API Qt C++ al linguaggio Python.

I pacchetti originali Shiboken e PySide dovevano essere usati con Python 2 e Qt4; poiché queste due versioni sono considerate obsolete dal 2019, utilizzare Shiboken2 e PySide2, che funzionano con Python 3 e Qt5. Il nuovo sviluppo di FreeCAD è fatto con Python 3 e Qt5, quindi la compatibilità con Python 2 e Qt4 non è garantita dopo FreeCAD 0.18.

Maggiori informazioni su Shiboken e Pyside su Qt per Python.

Coin3D

Versione: 3.0 o superiore

Licenza: BSD 3-clause license

Coin3D è una libreria di grafica 3D di alto livello con una interfaccia di programmazione delle applicazioni (Application Programming Interface) in C++. Per "renderizzare" i grafici in tempo reale utilizza la struttura di dati scenegraph (grafo di scena) adatta alla maggior parte delle applicazioni di visualizzazione scientifica e ingegneristica.

Coin3D è costruito secondo lo standard del settore OpenGL delle librerie di modalità di renderizzazione immediata, e aggiunge astrazioni per primitive di livello superiore, fornisce interattività 3D e contiene molte funzioni di ottimizzazione complesse per il rendering veloce che sono trasparenti per il programmatore di applicazioni.

Coin3D è compatibile con l'API Open Inventor 2.1 di SGI. Questa API è diventata l'interfaccia grafica standard de facto per la visualizzazione 3D nella comunità scientifica e ingegneristica. Ha dimostrato il suo valore sin dal 2000 come componente principale in migliaia di applicazioni ingegneristiche in tutto il mondo.

Coin3D (Open Inventor) viene utilizzato come visualizzatore 3D in FreeCAD perché il visualizzatore OpenCASCADE (AIS e Graphics3D) presenta limitazioni e colli di bottiglia nelle prestazioni, in particolare con il rendering ingegneristico su larga scala; altre cose come texture o rendering volumetrico non sono interamente supportate dal visualizzatore OpenCASCADE.

Coin3D è portatile su un'ampia gamma di piattaforme: sistemi operativi UNIX, Linux, BSD, macOS e Microsoft Windows. Per saperne di più su questa libreria, visita la homepage di Coin3D.

SoQt (deprecato)

Versione: 1.2.0 o superiore

Licenza: BSD 3-clause license

SoQt è il binding di Coin3D (Open Inventor) al toolkit GUI Qt.

SoQt non è più utilizzato in FreeCAD, è stato sostituito da Quarter che è un binding a Qt più recente.

Quarter

Versione: 1.0 o successiva

Licenza: BSD 3-clause license

Quarter è un binding a Coin3D più recente rispetto al toolkit Qt. Una sua versione è inclusa nel codice sorgente di FreeCAD, quindi viene compilata insieme ad esso.

Pivy

Versione: 0.6.3 o successiva

Licenza: BSD 3-clause license

Pivy è una libreria che avvolge la libreria Coin3d per l'uso in Python. Non è necessaria per compilare FreeCAD o per avviarla, ma è necessaria come dipendenza di runtime dall'Ambiente Draft e da altri ambienti che la utilizzano internamente, come Arch e BIM.

Se non si utilizzano questi ambienti di lavoro, non ci sarà bisogno di Pivy.

Ply

Versione: 3.11 o successiva

Licenza: BSD 3-clause license

Ply è il parser Python-Lex-Yacc. Viene utilizzato come dipendenza di runtime dall'Ambiente OpenSCAD. Se non si utilizza questo workbench, si potrebbe non aver bisogno di questo pacchetto.

Per ulteriori informazioni, vedere la home page di Ply

Xerces-C++

Versione: 3.0 o successiva

Licenza: Apache Software License Versión 2.0

Xerces-C++ è un analizzatore (parser) di convalida XML scritto in un sottoinsieme portatile di C++. Xerces-C++ rende più facile fornire alla propria applicazione la capacità di leggere e scrivere dati XML. Per l'analisi, la generazione, la manipolazione, e la convalida di documenti XML è prevista una libreria condivisa.

Xerces-C++ è un analizzatore XML di convalida scritto in un sottoinsieme portabile di C++. Xerces-C++ rende facile dare alla tua applicazione la capacità di leggere e scrivere dati XML. Viene fornita una libreria condivisa per l'analisi, la generazione, la manipolazione e la convalida di documenti XML. Xerces-C++ è fedele alla raccomandazione XML 1.0 e agli standard associati.

L'analizzatore viene utilizzato per salvare e ripristinare i parametri in FreeCAD. Per ulteriori informazioni, vedere la homepage di Xerces-C++.

Eigen3

Versione: 3.0 o successiva

Licenza: A partire dalla versione 3.1.1, è concesso in licenza con la Mozilla Public License 2.0. Le versioni precedenti erano concesse in licenza in base alla GNU Lesser General Public License 3.

Eigen è una libreria di template C++ per l'algebra lineare: matrici, vettori, solutori numerici e algoritmi correlati.

Se vuoi solo usare Eigen, puoi usare subito i file di header. Non esiste alcuna libreria binaria a cui collegarsi e nessun file di intestazione configurato. Eigen è una libreria di modelli pura definita negli header.

Eigen è utilizzato in FreeCAD per molte operazioni vettoriali nello spazio 3D. Per saperne di più, visita la homepage di Eigen.

Zipios++

Versione: 0.1.5 o successiva

Licenza: GNU Lesser General Public License 2.1

Zipios++ è una libreria C++ per leggere e scrivere file .zip. L'accesso alle singole voci viene fornito tramite iostream C++ standard. Viene inoltre fornito un semplice file system virtuale di sola lettura che monta directory regolari e file .zip. La struttura e l'interfaccia pubblica di Zipios++ sono vagamente basate sul pacchetto java.util.zip di Java.

Il formato di file nativo di FreeCAD .FCstd è in realtà un file .zip che memorizza e comprime altri tipi di dati al suo interno, come i file BREP e XML. Pertanto, Zipios++ viene utilizzato per salvare e aprire archivi compressi, inclusi i file FreeCAD.

Una copia di Zipios++ è inclusa nel codice sorgente di FreeCAD quindi viene compilata insieme ad esso. Se desideri utilizzare una libreria Zipios++ esterna, fornita dal tuo sistema operativo, si può impostare -DFREECAD_USE_EXTERNAL_ZIPIOS=ON con cmake.

Zipios++ utilizza la libreria Zlib per eseguire l'effettiva decompressione dei file.

Zlib

Versione: 1.0 o successiva

Licenza: licenza zlib

Zlib è progettato per essere una libreria di compressione dei dati gratuita, generica e senza perdite da utilizzare su qualsiasi hardware e sistema operativo. Implementa l'algoritmo di compressione DEFLATE comunemente usato nei file .zip e .gzip.

Una copia di questa libreria è inclusa nel codice sorgente di FreeCAD, quindi viene compilata insieme ad esso.

libarea

Versione: 0.0.20140514-1 o successiva

Licenza: BSD 3-clause license

Libarea è una libreria software per calcolare le operazioni di profili e tasche utilizzate nel software di produzione assistita da computer (CAM). È stata creata da Dan Heeks per il suo progetto HeeksCNC.

Una copia della libreria è inclusa nel codice sorgente dell'Ambiente CAM, quindi viene compilata insieme ad esso.

LibPack

LibPack è un comodo pacchetto contenente le dipendenze di compilazione di FreeCAD raccolte tutte insieme. È necessario solo se si sta compilando FreeCAD su Windows con Visual Studio 2015 o versioni successive. È possibile trovare l'ultimo LibPack nella releases page.

Se si sta lavorando sotto Linux, non c'è bisogno del LibPack, poiché si può ottenere le dipendenze dai repository della tua distribuzione come menzionato nella pagina Compilazione in Linux.

FreeCAD 12.1.2

Vedere l'annuncio nel forum: Nuovi libpack per Windows con Qt5.12, OCC7.3 e Python 3.6 di apeltauer

Include tra le altre cose: Boost 1.67, Coin3D 4.0.0a, Eigen3, Open CASCADE Technology 7.3.0, Python 3.6.8, PySide2, Qt 5.12.1, Salome SMESH, Shiboken2, vtk7, Xerces-C, Zipios++, zlib 1.2 .11



Pagina degli strumenti

Per sviluppare seriamente qualsiasi software servono degli strumenti. Ecco un elenco di quelli che si usa per sviluppare FreeCAD:

Strumenti indipendenti dalla piattaforma

Qt-Toolkit

Qt-toolkit è uno strumento avanzato per il disegno di interfacce utente indipendente dalla piattaforma. Esso è contenuto in LibPack di FreeCAD, ma può anche essere scaricato da Qt project.

Inkscape

Questo è un ottimo programma di disegno vettoriale. Aderisce allo standard SVG e viene utilizzato per disegnare icone e immagini. Inkscape è un software libero e open source concesso in licenza con GPL. Puoi scaricarlo su www.inkscape.org.

Doxygen

Uno strumento molto buono e stabile per generare la documentazione del codice partendo da file .h e .cpp.

Gimp

Non c'è molto da dire sul GNU Image Manipulation Program. Può manipolare file .xpm che è un modo molto efficace per gestire le icone nei programmi QT. XPM è fondamentalmente un codice C che può essere compilato in un programma. Gimp supporta il formato di file .png gratuito utilizzato nel wiki.

GIMP è scaricabile da: www.gimp.org

Gitkraken

Questa è una GUI git proprietaria che è molto utile per imparare come funziona git nel caso si sia interessati a contribuire a FreeCAD. Pagine rilevanti da ricercare:

OBS Studio

Software gratuito e open source per registrazione video e live streaming. Maggiori dettagli sul sito ufficiale: obsproject.com

OpenCamLib

OpenCamLib (OCL) è una libreria open source che mira a fornire algoritmi di produzione assistita da computer (CAM). FreeCAD utilizza OCL nelle operazioni sperimentali del percorso della superficie 3D e in altre funzionalità sperimentali.

StarUML

Un programma UML completo ma proprietario. Ha molte caratteristiche importanti, incluso il reverse engineering del codice sorgente C++.

Si può scaricare da: staruml.io

Strumenti in Windows

Visual Studio Community

Visual Studio Community è gratuito per progetti open source e piccole strutture. L'installazione è modulare. Si può aggiungere il supporto per un gran numero di linguaggi tra cui C++ e Python.

Si può scaricare da Visual Studio Community.

CamStudio

È uno strumento Open Source per registrare Screen-cast (Webcast). È un ottimo strumento per creare tutorial registrandoli. Non è così noioso come scrivere documentazione.

Vedere camstudio.org per avere maggiori informazioni.

Strumenti in Linux

Da Fare



In FreeCAD versione 0.20 la posizione predefinita dei file di configurazione, dati e cache del programma è stata modificata per Linux.
Vedere Note sulla versione 0.20 per ulteriori informazioni. Questa pagina non è stata ancora aggiornata di conseguenza.

Panoramica

Questa pagina descrive i diversi modi per avviare FreeCAD e le principali caratteristiche di configurazione.

Avviare FreeCAD dalla riga di comando

FreeCAD può essere avviato normalmente, facendo doppio clic sulla sua icona sul desktop o selezionandolo dal menu di avvio, ma può anche essere avviato direttamente dalla riga di comando. Ciò consente di modificare alcune delle opzioni di avvio di default.

Utilizzo delle opzioni della riga di comando senza una shell della riga di comando

  • Su Ubuntu si può creare un'icona sul desktop e modificarne le proprietà. Aggiungere le opzioni della riga di comando separate da spazi dopo il nome del programma nel campo "Comando".
  • Su Windows creare un collegamento e modificare le proprietà. Aggiungere le opzioni della riga di comando separate da spazi al campo "Destinazione".

Le opzioni della riga di comando

Le opzioni della riga di comando sono soggette a frequenti cambiamenti, quindi è bene verificare le opzioni correnti digitando:

FreeCAD --help

Nella risposta sono elencati i parametri utilizzabili:

 Usage: FreeCAD [options] File1 File2 ...
 
 Allowed options:
 
 Generic options:
   -v [ --version ]          Prints version string
   -h [ --help ]             Prints help message
   -c [ --console ]          Starts in console mode
   --response-file arg       Can be specified with '@name', too
   --dump-config             Dumps configuration
   --get-config arg          Prints the value of the requested configuration key
 
 Configuration:
   -l [ --write-log ]        Writes a log file to:
                             /home/username/.FreeCAD/FreeCAD.log
   --log-file arg            Unlike --write-log this allows logging to an 
                             arbitrary file
   -u [ --user-cfg ] arg     User config file to load/save user settings
   -s [ --system-cfg ] arg   System config file to load/save system settings
   -t [ --run-test ] arg     Test case - or 0 for all
   -M [ --module-path ] arg  Additional module paths
   -P [ --python-path ] arg  Additional python paths
   --single-instance         Allow to run a single instance of the application

Nella tabella seguente, le opzioni selezionate sono descritte in modo più dettagliato:

Opzione lunga Nome della variabile di configurazione corrispondente Sinossi
--user-cfg <filename> UserParameter Nome file o percorso relativo che termina con un nome file. Il valore predefinito è user.cfg.
--module-path <dir> Antepone a AdditionalModulePaths Directory che contiene moduli. Questa opzione può essere fornita ripetutamente per specificare più directory.
--get-config <config-var-name> most Emette il valore richiesto in una finestra di dialogo popup. Esce alla conferma con OK. Non può essere utilizzato ripetutamente. Se viene utilizzato un nome di variabile sconosciuto/illegale, la risposta è vuota. Il flag --console non è rispettato.

Le opzioni possono essere scritte in due forme: --long-option arg e --long-option=arg.

Risposta e file di configurazione

FreeCAD può leggere alcune di queste opzioni da un file di configurazione. Questo file deve essere nella directory bin e deve essere nominato FreeCAD.cfg. Tenere presente che le opzioni specificate nella riga di comando sovrascrivono il file di configurazione!

Alcuni sistemi operativi hanno un limite di caratteri molto basso nella riga di comando. Il modo più comune per aggirare questa limitazione è quello di usare il file di risposta. Un file di risposta è semplicemente un file di configurazione che utilizza la stessa sintassi della riga di comando. Se la riga di comando specifica un nome di file di risposta da utilizzare, esso viene caricato e analizzato in aggiunta alla linea di comando:

FreeCAD @ResponseFile.txt 

oppure:

FreeCAD --response-file=ResponseFile.txt

oppure:

FreeCAD --response-file ResponseFile.txt

Opzioni nascoste

Per l'utente esistono alcune opzioni non visibili. Queste opzioni sono, per esempio, i parametri di X-Window analizzati dal sistema Windows:

  • -display display, imposta la visualizzazione di X (il valore predefinito è $DISPLAY).
  • -geometry geometry, imposta la geometria client della prima finestra che viene visualizzata.
  • -fn oppure -font font, definisce il tipo carattere dell'applicazione. Il carattere deve essere specificato utilizzando una descrizione logica dei font di X.
  • -bg oppure -background color, imposta il colore di sfondo predefinito e una tavolozza per applicarlo (sono calcolate le tonalità chiare e scure).
  • -fg oppure -foreground color, imposta il colore di primo piano predefinito.
  • -btn oppure -button color, imposta il colore predefinito dei pulsanti.
  • -name name, imposta il nome dell'applicazione.
  • -title title, imposta il titolo dell'applicazione.
  • -visual TrueColor, forza l'applicazione a utilizzare una visualizzazione TrueColor su un display a 8-bit.
  • -ncols count, limita il numero di colori allocati nel cubo di colori su un display a 8 bit, se l'applicazione sta usando la specifica di colore QApplication::ManyColor. Se count è 216 allora è utilizzato un cubo di colori di 6x6x6 (vale a dire 6 livelli di rosso, 6 di verde, e 6 di blu), per altri valori viene utilizzato un cubo approssimativamente proporzionale a un cubo 2x3x1.
  • -cmap, obbliga l'applicazione a installare una mappa privata di colori su un display a 8 bit.

Eseguire FreeCAD senza GUI (senza testa)

Di solito FreeCAD è costruito con due file eseguibili: uno con l'interfaccia grafica chiamato FreeCAD o freecad e uno headless chiamato FreeCADCmd o freecadcmd. FreeCAD può essere utilizzato in modalità console utilizzando l'opzione --console (che è il comportamento predefinito di FreeCADCmd):

FreeCAD --console

In modalità console, non verrà visualizzata alcuna interfaccia utente grafica e ti verrà presentato un prompt dell'interprete Python: >>>. Da quel prompt, hai le stesse funzionalità dell'interprete Python che gira all'interno della GUI di FreeCAD e accedi a tutti i moduli e plugin di FreeCAD, eccetto il modulo FreeCADGui. Tieni presente che anche i moduli che dipendono da FreeCADGui potrebbero non essere disponibili.

Per ulteriori informazioni sulla modalità console o headless, fare riferimento a FreeCAD Headless.

Esecuzione di moduli, macro e script

Tipo di file Sistema Esempio di riga di comando
Modulo Windows "C:\Programmi\FreeCAD\bin\FreeCAD.exe" -M "C:\FreeCAD\Mod\Draft"
Linux FreeCAD_0.19 -M ~/.FreeCAD/Mod/Draft
Linux (AppImage) percorso/di/FreeCADXXX.AppImage -M ~/.FreeCAD/Mod/Draft
.FCMacro o .py Windows "C:\Programmi\FreeCAD\bin\FreeCAD.exe" "C:\Utenti\nomeutente\AppData\Roaming\FreeCAD\Mod\WorkFeature\start_WF.FCMacro"
Linux FreeCAD_0.19 ~/.FreeCAD/Mod/WorkFeature/start_WF.FCMacro
Linux (AppImage) percorso/di/FreeCADXXX.AppImage ~/.FreeCAD/Mod/WorkFeature/start_WF.FCMacro

Vedere Eseguire automaticamente una macro all'avvio su come impostare una macro da eseguire automaticamente all'avvio di FreeCAD.

Variabili d'ambiente

FreeCAD supporta le seguenti variabili di ambiente, che possono essere utilizzate per configurare le directory: disponibile dalla versione 0.19

Variabile d'ambiente Corrispondente nome della variabile di configurazione Sinossi
FREECAD_USER_HOME UserHomePath Directory "base" di FreeCAD per la conservazione dei dati utente locali.
FREECAD_USER_DATA UserAppData Se non è impostato, il valore predefinito è FREECAD_USER_HOME/.FreeCAD, ma solo se è impostato FREECAD_USER_HOME.
FREECAD_USER_TEMP AppTempPath Se non è impostato, il valore predefinito è FREECAD_USER_HOME/temp, ma solo se è impostato FREECAD_USER_HOME.

Se il percorso specificato non esiste, l'impostazione viene ignorata!

Le suddette variabili d'ambiente sono pensate per essere usate per realizzare un ambiente FreeCAD portatile. Per un esempio su come utilizzare le variabili di ambiente dalla riga di comando su Linux, fare riferimento a note per gli utenti Linux sulla pagina dei download.

HOME

FreeCAD utilizza Qt, che rispetta la variabile ambientale HOME. Pertanto, l'impostazione HOME può essere utilizzata per specificare la directory di base dei file di configurazione relativi a Qt (.config/FreeCAD/FreeCAD.conf).

FreeCad stesso non rispetta la variabile ambientale HOME (perché determina la home directory dell'utente da un'API di sistema di livello inferiore). Usa FREECAD_USER_HOME per questo scopo.

TMPDIR

La directory temporanea predefinita è /tmp/. La variabile d'ambiente TMPDIR può essere utilizzata per sovrascrivere l'impostazione predefinita. (Editor: precedence?).

Librerie

Alcune librerie hanno bisogno di chiamare le variabili di ambiente del sistema. A volte, quando c'è un problema con un'installazione FreeCAD, è perché qualche variabile d'ambiente è assente o è errata. Pertanto, alcune variabili importanti vengono duplicate in Config e salvate nel file di registro

Python

  • PYTHONPATH
  • PYTHONHOME
  • TCL_LIBRARY
  • TCLLIBPATH

OpenCascade

  • CSF_MDTVFontDirectory
  • CSF_MDTVTexturesDirectory
  • CSF_UnitsDefinition
  • CSF_UnitsLexicon
  • CSF_StandardDefaults
  • CSF_PluginDefaults
  • CSF_LANGUAGE
  • CSF_SHMessage
  • CSF_XCAFDefaults
  • CSF_GraphicShr
  • CSF_IGESDefaults
  • CSF_STEPDefaults

Set di configurazione

Ad ogni avvio FreeCAD esamina i suoi ambienti ed i parametri della riga di comando. Si costruisce un set di configurazione che contiene l'essenza delle informazioni per l'esecuzione. Queste informazioni vengono poi utilizzate per determinare il luogo dove salvare i dati dell'utente o file di log (registro). E' anche molto importante per le analisi post-mortem. Pertanto viene salvato nel file di registro.

Informazioni relative all'utente

Nome var config Descrizione Esempio Windows Esempio Linux
UserAppData Percorso dove FreeCAD archivia i dati dell'applicazione relativi all'utente. C:\Documents and Settings\username\AppData\FreeCAD
Percorso breve : %APPDATA%\FreeCAD
/home/username/.config/.FreeCAD
Percorso breve : ~/.FreeCAD
UserParameter File in cui FreeCAD archivia i dati dell'applicazione relativi all'utente. C:\Documents and Settings\username\AppData\FreeCAD\user.cfg
Percorso breve : %APPDATA%\FreeCAD\user.cfg
/home/username/.FreeCAD/user.cfg
Percorso breve : ~/.config/FreeCAD/user.cfg or $HOME/.config/.FreeCAD/user.cfg
SystemParameter File in cui FreeCAD archivia i dati relativi all'applicazione. C:\Documents and Settings\username\AppData\FreeCAD\system.cfg
Percorso breve : %APPDATA%\FreeCAD\system.cfg
/home/username/.config/.FreeCAD/system.cfg
Percorso breve : ~/.FreeCAD/system.cfg or $HOME/.FreeCAD/system.cfg
UserHomePath Percorso home dell'utente corrente C:\Documents and Settings\username
Percorso breve : %USERPROFILE%
/home/username
Percorso breve : ~

Nota: per le distribuzioni Linux, un file di configurazione aggiuntivo relativo a Qt può esistere nel percorso /home/username/.config/FreeCAD/FreeCAD.conf.

Argomenti della riga di comando

Nome var config Descrizione Esempio
LoggingFile 1 se il logging è attivato 1
LoggingFileName Nome del file dove si trova il log C:\Documents and Settings\username\AppData\FreeCAD\FreeCAD.log
RunMode Indica come funzionerà il ciclo principale. "Script" significa che richiama il file di script fornito e poi esce. "Cmd" esegue l'interprete della riga di comando. "Internal" esegue uno script interno. "Gui" entra nel ciclo di evento Gui. "Module" carica un dato modulo python. "Cmd"
FileName Il suo significato dipende da RunMode
ScriptFileName Il suo significato dipende da RunMode
Verbose Livello di verbosità di FreeCAD "" o "strict"
OpenFileCount Contiene il numero di file aperti attraverso gli argomenti della riga di comando "12"
AdditionalModulePaths Contiene i percorsi di moduli aggiuntivi indicati nella linea di cmd "extraModules/"

Relativi al sistema

Nome var config Descrizione Esempioo Windows Esempio Linux
AppHomePath Percorso in cui è installato FreeCAD c:/Progam Files/FreeCAD_0.19 /user/local/FreeCAD_0.19
PythonSearchPath Contiene un elenco di percorsi dove python cerca i moduli. Questo vale all'avvio e può cambiare durante l'esecuzione
AppTempPath Percorso della directory temporanea. Può essere fornito con la variabile d'ambiente TMPDIR o con Modifica parametri: Strumenti → Modifica parametri... → BaseApp → Preferences → General → TempPath /tmp/ (predefinito)

Informazioni relative alla costruzione

La tabella seguente mostra le informazioni disponibili relative alla versione di Build. La maggior parte proviene dal repositorio di Subversion. Queste cose sono necessarie per ricostruire esattamente la versione!

Nome var config Descrizione Esempio
BuildVersionMajor Numero di versione principale della costruzione. Definito in src/Build/Version.h.in 0
BuildVersionMinor Numero di versione secondario della costruzione. Definito in src/Build/Version.h.in 7
BuildRevision Numero di revisione del repositorio SVN del src nella costruzione. Generato da SVN 356
BuildRevisionRange Gamma di diversi cambiamenti 123-356
BuildRepositoryURL URL del repositorio https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk/src
BuildRevisionDate Data della revisione precedente 2007/02/03 22:21:18
BuildScrClean Indica se il codice sorgente è stato modificato dopo il suo checkout Src modified
BuildScrMixed Src not mixed

Relative al marchio

Queste voci di configurazione sono legate al meccanismo di marchiatura di FreeCAD. Vedere Marchiatura per maggiori dettagli.

Nome var config Descrizione Esempio
ExeName Nome del file di costruzione eseguibile. Può differire da quello di FreeCAD se è utilizzato un diverso main.cpp. FreeCAD.exe
ExeVersion Versione globale mostrata all'inizio V0.19
AppIcon Icona che viene utilizzata per l'eseguibile, mostrata in Application MainWindow. "FCIcon"
ConsoleBanner Banner che viene mostrato in modalità console
SplashPicture Nome dell'icona utilizzata per la schermata iniziale "FreeCADSplasher"
SplashAlignment Allineamento del testo nella finestra di dialogo iniziale "Bottom o Left"
SplashTextColor Colore del testo iniziale "#000000"
StartWorkbench Nome del Workbench che viene attivato automaticamente dopo l'avvio "Part design"
HiddenDockWindow Elenco dei dockwindows (separati da un punto e virgola) che saranno disabilitati "Property editor"

Interrogazione della configurazione

Dalla console Python di FreeCAD

Le voci del set di configurazione possono essere interrogate con il config var name (vedi tabelle sopra) dalla console Python. Per esempio:

  >>> FreeCAD.ConfigGet("ExeVersion")
  '0.19'

Se il nome non viene trovato, viene restituita una stringa vuota.

Dalla riga di comando

Utilizzare l'opzione --get-config <config-var-name> per interrogare un singolo nome. Non tutti i nomi sono supportati. Per esempio:

Usa l'opzione --dump-config per ottenere un elenco di nomi e dei loro valori. Non tutti i nomi sono supportati.

Dalla console di FreeCAD

Avvia FreeCAD in modalità console con --console ed esegui query con codice Python. Per esempio:

 $ FreeCAD --console
 [FreeCAD Console mode <Use Ctrl-D (i.e. EOF) to exit.>]
 >>> FreeCAD.ConfigGet("ExeVersion")
 '0.19'
 >>> exit()

Per Linux (shell bash) puoi modificare la seguente riga di comando in base alle tue esigenze:

 $ FreeCAD --console <<EOF
 print( "FREECAD_USER_HOME: " + ( "not set" if ( os.environ.get('FREECAD_USER_HOME') is None ) else os.environ.get('FREECAD_USER_HOME') ) )
 print( "UserHomePath: " + FreeCAD.ConfigGet("UserHomePath") )
 exit()
 EOF

Avvio di FreeCAD dal desktop

Linux: creazione di un'opzione di avvio aggiuntiva

Quanto segue presuppone che il desktop sia configurato in modo tale da poter avviare FreeCAD dallo stesso. A seconda della distribuzione Linux e dell'ambiente desktop, potrebbe essere necessario adattare i seguenti passaggi:

  1. Copiare il file di ingresso di freedesktop per FreeCAD da /usr/share/applications/freecad.desktop a ~/.local/share/applications.
  2. Cambiare il nome da freecad.desktop in qualcos'altro (ad es. MyFreeCADConfig.desktop).
  3. Aprire il file con un editor di testo e modificare il modo in cui viene invocato FreeCAD modificando la riga che inizia con Exec.
  4. Di conseguenza, è disponibile una voce aggiuntiva nel menu di avvio/avvio dell'applicazione. In questo modo, puoi avere più voci di FreeCAD con varie opzioni di avvio.

Avvio di FreeCAD da un supporto USB portatile

Windows

Mettere l'eseguibile di FreeCAD, FreeCAD.exe, sul supporto USB. Creare un file batch, FreeCAD.bat, e metterlo nella stessa directory di FreeCAD.exe. All'interno del file batch scrivere:

set CURRENTDIR=%cd%
set FREECAD_USER_HOME=%CURRENTDIR%
start FreeCAD.exe -u FreeCAD/user.cfg -s FreeCAD/system.cfg --write-log

Or with FREECAD_USER_DATA (see):

set CURRENTDIR="%cd%"
set FREECAD_USER_DATA=%CURRENTDIR%/..
start FreeCAD.exe -u %FREECAD_USER_DATA%/user.cfg -s %FREECAD_USER_DATA%/system.cfg

Con il batch nella root del supporto USB:

set CURRENTDIR=%cd%
set FREECAD_USER_DATA=%CURRENTDIR%FreeCAD\
start %cd%FreeCAD\bin\FreeCAD.exe -u %FREECAD_USER_DATA%user.cfg -s %FREECAD_USER_DATA%system.cfg

Ora fai doppio clic sul file batch per avviare FreeCAD. (vedere)


Build Support Tools/it


Introduzione

Lo Strumento per la compilazione di FreeCAD (FreeCAD build tool o fcbt) è uno script in Python ubicato in

trunc/src/Tools/fcbt.py

Può essere usato per semplificare alcune frequenti operazioni nella compilazione, distribuzione e estensione di FreeCAD.

Utilizzo

Con Python installato correttamente, fcbt può essere richiamato con il comando

python fbct.py

che visualizza un menu, in cui è possibile selezionare l'operazione che si desidera utilizzare per:

FreeCAD Build Tool
 Usage:
    fcbt <command name> [command parameter]
 possible commands are:
  - DistSrc         (DS)   Build a source Distr. of the current source tree
  - DistBin         (DB)   Build a binary Distr. of the current source tree
  - DistSetup       (DI)   Build a Setup Distr. of the current source tree
  - DistSetup       (DUI)  Build a User Setup Distr. of the current source tree
  - DistAll         (DA)   Run all three above modules
  - NextBuildNumber (NBN)  Increase the Build Number of this Version
  - CreateModule    (CM)   Insert a new FreeCAD Module (Workbench) in the module directory
 
 For help on the modules type:
   fcbt <command name> ?

Al prompt inserire il comando abbreviato che si desidera utilizzare. Ad esempio digitare "CM" per creare un modulo.

DistSrc

Il comando "DS" crea una distribuzione di codice sorgente dell'albero di codice sorgente attuale.

DistBin

Il comando "DB" crea una distribuzione binaria dell'albero di codice sorgente attuale.

DistSetup

Il comando "DI" crea una distribuzione di setup dell'albero di codice sorgente attuale.

DistSetup

Il comando "DUI" crea una distribuzione di setup dell'utente dell'albero di codice sorgente attuale.

DistAll

Il comando "DA" esegue "DS", "DB" e "DI" in sequenza.

NextBuildNumber

Il comando "NBN" incrementa il numero della build per creare una nuova versione di FreeCAD.

CreateModule

Il comando "CM" crea un nuovo modulo dell'applicazione (Workbench).



Introduzione

Questa pagina da indicazioni su come aggiungere un nuovo ambiente di lavoro all'interfaccia di FreeCAD. Gli Ambienti di Lavoro sono contenitori per i comandi di FreeCAD. Possono essere codificati in Python, in C++ o in un mix di entrambi, il che ha il vantaggio di unire la velocità del C++ alla flessibilità di Python. In tutti i casi, tuttavia, l'ambiente verrà avviato da un set di due file Python. Possono essere ambienti di lavoro "interni", inclusi nella distribuzione di FreeCAD, o ambienti di lavoro "esterni", distribuiti tramite l'Addon Manager o installati manualmente scaricandoli da qualche repository online. Gli Ambienti di lavoro interni possono essere codificati in C++, Python o una combinazione dei due, mentre i workbench esterni devono essere solo in Python.

La struttura dell'Ambiente di lavoro

È necessaria una cartella, con qualsiasi nome si voglia, collocata nella directory Mod dell'utente, con un file Init.py e, facoltativamente, un file InitGui.py. Il file Init.py viene eseguito all'avvio di FreeCAD e il file InitGui.py viene eseguito immediatamente dopo, ma solo quando FreeCAD si avvia in modalità GUI. Questo è tutto ciò che serve a FreeCAD per trovare l'ambiente di lavoro all'avvio e aggiungerlo alla propria interfaccia.

La cartella utente Mod è una sottocartella della cartella dei dati dell'applicazione utente (si può trovare quest'ultima digitando App.getUserAppDataDir() nella console Python):

  • Per Linux è solitamente /home/<username>/.local/share/FreeCAD/Mod/ (versione 0.20 e superiori) o /home/<username>/.FreeCAD/Mod/ (versione 0.19 e precedenti).
  • Per Windows è %APPDATA%\FreeCAD\Mod\, che di solito è C:\Users\<username>\Appdata\Roaming\FreeCAD\Mod\.
  • Per macOS è solitamente /Users/<username>/Library/Application Support/FreeCAD/Mod/.

La directory Mod dovrebbe essere simile a questa:

/Mod/
 +-- MyWorkbench/
     +-- Init.py
     +-- InitGui.py

All'interno questi file si può fare quello che si vuole. Di solito vengono utilizzati in questo modo:

  • Nel file Init.py si inseriscono solo alcune cose, usate anche quando FreeCAD funziona in modalità console, per esempio, gli importatori e gli esportatori di file
  • Nel file InitGui.py si definisce un ambiente di lavoro che contiene un nome, un'icona e una serie di comandi di FreeCAD (vedi sotto). Nel file python si definiscono inoltre le funzioni che vengono eseguite quando si carica FreeCAD (in questa parte si cerca di fare meno lavoro possibile, in modo da non rallentare l'avvio), quelle che vengono eseguite quando si attiva l'ambiente (la parte dove si esegue la maggior parte del lavoro), e come terze quelle che servono quando l'ambiente viene disattivato (in modo da poter rimuovere le cose, se è necessario).

La struttura e il contenuto del file per un ambiente di lavoro descritto qui è il modo classico di creare un nuovo ambiente. Si può usare una leggera variazione nella struttura dei file quando si crea un nuovo ambiente in Python, questo modo alternativo è descritto più precisamente come un "ambiente di lavoro con spazio dei nomi", aprendo la possibilità di usare pip per installare l'ambiente. Entrambe le strutture funzionano, quindi è più una questione di preferenza quando si crea un nuovo ambiente di lavoro. Lo stile e la struttura per gli ambienti qui presentati sono disponibili nello spazio dei nomi globale di FreeCAD, mentre per lo stile e la struttura alternativi l'ambiente risiede in uno spazio dei nomi dedicato. Per ulteriori letture sull'argomento vedere Riferimenti

Struttura del workbench in C++

Per codificare l'ambiente in python, non è necessario usare particolari attenzioni, è possibile inserire semplicemente gli altri file python insieme ai file Init.py e InitGui.py. Invece, quando si lavora in C++ si deve avere maggiori attenzioni, e iniziare rispettando una regola fondamentale di FreeCAD: separare la parte App dell'ambiente, quella che può essere eseguita in modalità console, senza alcun elemento GUI, dalla parte Gui, che è quella che viene caricata solo quando FreeCAD funziona completo del suo ambiente GUI. Quindi, quando si crea un ambiente in C++, in realtà si creano probabilmente due moduli, un App e un Gui. Questi due moduli devono naturalmente essere richiamabili in python. Ogni modulo di FreeCAD (App o Gui) consiste, per lo meno, di un modulo con un file init. Questo è un tipico file AppMyModuleGui.cpp:

extern "C" {
    void MyModuleGuiExport initMyModuleGui()  
    {
         if (!Gui::Application::Instance) {
            PyErr_SetString(PyExc_ImportError, "Cannot load Gui module in console application.");
            return;
        }
        try {
            // import other modules this one depends on
            Base::Interpreter().runString("import PartGui");
            // run some python code in the console
            Base::Interpreter().runString("print('welcome to my module!')");
        }
        catch(const Base::Exception& e) {
            PyErr_SetString(PyExc_ImportError, e.what());
            return;
        }
        (void) Py_InitModule("MyModuleGui", MyModuleGui_Import_methods);   /* mod name, table ptr */
        Base::Console().Log("Loading GUI of MyModule... done\n");
    
        // initializes the FreeCAD commands (in another cpp file)
        CreateMyModuleCommands();
    
        // initializes workbench and object definitions
        MyModuleGui::Workbench::init();
        MyModuleGui::ViewProviderSomeCustomObject::init();
    
         // add resources and reloads the translators
        loadMyModuleResource();
    }
}

Il file Init.py

"""FreeCAD init script of XXX module"""

# ***************************************************************************
# *   Copyright (c) 2015 John Doe john@doe.com                              *   
# *                                                                         *
# *   This file is part of the FreeCAD CAx development system.              *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU Lesser General Public License (LGPL)    *
# *   as published by the Free Software Foundation; either version 2 of     *
# *   the License, or (at your option) any later version.                   *
# *   for detail see the LICENSE text file.                                 *
# *                                                                         *
# *   FreeCAD is distributed in the hope that it will be useful,            *
# *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
# *   GNU Lesser General Public License for more details.                   *
# *                                                                         *
# *   You should have received a copy of the GNU Library General Public     *
# *   License along with FreeCAD; if not, write to the Free Software        *
# *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
# *   USA                                                                   *
# *                                                                         *
# ***************************************************************************/

FreeCAD.addImportType("My own format (*.own)", "importOwn")
FreeCAD.addExportType("My own format (*.own)", "exportOwn")
print("I am executing some stuff here when FreeCAD starts!")

Si può scegliere qualsiasi licenza che si desidera per il proprio workbench, ma si tenga presente che se ad un certo punto si vuole vedere il proprio workbench integrato e distribuito con il codice sorgente di FreeCAD, deve essere LGPL2+ come nell'esempio sopra. Vedere la Licenza.

Le funzioni FreeCAD.addImportType() e addEXportType() consentono di fornire il nome e l'estensione di un tipo di file e un modulo Python responsabile della sua importazione. Nell'esempio sopra, un modulo importOwn.py gestirà i file .own. Vedere Frammenti di codice per altri esempi.

Ambienti di lavoro in Python

Questo è il file InitGui.py:

class MyWorkbench (Workbench):

    MenuText = "My Workbench"
    ToolTip = "A description of my workbench"
    Icon = """paste here the contents of a 16x16 xpm icon"""

    def Initialize(self):
        """This function is executed when the workbench is first activated.
        It is executed once in a FreeCAD session followed by the Activated function.
        """
        import MyModuleA, MyModuleB # import here all the needed files that create your FreeCAD commands
        self.list = ["MyCommand1", "MyCommand2"] # a list of command names created in the line above
        self.appendToolbar("My Commands", self.list) # creates a new toolbar with your commands
        self.appendMenu("My New Menu", self.list) # creates a new menu
        self.appendMenu(["An existing Menu", "My submenu"], self.list) # appends a submenu to an existing menu

    def Activated(self):
        """This function is executed whenever the workbench is activated"""
        return

    def Deactivated(self):
        """This function is executed whenever the workbench is deactivated"""
        return

    def ContextMenu(self, recipient):
        """This function is executed whenever the user right-clicks on screen"""
        # "recipient" will be either "view" or "tree"
        self.appendContextMenu("My commands", self.list) # add commands to the context menu

    def GetClassName(self): 
        # This function is mandatory if this is a full Python workbench
        # This is not a template, the returned string should be exactly "Gui::PythonWorkbench"
        return "Gui::PythonWorkbench"
       
Gui.addWorkbench(MyWorkbench())

A parte questo, si può fare tutto ciò che si vuole: si potrebbe mettere tutto il codice del workbench all'interno di InitGui.py se si vuole, ma di solito è più conveniente posizionare le diverse funzioni dell'ambiente in file separati. Così i file sono più piccoli e più facili da leggere. Poi si importano i file in InitGui.py. È possibile organizzare i file nel modo desiderato, un buon esempio di organizzazione è un file per ogni comando di FreeCAD che si aggiunge.

Preferenze

Si può aggiungere una pagina Preferenze per il proprio ambiente di lavoro Python. Le pagine delle preferenze cercano un'icona di preferenza con un nome specifico nel sistema Qt Resource. Se l'icona non è nel sistema di risorse o non ha il nome corretto, l'icona non verrà visualizzata nella pagina Preferenze.

Aggiunta dell'icona del proprio workbench:

  • l'icona delle preferenze deve essere chiamata "preferences-" + "modulename" + ".svg" (tutto in minuscolo)
  • creare un file qrc contenente tutti i nomi delle icone
  • nella directory principale *.py, eseguire pyside-rcc -o myResources.py myqrc.qrc
  • in InitGui.py, aggiungere import myResource(.py)
  • aggiornare il tuo repository (git) con myResources.py e myqrc.qrc

Si dovranno ripetere i passaggi se si aggiungono o modificano le icone.

@kbwbe ha creato un buon script per compilare risorse per il workbench A2Plus. Vedere sotto.

Aggiunta delle tue pagine delle preferenze:

  • Si deve compilare il plug-in Qt designer che consente di aggiungere le impostazioni delle preferenze con Qt Designer
  • Creare un widget vuoto in Qt Designer (nessun pulsante o altro)
  • Progettare tua pagina delle preferenze, qualsiasi impostazione che deve essere salvata (preferenza) deve essere uno dei widget Gui::Pref* che sono stati aggiunti dal plugin)
  • In ognuno di questi, assicurarsi d'inserire PrefName (il nome del tuo valore di preferenza) e PrefPath (es: Mod/MyWorkbenchName), che salverà il tuo valore in BaseApp/Preferences/Mod/MyWorkbenchName
  • Salvare il file ui nel proprio ambiente, assicurarsi che sia gestito da cmake
  • Nel proprio banco di lavoro, ad es. all'interno del file InitGui, all'interno del metodo Initialize (ma funziona anche in qualsiasi altro posto), aggiungere: FreeCADGui.addPreferencePage("/path/to/myUiFile.ui","MyGroup"), "MyGroup" essendo uno dei gruppi di preferenze su la sinistra. FreeCAD cercherà automaticamente un file "preferences-mygroup.svg" nelle sue posizioni note (che si può estendere con FreeCADGui.addIconPath())
  • Assicurarsi che il metodo addPreferencePage() sia chiamato solo una volta, altrimenti la pagina pref verrà aggiunta più volte

Distribuzione

Per distribuire il proprio workbench Python, si può semplicemente ospitare i file in una posizione e istruire gli utenti a scaricarli e inserirli manualmente nella loro directory Mod, oppure si possono ospitare in un repository git online (GitHub, GitLab, Framagit e Debian Salsa sono posizioni attualmente supportate) e configurarle per l'installazione con l'Addon Manager. Le istruzioni per l'inclusione nell'elenco dei componenti aggiuntivi ufficiali di FreeCAD sono disponibili nel repository GitHub dei componenti aggiuntivi di FreeCAD. Per utilizzare Addon Manager, è necessario includere un package.xml metadata file, che istruisce Addon Manager su come trovare l'icona del proprio ambiente e consente la visualizzazione di una descrizione, numero di versione, ecc. Può anche essere utilizzato per specificare altri workbench o pacchetti Python da cui dipende l'ambiente in cui è bloccato o che è destinato a sostituire.

Per una guida rapida su come creare un file package.xml di base e aggiungere un workbench all'Addon Manager vedere: Aggiungere Workbench in Addon Manager.

Facoltativamente, si può includere a parte un file di metadati che descriva le dipendenze Python. Questo può essere un file chiamato metadata.txt che descrive le dipendenze esterne dell'ambiente (su altri componenti aggiuntivi, workbench o moduli Python) o un -format/ requirements.txt descrivendo le dipendenze Python. Si noti che se si utilizza un file requirements.txt, solo i nomi dei pacchetti specificati vengono utilizzati per la risoluzione delle dipendenze: le opzioni del comando pip, le opzioni di inclusione e le informazioni sulla versione non sono supportate da Addon Manager. Gli utenti possono eseguire manualmente il file dei requisiti utilizzando pip se tali funzionalità sono richieste.

Il formato del file metadata.txt è testo semplice, con tre righe facoltative:

workbenches=
pylibs=
optionalpylibs=

Ogni riga dovrebbe consistere in un elenco separato da virgole di elementi da cui dipende l'Ambiente. Gli ambienti di lavoro possono essere un ambiente di lavoro interno di FreeCAD, ad es. "FEM", o un Addon esterno, ad esempio "Curve". Le librerie Python obbligatorie e facoltative dovrebbero essere specificate con i loro nomi Python canonici, come si userebbe con pip install. Per esempio:

workbenches=FEM,Curves
pylibs=ezdxf
optionalpylibs=metadata,git

Si può anche includere uno script che viene eseguito quando il pacchetto viene disinstallato. Questo è un file chiamato "uninstall.py" che si trova al livello superiore del componente aggiuntivo. Viene eseguito quando un utente disinstalla il componente aggiuntivo utilizzando Addon Manager. Si usa per ripulire tutto ciò che il componente aggiuntivo potrebbe aver fatto al sistema degli utenti e che non dovrebbe persistere quando il componente aggiuntivo viene rimosso (ad esempio, rimuovere i file della cache, ecc.).

Per assicurarti che il proprio componente aggiuntivo venga letto correttamente da Addon Manager, si può abilitare una "modalità sviluppatore" in cui Addon Manager esamina tutti i componenti aggiuntivi disponibili e garantisce che i loro metadati contengano gli elementi richiesti. Per abilitare questa modalità selezionare: Modifica → Preferenze... → Gestore componenti aggiuntivi → Opzioni gestore componenti aggiuntivi → Modalità sviluppatore componenti aggiuntivi, vedere l'Editor delle preferenze.

Workbench in C++

Quando si vuole codificare l'ambiente in C ++, probabilmente si vuole anche codificare la definizione dell'ambiente stesso in C ++ (anche se non è necessario: si potrebbe anche codificare solo gli strumenti in C++, e lasciare la definizione dell'ambiente in python). In tal caso, il file InitGui.py diventa molto semplice: Può contenere una sola riga:

import MyModuleGui

dove MyModule è l'ambiente completo in C++, inclusi i comandi e la definizione dell'ambiente.

La codificazione dei workbenches in C++ funziona in modo molto simile. Questo è un tipico file Workbench.cpp da includere nella parte Gui del modulo:

namespace MyModuleGui {
    class MyModuleGuiExport Workbench : public Gui::StdWorkbench
    {
        TYPESYSTEM_HEADER();

    public:
        Workbench();
        virtual ~Workbench();

        virtual void activated();
        virtual void deactivated();

    protected:
        Gui::ToolBarItem* setupToolBars() const;
        Gui::MenuItem*    setupMenuBar() const;
    };
}

Preferenze

Si può anche aggiungere una pagina delle preferenze per i workbench C++. I passaggi sono simili a quelli per Python.

Distribuzione

Ci sono due opzioni per distribuire un workbench C++, si può ospitare da se le versioni precompilate per i diversi sistemi operativi oppure si può richiedere che il codice venga unito al codice sorgente di FreeCAD. Come accennato in precedenza, ciò richiede una licenza LGPL2+ e si deve prima presentare il proprio workbench alla comunità nel forum di FreeCAD per la revisione.

I comandi di FreeCAD

I comandi FreeCAD sono gli elementi di base dell'interfaccia di FreeCAD. Possono apparire come un pulsanti sulla barra degli strumenti, e come voce di menu. Ma sono lo stesso comando. Un comando è una semplice classe Python, che deve contenere un paio di attributi predefiniti e le funzioni che definiscono il nome del comando, la sua icona, e cosa fare quando viene attivato il comando.

Definizione dei comandi Python

class My_Command_Class():
    """My new command"""

    def GetResources(self):
        return {"Pixmap"  : "My_Command_Icon", # the name of a svg file available in the resources
                "Accel"   : "Shift+S", # a default shortcut (optional)
                "MenuText": "My New Command",
                "ToolTip" : "What my new command does"}

    def Activated(self):
        """Do something here"""
        return

    def IsActive(self):
        """Here you can define if the command must be active or not (greyed) if certain conditions
        are met or not. This function is optional."""
        return True

FreeCADGui.addCommand("My_Command", My_Command_Class())

Definizione dei comandi C++

Allo stesso modo, è possibile codificare i comandi in C++, in genere in un file Commands.cpp nel modulo Gui. Questo è un tipico file Commands.cpp:

DEF_STD_CMD_A(CmdMyCommand);

CmdMyCommand::CmdMyCommand()
  :Command("My_Command")
{
  sAppModule    = "MyModule";
  sGroup        = QT_TR_NOOP("MyModule");
  sMenuText     = QT_TR_NOOP("Runs my command...");
  sToolTipText  = QT_TR_NOOP("Describes what my command does");
  sWhatsThis    = QT_TR_NOOP("Describes what my command does");
  sStatusTip    = QT_TR_NOOP("Describes what my command does");
  sPixmap       = "some_svg_icon_from_my_resource";
}

void CmdMyCommand::activated(int iMsg)
{
    openCommand("My Command");
    doCommand(Doc,"print('Hello, world!')");
    commitCommand();
    updateActive();
}

bool CmdMyCommand::isActive(void)
{
  if( getActiveGuiDocument() )
    return true;
  else
    return false;
}

void CreateMyModuleCommands(void)
{
    Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager();
    rcCmdMgr.addCommand(new CmdMyCommand());
}

"Compilazione" del file di risorse

compileA2pResources.py dall'ambiente A2Plus:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#***************************************************************************
#*                                                                         *
#*   Copyright (c) 2019 kbwbe                                              *
#*                                                                         *
#*   Portions of code based on hamish's assembly 2                         *
#*                                                                         *
#*   This program is free software; you can redistribute it and/or modify  *
#*   it under the terms of the GNU Lesser General Public License (LGPL)    *
#*   as published by the Free Software Foundation; either version 2 of     *
#*   the License, or (at your option) any later version.                   *
#*   for detail see the LICENSE text file.                                 *
#*                                                                         *
#*   This program is distributed in the hope that it will be useful,       *
#*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
#*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
#*   GNU Library General Public License for more details.                  *
#*                                                                         *
#*   You should have received a copy of the GNU Library General Public     *
#*   License along with this program; if not, write to the Free Software   *
#*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
#*   USA                                                                   *
#*                                                                         *
#***************************************************************************

# This script compiles the A2plus icons for py2 and py3
# For Linux only
# Start this file in A2plus main directory
# Make sure pyside-rcc is installed

import os, glob

qrc_filename = 'temp.qrc'
if os.path.exists(qrc_filename):
    os.remove(qrc_filename)

qrc = '''<RCC>
\t<qresource prefix="/">'''
for fn in glob.glob('./icons/*.svg'):
    qrc = qrc + '\n\t\t<file>%s</file>' % fn
qrc = qrc + '''\n\t</qresource>
</RCC>'''

print(qrc)

f = open(qrc_filename,'w')
f.write(qrc)
f.close()

os.system(
    'pyside-rcc -o a2p_Resources2.py {}'.format(qrc_filename))
os.system(
    'pyside-rcc -py3 -o a2p_Resources3.py {}'.format(qrc_filename))

os.remove(qrc_filename)

Riferimenti



Prova preliminare

Prima di provare il debug usare la Struttura di Test (test framework - macro) per verificare se i test standard funzionano correttamente. Se non funzionano, è possibile che l'installazione sia danneggiata.

Riga di comando

Il debug di FreeCAD è supportato da alcuni meccanismi interni. La versione a riga di comando di FreeCAD fornisce delle opzioni di supporto del debug:

Queste sono le opzioni attualmente riconosciute in FreeCAD 0.19:

Opzioni generiche:

 -v [ --version ]        Stampa la stringa della versione
 -h [ --help ]           Stampa un messaggio di aiuto
 -c [ --console ]        Si avvia in modalità console
 --response-file arg     Può essere specificato anche con '@name'
 --dump-config           Scarica la configurazione
 --get-config arg        Stampa il valore della chiave di configurazione richiesta

Configurazione:

 -l [ --write-log ]        Scrive un file di registro in:
                           $HOME/.local/share/FreeCAD/FreeCAD.log (Linux)
                           $HOME/Libreria/Applicazione\Supporto/FreeCAD/FreeCAD.log (macOS)
                           %APPDATA%\FreeCAD\FreeCAD.log (Windows)
 --log-file arg            Diversamente da --write-log, questo consente di accedere a un file
                           archivio arbitrario
 -u [ --user-cfg ] arg     File di configurazione utente per caricare/salvare le impostazioni utente
 -s [ --system-cfg ] arg   File di configurazione del sistema per caricare/salvare le impostazioni di sistema
 -t [ --run-test ] arg     Test case - o 0 per tutti
 -M [ --module-path ] arg  Percorsi di moduli aggiuntivi
 -P [ --python-path ] arg  Percorsi Python aggiuntivi
 --single-instance         Consente di eseguire una singola istanza dell'applicazione

Generare un Backtrace

Se si esegue una versione sperimentale di FreeCAD ancora in fase sviluppo, essa potrebbe "bloccarsi". Si può aiutare gli sviluppatori a risolvere questi problemi fornendo loro un "backtrace". Per fare questo, è necessario eseguire un "debug build" del software. "Debug build" è un parametro che viene impostato al momento della compilazione, perciò bisogna auto-compilare FreeCAD, oppure ottenere una versione "debug" precompilata.

Per Linux

Linux Debugging →

Prerequisiti:

  • pacchetto software gdb installato
  • un debug build di FreeCAD (in questo momento disponibili solo per la compilazione di Debug)
  • un modello di FreeCAD che causa un crash

Passaggi:

Immettere quanto segue nella finestra del terminale:

Trovare il codice binario di FreeCAD sul proprio sistema:

$ whereis freecad
freecad: /usr/local/freecad <--- for example

$ cd /usr/local/freecad/bin
$ gdb FreeCAD

LLDB produrrà alcune informazioni di inizializzazione. Il (lldb) mostra che il debugger è in esecuzione nel terminale, ora inserisci::

(gdb) handle SIG33 noprint nostop
(gdb) run

FreeCAD verrà avviato. Effettuare le operazioni che causano il crash o il blocco di FreeCAD, quindi immettere 'bt' nella finestra del terminale.

(gdb) bt

Questo genera una lunga lista che descrive esattamente ciò che il programma stava facendo quando è andato in crash o in blocco. Includere questa lista nel vostro rapporto sul problema.

(gdb) bt full

Stampa anche i valori delle variabili locali. Questo può essere combinato con un numero per limitare il numero di frame mostrati.

Per macOSX

macOSX Debugging →

Prerequisiti:

  • pacchetto software lldb installato
  • un debug build di FreeCAD
  • un modello di FreeCAD che causa un crash

Passaggi:

Immettere quanto segue nella finestra del terminale:

$ cd FreeCAD/bin
$ lldb FreeCAD

LLDB produrrà alcune informazioni di inizializzazione. Il (lldb) mostra che il debugger è in esecuzione nel terminale, ora inserisci:

(lldb) run

Ora FreeCAD viene avviato. Effettuare le operazioni che causano il crash o il blocco di FreeCAD, quindi immettere 'bt' nella finestra del terminale.

(lldb) bt

Questo genera una lunga lista che descrive esattamente ciò che il programma stava facendo quando è andato in crash o in blocco. Includere questa lista nel vostro rapporto sul problema.

Elencare le librerie caricate da FreeCAD

(Applicabile a Linux e macOS)

A volte è utile capire quali librerie sta caricando FreeCAD, in particolare se ci sono più librerie caricate con lo stesso nome ma versioni diverse (collisione di versioni). Per vedere quali librerie vengono caricate da FreeCAD quando si arresta in modo anomalo, è necessario aprire un terminale ed eseguirlo nel debugger. In una seconda finestra del terminale, scopri l'id del processo di FreeCAD:

ps -A | grep FreeCAD

Usa l'id restituito e passalo a lsof:

lsof -p process_id

Questo stampa un lungo elenco di risorse caricate. Quindi, ad esempio, se si tenta di verificare se è caricata più di una versione della libreria Coin3d, scorrere l'elenco o cercare direttamente Coin nell'output:

lsof -p process_id | grep Coin

Eliminare errori Python

Per un approccio più moderno al debug di Python, almeno su Windows, vedere questo

winpdb

winpdb Debugging →

Ecco un esempio dell'uso di "Winpdb" all'interno di FreeCAD:

E' necessario il debugger di Python: "Winpdb". Se non lo è installato, su Ubuntu/Debian installarlo con:

sudo apt-get install winpdb

Questo consente di impostare il debugger.

  1. Start Winpdb.
  2. Impostare la password del debugger su "test": andare al menu "File" → "Password" e impostare la password.

Ora si esegua uno script Python di prova in FreeCAD passo dopo passo.

  1. Eseguire winpdb e impostare la password (ad esempio test)
  2. Creare un file Python con questo contenuto
import rpdb2
rpdb2.start_embedded_debugger("test")
import FreeCAD
import Part
import Draft
print "hello"
print "hello"
import Draft
points=[FreeCAD.Vector(-3.0,-1.0,0.0),FreeCAD.Vector(-2.0,0.0,0.0)]
Draft.makeWire(points,closed=False,face=False,support=None)
  1. Avviare FreeCAD e caricare il file precedente in FreeCAD.
  2. Premere F6 per eseguirlo.
  3. Ora FreeCAD non risponde perché il debugger Python è in attesa
  4. Passare alla GUI di Windpdb e cliccare su "Attach". Dopo pochi secondi appare una voce "<Input>" su cui si deve fare doppio clic.
  5. Ora in Winpdb viene visualizzato lo script attualmente in esecuzione.
  6. Impostare un break nell'ultima riga e premere F5.
  7. Ora premere F7 per entrare nel codice Python di Draft.makeWire

Visual Studio Code (VS Code)

VS Code Debugging →

Prerequisiti:

  • Il pacchetto ptvsd deve essere installato in un Python 3 al di fuori di FreeCAD, quindi il modulo deve essere copiato nella cartella della libreria Python di FreeCAD.
# In a cmd window that has a path to you local Python 3:
pip install ptvsd
# Then if your Python is installed in C:\Users\<userid>\AppData\Local\Programs\Python\Python37
# and your FreeCAD is installed in C:\freecad\bin
xcopy "C:\Users\<userid>\AppData\Local\Programs\Python\Python37\Lib\site-packages\ptvsd" "C:\freecad\bin\Lib\site-packages\ptvsd"

pypi page

Documentazione di Visual Studio Code per il debug remoto

Passi:

  • Aggiungere il seguente codice all'inizio dello script
import ptvsd
print("Waiting for debugger attach")
# 5678 is the default attach port in the VS Code debug configurations
ptvsd.enable_attach(address=('localhost', 5678), redirect_output=True)
ptvsd.wait_for_attach()
  • Aggiungere una configurazione di debug nel codice di Visual Studio Debug → Aggiungi configurazioni ....
  • La configurazione dovrebbe assomigliare a questa:
    "configurations": [
        {
            "name": "Python: Attacher",
            "type": "python",
            "request": "attach",
            "port": 5678,
            "host": "localhost",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "."
                }
            ]
        },
  • In VS Code aggiungere un breakpoint dove si desidera.
  • Avviare lo script in FreeCAD. FreeCAD si blocca in attesa dell'allegato.
  • In VS Code avviare il debug, utilizzando la configurazione creata. Si dovrebbero vedere le variabili nell'area del debugger.
  • Quando si impostano i punti di interruzione, VS Code segnalerà di non trovare il file .py aperto nell'editor di VS Code.
    • Cambiare "remoteRoot": "." to "remoteRoot": "<directory del file>"
      • Ad esempio, se il file Python risiede in /home/FC_myscripts/myscript.py
      • Cambiare in: "remoteRoot": "/home/FC_myscripts"
    • Se si sta solo eseguendo il debug delle macro di FreeCAD dalla cartella delle macro di FreeCAD e quella cartella è "C:/Users/<userid>/AppData/Roaming/FreeCAD/Macro", usare:
      • "localRoot": "C:/Users/<userid>/AppData/Roaming/FreeCAD/Macro",
      • "remoteRoot": "C:/Users/<userid>/AppData/Roaming/FreeCAD/Macro"
  • Se la macro non riesce a trovare ptvsd nonostante l'abbia installata da qualche parte, far precedere 'import ptvsd' con
from sys import path
sys.path.append('/path/to/site-packages')

Dove si trova il percorso della directory in cui è stato installato ptvsd.

  • Sul bordo in basso a sinistra di VSCode si può scegliere l'eseguibile Python: è meglio impostarlo alla versione installata con FreeCAD.

Nel package Mac è /Applications/FreeCAD.App/Contents/Resources/bin/python.

E' possibile individuarlo sul proprio sistema digitando

import sys
print(sys.executable)

nella console Python di FreeCAD.

Con LiClipse e AppImage

LiClipse Debugging →

  • Estrarre AppImage.
> ./your location/FreeCAD_xxx.AppImage --appimage-extract
> cd squashfs-root/
  • La posizione sqashfs-root è il punto in cui il debugger viene successivamente collegato.
  • Assicurarsi di poter avviare una sessione di FreeCAD dalla posizione squashfs-root.
squashfs-root> ./usr/bin/freecadcmd
  • Si dovrebbe avviare una sessione della riga di comando di FreeCAD.
  • Installare [1].
    • Viene fornito pronto con pydev e dispone di programmi di installazione per tutte le piattaforme.
    • Per Linux è sufficiente estrarlo (in qualsiasi posizione) ed eseguire.
  • Configurare liclipse per il debug.
    • Fare clic con il pulsante destro del mouse sull'icona pydev (angolo in alto a destra) e scegli Personalizza.
      • Attivare "PyDev Debug" (tramite la casella di controllo, oppure potrebbe essere necessario andare alla scheda "Disponibilità set di azioni" e attivarla prima).
      • Nel menu pydev scegliere "start debug server".
    • Usare finestra menu/apri prospettiva/altro > debug.
      • Fai clic con il pulsante destro del mouse sull'icona di debug (angolo in alto a destra) e scegliere Personalizza.
      • Selezionando "Debug" vengono visualizzati gli strumenti di navigazione di debug nella barra degli strumenti.
    • Aprire le preferenze tramite la finestra del menu/preferenze.
      • In PyDev/Interpreters aggiungere "nuovo interprete navigando".
      • L'interprete aggiunto dovrebbe essere: your loc/squashfs-root/usr/bin/python.
      • Se si sta usando solo per fc, si possono aggiungere anche le cartelle del workbench AddOn o farlo in un progetto pydev in seguito.
  • Trovare il percorso per pydevd.py nella tua installazione di liclipse.
    • Qualcosa sulla falsariga di: your location/liclipse/plugins/org.python.pydev.xx/pysrc.
  • Creare un normale progetto pydev in liclipse.
    • Importare fonti esterne, ad esempio una macro di cui si desidera eseguire il debug o un workbench esterno.
    • In quella macro (o file .py del workbench) aggiungere le righe di codice:
import sys; sys.path.append("path ending with /pysrc")
import pydevd; pydevd.settrace()
  • Questo è il punto in cui l'esecuzione si fermerà quando viene eseguita la macro.
  • Avviare il server di debug liclipse (menu pydev).
  • Avviare FreeCAD.
squashfs-root> ./usr/bin/freecad
  • Eseguire la macro (o qualsiasi altro file con un trigger pydevd.settrace()) da freecad, come si farebbe normalmente.
  • Buon debug.
  • L'uso di LiClipse per il debug remoto e i passaggi qui descritti relativi a liclipse dovrebbero funzionare su qualsiasi piattaforma. Le parti relative ad AppImage sono solo per Linux.

Pyzo

Vedere l'articolo principale su Pyzo.

Debugging OpenCasCade

Per gli sviluppatori che hanno bisogno di approfondire il kernel OpenCasCade, l'utente @abdullah ha creato un thread di orientamento che spiega come farlo.



Test workbench icon

Introduzione

Test Framework non è in realtà un ambiente di modellazione, ma contiene un set di script Python per eseguire diversi test sui componenti principali di FreeCAD, al fine di eseguire il debug dei problemi. Vedere anche come individuare gli errori.

Puoi avviare i test dalla riga di comando, usando le opzioni -t o --run-test.

Avvia tutti i test:

freecad --run-test 0

Avvia solo alcuni test specificati, per esempio

freecad -t TestDraft

Se un test non ha bisogno della GUI, può anche essere eseguito in modalità console impostando l'opzione -c o --console in aggiunta. Questo di solito si traduce in tempi di avvio molto più rapidi poiché la GUI non viene caricata. Per esempio:

freecad -c -t TestPartDesignApp

Test menu

Ogni directory di primo livello in FreeCAD dovrebbe avere un file con i test che possono essere eseguiti per quel particolare ambiente di lavoro o modulo. Il file di solito inizia con la parola Test.

Per eseguire un test da FreeCAD, passare all'Ambiente Test, quindi Test commands → TestToolsGui → Self test → Select test name, quindi immettere il nome del file Python con i test; ad esempio, per l' Ambiente Draft, sarebbe TestDraft, quindi premere Start.

Funzioni di test

Questa è la lista delle applicazioni di test di 0.15 Git 4207:

TestAPP.All

Aggiungi funzione di test

BaseTests

Aggiungi funzione di test

UnitTests

Aggiungi funzione di test

Document

Aggiungi funzione di test

UnicodeTests

Aggiungi funzione di test

MeshTestsApp

Aggiungi funzione di test

TestDraft

Aggiungi funzione di test

TestSketcherApp

Aggiungi funzione di test

TestPartApp

Aggiungi funzione di test

TestPartDesignApp

Aggiungi funzione di test

TestCAMApp

Ambiente Path casistiche di test:

  • depthTestCases:
  • PathTestUtils:
  • TestDressupDogbone: Test functionality of Dogbone dressup.
  • TestHoldingTags: Test functionality of Holding Tags dressup.
  • TestPathAdaptive: Test selection capability of Adaptive operation.
  • TestPathCore: Test core functionality of Path workbench.
  • TestPathDeburr: Test general functionality of Deburr operation.
  • TestPathGeom: Test various functions available in the PathGeom module.
  • TestPathHelix: Test general functionality of Helix operation.
  • TestPathLog: Test various functions available in the PathLog debugging and feedback module.
  • TestPathOpTools:
  • TestPathPreferences: Test various functions available in the PathPreferences module.
  • TestPathPropertyBag:
  • TestPathSetupSheet:
  • TestPathStock:
  • TestPathThreadMilling:
  • TestPathTool:
  • TestPathToolBit:
  • TestPathToolController:
  • TestPathTooltable:
  • TestPathUtil: Test various functions available in the PathUtil module.
  • TestPathVcarve: Test general functionality of Vcarve operation.
  • TestPathVoronoi:

Workbench

Aggiungi funzione di test

Menu

Aggiungi funzione di test

Menu.MenuDeleteCases

Aggiungi funzione di test

Menu.MenuCreateCases

Aggiungi funzione di test

Scripting

Vedere anche: Script di base per FreeCAD

Ottienere un elenco di tutti i moduli di test di primo livello

FreeCAD.__unit_test__

Si noti che i moduli di test restituiti qui dipendono dal fatto che una GUI sia disponibile o meno. Cioè, quando viene eseguito in modalità console, mancano vari test che terminano in "Gui".

Eseguire test specifici

Esistono vari modi per eseguire test utilizzando Python's unittest library. Il framework di test di FreeCAD porta alla luce i casi più comuni.

Eseguire tutti i test definiti in un modulo Python:

import Test, TestFemApp
Test.runTestsFromModule(TestFemApp)

Eseguire tutti i test definiti in una classe Python:

import Test, femtest.app.test_solver_calculix
Test.runTestsFromClass(femtest.app.test_solver_calculix.TestSolverCalculix)

Esempio 1

All'interno della console Python di FreeCAD, il seguente formato di codice può essere utilizzato per eseguire test incorporati. Sostituire il testo rosso "TestFem" nel codice sottostante con il nome del test del modulo desiderato.

  • Ad esempio, utilizzare "TestPathApp" per eseguire tutti gli unit test per il framework di unit test Path workbench.
  • I sottomoduli sono disponibili utilizzando la notazione a punti, ad esempio "TestPathApp.TestPathAdaptive" per eseguire solo gli unit test adattivi all'interno del framework di test workbench Path più grande.
  • Più moduli di test o sottomoduli possono essere combinati aggiungendo un'altra chiamata al metodo `suite.addTest(...)` proprio come quella nel codice seguente, ma con un modulo o un riferimento di sottomodulo diverso.
  • L'output per il codice riportato di seguito sarà nel pannello Report View all'interno della GUI di FreeCAD.
  • Il codice sorgente è copiato dal post dell'utente del forum FreeCAD, sgrogan, nell'argomento unit test per python, con credito lì dato all'utente del forum, wmayer.
import unittest
suite = unittest.TestSuite()
suite.addTest(unittest.defaultTestLoader.loadTestsFromName("TestFem"))
r = unittest.TextTestRunner()
r.run(suite)

Risorse aggiuntive

Argomenti del Forum



Presentazione

Questo articolo descrive la Marchiatura di FreeCAD. Marchiare (Branding) significa creare una propria applicazione basata su FreeCAD. La personalizzazione può riguardare solo il proprio eseguibile oppure andare dalla schermata iniziale fino alla rielaborazione completa del programma. Sulla base dell'architettura flessibile di FreeCAD è facile utilizzarlo come base per il proprio programma per scopi speciali.

Avvertimento

Sebbene FreeCAD sia offerto gratuitamente e la comunità di FreeCAD sia felice di vedere emergere altre applicazioni basate su FreeCAD, abbiamo d'altronde visto un uso ingiusto delle informazioni contenute in questa pagina da parte di persone che semplicemente hanno rimarchiato FreeCAD in un'applicazione closed-source per trarne profitto.

Sebbene la Licenza LGPL consenta di utilizzare il codice sorgente di FreeCAD in applicazioni closed-source, fornisce anche regole rigide per farlo e non consente semplicemente di prendere FreeCAD, rinominarlo e togliergli la licenza.

Se sei interessato a utilizzare FreeCAD in un'applicazione closed-source, assicurati di controllare accuratamente le implicazioni della licenza LGPL e, ancora meglio, contatta qualsiasi sviluppatore, amministratore o moderatore di FreeCAD prima di farlo.

Generale

La maggior parte della marchiatura avviene in MainCmd.cpp oppure in MainGui.cpp. Questi Progetti generano i file eseguibili di FreeCAD. Per costruire il proprio marchio è sufficiente copiare i progetti Main o MainGui e dare all'eseguibile il proprio nome, ad esempio, FooApp.exe.

Le impostazioni più importanti per dare all'applicazione un nuovo aspetto possono essere fatte all'interno della funzione main(). Ecco la sezione di codice che controlla la marchiatura:

int main( int argc, char ** argv )
{
    // Name and Version of the Application
    App::Application::Config()["ExeName"] = "FooApp";
    App::Application::Config()["ExeVersion"] = "0.7";

    // set the banner (for loging and console)
    App::Application::Config()["CopyrightInfo"] = sBanner;
    App::Application::Config()["AppIcon"] = "FooAppIcon";
    App::Application::Config()["SplashScreen"] = "FooAppSplasher";
    App::Application::Config()["StartWorkbench"] = "Part design";
    App::Application::Config()["HiddenDockWindow"] = "Property editor";
    App::Application::Config()["SplashAlignment" ] = "Bottom|Left";
    App::Application::Config()["SplashTextColor" ] = "#000000"; // black

    // Inits the Application 
    App::Application::Config()["RunMode"] = "Gui";
    App::Application::init(argc,argv);

    Gui::BitmapFactory().addXPM("FooAppSplasher", ( const char** ) splash_screen);

    Gui::Application::initApplication();
    Gui::Application::runApplication();
    App::Application::destruct();

    return 0;
}

La prima voce Config definisce il nome del programma. Questo nome non è il nome del file eseguibile, il quale può essere modificato rinominandolo o tramite le impostazioni del compilatore, ma è il nome che viene visualizzato nella barra delle applicazioni di Windows o nell'elenco dei programmi sui sistemi Unix.

Le righe successive definiscono le voci di configurazione della vostra applicazione FooApp. Una descrizione di Config e delle sue voci si trova in Avvio e Configurazione.

Immagini

In FreeCAD tutte le risorse immagine vengono compilate utilizzando Qt's resource system. Pertanto è necessario scrivere un file .qrc, un file basato sul formato XML, che elenca i file di immagine sul disco, ma anche qualsiasi altro tipo di file di risorse. Per caricare all'interno dell'applicazione le risorse compilate è necessario aggiungere una riga

Q_INIT_RESOURCE(FooApp);

nella funzione main(). In alternativa, se si dispone di un'immagine in formato XPM è possibile includerla direttamente nella propria main.cpp e aggiungere la seguente riga per registrarla:

Gui::BitmapFactory().addXPM("FooAppSplasher", ( const char** ) splash_screen);

Marchiatura XML

In FreeCAD c'è anche un metodo supportato senza scrivere una funzione main() personalizzata. Per questo metodo basta scrivere un file chiamato branding.xml e metterlo nella directory di installazione di FreeCAD. Ecco un esempio con tutti i tag supportati:

<?xml version="1.0" encoding="utf-8"?>
<Branding>
    <Application>FooApp</Application>
    <WindowTitle>Foo App in title bar</WindowTitle>
    <BuildVersionMajor>1</BuildVersionMajor>
    <BuildVersionMinor>0</BuildVersionMinor>
    <BuildRevision>1234</BuildRevision>
    <BuildRevisionDate>2014/1/1</BuildRevisionDate>
    <CopyrightInfo>(c) My copyright</CopyrightInfo>
    <MaintainerUrl>Foo App URL</MaintainerUrl>
    <ProgramLogo>Path to logo (appears in bottom right corner)</ProgramLogo>
    <WindowIcon>Path to icon file</WindowIcon>
    <ProgramIcons>Path to program icons</ProgramIcons>
    <SplashScreen>splashscreen.png</SplashScreen>
    <SplashAlignment>Bottom|Left</SplashAlignment>
    <SplashTextColor>#ffffff</SplashTextColor>
    <SplashInfoColor>#c8c8c8</SplashInfoColor>
    <StartWorkbench>PartDesignWorkbench</StartWorkbench>
</Branding>

Tutti i tag elencati sono opzionali.



Introduzione

Localizzazione è in generale il processo che fornisce un software con una interfaccia utente (GUI) multilingua. In FreeCAD è possibile impostare la lingua dell'interfaccia utente in Modifica → Preferenze → Generale. FreeCAD utilizza Qt per abilitare il supporto di più lingue. Sui sistemi Unix / Linux, FreeCAD utilizza le impostazioni locali di default del sistema.

Contribuire a tradurre FreeCAD

Una cosa molto importante che gli utenti possono fare per contribuire a FreeCAD (se per esempio non hanno competenze di programmazione) è quella di aiutare a tradurre i suoi diversi aspetti (codice sorgente, wiki, sito Web, documentazione ecc.) in un'altra lingua. Ecco i modi per farlo.

Tradurre il codice sorgente di FreeCAD

FreeCAD utilizza un sistema di traduzione in linea collaborativo di terze parti chiamato Crowdin.

È un software proprietario ma gratuito per i progetti FOSS. Sotto ci sono le istruzioni su come usarlo:

  • Andare alla pagina Traduzione del progetto FreeCAD in Crowdin.
  • Accedere creando un nuovo profilo, o utilizzando un account di terze parti (GitHub, GitLab, GMail etc...).
  • Fare clic sulla lingua su cui si desidera lavorare.
  • Iniziare a tradurre facendo clic sul pulsante Traduci accanto a uno dei file. Ad esempio, su FreeCAD.ts che contiene le stringhe di testo per la GUI principale di FreeCAD.
  • Si può convalidare le traduzioni esistenti, oppure è possibile crearne di proprie.
Se si partecipa alla traduzione di FreeCAD, e si desidera essere informati prima della pubblicazione di una prossima versione che è il momento di rivedere la propria traduzione, si prega di iscriversi a uno dei team di traduzione di FreeCAD in Crowdin

.

Nota: I dettagli su come utilizzare crowdin possono essere trovati nella pagina Amministrazione di Crowdin.

Traduzione degli ambienti esterni

Vedere Traduzione di un ambiente esterno.

Preferenze di FreeCAD per i traduttori

A partire da FreeCAD 0.20, le seguenti variabili possono essere aggiunte manualmente alla sezione BaseApp/Preferences/General del file user.cfg per facilitare lo sviluppo di nuove traduzioni:

AdditionalLanguageDomainEntries - per aggiungere lingue completamente nuove a FreeCAD, che non sono attualmente supportate dal codice sorgente, è possibile utilizzare questa preferenza utente per aggiungere all'elenco delle lingue disponibili. Il formato delle lingue è "Language Name"="codice"; Per esempio:

<FCText Name="AdditionalLanguageDomainEntries">"Esperanto"="eo";"French"="fr";</FCText>

AdditionalTranslationsDirectory - aggiunge una directory aggiuntiva per FreeCAD per cercare i file *.qm. Questa posizione avrà la precedenza su $userAppDataDir/translations e $resourceDir/translations. Per esempio:

<FCText Name="AdditionalTranslationsDirectory">C:/Users/FreeCADUser/TestTranslations</FCText>

Tradurre il wiki

Questo wiki ospita molti contenuti, la maggior parte dei quali costruisce il manuale. È possibile sfogliare la documentazione a partire dalla Pagina principale, o dare un'occhiata al Sommario del manuale utente.

Per tradurre il wiki, si deve disporre dei permessi di modifica del wiki; vedere Come si può ottenere il permesso di modificare il wiki?.

È necessario avere una conoscenza di base sulla formattazione dello stile wiki e sulle linee guida generali del wiki di FreeCAD, perché durante la traduzione bisogna sapere cosa fare con alcuni tag. Potete trovare queste informazioni in WikiPages (en).

Plugin Mediawiki Translation

Quando il Wiki è stato spostato da SourceForge, Yorik ha installato un MediaWiki's plugin di traduzione che facilita la traduzione delle pagine. I vantaggi del plugin di traduzione sono che, ad esempio, ora può essere tradotto anche il titolo della pagina, che tiene traccia delle traduzioni, notifica se la pagina originale è stata aggiornata, e mantiene le traduzioni sincronizzate con la pagina originale inglese.

Lo strumento è documentato in Help:Extension:Translate, ed è parte di MediaWiki Language Extension Bundle.

Per sapere come preparare rapidamente una pagina per la traduzione e attivare il plugin, si prega di leggere Page translation example. In sostanza, una coppia di tag

<translate> ... </translate>

deve circondare l'intera pagina per attivare il sistema di traduzione e la pagina deve essere contrassegnata per la traduzione.

Per vedere un esempio di come funziona lo strumento di traduzione, visitare la Pagina principale. Si vedrà una barra della lingua generata automaticamente in alto. Cliccare su Deutsch (tedesco), si andrà a Main_Page/de. Proprio sotto il titolo, "Hauptseite" (in inglese "Main Page"), si può leggere Questa pagina è una versione tradotta della pagina Pagina principale e la traduzione è completa al XX%, XX è la percentuale corrente di traduzione. Fare clic su "Traduci" nella parte superiore della pagina per avviare l'utilità di traduzione per aggiornare, correggere e rivedere la traduzione esistente.

Ora se si va nella pagina Main Page, si nota che quando la pagina viene contrassegnata per la traduzione non è possibile modificarla direttamente, ma che si deve passare attraverso l'utility di traduzione.

Quando si aggiungono nuovi contenuti, prima deve essere creata la pagina inglese, e poi la pagina inglese può essere tradotta in un'altra lingua. Se qualcuno vuole cambiare o aggiungere dei contenuti in una pagina esistente, deve farlo nella pagina inglese, marcarla per la traduzione e poi tradurre i contenuti editati.

Se non siete sicuri su come procedere, non esitate a chiedere aiuto nel Development → Wiki subforum o nel specific language subforum del FreeCAD forum.

Note importanti

Ogni utente del wiki che dispone delle autorizzazioni "Editor" è in grado di avviare l'utilità di traduzione per scrivere, salvare e rivedere le traduzioni.

Tuttavia, solo gli utenti con permessi di "Amministratore" possono contrassegnare le pagine per la traduzione. Una pagina che non è stata contrassegnata per la traduzione non fa uso dell'estensione di traduzione e non è sincronizzata correttamente con le informazioni in inglese.

Anche la barra laterale (il menu di navigazione a sinistra) è traducibile, ma solo gli amministratori possono modificare questo elemento del sito. Si prega di seguire le istruzioni dedicate a questo nella pagina Tradurre la Sidebar.

La prima volta che una pagina viene passata al nuovo sistema di traduzione perde tutte le sue vecchie traduzioni "manuali". Per recuperare una traduzione, bisogna salvare una copia offline del vecchio testo prima della conversione. Quindi si può usare questo vecchio testo tradotto per riempire le unità di traduzione nel nuovo sistema. Si può anche aprire una versione precedente dalla cronologia (pulsante History) e ottenere il vecchio testo in questo modo. Questo deve essere fatto per ogni lingua che ha una pagina tradotta.

Tradurre la documentazione di FreeCAD

Come da consenso generale, la pagina di riferimento nel wiki è la pagina inglese, che dovrebbe essere creata per prima. Se si desidera modificare o aggiungere contenuto a una pagina, è necessario farlo prima alla pagina inglese e solo una volta completato l'aggiornamento, portare la modifica nella pagina tradotta.

Vecchie istruzioni di traduzione

Queste istruzioni sono solo un background storico, mentre le pagine vengono passate al nuovo plugin di traduzione.

Il primo passo è controllare se è già stata avviata la traduzione del manuale per la propria lingua (cercare nella barra laterale sinistra, sotto "manual").
In caso contrario, andare al forum e comunicare che si intende avviare una nuova traduzione, verranno create le impostazioni di base per la lingua che si desidera lavorare.
Vedere Come si può ottenere il permesso di modificare il wiki?.
Se la lingua è già presente, vedere quali pagine da tradurre sono ancora mancanti (sono quelle elencate in rosso). La tecnica è semplice: entrare in una pagina rossa, copiare e incollare il contenuto della corrispondente pagina inglese, e iniziare a tradurre..
Non dimenticare di includere tutti i tag e i modelli dalla pagina originale in inglese. Alcuni di questi modelli avranno un equivalente nella nuova lingua (per esempio, esiste un modello di Docnav in francese denominato Docnav/fr). Si deve utilizzare una barra slash e il codice della proria lingua in quasi tutti i collegamenti. Guardare altre pagine già tradotte per vedere come procedere.
Aggiungere una barra e il codice della propria lingua nelle categorie, come [[Category:Developer Documentation/it]]
Se non si è sicuri, andare nel forum e richiedere un controllo su quello che si è fatto, qualcuno vi dirà se và bene oppure no.
Nelle pagine del manuale sono comunemente utilizzati due modelli (maschere standard). Questi 2 modelli hanno versioni localizzate (Template:Docnav/it, Template:it, etc...)

  • Template:GuiCommand : è il blocco di informazioni del comando Gui in alto a destra nella documentazione del comando.
  • Template:Docnav : è la barra di navigazione visualizzata nella parte inferiore delle pagine, mostra le pagine precedenti e successive

Convenzioni sui nomi delle pagine
Si prega di prendere atto che, a causa di limitazioni in Sourceforge al motore MediaWiki, è necessario che tutte le pagine tradotte mantengano il nome originale in inglese della pagina corrispondente, con l'aggiunta di uno slash e del codice della lingua.
Per esempio, la pagina tradotta di About FreeCAD deve essere About Freecad/it in italiano, About FreeCAD/pl in polacco, etc. Il motivo è semplice: in questo modo se i traduttori interrompono il lavoro, gli amministratori del wiki, che non parlano tutte le lingue, sanno di quali pagine si tratta. Ciò facilita la manutenzione ed evita di perdere delle pagine.
Se si desidera che il modello Docnav mostri pagine collegate nella propria lingua, è possibile utilizzare redirect pages. Esse sono sostanzialmente collegate alla pagina vera e propria. Ecco un esempio con la pagina in francese di About FreeCAD.

  • La pagina About FreeCAD/fr è la pagina con il contenuto
  • La pagina À propos de FreeCAD contiene contiene questo codice:
#REDIRECT [[About FreeCAD/fr]]
  • Nella pagina About FreeCAD/fr, il codice Docnav sarà simile a questo:
{{docnav/fr|Bienvenue sur l'aide en ligne|Fonctionnalités}}

La pagina "Bienvenue sur l'aide en ligne" reindirizza a Online Help Startpage/fr, e la pagina "Fonctionnalités" reindirizza a Feature list/fr.

Tradurre il sito Web di FreeCAD

La traduzione del sito Web di FreeCAD viene ora eseguita tramite Crowdin. Il file si chiama homepage.po.

Sviluppo - Come aggiungere la localizzazione

Questa sezione è per gli sviluppatori che desiderano aggiungere la localizzazione al loro codice.

Preparare i moduli di FreeCAD/master per la traduzione

Queste sono le parti del processo di traduzione di FreeCAD:

  • estrarre le stringhe di testo dal codice sorgente nei file *.ts
  • caricare i file *.ts in FreeCAD Crowdin.
  • tradurre le stringhe all'interno di Crowdin
  • estrarre i file *.ts nuovi o modicati da Crowdin
  • convertire i file *.ts in file *.qm e aggiornare il file *.qrc di ogni modulo
  • aggiornare FreeCAD master

Tutti i passaggi precedenti sono eseguiti dagli "script di traduzione" che vengono eseguiti periodicamente da un amministratore.

Preparare il modulo per la traduzione è abbastanza semplice. Innanzitutto, è necessario assicurarsi di avere una directory "translations" in myModule/Gui/Resources. Quindi aprire una finestra di terminale (o equivalente in Windows/OSX) nella directory "translations" e inserire il seguente comando:

lupdate -ts myModule.ts

Questo crea un file di traduzione vuoto. Una volta fatto ciò, è necessario assicurarsi che gli script di traduzione siano aggiornati come in questa pull request.

Tutto quello che segue va in automatico per quanto riguarda lo sviluppatore. L'amministratore estrarrà le stringhe di testo, i traduttori le tradurranno, quindi l'amministratore estrarrà le traduzioni e aggiornerà FreeCAD/master.

Preparare il proprio modulo o la macro per la traduzione

I moduli o le macro di terze parti vengono tradotti più o meno allo stesso modo, tranne per il fatto che si deve eseguire parte del lavoro da solo. Questa discussione del forum descrive i dettagli.

Aggiornamento: vedere Traduzione di un ambiente di lavoro esterno

Precedenti tecniche di traduzione dei moduli

Vecchi metodi di localizzazione descrive in dettaglio l'uso di strumenti di traduzione come Qt Linguist, lupdate, lrelease, pylupdate4, ecc. La maggior parte di questi strumenti non sono più richiesti per i moduli FreeCAD/master, ma può essere utile conoscerli per la preparazione e l'aggiornamento di moduli di terze parti.

Aggiornamento automatico delle traduzioni in Crowdin

Attualmente i manutentori di FreeCAD utilizzano l'API Crowdin tramite Crowdin Scripts per eseguire il pull e il push delle traduzioni in Crowdin e di nuovo nel repository Github. L'API di Crowdin offre ai manutentori di FreeCAD la possibilità di automatizzare aspetti del flusso di lavoro di traduzione del progetto, per maggiori informazioni fare riferimento alla Documentazione dell'API di Crowdin.

Pagine correlate

Scripting

Vedere anche: Script di base per FreeCAD.

Per ottenere un dizionario con le lingue supportate dall'interfaccia di FreeCAD, utilizzare il metodo supportedLocales del modulo FreeCADGui.

locales = FreeCADGui.supportedLocales()

Dopo l'esecuzione locales conterrà:

{'English': 'en', 'Afrikaans': 'af', 'Arabic': 'ar', 'Basque': 'eu', 'Catalan': 'ca', 'Chinese Simplified': 'zh-CN', 'Chinese Traditional': 'zh-TW', 'Croatian': 'hr', 'Czech': 'cs', 'Dutch': 'nl', 'Filipino': 'fil', 'Finnish': 'fi', 'French': 'fr', 'Galician': 'gl', 'German': 'de', 'Hungarian': 'hu', 'Indonesian': 'id', 'Italian': 'it', 'Japanese': 'ja', 'Kabyle': 'kab', 'Korean': 'ko', 'Lithuanian': 'lt', 'Norwegian': 'no', 'Polish': 'pl', 'Portuguese': 'pt-PT', 'Portuguese, Brazilian': 'pt-BR', 'Romanian': 'ro', 'Russian': 'ru', 'Slovak': 'sk', 'Slovenian': 'sl', 'Spanish': 'es-ES', 'Swedish': 'sv-SE', 'Turkish': 'tr', 'Ukrainian': 'uk', 'Valencian': 'val-ES', 'Vietnamese': 'vi'}

Per ottenere la lingua dell'interfaccia corrente usa il metodo getLocale dello stesso modulo:

locale = FreeCADGui.getLocale()

Se la lingua corrente è l'inglese locale conterrà:

'English'

Per ottenere il language code corrispondente utilizzare:

locale = FreeCADGui.supportedLocales()[Gui.getLocale()]

Se la lingua corrente è l'inglese il risultato sarà:

'en'

Per impostare la lingua dell'interfaccia corrente utilizzare il metodo setLocale dello stesso modulo. È possibile specificare la lingua o il codice della lingua:

FreeCADGui.setLocale('Russian')
FreeCADGui.setLocale('ru')



Introduzione

Questa pagina elenca alcuni moduli Python aggiuntivi o altre parti di software che possono essere scaricati gratuitamente da internet, e che aggiungono funzionalità alla vostra installazione FreeCAD.

PySide (precedentemente era PyQt)

PySide (precedentemente PyQt) è richiesto da diversi moduli di FreeCAD per accedere all'interfaccia Qt di FreeCAD. È già incluso nella versione per windows di FreeCAD, e di solito su Linux è installato automaticamente da FreeCAD quando l'installazione viene fatta dai repository ufficiali. Se i moduli Draft, Arch, ecc. sono abilitati, dopo che FreeCAD è installato, significa che PySide (precedentemente PyQt) è presente e non è più necessario fare nulla.

Note:

In FreeCAD, PyQt4 diventerà progressivamente obsoleto dopo la versione 0.13, a favore di PySide, che fa esattamente lo stesso lavoro, ma ha una licenza (LGPL) più compatibile con FreeCAD.

Installazione

Linux

Il modo più semplice per installare PySide è attraverso il gestore dei pacchetti della propria distribuzione. Su sistemi Debian/Ubuntu, il nome del pacchetto è generalmente python-PySide, mentre per i sistemi basati su RPM viene chiamato pyside. Le dipendenze necessarie (Qt e SIP) si installano automaticamente.

Windows

Il programma può essere scaricato da http://qt-project.org/wiki/Category:LanguageBindings::PySide::Downloads. Prima di installare PyQt4 è necessario installare le librerie Qt e SIP (operazioni da documentare).

MacOS

PySide può essere installato su Mac tramite homebrew oppure port. Per maggiori informazioni, vedere Installare le dipendenze.

Utilizzo

Dopo l'installazione, è possibile verificare che tutto funzioni digitando nella console Python di FreeCAD:

import PySide

Per accedere all'interfaccia di FreeCAD, digitare:

from PySide import QtCore,QtGui
FreeCADWindow = FreeCADGui.getMainWindow()

Quindi si può iniziare ad esplorare l'interfaccia con il comando dir(). È possibile aggiungere nuovi elementi, ad esempio un widget personalizzato, con comandi come:

FreeCADWindow.addDockWidget(QtCore.Qt.RghtDockWidgetArea,my_custom_widget)

Lavorare con Unicode:

text = text.encode('utf-8')

Lavorare con QFileDialog e OpenFileName:

path = FreeCAD.ConfigGet("AppHomePath")
#path = FreeCAD.ConfigGet("UserAppData")
OpenName, Filter = PySide.QtGui.QFileDialog.getOpenFileName(None, "Read a txt file", path, "*.txt")

Lavorare con QFileDialog e SaveFileName:

path = FreeCAD.ConfigGet("AppHomePath")
#path = FreeCAD.ConfigGet("UserAppData")
SaveName, Filter = PySide.QtGui.QFileDialog.getSaveFileName(None, "Save a file txt", path, "*.txt")

Esempio di passaggio da PyQt4 a PySide

Nota: questi sono esempi di errori riscontrati nella transizione da PyQt4 verso PySide con le correzioni che sono state fatte. Con gli esempi precedenti sono certamente possibili altre soluzioni

try:
    import PyQt4                                        # PyQt4
    from PyQt4 import QtGui ,QtCore                     # PyQt4
    from PyQt4.QtGui import QComboBox                   # PyQt4
    from PyQt4.QtGui import QMessageBox                 # PyQt4
    from PyQt4.QtGui import QTableWidget, QApplication  # PyQt4
    from PyQt4.QtGui import *                           # PyQt4
    from PyQt4.QtCore import *                          # PyQt4
except Exception:
    import PySide                                       # PySide
    from PySide import QtGui ,QtCore                    # PySide
    from PySide.QtGui import QComboBox                  # PySide
    from PySide.QtGui import QMessageBox                # PySide
    from PySide.QtGui import QTableWidget, QApplication # PySide
    from PySide.QtGui import *                          # PySide
    from PySide.QtCore import *                         # PySide

Per accedere all'interfaccia di FreeCAD, digitare:

è possibile aggiungere nuovi elementi, come un widget personalizzato, con comandi come:

myNewFreeCADWidget = QtGui.QDockWidget()          # create a new dockwidget
myNewFreeCADWidget.ui = Ui_MainWindow()           # myWidget_Ui()             # load the Ui script
myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui
try:
    app = QtGui.qApp                              # PyQt4 # the active qt window, = the freecad window since we are inside it
    FCmw = app.activeWindow()                     # PyQt4 # the active qt window, = the freecad window since we are inside it
    FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window
except Exception:
    FCmw = FreeCADGui.getMainWindow()             # PySide # the active qt window, = the freecad window since we are inside it
    FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window

Lavorare con Unicode

try:
    text = unicode(text, 'ISO-8859-1').encode('UTF-8')  # PyQt4
except Exception:
    text = text.encode('utf-8')                         # PySide

Lavorare con QFileDialog e OpenFileName :

OpenName = ""
try:
    OpenName = QFileDialog.getOpenFileName(None,QString.fromLocal8Bit("Lire un fichier FCInfo ou txt"),path,"*.FCInfo *.txt") # PyQt4
except Exception:
    OpenName, Filter = PySide.QtGui.QFileDialog.getOpenFileName(None, "Lire un fichier FCInfo ou txt", path, "*.FCInfo *.txt")#PySide

Lavorare con QFileDialog e SaveFileName :

SaveName = ""
try:
    SaveName = QFileDialog.getSaveFileName(None,QString.fromLocal8Bit("Sauver un fichier FCInfo"),path,"*.FCInfo") # PyQt4
except Exception:
    SaveName, Filter = PySide.QtGui.QFileDialog.getSaveFileName(None, "Sauver un fichier FCInfo", path, "*.FCInfo")# PySide

Il MessageBox:

def errorDialog(msg):
    diag = QtGui.QMessageBox(QtGui.QMessageBox.Critical,u"Error Message",msg )
    try:
        diag.setWindowFlags(PyQt4.QtCore.Qt.WindowStaysOnTopHint) # PyQt4 # this function sets the window before
    except Exception:
        diag.setWindowFlags(PySide.QtCore.Qt.WindowStaysOnTopHint)# PySide # this function sets the window before
#    diag.setWindowModality(QtCore.Qt.ApplicationModal)       # function has been disabled to promote "WindowStaysOnTopHint"
    diag.exec_()

Lavorare con setProperty (PyQt4) e setValue (PySide)

self.doubleSpinBox.setProperty("value", 10.0) # PyQt4

sostituire con:

self.doubleSpinBox.setValue(10.0) # PySide

Lavorare con setToolTip

self.doubleSpinBox.setToolTip(_translate("MainWindow", "Coordinate placement Axis Y", None)) # PyQt4

sostituire con:

self.doubleSpinBox.setToolTip(_fromUtf8("Coordinate placement Axis Y")) # PySide

oppure:

self.doubleSpinBox.setToolTip(u"Coordinate placement Axis Y.")# PySide

Documentazione aggiuntiva

Pivy

Pivy serve a alcuni moduli per accedere alla visualizzazione 3D di FreeCAD. Su Windows, Pivy è già in impacchettato nel programma di installazione FreeCAD, e su Linux solitamente è installato automaticamente quando si installa FreeCAD da un repository ufficiale. Su macOS, purtroppo, è necessario compilare pivy da soli.

Installazione

Prerequisiti

Si presume che prima di compilare Pivy si desideri avere Coin e SoQt installati.

Per compilarlo su Mac è sufficiente installare il pacchetto binario Coin3. Il tentativo di installare Coin da MacPorts è stato problematico: ha cercato di aggiungere un sacco di pacchetti di X Windows e alla fine il tentativo è fallito con un errore di script.

Per Fedora ho trovato un RPM con Coin3

SoQt compilato da codice sorgente funziona bene su Mac e Linux.

Debian & Ubuntu

A partire da Debian Squeeze e Ubuntu Lucid, Pivy sarà disponibile direttamente dai repository ufficiali e questo eviterà un sacco di problemi. Nel frattempo, è possibile scaricare uno dei pacchetti che abbiamo creato (per Debian e Ubuntu Karmic) e disponibili nelle pagine Download, o compilarlo da soli.

Il modo migliore per compilare facilmente Pivy è quello di prendere il pacchetto sorgente di Debian per Pivy e creare un pacchetto con debuild.

È lo stesso codice sorgente dal sito ufficiale di Pivy, ma la comunità di Debian vi ha fatto diverse aggiunte bug-fixing.

Si compila bene anche su Ubuntu Karmic: http://packages.debian.org/squeeze/python-pivy . Scaricare i file .orig.gz e .diff.gz, poi decomprimerli entrambi, quindi applicare .diff al codice sorgente: andare nella cartella del codice sorgente decompresso di Pivy, e applicare la patch .diff:

patch -p1 < ../pivy_0.5.0~svn765-2.diff

poi

debuild

per avere Pivy correttamente costruito in un pacchetto ufficiale installabile. Dopo è sufficiente installare il pacchetto con gdebi.

Altre distribuzioni Linux

Prima di tutto scaricare gli ultimi sorgenti dai repository del progetto:

hg clone http://hg.sim.no/Pivy/default Pivy

A partire dal marzo 2012, l'ultima versione è Pivy-0.5.

In seguito serve uno strumento chiamato SWIG per generare il codice C++ per i binding di Python. Pivy-0.5 segnala che è stato testato solo con SWIG 1.3.31, 1.3.33, 1.3.35 e 1.3.40. Perciò si può scaricare un tarball del codice sorgente di una di queste vecchie versioni da http://www.swig.org. Poi scompattarlo e da una riga di comando fare (come root):

./configure
make
make install (or checkinstall if you use it)

Impiega appena pochi secondi per costruirsi.

In alternativa, si può provare la costruzione con un SWIG più recente. A partire dal marzo 2012 la versione tipica del repository è la 2.0.4. Pivy presenta un piccolo problema di compilazione con SWIG 2.0.4 su macOS (vedere sotto), mentre pare si costruisca bene su Fedora Core 15.

Dopo le operazioni precedenti andare nel sorgente di Pivy e eseguire:

python setup.py build

per creare i file sorgente. Notare che la generazione può produrre migliaia di avvisi, ma fortunatamente non ci sono errori.

Questo è probabilmente obsoleto, ma si può incorrere in un errore di compilazione in cui una 'const char*' non può essere convertita in una 'char*'. Per risolvere il problema basta scrivere una 'const' prima nelle righe appropriate. Si devono correggere sei righe.

Dopo di che, installare digitando (come root):

python setup.py install (or checkinstall python setup.py install)

Questo è tutto. Pivy è installato.

MacOS

Queste istruzioni potrebbero non essere complete. Qualcosa di simile a questo ha funzionato per OS 10,7 dopo marzo 2012. Io uso MacPorts come repository, ma dovrebbero funzionare anche le altre opzioni.

Per quanto riguarda Linux, scaricare l'ultimo codice sorgente:

hg clone http://hg.sim.no/Pivy/default Pivy

Se non si dispone di hg, è possibile ottenerlo da MacPorts:

port install mercurial

Poi, come prima, è necessario SWIG. Si tratta di fare:

port install swig

C'è bisogno anche di:

port install swig-python

Da marzo 2012, la versione di SWIG in MacPorts è la 2.0.4. Come detto in precedenza per Linux, potrebbe essere meglio scaricare una versione precedente. SWIG 2.0.4 sembra avere un bug che blocca la costruzione di Pivy. Vedere il primo messaggio in questa raccolta

Questo problema può essere corretto modificando i 2 percorsi del codice sorgente per aggiungere dereferenziazioni: arg4 *, * arg5 al posto di arg4, arg5. Ora si può costruire Pivy:

python setup.py build
sudo python setup.py install

Windows

Supponendo di utilizzare Visual Studio 2005 o versioni successive è necessario aprire un prompt dei comandi con 'Visual Studio 2005 Command prompt' dal menu Strumenti. Se l'interprete Python non è ancora nel percorso di sistema fare:

set PATH=path_to_python_2.5;%PATH%

Per avere pivy funzionante si devono scaricare gli ultimi sorgenti dal repository del progetto:

svn co https://svn.coin3d.org/repos/Pivy/trunk Pivy

Dopo serve lo strumento chiamato SWIG per generare il codice C++ per i binding con Python. Si raccomanda di utilizzare la versione 1.3.25 di SWIG, non l'ultima versione, perché al momento pivy funziona correttamente solo con la 1.3.25. Scaricare i file binari per 1.3.25 da http://www.swig.org. Poi scompattarli e dalla riga di comando aggiungerli al percorso di sistema

set PATH=path_to_swig_1.3.25;%PATH%

e impostare il percorso appropriato per COINDIR

set COINDIR=path_to_coin

Su Windows il file di configurazione di pivy si aspetta SoWin invece di SoQt come predefinito. Non ho trovato un modo valido per costruirlo con SoQt, così ho modificato direttamente il file setup.py. Nella riga 200 è sufficiente rimuovere la parte 'sowin': ('gui._sowin', 'sowin-config', 'Pivy.gui.') (non rimuovere le parentesi di chiusura).

Successivamente andare nel sorgente di pivy e eseguire:

python setup.py build

per creare i file sorgente. Si può incorrere nell'errore di compilazione 'header files couldn't be found' (file di intestazione non trovati). In questo caso, impostare la variabile INCLUDE

set INCLUDE=%INCLUDE%;path_to_coin_include_dir

e, se le intestazioni di SoQt non sono nella stessa posizione delle intestazioni di Coin, impostare anche

set INCLUDE=%INCLUDE%;path_to_soqt_include_dir

e infine impostare le intestazioni di Qt

set INCLUDE=%INCLUDE%;path_to_qt4\include\Qt

Se si utilizza la Express Edition di Visual Studio si potrebbe ricevere un'eccezione keyerror di Python. In questo caso è necessario modificare alcune parti in msvccompiler.py, che si trova nella propria installazione di Python.

Andare alla riga 122 e sostituire la riga

vsbase = r"Software\Microsoft\VisualStudio\%0.1f" % version

con

vsbase = r"Software\Microsoft\VCExpress\%0.1f" % version

Quindi riprovare di nuovo. Se si riceve un secondo errore del tipo

error: Python was built with Visual Studio 2003;...

è necessario sostituire anche la riga 128

self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv1.1")

con

self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv2.0")

Riprovare ancora una volta. Se si ottiene di nuovo un errore quale

error: Python was built with Visual Studio version 8.0, and extensions need to be built with the same version of the compiler, but it isn't installed.

allora si deve controllare le variabili d'ambiente DISTUTILS_USE_SDK e MSSDK con

echo %DISTUTILS_USE_SDK%
echo %MSSDK%

Se non sono ancora impostate basta impostarle, ad esempio, a 1

set DISTUTILS_USE_SDK=1
set MSSDK=1

Ora, si può incorrere in un errore di compilazione in cui una 'const char *' non può essere convertita in una 'char *'. Per risolvere il problema basta scrivere una 'const' prima nelle righe appropriate. Ci sono sei righe da correggere. Infine, copiare la directory di pivy generata in un posto dove l'interprete di Python di FreeCAD possa trovarla.

Utilizzo

Per verificare se Pivy è installato correttamente:

import pivy

Per consentire a Pivy di accedere al grafo di scena (Scenegraph) di FreeCAD effettuare le seguenti operazioni:

from pivy import coin
App.newDocument() # Open a document and a view
view = Gui.ActiveDocument.ActiveView
FCSceneGraph = view.getSceneGraph() # returns a pivy Python object that holds a SoSeparator, the main "container" of the Coin scenegraph
FCSceneGraph.addChild(coin.SoCube()) # add a box to scene

Ora è possibile esplorare FCSceneGraph con il comando dir().

Documentazione aggiuntiva

Purtroppo in rete la documentazione su Pivy è ancora quasi inesistente. Ma può essere utile la documentazione di Coin, in quanto Pivy semplicemente traduce le funzioni di Coin, i nodi e i metodi in Python, tutto mantiene lo stesso nome e le stesse proprietà, tenendo presente la differenza di sintassi tra C e Python:

Potete anche esplorare il file Draft.py nella cartella Mod/Draft di FreeCAD, dato che che in esso si fa un grande uso di pivy.

pyCollada

  • homepage: http://pycollada.github.com
  • license: BSD
  • optional, necessario per consentire di importare ed esportare i file di Collada (.DAE)

pyCollada è una libreria di Python che permette ai programmi di leggere e di scrivere i file di Collada (*.DAE). Quando pyCollada è installato sul sistema, FreeCAD lo rileva e aggiunge le opzioni di importazione e di esportazione per gestire l'apertura e il salvataggio di file nel formato Collada.

Installazione

Linux

sudo apt-get install python3-collada

Si può controllare se pycollada è stato installato correttamente digitando in una console Python:

import collada

Se non viene restituito nulla (nessun messaggio di errore), allora tutto è OK

Windows

Su Windows, dalla versione 0.15, pycollada è incluso in FreeCAD sia nella versione di rilascio che in quella di sviluppo quindi non sono più necessari ulteriori passaggi.

MacOS

Se si utilizza la build Homebrew di FreeCAD è possibile installare pycollada nel proprio sistema Python utilizzando pip.

Se è necessario installare pip:

$ sudo easy_install pip

Installare pycollada:

$ sudo pip install pycollada

Se si utilizza una versione binaria di FreeCAD, si può dire a pip di installare pycollada all'interno di FreeCAD.app:

$ pip install --target="/Applications/FreeCAD.app/Contents/lib/python2.7/site-packages" pycollada

o dopo aver scaricato il codice pycollada

$ export PYTHONPATH=/Applications/FreeCAD\ 0.16.6706.app/Contents/lib/python2.7/site-packages:$PYTHONPATH
$ python setup.py install --prefix=/Applications/FreeCAD\ 0.16.6706.app/Contents

IfcOpenShell

IFCOpenShell è una libreria attualmente in fase di sviluppo, che permette di importare (e presto di esportare) file Industry foundation Classes (*.IFC). IFC è una estensione per il formato STEP, e sta diventando lo standard nei processi di lavoro BIM. Quando ifcopenshell è installato correttamente nel vostro sistema, il ambiente Arch di FreeCAD è grado di rilevarlo e usarlo per importare i file IFC. Poiché ifcopenshell si basa su OpenCascade, come FreeCAD, la qualità della importazione è molto buona, producendo geometria solida di alta qualità.

Installazione

Dato che ifcopenshell è abbastanza recente, dovrete probabilmente compilarla da soli.

Linux

Per compilare ifcopenshell serve che sul sistema siano installati un paio di pacchetti di sviluppo:

liboce-*-dev
python-dev
swig

ma dato che anche FreeCAD richiede tutti questi pacchetti, se è possibile compilare FreeCAD, non serve alcun dipendenza in più per compilare IfcOpenShell.

Prelevare l'ultimo codice sorgente da:

git clone https://github.com/IfcOpenShell/IfcOpenShell.git

Il processo di costruzione è molto semplice:

mkdir ifcopenshell-build
cd ifcopenshell-build
cmake ../IfcOpenShell/cmake

o, se si utilizza Oce invece di OpenCascade:

cmake -DOCC_INCLUDE_DIR=/usr/include/oce ../ifcopenshell/cmake

Siccome ifcopenshell è fatto principalmente per Blender, utilizza Python3 di impostazione predefinita. Per usarlo dentro FreeCAD, è necessario compilarlo contro la stessa versione di Python che viene utilizzata da FreeCAD. Quindi potrebbe essere necessario forzare la versione di Python con parametri aggiuntivi cmake (adattare per la vostra versione di Python):

cmake -DOCC_INCLUDE_DIR=/usr/include/oce -DPYTHON_INCLUDE_DIR=/usr/include/python2.7 -DPYTHON_LIBRARY=/usr/lib/python2.7.so ../ifcopenshell/cmake

Poi:

make
sudo make install

Si può controllare se ifcopenshell è stato installato correttamente digitando in una console Python:

import ifcopenshell

Se non viene restituito nulla (nessun messaggio di errore), allora tutto è OK

Windows

Nota: I programmi di installazione di FreeCAD ufficiali ottenuti dal website/github di FreeCAD contengono già ifcopenshell.

Copiato dal file README di IfcOpenShell

Si consiglia agli utenti di utilizzare il file Visual Studio .sln nella cartella win/. Per gli utenti Windows è disponibile una versione predefinita di Open CASCADE sul sito web di opencascade. Scaricare e installare questa versione e fornire i percorsi dell'intestazione Open CASCADE e dei file di libreria a MS Visual Studio C++.

Per creare il wrapper IfcPython, è necessario installare SWIG. Si prega di scaricare l'ultima versione di swigwin dal sito web di swig. Dopo aver estratto il file .zip, aggiungi la cartella estratta alla variabile di ambiente PATH. Python deve essere installato, fornire i percorsi di inclusione e libreria a Visual Studio.

Link

Tutorial Importare e Esportare IFC - compilare IfcOpenShell

LazyLoader

LazyLoader è un modulo Python che consente il caricamento differito, pur continuando a importare all'inizio dello script. Ciò è utile se stai importando un altro modulo che è lento e viene utilizzato più volte durante lo script. L'utilizzo di LazyLoader può migliorare i tempi di avvio del workbench, ma il modulo dovrà comunque essere caricato al primo utilizzo.

Installazione

LazyLoader è incluso in FreeCAD v0.19

Utilizzo

Dovrai importare LazyLoader, quindi modificare l'importazione di qualsiasi modulo desideri rinviare.

from lazy_loader.lazy_loader import LazyLoader
Part = LazyLoader('Part', globals(), 'Part')

La variabile Part è il nome del modulo nel tuo script. È possibile replicare "importa parte come P" modificando la variabile.

P = LazyLoader('Part', globals(), 'Part')

Si può anche importare un modulo da un pacchetto.

utils = LazyLoader('PathScripts', globals(), 'PathScripts.PathUtils')

Non si può importare singole funzioni, solo interi moduli.

Link


Crediti

<translate>

</translate>

<translate>

</translate> <translate>

FreeCAD would not be what it is without the generous contributions of many people. Here's an overview of the people and companies who contributed to FreeCAD over time. For credits for the third party libraries see the Third Party Libraries page.

Development

Project managers

Lead developers of the FreeCAD project:

</translate>

<translate>

Main developers

People who work regularly on the FreeCAD code (retrieved from https://github.com/FreeCAD/FreeCAD/graphs/contributors):

</translate>

<translate>

Other coders

Other people who contributed code to the FreeCAD project:

</translate>

  • Barleyman
  • Berthold Grupp
  • dbtayl
  • Dmitry Chigrin
  • ezzieyguywuf
  • fandaL
  • Georg Wiora
  • Graeme van der Vlugt
  • itain
  • j-dowsett
  • Jacques-Antoine Gaudin
  • jcc242
  • jmaustpc
  • Joachim Zettler
  • jobermayr
  • Johan3DV
  • jonnor
  • keithsloan52
  • Ken Cline
  • Mandeep Singh
  • marktaff
  • Martin Burbaum
  • maurerpe
  • ovginkel
  • peterl94
  • plaes
  • poutine70
  • TheMarkster
  • qingfengxia
  • Remigiusz Fiedler (DXF-parser)
  • SebKuzminsky
  • tomate44
  • triplus
  • usakhelo

<translate>

Companies

Companies which donated code, assets or developer time:

</translate>

<translate>

Forum moderators

People in charge of the FreeCAD forum (retrieved from http://forum.freecadweb.org/memberlist.php?mode=team):

</translate>

<translate>

Community

People from the community who put a lot of efforts in helping the FreeCAD project either by being active on the forum, keeping a blog about FreeCAD, making video tutorials, packaging FreeCAD for Windows/Linux/macOS, writing a FreeCAD book... (listed by alphabetical order) (retrieved from http://forum.freecadweb.org/memberlist.php?mode=&sk=d&sd=d#memberlist).

</translate>

<translate>

Documentation writers

People who wrote the documentation on this wiki:

</translate>

<translate>

Translators

People who helped to translate the FreeCAD application (retrieved from https://crowdin.com/project/freecad):

</translate>

<translate>

Addons developers

Developers of FreeCAD addons (retrieved from https://github.com/FreeCAD/FreeCAD-addons):

</translate>

<translate>


</translate>